diff --git a/.gitignore b/.gitignore index 5227944..31242bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/mutter-3.14.4.tar.xz +SOURCES/mutter-3.22.3.tar.xz diff --git a/.mutter.metadata b/.mutter.metadata index 096c226..0aaec90 100644 --- a/.mutter.metadata +++ b/.mutter.metadata @@ -1 +1 @@ -6f3e63e600fae7f662a55d68dcda1ed0653e4d03 SOURCES/mutter-3.14.4.tar.xz +90bf3c4a65b474e958a1b13f80c47ebcdb411b42 SOURCES/mutter-3.22.3.tar.xz diff --git a/SOURCES/0001-Add-support-for-quad-buffer-stereo.patch b/SOURCES/0001-Add-support-for-quad-buffer-stereo.patch deleted file mode 100644 index cf24414..0000000 --- a/SOURCES/0001-Add-support-for-quad-buffer-stereo.patch +++ /dev/null @@ -1,939 +0,0 @@ -From a2e17081605da4df8d2763b9dbdc8e3b3c93e3bd Mon Sep 17 00:00:00 2001 -From: "Owen W. Taylor" -Date: Thu, 8 May 2014 18:44:15 -0400 -Subject: [PATCH] Add support for quad-buffer stereo - -Track the stereo status of windows using the new EXT_stereo_tree -GLX extension. - -When stereo is enabled or disabled, a restart is triggered via -meta_restart() after a timeout, setting a _META_ENABLE_STEREO -property on the root window to indicate whether we should -turn on a stereo stage for clutter. The property avoids a loop, -since we need to enable stereo *before* initializing Clutter and GL, -but we need GL to figure out whether we have stereo windows. - -Stereo windows are drawn to the stage using new functionality -in Cogl to setup a stereo context, select which buffer to draw -to, and draw either the left or right buffer of a stereo -texture_from_pixmap. ---- - src/Makefile.am | 2 + - src/compositor/compositor-private.h | 9 ++ - src/compositor/compositor.c | 128 ++++++++++++++++++++++ - src/compositor/meta-shaped-texture-private.h | 5 +- - src/compositor/meta-shaped-texture.c | 157 ++++++++++++++++++++------- - src/compositor/meta-surface-actor-wayland.c | 2 +- - src/compositor/meta-surface-actor-x11.c | 50 ++++++++- - src/compositor/meta-surface-actor-x11.h | 5 + - src/compositor/meta-window-actor-private.h | 5 + - src/compositor/meta-window-actor.c | 22 ++++ - src/core/main.c | 3 + - src/core/stereo.c | 146 +++++++++++++++++++++++++ - src/core/stereo.h | 28 +++++ - 13 files changed, 514 insertions(+), 48 deletions(-) - create mode 100644 src/core/stereo.c - create mode 100644 src/core/stereo.h - -diff --git a/src/Makefile.am b/src/Makefile.am -index d7a44bc..b2c1c1a 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -184,6 +184,8 @@ libmutter_la_SOURCES = \ - core/stack.h \ - core/stack-tracker.c \ - core/stack-tracker.h \ -+ core/stereo.c \ -+ core/stereo.h \ - core/util.c \ - meta/util.h \ - core/util-private.h \ -diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h -index 9e3e73d..e9b7463 100644 ---- a/src/compositor/compositor-private.h -+++ b/src/compositor/compositor-private.h -@@ -21,6 +21,10 @@ struct _MetaCompositor - gint64 server_time_query_time; - gint64 server_time_offset; - -+ int glx_opcode; -+ guint stereo_tree_ext : 1; -+ guint have_stereo_windows : 1; -+ - guint server_time_is_monotonic_time : 1; - guint no_mipmaps : 1; - -@@ -60,4 +64,9 @@ void meta_end_modal_for_plugin (MetaCompositor *compositor, - gint64 meta_compositor_monotonic_time_to_server_time (MetaDisplay *display, - gint64 monotonic_time); - -+gboolean meta_compositor_window_is_stereo (MetaScreen *screen, -+ Window xwindow); -+void meta_compositor_select_stereo_notify (MetaScreen *screen, -+ Window xwindow); -+ - #endif /* META_COMPOSITOR_PRIVATE_H */ -diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c -index 2e182c2..11b7c2c 100644 ---- a/src/compositor/compositor.c -+++ b/src/compositor/compositor.c -@@ -75,6 +75,8 @@ - #include "meta-window-group.h" - #include "window-private.h" /* to check window->hidden */ - #include "display-private.h" /* for meta_display_lookup_x_window() and meta_display_cancel_touch() */ -+#include "stack-tracker.h" -+#include "stereo.h" - #include "util-private.h" - #include "frame.h" - #include -@@ -467,6 +469,97 @@ redirect_windows (MetaScreen *screen) - } - } - -+#define GLX_STEREO_TREE_EXT 0x20F5 -+#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 -+#define GLX_STEREO_NOTIFY_EXT 0x00000000 -+ -+typedef struct { -+ int type; -+ unsigned long serial; -+ Bool send_event; -+ Display *display; -+ int extension; -+ int evtype; -+ Drawable window; -+ Bool stereo_tree; -+} StereoNotifyEvent; -+ -+static gboolean -+screen_has_stereo_tree_ext (MetaScreen *screen) -+{ -+ MetaDisplay *display = meta_screen_get_display (screen); -+ Display *xdisplay = meta_display_get_xdisplay (display); -+ const char *extensions_string; -+ -+ static const char * (*query_extensions_string) (Display *display, -+ int screen); -+ -+ if (query_extensions_string == NULL) -+ query_extensions_string = -+ (const char * (*) (Display *, int)) -+ cogl_get_proc_address ("glXQueryExtensionsString"); -+ -+ extensions_string = query_extensions_string (xdisplay, -+ meta_screen_get_screen_number (screen)); -+ -+ return strstr (extensions_string, "EXT_stereo_tree") != 0; -+} -+ -+#include -+ -+gboolean -+meta_compositor_window_is_stereo (MetaScreen *screen, -+ Window xwindow) -+{ -+ MetaCompositor *compositor = get_compositor_for_screen (screen); -+ MetaDisplay *display = meta_screen_get_display (screen); -+ Display *xdisplay = meta_display_get_xdisplay (display); -+ -+ static int (*query_drawable) (Display *dpy, -+ Drawable draw, -+ int attribute, -+ unsigned int *value); -+ -+ if (compositor->stereo_tree_ext) -+ { -+ unsigned int stereo_tree = 0; -+ -+ if (query_drawable == NULL) -+ query_drawable = -+ (int (*) (Display *, Drawable, int, unsigned int *)) -+ cogl_get_proc_address ("glXQueryDrawable"); -+ -+ query_drawable (xdisplay, xwindow, GLX_STEREO_TREE_EXT, &stereo_tree); -+ -+ return stereo_tree != 0; -+ } -+ else -+ return FALSE; -+} -+ -+void -+meta_compositor_select_stereo_notify (MetaScreen *screen, -+ Window xwindow) -+{ -+ MetaCompositor *compositor = get_compositor_for_screen (screen); -+ MetaDisplay *display = meta_screen_get_display (screen); -+ Display *xdisplay = meta_display_get_xdisplay (display); -+ -+ static void (*select_event) (Display *dpy, -+ Drawable draw, -+ unsigned long event_mask); -+ -+ if (compositor->stereo_tree_ext) -+ { -+ if (select_event == NULL) -+ select_event = -+ (void (*) (Display *, Drawable, unsigned long)) -+ cogl_get_proc_address ("glXSelectEvent"); -+ -+ select_event (xdisplay, xwindow, GLX_STEREO_NOTIFY_MASK_EXT); -+ } -+} -+ - void - meta_compositor_manage (MetaCompositor *compositor) - { -@@ -475,6 +568,8 @@ meta_compositor_manage (MetaCompositor *compositor) - MetaScreen *screen = display->screen; - MetaBackend *backend = meta_get_backend (); - -+ compositor->stereo_tree_ext = screen_has_stereo_tree_ext (screen); -+ - meta_screen_set_cm_selection (display->screen); - - compositor->stage = meta_backend_get_stage (backend); -@@ -735,6 +830,23 @@ meta_compositor_process_event (MetaCompositor *compositor, - if (window) - process_damage (compositor, (XDamageNotifyEvent *) event, window); - } -+ else if (!meta_is_wayland_compositor () && -+ event->type == GenericEvent && -+ event->xcookie.extension == compositor->glx_opcode) -+ { -+ if (event->xcookie.evtype == GLX_STEREO_NOTIFY_EXT) -+ { -+ StereoNotifyEvent *stereo_event = (StereoNotifyEvent *)(event->xcookie.data); -+ window = meta_display_lookup_x_window (compositor->display, stereo_event->window); -+ -+ if (window != NULL) -+ { -+ MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); -+ meta_window_actor_stereo_notify (window_actor, stereo_event->stereo_tree); -+ meta_stack_tracker_queue_sync_stack (window->screen->stack_tracker); -+ } -+ } -+ } - - if (compositor->have_x11_sync_object) - meta_sync_ring_handle_event (event); -@@ -918,6 +1030,7 @@ meta_compositor_sync_stack (MetaCompositor *compositor, - GList *stack) - { - GList *old_stack; -+ int stereo_window_count = 0; - - /* This is painful because hidden windows that we are in the process - * of animating out of existence. They'll be at the bottom of the -@@ -993,12 +1106,16 @@ meta_compositor_sync_stack (MetaCompositor *compositor, - * near the front of the other.) - */ - compositor->windows = g_list_prepend (compositor->windows, actor); -+ if (meta_window_actor_is_stereo (actor)) -+ stereo_window_count++; - - stack = g_list_remove (stack, window); - old_stack = g_list_remove (old_stack, actor); - } - - sync_actor_stacking (compositor); -+ -+ meta_stereo_set_have_stereo_windows (stereo_window_count > 0); - } - - void -@@ -1172,6 +1289,17 @@ meta_compositor_new (MetaDisplay *display) - meta_post_paint_func, - compositor, - NULL); -+ if (!meta_is_wayland_compositor ()) -+ { -+ Display *xdisplay = meta_display_get_xdisplay (display); -+ int glx_major_opcode, glx_first_event, glx_first_error; -+ -+ if (XQueryExtension (xdisplay, -+ "GLX", -+ &glx_major_opcode, &glx_first_event, &glx_first_error)) -+ compositor->glx_opcode = glx_major_opcode; -+ } -+ - return compositor; - } - -diff --git a/src/compositor/meta-shaped-texture-private.h b/src/compositor/meta-shaped-texture-private.h -index 21c6335..0d9794e 100644 ---- a/src/compositor/meta-shaped-texture-private.h -+++ b/src/compositor/meta-shaped-texture-private.h -@@ -30,8 +30,9 @@ - #include - - ClutterActor *meta_shaped_texture_new (void); --void meta_shaped_texture_set_texture (MetaShapedTexture *stex, -- CoglTexture *texture); -+void meta_shaped_texture_set_textures (MetaShapedTexture *stex, -+ CoglTexture *texture, -+ CoglTexture *texture_right); - void meta_shaped_texture_set_fallback_size (MetaShapedTexture *stex, - guint fallback_width, - guint fallback_height); -diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c -index e2d6060..42d06e0 100644 ---- a/src/compositor/meta-shaped-texture.c -+++ b/src/compositor/meta-shaped-texture.c -@@ -74,8 +74,10 @@ static guint signals[LAST_SIGNAL]; - struct _MetaShapedTexturePrivate - { - MetaTextureTower *paint_tower; -+ MetaTextureTower *paint_tower_right; - - CoglTexture *texture; -+ CoglTexture *texture_right; - CoglTexture *mask_texture; - - /* The region containing only fully opaque pixels */ -@@ -122,8 +124,10 @@ meta_shaped_texture_init (MetaShapedTexture *self) - priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self); - - priv->paint_tower = meta_texture_tower_new (); -+ priv->paint_tower_right = NULL; /* demand create */ - - priv->texture = NULL; -+ priv->texture_right = NULL; - priv->mask_texture = NULL; - priv->create_mipmaps = TRUE; - } -@@ -176,11 +180,11 @@ meta_shaped_texture_dispose (GObject *object) - MetaShapedTexture *self = (MetaShapedTexture *) object; - MetaShapedTexturePrivate *priv = self->priv; - -- if (priv->paint_tower) -- meta_texture_tower_free (priv->paint_tower); -- priv->paint_tower = NULL; -+ g_clear_pointer (&priv->paint_tower, meta_texture_tower_free); -+ g_clear_pointer (&priv->paint_tower_right, meta_texture_tower_free); - - g_clear_pointer (&priv->texture, cogl_object_unref); -+ g_clear_pointer (&priv->texture_right, cogl_object_unref); - g_clear_pointer (&priv->opaque_region, cairo_region_destroy); - - meta_shaped_texture_set_mask_texture (self, NULL); -@@ -259,8 +263,9 @@ paint_clipped_rectangle (CoglFramebuffer *fb, - } - - static void --set_cogl_texture (MetaShapedTexture *stex, -- CoglTexture *cogl_tex) -+set_cogl_textures (MetaShapedTexture *stex, -+ CoglTexture *cogl_tex, -+ CoglTexture *cogl_tex_right) - { - MetaShapedTexturePrivate *priv; - guint width, height; -@@ -271,8 +276,11 @@ set_cogl_texture (MetaShapedTexture *stex, - - if (priv->texture) - cogl_object_unref (priv->texture); -+ if (priv->texture_right) -+ cogl_object_unref (priv->texture_right); - - priv->texture = cogl_tex; -+ priv->texture_right = cogl_tex_right; - - if (cogl_tex != NULL) - { -@@ -286,6 +294,9 @@ set_cogl_texture (MetaShapedTexture *stex, - height = 0; - } - -+ if (cogl_tex_right != NULL) -+ cogl_object_ref (cogl_tex_right); -+ - if (priv->tex_width != width || - priv->tex_height != height) - { -@@ -300,52 +311,41 @@ set_cogl_texture (MetaShapedTexture *stex, - * previous buffer. We only queue a redraw in response to surface - * damage. */ - -+ if (cogl_tex_right != NULL) -+ { -+ if (priv->paint_tower_right == NULL) -+ priv->paint_tower_right = meta_texture_tower_new (); -+ } -+ else -+ { -+ g_clear_pointer (&priv->paint_tower_right, meta_texture_tower_free); -+ } -+ - if (priv->create_mipmaps) -- meta_texture_tower_set_base_texture (priv->paint_tower, cogl_tex); -+ { -+ meta_texture_tower_set_base_texture (priv->paint_tower, cogl_tex); -+ -+ if (priv->paint_tower_right) -+ meta_texture_tower_set_base_texture (priv->paint_tower_right, cogl_tex_right); -+ } - } - - static void --meta_shaped_texture_paint (ClutterActor *actor) -+paint_texture (MetaShapedTexture *stex, -+ CoglTexture *paint_tex) - { -- MetaShapedTexture *stex = (MetaShapedTexture *) actor; -+ ClutterActor *actor = CLUTTER_ACTOR (stex); - MetaShapedTexturePrivate *priv = stex->priv; - guint tex_width, tex_height; - guchar opacity; - CoglContext *ctx; - CoglFramebuffer *fb; -- CoglTexture *paint_tex; - ClutterActorBox alloc; - CoglPipelineFilter filter; - - if (priv->clip_region && cairo_region_is_empty (priv->clip_region)) - return; - -- if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR (stex))) -- clutter_actor_realize (CLUTTER_ACTOR (stex)); -- -- /* The GL EXT_texture_from_pixmap extension does allow for it to be -- * used together with SGIS_generate_mipmap, however this is very -- * rarely supported. Also, even when it is supported there -- * are distinct performance implications from: -- * -- * - Updating mipmaps that we don't need -- * - Having to reallocate pixmaps on the server into larger buffers -- * -- * So, we just unconditionally use our mipmap emulation code. If we -- * wanted to use SGIS_generate_mipmap, we'd have to query COGL to -- * see if it was supported (no API currently), and then if and only -- * if that was the case, set the clutter texture quality to HIGH. -- * Setting the texture quality to high without SGIS_generate_mipmap -- * support for TFP textures will result in fallbacks to XGetImage. -- */ -- if (priv->create_mipmaps) -- paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower); -- else -- paint_tex = COGL_TEXTURE (priv->texture); -- -- if (paint_tex == NULL) -- return; -- - tex_width = priv->tex_width; - tex_height = priv->tex_height; - -@@ -510,6 +510,76 @@ meta_shaped_texture_paint (ClutterActor *actor) - } - - static void -+meta_shaped_texture_paint (ClutterActor *actor) -+{ -+ MetaShapedTexture *stex = (MetaShapedTexture *) actor; -+ MetaShapedTexturePrivate *priv = stex->priv; -+ CoglFramebuffer *fb; -+ gboolean stereo; -+ CoglTexture *paint_tex; -+ CoglTexture *paint_tex_right; -+ -+ if (priv->clip_region && cairo_region_is_empty (priv->clip_region)) -+ return; -+ -+ if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR (stex))) -+ clutter_actor_realize (CLUTTER_ACTOR (stex)); -+ -+ /* The GL EXT_texture_from_pixmap extension does allow for it to be -+ * used together with SGIS_generate_mipmap, however this is very -+ * rarely supported. Also, even when it is supported there -+ * are distinct performance implications from: -+ * -+ * - Updating mipmaps that we don't need -+ * - Having to reallocate pixmaps on the server into larger buffers -+ * -+ * So, we just unconditionally use our mipmap emulation code. If we -+ * wanted to use SGIS_generate_mipmap, we'd have to query COGL to -+ * see if it was supported (no API currently), and then if and only -+ * if that was the case, set the clutter texture quality to HIGH. -+ * Setting the texture quality to high without SGIS_generate_mipmap -+ * support for TFP textures will result in fallbacks to XGetImage. -+ */ -+ if (priv->create_mipmaps) -+ paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower); -+ else -+ paint_tex = COGL_TEXTURE (priv->texture); -+ -+ if (paint_tex == NULL) -+ return; -+ -+ fb = cogl_get_draw_framebuffer (); -+ -+ stereo = priv->texture_right && cogl_framebuffer_get_is_stereo (fb); -+ -+ if (stereo) -+ { -+ if (priv->create_mipmaps) -+ paint_tex_right = meta_texture_tower_get_paint_texture (priv->paint_tower_right); -+ else -+ paint_tex_right = COGL_TEXTURE (priv->texture_right); -+ } -+ else -+ paint_tex_right = NULL; -+ -+ if (paint_tex != NULL) -+ { -+ if (stereo) -+ cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_LEFT); -+ paint_texture (stex, paint_tex); -+ if (stereo) -+ cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_BOTH); -+ } -+ -+ if (paint_tex_right != NULL) -+ { -+ cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_RIGHT); -+ paint_texture (stex, paint_tex_right); -+ cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_BOTH); -+ } -+} -+ -+static void - meta_shaped_texture_get_preferred_width (ClutterActor *self, - gfloat for_height, - gfloat *min_width_p, -@@ -638,6 +708,12 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex, - priv->create_mipmaps = create_mipmaps; - base_texture = create_mipmaps ? priv->texture : NULL; - meta_texture_tower_set_base_texture (priv->paint_tower, base_texture); -+ -+ if (priv->paint_tower_right) -+ { -+ base_texture = create_mipmaps ? priv->texture_right : NULL; -+ meta_texture_tower_set_base_texture (priv->paint_tower_right, base_texture); -+ } - } - } - -@@ -703,6 +779,8 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex, - return FALSE; - - meta_texture_tower_update_area (priv->paint_tower, x, y, width, height); -+ if (priv->paint_tower_right) -+ meta_texture_tower_update_area (priv->paint_tower_right, x, y, width, height); - - unobscured_region = effective_unobscured_region (stex); - if (unobscured_region) -@@ -735,17 +813,18 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex, - } - - /** -- * meta_shaped_texture_set_texture: -+ * meta_shaped_texture_set_textures: - * @stex: The #MetaShapedTexture - * @pixmap: The #CoglTexture to display - */ - void --meta_shaped_texture_set_texture (MetaShapedTexture *stex, -- CoglTexture *texture) -+meta_shaped_texture_set_textures (MetaShapedTexture *stex, -+ CoglTexture *texture, -+ CoglTexture *texture_right) - { - g_return_if_fail (META_IS_SHAPED_TEXTURE (stex)); - -- set_cogl_texture (stex, texture); -+ set_cogl_textures (stex, texture, texture_right); - } - - /** -diff --git a/src/compositor/meta-surface-actor-wayland.c b/src/compositor/meta-surface-actor-wayland.c -index ba4e517..ea8eb4c 100644 ---- a/src/compositor/meta-surface-actor-wayland.c -+++ b/src/compositor/meta-surface-actor-wayland.c -@@ -234,7 +234,7 @@ meta_surface_actor_wayland_set_texture (MetaSurfaceActorWayland *self, - CoglTexture *texture) - { - MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); -- meta_shaped_texture_set_texture (stex, texture); -+ meta_shaped_texture_set_textures (stex, texture, NULL); - } - - MetaWaylandSurface * -diff --git a/src/compositor/meta-surface-actor-x11.c b/src/compositor/meta-surface-actor-x11.c -index f486c68..c837b5e 100644 ---- a/src/compositor/meta-surface-actor-x11.c -+++ b/src/compositor/meta-surface-actor-x11.c -@@ -31,6 +31,7 @@ - #include - - #include -+#include "compositor-private.h" - #include "window-private.h" - #include "meta-shaped-texture-private.h" - #include "meta-cullable.h" -@@ -58,6 +59,8 @@ struct _MetaSurfaceActorX11Private - guint size_changed : 1; - - guint unredirected : 1; -+ -+ guint stereo : 1; - }; - typedef struct _MetaSurfaceActorX11Private MetaSurfaceActorX11Private; - -@@ -94,7 +97,7 @@ detach_pixmap (MetaSurfaceActorX11 *self) - * you are supposed to be able to free a GLXPixmap after freeing the underlying - * pixmap, but it certainly doesn't work with current DRI/Mesa - */ -- meta_shaped_texture_set_texture (stex, NULL); -+ meta_shaped_texture_set_textures (stex, NULL, NULL); - cogl_flush (); - - meta_error_trap_push (display); -@@ -114,23 +117,35 @@ set_pixmap (MetaSurfaceActorX11 *self, - CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); - MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); - CoglError *error = NULL; -- CoglTexture *texture; -+ CoglTexturePixmapX11 *texture; -+ CoglTexturePixmapX11 *texture_right; - - g_assert (priv->pixmap == None); - priv->pixmap = pixmap; - -- texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->pixmap, FALSE, &error)); -+ if (priv->stereo) -+ texture = cogl_texture_pixmap_x11_new_left (ctx, pixmap, FALSE, &error); -+ else -+ texture = cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, &error); -+ -+ if (priv->stereo) -+ texture_right = cogl_texture_pixmap_x11_new_right (texture); -+ else -+ texture_right = NULL; - - if (error != NULL) - { - g_warning ("Failed to allocate stex texture: %s", error->message); - cogl_error_free (error); - } -- else if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture)))) -+ else if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (texture))) - g_warning ("NOTE: Not using GLX TFP!\n"); - -- priv->texture = texture; -- meta_shaped_texture_set_texture (stex, texture); -+ priv->texture = COGL_TEXTURE (texture); -+ meta_shaped_texture_set_textures (stex, COGL_TEXTURE (texture), COGL_TEXTURE (texture_right)); -+ -+ if (priv->stereo) -+ cogl_object_unref (texture_right); - } - - static void -@@ -399,12 +414,17 @@ meta_surface_actor_x11_new (MetaWindow *window) - MetaSurfaceActorX11 *self = g_object_new (META_TYPE_SURFACE_ACTOR_X11, NULL); - MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); - MetaDisplay *display = meta_window_get_display (window); -+ Window xwindow; - - g_assert (!meta_is_wayland_compositor ()); - - priv->window = window; - priv->display = display; - -+ xwindow = meta_window_x11_get_toplevel_xwindow (window); -+ priv->stereo = meta_compositor_window_is_stereo (display->screen, xwindow); -+ meta_compositor_select_stereo_notify (display->screen, xwindow); -+ - create_damage (self); - g_signal_connect_object (priv->window, "notify::decorated", - G_CALLBACK (window_decorated_notify), self, 0); -@@ -432,3 +452,21 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self, - priv->last_height = height; - meta_shaped_texture_set_fallback_size (stex, width, height); - } -+ -+void -+meta_surface_actor_x11_stereo_notify (MetaSurfaceActorX11 *self, -+ gboolean stereo_tree) -+{ -+ MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); -+ -+ priv->stereo = stereo_tree != FALSE; -+ detach_pixmap (self); -+} -+ -+gboolean -+meta_surface_actor_x11_is_stereo (MetaSurfaceActorX11 *self) -+{ -+ MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); -+ -+ return priv->stereo; -+} -diff --git a/src/compositor/meta-surface-actor-x11.h b/src/compositor/meta-surface-actor-x11.h -index 0e692ee..4b2eccc 100644 ---- a/src/compositor/meta-surface-actor-x11.h -+++ b/src/compositor/meta-surface-actor-x11.h -@@ -64,6 +64,11 @@ MetaSurfaceActor * meta_surface_actor_x11_new (MetaWindow *window); - void meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self, - int width, int height); - -+void meta_surface_actor_x11_stereo_notify (MetaSurfaceActorX11 *self, -+ gboolean stereo_tree); -+ -+gboolean meta_surface_actor_x11_is_stereo (MetaSurfaceActorX11 *self); -+ - G_END_DECLS - - #endif /* __META_SURFACE_ACTOR_X11_H__ */ -diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h -index 5f495d6..fe72dce 100644 ---- a/src/compositor/meta-window-actor-private.h -+++ b/src/compositor/meta-window-actor-private.h -@@ -61,4 +61,9 @@ void meta_window_actor_effect_completed (MetaWindowActor *actor, - MetaSurfaceActor *meta_window_actor_get_surface (MetaWindowActor *self); - void meta_window_actor_update_surface (MetaWindowActor *self); - -+void meta_window_actor_stereo_notify (MetaWindowActor *actor, -+ gboolean stereo_tree); -+ -+gboolean meta_window_actor_is_stereo (MetaWindowActor *actor); -+ - #endif /* META_WINDOW_ACTOR_PRIVATE_H */ -diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c -index edc21e3..784856b 100644 ---- a/src/compositor/meta-window-actor.c -+++ b/src/compositor/meta-window-actor.c -@@ -2183,3 +2183,25 @@ meta_window_actor_sync_updates_frozen (MetaWindowActor *self) - - meta_window_actor_set_updates_frozen (self, meta_window_updates_are_frozen (window)); - } -+ -+void -+meta_window_actor_stereo_notify (MetaWindowActor *self, -+ gboolean stereo_tree) -+{ -+ MetaWindowActorPrivate *priv = self->priv; -+ -+ if (META_IS_SURFACE_ACTOR_X11 (priv->surface)) -+ meta_surface_actor_x11_stereo_notify (META_SURFACE_ACTOR_X11 (priv->surface), -+ stereo_tree); -+} -+ -+gboolean -+meta_window_actor_is_stereo (MetaWindowActor *self) -+{ -+ MetaWindowActorPrivate *priv = self->priv; -+ -+ if (META_IS_SURFACE_ACTOR_X11 (priv->surface)) -+ return meta_surface_actor_x11_is_stereo (META_SURFACE_ACTOR_X11 (priv->surface)); -+ else -+ return FALSE; -+} -diff --git a/src/core/main.c b/src/core/main.c -index 8184f56..587af55 100644 ---- a/src/core/main.c -+++ b/src/core/main.c -@@ -355,6 +355,9 @@ meta_init (void) - if (!meta_is_wayland_compositor ()) - meta_select_display (opt_display_name); - -+ if (!meta_is_wayland_compositor ()) -+ meta_stereo_init (); -+ - meta_clutter_init (); - - #ifdef HAVE_WAYLAND -diff -up mutter-3.14.4/src/core/stereo.c.stereo mutter-3.14.4/src/core/stereo.c ---- mutter-3.14.4/src/core/stereo.c.stereo 2016-08-29 12:58:37.773343391 -0400 -+++ mutter-3.14.4/src/core/stereo.c 2016-08-29 13:01:02.636911101 -0400 -@@ -0,0 +1,153 @@ -+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ -+ -+/* -+ * Copyright (C) 2014 Red Hat, Inc. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of the -+ * License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see . -+ */ -+ -+/* -+ * SECTION:stereo -+ * @short_description: Keep track of whether we are a stereo compositor -+ * -+ * With GLX, we need to use a different GL context for stereo and -+ * non-stereo support. Support for multiple GL contexts is unfinished -+ * in Cogl and entirely lacking in Clutter, so it's by far easier -+ * to just restart Mutter when we detect a stereo window. -+ * -+ * A property _MUTTER_ENABLE_STEREO is maintained on the root window -+ * to know whether we should initialize clutter for stereo or not. -+ * When the presence or absence of stereo windows mismatches the -+ * stereo-enabled state for a sufficiently long period of time, -+ * we restart Mutter. -+ */ -+ -+#include -+ -+#include -+#include -+#include -+ -+#include -+#include "ui.h" -+#include -+#include "display-private.h" -+#include "stereo.h" -+#include "util-private.h" -+ -+static guint stereo_switch_id = 0; -+static gboolean stereo_enabled = FALSE; -+/* -1 so the first time meta_stereo_set_have_stereo_windows() is called -+ * we avoid the short-circuit and set up a timeout to restart -+ * if necessary */ -+static gboolean stereo_have_windows = (gboolean)-1; -+static gboolean stereo_restart = FALSE; -+ -+#define STEREO_ENABLE_WAIT 1000 -+#define STEREO_DISABLE_WAIT 5000 -+ -+void -+meta_stereo_init (void) -+{ -+ Display *xdisplay; -+ Window root; -+ Atom atom_enable_stereo; -+ Atom type; -+ int format; -+ unsigned long n_items, bytes_after; -+ guchar *data; -+ -+ xdisplay = XOpenDisplay (NULL); -+ if (xdisplay == NULL) -+ meta_fatal ("Unable to open X display %s\n", XDisplayName (NULL)); -+ -+ root = DefaultRootWindow (xdisplay); -+ atom_enable_stereo = XInternAtom (xdisplay, "_MUTTER_ENABLE_STEREO", False); -+ -+ XGetWindowProperty (xdisplay, root, atom_enable_stereo, -+ 0, 1, False, XA_INTEGER, -+ &type, &format, &n_items, &bytes_after, &data); -+ if (type == XA_INTEGER) -+ { -+ if (format == 32 && n_items == 1 && bytes_after == 0) -+ { -+ stereo_enabled = *(long *)data; -+ } -+ else -+ { -+ meta_warning ("Bad value for _MUTTER_ENABLE_STEREO property\n"); -+ } -+ -+ XFree (data); -+ } -+ else if (type != None) -+ { -+ meta_warning ("Bad type for _MUTTER_ENABLE_STEREO property\n"); -+ } -+ -+ meta_verbose ("On startup, _MUTTER_ENABLE_STEREO=%s", -+ stereo_enabled ? "yes" : "no"); -+ clutter_x11_set_use_stereo_stage (stereo_enabled); -+ XCloseDisplay (xdisplay); -+} -+ -+static gboolean -+meta_stereo_switch (gpointer data) -+{ -+ stereo_switch_id = 0; -+ stereo_restart = TRUE; -+ -+ meta_restart (stereo_have_windows ? -+ _("Enabling stereo...") : -+ _("Disabling stereo...")); -+ -+ return FALSE; -+} -+ -+void -+meta_stereo_set_have_stereo_windows (gboolean have_windows) -+{ -+ have_windows = have_windows != FALSE; -+ -+ if (!stereo_restart && have_windows != stereo_have_windows) -+ { -+ MetaDisplay *display = meta_get_display (); -+ Display *xdisplay = meta_display_get_xdisplay (display); -+ Window root = DefaultRootWindow (xdisplay); -+ Atom atom_enable_stereo = XInternAtom (xdisplay, "_MUTTER_ENABLE_STEREO", False); -+ long value; -+ -+ stereo_have_windows = have_windows; -+ -+ if (stereo_have_windows) -+ meta_verbose ("Detected stereo windows\n"); -+ else -+ meta_verbose ("No stereo windows detected\n"); -+ -+ value = stereo_have_windows; -+ XChangeProperty (xdisplay, root, -+ atom_enable_stereo, XA_INTEGER, 32, -+ PropModeReplace, (guchar *)&value, 1); -+ -+ if (stereo_switch_id != 0) -+ { -+ g_source_remove (stereo_switch_id); -+ stereo_switch_id = 0; -+ } -+ -+ if (stereo_have_windows != stereo_enabled) -+ stereo_switch_id = g_timeout_add (stereo_have_windows ? STEREO_ENABLE_WAIT : STEREO_DISABLE_WAIT, -+ meta_stereo_switch, NULL); -+ } -+} -diff --git a/src/core/stereo.h b/src/core/stereo.h -new file mode 100644 -index 0000000..ccd1d70 ---- /dev/null -+++ b/src/core/stereo.h -@@ -0,0 +1,28 @@ -+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ -+ -+/* -+ * Copyright (C) 2014 Red Hat, Inc. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License as -+ * published by the Free Software Foundation; either version 2 of the -+ * License, or (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see . -+ */ -+ -+#ifndef META_STEREO_H -+#define META_STEREO_H -+ -+void meta_stereo_init (void); -+void meta_stereo_set_have_stereo_windows (gboolean have_windows); -+gboolean meta_stereo_is_restart (void); -+void meta_stereo_finish_restart (void); -+ -+#endif --- -2.7.4 - diff --git a/SOURCES/0001-Monitor-config-Fix-a-copy-paste-error.patch b/SOURCES/0001-Monitor-config-Fix-a-copy-paste-error.patch deleted file mode 100644 index 6638b65..0000000 --- a/SOURCES/0001-Monitor-config-Fix-a-copy-paste-error.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 1b22da00390f69fcdfd57135e10f141750e47f00 Mon Sep 17 00:00:00 2001 -From: Matthias Clasen -Date: Mon, 20 Jul 2015 17:33:28 -0400 -Subject: [PATCH 1/2] Monitor-config: Fix a copy-paste error - -The code was checking width twice, instead of width and height, -as was clearly the intention. Coverity pointed this out. - -https://bugzilla.gnome.org/show_bug.cgi?id=752551 ---- - src/backends/meta-monitor-config.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/backends/meta-monitor-config.c b/src/backends/meta-monitor-config.c -index eae142a..ba0ae57 100644 ---- a/src/backends/meta-monitor-config.c -+++ b/src/backends/meta-monitor-config.c -@@ -489,8 +489,8 @@ handle_end_element (GMarkupParseContext *context, - } - else - { -- if (parser->output.rect.width == 0 && -- parser->output.rect.width == 0) -+ if (parser->output.rect.width == 0 || -+ parser->output.rect.height == 0) - parser->output.enabled = FALSE; - else - parser->output.enabled = TRUE; --- -2.4.5 - diff --git a/SOURCES/0001-Revert-backend-x11-Ensure-the-Xkb-group-index-remain.patch b/SOURCES/0001-Revert-backend-x11-Ensure-the-Xkb-group-index-remain.patch new file mode 100644 index 0000000..ee3b81c --- /dev/null +++ b/SOURCES/0001-Revert-backend-x11-Ensure-the-Xkb-group-index-remain.patch @@ -0,0 +1,61 @@ +From 090ac268b91c3b07f90d9d4ebe481bfe649836df Mon Sep 17 00:00:00 2001 +From: Rui Matos +Date: Mon, 13 Jun 2016 19:32:43 +0200 +Subject: [PATCH] Revert "backend-x11: Ensure the Xkb group index remains + properly set" + +This reverts commit 2857fdbdb887fcaa2e2f25d268c34ae039646e78. +--- + src/backends/x11/meta-backend-x11.c | 16 +++------------- + 1 file changed, 3 insertions(+), 13 deletions(-) + +diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c +index a645bbd..dbcd13f 100644 +--- a/src/backends/x11/meta-backend-x11.c ++++ b/src/backends/x11/meta-backend-x11.c +@@ -82,7 +82,6 @@ struct _MetaBackendX11Private + gchar *keymap_layouts; + gchar *keymap_variants; + gchar *keymap_options; +- int locked_group; + }; + typedef struct _MetaBackendX11Private MetaBackendX11Private; + +@@ -298,23 +297,15 @@ handle_host_xevent (MetaBackend *backend, + + if (event->type == priv->xkb_event_base) + { +- XkbEvent *xkb_ev = (XkbEvent *) event; ++ XkbAnyEvent *xkb_ev = (XkbAnyEvent *) event; + +- if (xkb_ev->any.device == META_VIRTUAL_CORE_KEYBOARD_ID) ++ if (xkb_ev->device == META_VIRTUAL_CORE_KEYBOARD_ID) + { +- switch (xkb_ev->any.xkb_type) ++ switch (xkb_ev->xkb_type) + { + case XkbNewKeyboardNotify: + case XkbMapNotify: + keymap_changed (backend); +- break; +- case XkbStateNotify: +- if (xkb_ev->state.changed & XkbGroupLockMask) +- { +- if (priv->locked_group != xkb_ev->state.locked_group) +- XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, priv->locked_group); +- } +- break; + default: + break; + } +@@ -785,7 +776,6 @@ meta_backend_x11_lock_layout_group (MetaBackend *backend, + MetaBackendX11 *x11 = META_BACKEND_X11 (backend); + MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); + +- priv->locked_group = idx; + XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, idx); + } + +-- +2.7.4 + diff --git a/SOURCES/0001-backend-x11-Require-clutter-to-use-the-gl3-driver.patch b/SOURCES/0001-backend-x11-Require-clutter-to-use-the-gl3-driver.patch deleted file mode 100644 index 618f2c4..0000000 --- a/SOURCES/0001-backend-x11-Require-clutter-to-use-the-gl3-driver.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 239c642dc0a5789c8b557819a2c64a6a4f7696c5 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Thu, 11 Aug 2016 15:44:30 +0200 -Subject: [PATCH] backend-x11: Require clutter to use the gl3 driver - -The clutter version we use defaults to the classic gl driver but we -need the gl3 driver for memory purged notifications. ---- - src/backends/x11/meta-backend-x11.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c -index ae7d8fa..f70ce5a 100644 ---- a/src/backends/x11/meta-backend-x11.c -+++ b/src/backends/x11/meta-backend-x11.c -@@ -705,6 +705,7 @@ meta_backend_x11_init (MetaBackendX11 *x11) - XInitThreads(); - clutter_x11_enable_threaded_swap_wait (); - -+ clutter_set_allowed_drivers ("gl3,gl"); - clutter_x11_request_reset_on_video_memory_purge (); - - /* We do X11 event retrieval ourselves */ --- -2.7.4 - diff --git a/SOURCES/0001-backends-x11-Support-synaptics-configuration.patch b/SOURCES/0001-backends-x11-Support-synaptics-configuration.patch new file mode 100644 index 0000000..059728b --- /dev/null +++ b/SOURCES/0001-backends-x11-Support-synaptics-configuration.patch @@ -0,0 +1,345 @@ +From 10b63b27ba84458884138cecc1b914b4f69bc9b9 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 19 Jan 2017 15:03:41 +0100 +Subject: [PATCH] backends/x11: Support synaptics configuration + +The code is taken mostly as-is from g-s-d, so we can drag the +dead horse a bit longer. +--- + src/backends/x11/meta-input-settings-x11.c | 264 +++++++++++++++++++++++++++++ + 1 file changed, 264 insertions(+) + +diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c +index 8f962b4..75ceb0c 100644 +--- a/src/backends/x11/meta-input-settings-x11.c ++++ b/src/backends/x11/meta-input-settings-x11.c +@@ -26,6 +26,7 @@ + #include "meta-backend-x11.h" + #include "meta-input-settings-x11.h" + ++#include + #include + #include + #include +@@ -118,6 +119,177 @@ change_property (ClutterInputDevice *device, + meta_XFree (data_ret); + } + ++static gboolean ++is_device_synaptics (ClutterInputDevice *device) ++{ ++ guchar *has_setting; ++ ++ /* We just need looking for a synaptics-specific property */ ++ has_setting = get_property (device, "Synaptics Off", XA_INTEGER, 8, 1); ++ if (!has_setting) ++ return FALSE; ++ ++ meta_XFree (has_setting); ++ return TRUE; ++} ++ ++static void ++change_synaptics_tap_left_handed (ClutterInputDevice *device, ++ gboolean tap_enabled, ++ gboolean left_handed) ++{ ++ MetaDisplay *display = meta_get_display (); ++ MetaBackend *backend = meta_get_backend (); ++ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); ++ XDevice *xdevice; ++ guchar *tap_action, *buttons; ++ guint buttons_capacity = 16, n_buttons; ++ ++ xdevice = XOpenDevice(xdisplay, clutter_input_device_get_device_id (device)); ++ if (!xdevice) ++ return; ++ ++ tap_action = get_property (device, "Synaptics Tap Action", ++ XA_INTEGER, 8, 7); ++ if (!tap_action) ++ goto out; ++ ++ tap_action[4] = tap_enabled ? (left_handed ? 3 : 1) : 0; ++ tap_action[5] = tap_enabled ? (left_handed ? 1 : 3) : 0; ++ tap_action[6] = tap_enabled ? 2 : 0; ++ ++ change_property (device, "Synaptics Tap Action", ++ XA_INTEGER, 8, tap_action, 7); ++ meta_XFree (tap_action); ++ ++ if (display) ++ meta_error_trap_push (display); ++ buttons = g_new (guchar, buttons_capacity); ++ n_buttons = XGetDeviceButtonMapping (xdisplay, xdevice, ++ buttons, buttons_capacity); ++ ++ while (n_buttons > buttons_capacity) ++ { ++ buttons_capacity = n_buttons; ++ buttons = (guchar *) g_realloc (buttons, ++ buttons_capacity * sizeof (guchar)); ++ ++ n_buttons = XGetDeviceButtonMapping (xdisplay, xdevice, ++ buttons, buttons_capacity); ++ } ++ ++ buttons[0] = left_handed ? 3 : 1; ++ buttons[2] = left_handed ? 1 : 3; ++ XSetDeviceButtonMapping (xdisplay, xdevice, buttons, n_buttons); ++ ++ if (display && meta_error_trap_pop_with_return (display)) ++ { ++ g_warning ("Could not set synaptics touchpad left-handed for %s", ++ clutter_input_device_get_device_name (device)); ++ } ++ ++ out: ++ XCloseDevice (xdisplay, xdevice); ++} ++ ++static void ++change_synaptics_speed (ClutterInputDevice *device, ++ gdouble speed) ++{ ++ MetaDisplay *display = meta_get_display (); ++ MetaBackend *backend = meta_get_backend (); ++ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); ++ XDevice *xdevice; ++ XPtrFeedbackControl feedback; ++ XFeedbackState *states, *state; ++ int i, num_feedbacks, motion_threshold, numerator, denominator; ++ gfloat motion_acceleration; ++ ++ xdevice = XOpenDevice(xdisplay, clutter_input_device_get_device_id (device)); ++ if (!xdevice) ++ return; ++ /* Get the list of feedbacks for the device */ ++ states = XGetFeedbackControl (xdisplay, xdevice, &num_feedbacks); ++ if (!states) ++ return; ++ ++ /* Calculate acceleration and threshold */ ++ motion_acceleration = (speed + 1) * 5; /* speed is [-1..1], map to [0..10] */ ++ motion_threshold = CLAMP (10 - floor (motion_acceleration), 1, 10); ++ ++ if (motion_acceleration >= 1.0) ++ { ++ /* we want to get the acceleration, with a resolution of 0.5 ++ */ ++ if ((motion_acceleration - floor (motion_acceleration)) < 0.25) ++ { ++ numerator = floor (motion_acceleration); ++ denominator = 1; ++ } ++ else if ((motion_acceleration - floor (motion_acceleration)) < 0.5) ++ { ++ numerator = ceil (2.0 * motion_acceleration); ++ denominator = 2; ++ } ++ else if ((motion_acceleration - floor (motion_acceleration)) < 0.75) ++ { ++ numerator = floor (2.0 *motion_acceleration); ++ denominator = 2; ++ } ++ else ++ { ++ numerator = ceil (motion_acceleration); ++ denominator = 1; ++ } ++ } ++ else if (motion_acceleration < 1.0 && motion_acceleration > 0) ++ { ++ /* This we do to 1/10ths */ ++ numerator = floor (motion_acceleration * 10) + 1; ++ denominator= 10; ++ } ++ else ++ { ++ numerator = -1; ++ denominator = -1; ++ } ++ ++ if (display) ++ meta_error_trap_push (display); ++ ++ state = (XFeedbackState *) states; ++ ++ for (i = 0; i < num_feedbacks; i++) ++ { ++ if (state->class == PtrFeedbackClass) ++ { ++ /* And tell the device */ ++ feedback.class = PtrFeedbackClass; ++ feedback.length = sizeof (XPtrFeedbackControl); ++ feedback.id = state->id; ++ feedback.threshold = motion_threshold; ++ feedback.accelNum = numerator; ++ feedback.accelDenom = denominator; ++ ++ XChangeFeedbackControl (xdisplay, xdevice, ++ DvAccelNum | DvAccelDenom | DvThreshold, ++ (XFeedbackControl *) &feedback); ++ break; ++ } ++ ++ state = (XFeedbackState *) ((char *) state + state->length); ++ } ++ ++ if (display && meta_error_trap_pop_with_return (display)) ++ { ++ g_warning ("Could not set synaptics touchpad acceleration for %s", ++ clutter_input_device_get_device_name (device)); ++ } ++ ++ XFreeFeedbackList (states); ++ XCloseDevice (xdisplay, xdevice); ++} ++ + static void + meta_input_settings_x11_set_send_events (MetaInputSettings *settings, + ClutterInputDevice *device, +@@ -126,6 +298,13 @@ meta_input_settings_x11_set_send_events (MetaInputSettings *settings, + guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */ + guchar *available; + ++ if (is_device_synaptics (device)) ++ { ++ values[0] = mode != G_DESKTOP_DEVICE_SEND_EVENTS_ENABLED; ++ change_property (device, "Synaptics Off", XA_INTEGER, 8, &values, 1); ++ return; ++ } ++ + available = get_property (device, "libinput Send Events Modes Available", + XA_INTEGER, 8, 2); + if (!available) +@@ -178,6 +357,12 @@ meta_input_settings_x11_set_speed (MetaInputSettings *settings, + Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend)); + gfloat value = speed; + ++ if (is_device_synaptics (device)) ++ { ++ change_synaptics_speed (device, speed); ++ return; ++ } ++ + change_property (device, "libinput Accel Speed", + XInternAtom (xdisplay, "FLOAT", False), + 32, &value, 1); +@@ -190,6 +375,18 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings, + { + guchar value = (enabled) ? 1 : 0; + ++ if (is_device_synaptics (device)) ++ { ++ GSettings *settings; ++ ++ settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad"); ++ change_synaptics_tap_left_handed (device, ++ g_settings_get_boolean (settings, "tap-to-click"), ++ enabled); ++ g_object_unref (settings); ++ return; ++ } ++ + change_property (device, "libinput Left Handed Enabled", + XA_INTEGER, 8, &value, 1); + } +@@ -201,6 +398,20 @@ meta_input_settings_x11_set_tap_enabled (MetaInputSettings *settings, + { + guchar value = (enabled) ? 1 : 0; + ++ if (is_device_synaptics (device)) ++ { ++ GDesktopTouchpadHandedness handedness; ++ GSettings *settings; ++ ++ settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad"); ++ handedness = g_settings_get_enum (settings, "left-handed"); ++ g_object_unref (settings); ++ ++ change_synaptics_tap_left_handed (device, enabled, ++ handedness == G_DESKTOP_TOUCHPAD_HANDEDNESS_LEFT); ++ return; ++ } ++ + change_property (device, "libinput Tapping Enabled", + XA_INTEGER, 8, &value, 1); + } +@@ -212,6 +423,27 @@ meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings, + { + guchar value = (inverted) ? 1 : 0; + ++ if (is_device_synaptics (device)) ++ { ++ gint32 *scrolling_distance; ++ ++ scrolling_distance = get_property (device, "Synaptics Scrolling Distance", ++ XA_INTEGER, 32, 2); ++ if (scrolling_distance) ++ { ++ scrolling_distance[0] = inverted ? ++ -abs (scrolling_distance[0]) : abs (scrolling_distance[0]); ++ scrolling_distance[1] = inverted ? ++ -abs (scrolling_distance[1]) : abs (scrolling_distance[1]); ++ ++ change_property (device, "Synaptics Scrolling Distance", ++ XA_INTEGER, 32, scrolling_distance, 2); ++ meta_XFree (scrolling_distance); ++ } ++ ++ return; ++ } ++ + change_property (device, "libinput Natural Scrolling Enabled", + XA_INTEGER, 8, &value, 1); + } +@@ -225,6 +457,22 @@ meta_input_settings_x11_set_edge_scroll (MetaInputSettings *settings, + guchar *current = NULL; + guchar *available = NULL; + ++ if (is_device_synaptics (device)) ++ { ++ current = get_property (device, "Synaptics Edge Scrolling", ++ XA_INTEGER, 8, 3); ++ if (current) ++ { ++ current[0] = !!edge_scroll_enabled; ++ current[1] = !!edge_scroll_enabled; ++ change_property (device, "Synaptics Edge Scrolling", ++ XA_INTEGER, 8, current, 3); ++ meta_XFree (current); ++ } ++ ++ return; ++ } ++ + available = get_property (device, "libinput Scroll Methods Available", + XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS); + if (!available || !available[SCROLL_METHOD_FIELD_EDGE]) +@@ -254,6 +502,22 @@ meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings *set + guchar *current = NULL; + guchar *available = NULL; + ++ if (is_device_synaptics (device)) ++ { ++ current = get_property (device, "Synaptics Two-Finger Scrolling", ++ XA_INTEGER, 8, 2); ++ if (current) ++ { ++ current[0] = !!two_finger_scroll_enabled; ++ current[1] = !!two_finger_scroll_enabled; ++ change_property (device, "Synaptics Two-Finger Scrolling", ++ XA_INTEGER, 8, current, 2); ++ meta_XFree (current); ++ } ++ ++ return; ++ } ++ + available = get_property (device, "libinput Scroll Methods Available", + XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS); + if (!available || !available[SCROLL_METHOD_FIELD_2FG]) +-- +2.9.3 + diff --git a/SOURCES/0001-build-Lower-automake-requirement.patch b/SOURCES/0001-build-Lower-automake-requirement.patch new file mode 100644 index 0000000..f7c7af6 --- /dev/null +++ b/SOURCES/0001-build-Lower-automake-requirement.patch @@ -0,0 +1,25 @@ +From e19b0723e829a102f930af735c9ff6d08ec9232f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Fri, 17 Mar 2017 16:44:11 +0100 +Subject: [PATCH] build: Lower automake requirement + +--- + cogl/configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/cogl/configure.ac b/cogl/configure.ac +index 3ed761c57..1b259af58 100644 +--- a/cogl/configure.ac ++++ b/cogl/configure.ac +@@ -113,7 +113,7 @@ AC_SUBST([WAYLAND_SERVER_REQ_VERSION], [wayland_server_req_version]) + # want to know if the user specified custom cflags or not. + cflags_set=${CFLAGS+set} + +-AM_INIT_AUTOMAKE([1.14 foreign -Wno-portability no-define no-dist-gzip dist-xz tar-ustar subdir-objects]) ++AM_INIT_AUTOMAKE([1.11 foreign -Wno-portability no-define no-dist-gzip dist-xz tar-ustar]) + AM_SILENT_RULES([yes]) + + AH_BOTTOM([#include "config-custom.h"]) +-- +2.12.0 + diff --git a/SOURCES/0001-cally-Fix-translation-to-screen-coordinates.patch b/SOURCES/0001-cally-Fix-translation-to-screen-coordinates.patch new file mode 100644 index 0000000..33370b3 --- /dev/null +++ b/SOURCES/0001-cally-Fix-translation-to-screen-coordinates.patch @@ -0,0 +1,31 @@ +From 59eb6a6ff7d6356213db1ea22616315c215ae4a1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Fri, 28 Apr 2017 17:12:40 +0200 +Subject: [PATCH] cally: Fix translation to screen coordinates + +Due to an accidental swap of an else statement and a preprocessor #else, +the output x coordinate is currently only set when not using the X11 +windowing system, whoops. + +https://bugzilla.gnome.org/show_bug.cgi?id=781902 +--- + clutter/clutter/cally/cally-actor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/clutter/clutter/cally/cally-actor.c b/clutter/clutter/cally/cally-actor.c +index fe3e27433..8ff5b09e1 100644 +--- a/clutter/clutter/cally/cally-actor.c ++++ b/clutter/clutter/cally/cally-actor.c +@@ -780,8 +780,8 @@ _cally_actor_get_top_level_origin (ClutterActor *actor, + g_warning ("[x11] We were not able to get proper absolute " + "position of the stage"); + } +- else + #else ++ else + { + static gboolean yet_warned = FALSE; + +-- +2.12.2 + diff --git a/SOURCES/0001-clutter-clone-Unset-source-when-source-actor-is-dest.patch b/SOURCES/0001-clutter-clone-Unset-source-when-source-actor-is-dest.patch new file mode 100644 index 0000000..f30481a --- /dev/null +++ b/SOURCES/0001-clutter-clone-Unset-source-when-source-actor-is-dest.patch @@ -0,0 +1,60 @@ +From 82eb06def0b02efec2852aced4f0e609abb12557 Mon Sep 17 00:00:00 2001 +From: Rui Matos +Date: Thu, 2 Mar 2017 19:18:43 +0100 +Subject: [PATCH] clutter-clone: Unset source when source actor is destroyed + +Otherwise we might be holding on to a source actor that's no longer +fully functioning and cause crashes if for example we try to paint it. + +https://bugzilla.gnome.org/show_bug.cgi?id=779483 +--- + clutter/clutter/clutter-clone.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/clutter/clutter/clutter-clone.c b/clutter/clutter/clutter-clone.c +index af03a4e81..f0eea2459 100644 +--- a/clutter/clutter/clutter-clone.c ++++ b/clutter/clutter/clutter-clone.c +@@ -54,6 +54,7 @@ + struct _ClutterClonePrivate + { + ClutterActor *clone_source; ++ gulong source_destroy_id; + }; + + G_DEFINE_TYPE_WITH_PRIVATE (ClutterClone, clutter_clone, CLUTTER_TYPE_ACTOR) +@@ -377,6 +378,13 @@ clutter_clone_new (ClutterActor *source) + } + + static void ++on_source_destroyed (ClutterActor *source, ++ ClutterClone *self) ++{ ++ clutter_clone_set_source_internal (self, NULL); ++} ++ ++static void + clutter_clone_set_source_internal (ClutterClone *self, + ClutterActor *source) + { +@@ -387,6 +395,8 @@ clutter_clone_set_source_internal (ClutterClone *self, + + if (priv->clone_source != NULL) + { ++ g_signal_handler_disconnect (priv->clone_source, priv->source_destroy_id); ++ priv->source_destroy_id = 0; + _clutter_actor_detach_clone (priv->clone_source, CLUTTER_ACTOR (self)); + g_object_unref (priv->clone_source); + priv->clone_source = NULL; +@@ -396,6 +406,8 @@ clutter_clone_set_source_internal (ClutterClone *self, + { + priv->clone_source = g_object_ref (source); + _clutter_actor_attach_clone (priv->clone_source, CLUTTER_ACTOR (self)); ++ priv->source_destroy_id = g_signal_connect (priv->clone_source, "destroy", ++ G_CALLBACK (on_source_destroyed), self); + } + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_SOURCE]); +-- +2.13.0 + diff --git a/SOURCES/0001-cogl-Prefer-swizzling-to-convert-BGRA-buffers.patch b/SOURCES/0001-cogl-Prefer-swizzling-to-convert-BGRA-buffers.patch new file mode 100644 index 0000000..5ef1fad --- /dev/null +++ b/SOURCES/0001-cogl-Prefer-swizzling-to-convert-BGRA-buffers.patch @@ -0,0 +1,248 @@ +From 32faf80489f8ee7b4c973660c286f6d228f8e738 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Sat, 25 Feb 2017 23:21:06 +0100 +Subject: [PATCH] cogl: Prefer swizzling to convert BGRA buffers + +(squashed/rebased for gnome-3-22) + +If the GL implementation/hw supports the GL_*_texture_swizzle extension, +pretend that BGRA textures shall contain RGBA data, and let the flipping +happen when the texture will be used in the rendering pipeline. + +This avoids rather expensive format conversions when forcing BGRA buffers +into RGBA textures, which happens rather often with WL_SHM_FORMAT_ARGB8888 +buffers (like gtk+ uses) in little-endian machines. + +In intel/mesa/wayland, the performance improvement is rather noticeable, +CPU% as seen by top decreases from 45-50% to 25-30% when running +gtk+/tests/scrolling-performance with a cairo renderer. + +https://bugzilla.gnome.org/show_bug.cgi?id=779234 +--- + cogl/cogl/cogl-driver.h | 7 +++++ + cogl/cogl/driver/gl/cogl-framebuffer-gl.c | 9 ++++++ + cogl/cogl/driver/gl/cogl-texture-2d-gl.c | 11 ++++---- + cogl/cogl/driver/gl/gl/cogl-driver-gl.c | 37 +++++++++++++++++++++---- + cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c | 12 ++++++++ + cogl/cogl/driver/gl/gles/cogl-driver-gles.c | 26 +++++++++++++---- + cogl/cogl/driver/nop/cogl-driver-nop.c | 1 + + 7 files changed, 87 insertions(+), 16 deletions(-) + +diff --git a/cogl/cogl/cogl-driver.h b/cogl/cogl/cogl-driver.h +index 648228c..85aa0d8 100644 +--- a/cogl/cogl/cogl-driver.h ++++ b/cogl/cogl/cogl-driver.h +@@ -55,6 +55,13 @@ struct _CoglDriverVtable + GLenum *out_glintformat, + GLenum *out_glformat, + GLenum *out_gltype); ++ CoglPixelFormat ++ (* pixel_format_to_gl_with_target) (CoglContext *context, ++ CoglPixelFormat format, ++ CoglPixelFormat target_format, ++ GLenum *out_glintformat, ++ GLenum *out_glformat, ++ GLenum *out_gltype); + + CoglBool + (* update_features) (CoglContext *context, +diff --git a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c +index 18ba08a..2af36f0 100644 +--- a/cogl/cogl/driver/gl/cogl-framebuffer-gl.c ++++ b/cogl/cogl/driver/gl/cogl-framebuffer-gl.c +@@ -1418,6 +1418,15 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer, + &gl_format, + &gl_type); + ++ /* As we are reading pixels, we want to consider the bitmap according to ++ * its real pixel format, not the swizzled channels we pretend face to the ++ * pipeline. ++ */ ++ if ((format == COGL_PIXEL_FORMAT_BGRA_8888 || ++ format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) && ++ _cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE)) ++ gl_format = GL_BGRA; ++ + /* NB: All offscreen rendering is done upside down so there is no need + * to flip in this case... */ + if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_MESA_PACK_INVERT) && +diff --git a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c +index 1193df4..817dd53 100644 +--- a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c ++++ b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c +@@ -657,11 +657,12 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d, + + upload_format = cogl_bitmap_get_format (upload_bmp); + +- ctx->driver_vtable->pixel_format_to_gl (ctx, +- upload_format, +- NULL, /* internal format */ +- &gl_format, +- &gl_type); ++ ctx->driver_vtable->pixel_format_to_gl_with_target (ctx, ++ upload_format, ++ _cogl_texture_get_format (tex), ++ NULL, /* internal gl format */ ++ &gl_format, ++ &gl_type); + + /* If this touches the first pixel then we'll update our copy */ + if (dst_x == 0 && dst_y == 0 && +diff --git a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c +index 2b9a49c..178262a 100644 +--- a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c ++++ b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c +@@ -96,11 +96,12 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context, + } + + static CoglPixelFormat +-_cogl_driver_pixel_format_to_gl (CoglContext *context, +- CoglPixelFormat format, +- GLenum *out_glintformat, +- GLenum *out_glformat, +- GLenum *out_gltype) ++_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context, ++ CoglPixelFormat format, ++ CoglPixelFormat target_format, ++ GLenum *out_glintformat, ++ GLenum *out_glformat, ++ GLenum *out_gltype) + { + CoglPixelFormat required_format; + GLenum glintformat = 0; +@@ -174,7 +175,16 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context, + case COGL_PIXEL_FORMAT_BGRA_8888: + case COGL_PIXEL_FORMAT_BGRA_8888_PRE: + glintformat = GL_RGBA; +- glformat = GL_BGRA; ++ /* If the driver has texture_swizzle, pretend internal ++ * and buffer format are the same here, the pixels ++ * will be flipped through this extension. ++ */ ++ if (target_format == format && ++ _cogl_has_private_feature ++ (context, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE)) ++ glformat = GL_RGBA; ++ else ++ glformat = GL_BGRA; + gltype = GL_UNSIGNED_BYTE; + break; + +@@ -289,6 +299,20 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context, + return required_format; + } + ++static CoglPixelFormat ++_cogl_driver_pixel_format_to_gl (CoglContext *context, ++ CoglPixelFormat format, ++ GLenum *out_glintformat, ++ GLenum *out_glformat, ++ GLenum *out_gltype) ++{ ++ return _cogl_driver_pixel_format_to_gl_with_target (context, ++ format, format, ++ out_glintformat, ++ out_glformat, ++ out_gltype); ++} ++ + static CoglBool + _cogl_get_gl_version (CoglContext *ctx, + int *major_out, +@@ -669,6 +693,7 @@ _cogl_driver_gl = + { + _cogl_driver_pixel_format_from_gl_internal, + _cogl_driver_pixel_format_to_gl, ++ _cogl_driver_pixel_format_to_gl_with_target, + _cogl_driver_update_features, + _cogl_offscreen_gl_allocate, + _cogl_offscreen_gl_free, +diff --git a/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c +index c76a0cf..d5ee4b4 100644 +--- a/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c ++++ b/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c +@@ -114,6 +114,18 @@ _cogl_texture_driver_gen (CoglContext *ctx, + red_swizzle) ); + } + ++ /* If swizzle extension is available, prefer it to flip bgra buffers to rgba */ ++ if ((internal_format == COGL_PIXEL_FORMAT_BGRA_8888 || ++ internal_format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) && ++ _cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE)) ++ { ++ static const GLint bgra_swizzle[] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA }; ++ ++ GE( ctx, glTexParameteriv (gl_target, ++ GL_TEXTURE_SWIZZLE_RGBA, ++ bgra_swizzle) ); ++ } ++ + return tex; + } + +diff --git a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c +index bf63fcc..521f6ef 100644 +--- a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c ++++ b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c +@@ -67,11 +67,12 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context, + } + + static CoglPixelFormat +-_cogl_driver_pixel_format_to_gl (CoglContext *context, +- CoglPixelFormat format, +- GLenum *out_glintformat, +- GLenum *out_glformat, +- GLenum *out_gltype) ++_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context, ++ CoglPixelFormat format, ++ CoglPixelFormat target_format, ++ GLenum *out_glintformat, ++ GLenum *out_glformat, ++ GLenum *out_gltype) + { + CoglPixelFormat required_format; + GLenum glintformat; +@@ -219,6 +220,20 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context, + return required_format; + } + ++static CoglPixelFormat ++_cogl_driver_pixel_format_to_gl (CoglContext *context, ++ CoglPixelFormat format, ++ GLenum *out_glintformat, ++ GLenum *out_glformat, ++ GLenum *out_gltype) ++{ ++ return _cogl_driver_pixel_format_to_gl_with_target (context, ++ format, format, ++ out_glintformat, ++ out_glformat, ++ out_gltype); ++} ++ + static CoglBool + _cogl_get_gl_version (CoglContext *ctx, + int *major_out, +@@ -457,6 +472,7 @@ _cogl_driver_gles = + { + _cogl_driver_pixel_format_from_gl_internal, + _cogl_driver_pixel_format_to_gl, ++ _cogl_driver_pixel_format_to_gl_with_target, + _cogl_driver_update_features, + _cogl_offscreen_gl_allocate, + _cogl_offscreen_gl_free, +diff --git a/cogl/cogl/driver/nop/cogl-driver-nop.c b/cogl/cogl/driver/nop/cogl-driver-nop.c +index d9b1d0f..6e04e71 100644 +--- a/cogl/cogl/driver/nop/cogl-driver-nop.c ++++ b/cogl/cogl/driver/nop/cogl-driver-nop.c +@@ -61,6 +61,7 @@ _cogl_driver_nop = + { + NULL, /* pixel_format_from_gl_internal */ + NULL, /* pixel_format_to_gl */ ++ NULL, /* pixel_format_to_gl_with_target */ + _cogl_driver_update_features, + _cogl_offscreen_nop_allocate, + _cogl_offscreen_nop_free, +-- +2.9.3 + diff --git a/SOURCES/0001-display-Check-we-have-a-screen-before-freeing-it.patch b/SOURCES/0001-display-Check-we-have-a-screen-before-freeing-it.patch new file mode 100644 index 0000000..5b8c284 --- /dev/null +++ b/SOURCES/0001-display-Check-we-have-a-screen-before-freeing-it.patch @@ -0,0 +1,32 @@ +From 91dced2ea5e4317c0067df28071c7694fb2f35ac Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Fri, 17 Feb 2017 14:24:38 +0100 +Subject: [PATCH] display: Check we have a screen before freeing it + +The reason for the display to be closed may be meta_screen_new() +returning NULL, in which case we don't have a screen to free. +Avoid a segfault on exit by adding a proper check. + +https://bugzilla.gnome.org/show_bug.cgi?id=778831 +--- + src/core/display.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/core/display.c b/src/core/display.c +index 42a530f6c..c6248ce34 100644 +--- a/src/core/display.c ++++ b/src/core/display.c +@@ -1113,7 +1113,9 @@ meta_display_close (MetaDisplay *display, + meta_display_free_events_x11 (display); + meta_display_free_events (display); + +- meta_screen_free (display->screen, timestamp); ++ if (display->screen) ++ meta_screen_free (display->screen, timestamp); ++ display->screen = NULL; + + /* Must be after all calls to meta_window_unmanage() since they + * unregister windows +-- +2.12.0 + diff --git a/SOURCES/0001-events-Don-t-move-sloppy-focus-while-buttons-are-pre.patch b/SOURCES/0001-events-Don-t-move-sloppy-focus-while-buttons-are-pre.patch new file mode 100644 index 0000000..3a6d899 --- /dev/null +++ b/SOURCES/0001-events-Don-t-move-sloppy-focus-while-buttons-are-pre.patch @@ -0,0 +1,42 @@ +From def9c7e2cb32d8aeb7c48f126a43e2ff97fe14e2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Thu, 21 Jul 2016 15:43:12 +0200 +Subject: [PATCH] events: Don't move (sloppy) focus while buttons are pressed + +(https://bugzilla.redhat.com/show_bug.cgi?id=1358535) +--- + src/x11/events.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/src/x11/events.c b/src/x11/events.c +index 98f5f03a9..b763af312 100644 +--- a/src/x11/events.c ++++ b/src/x11/events.c +@@ -830,6 +830,16 @@ crossing_serial_is_ignored (MetaDisplay *display, + } + + static gboolean ++event_has_button_mask (XIEnterEvent *enter_event) ++{ ++ int i; ++ for (i = 0; i < enter_event->buttons.mask_len; i++) ++ if (enter_event->buttons.mask[i] != '\0') ++ return TRUE; ++ return FALSE; ++} ++ ++static gboolean + handle_input_xevent (MetaDisplay *display, + XIEvent *input_event, + unsigned long serial) +@@ -870,6 +880,7 @@ handle_input_xevent (MetaDisplay *display, + * avoid races. + */ + if (window && !crossing_serial_is_ignored (display, serial) && ++ !event_has_button_mask (enter_event) && + enter_event->mode != XINotifyGrab && + enter_event->mode != XINotifyUngrab && + enter_event->detail != XINotifyInferior && +-- +2.12.0 + diff --git a/SOURCES/0001-events-Don-t-use-XIEvent-serial-numbers.patch b/SOURCES/0001-events-Don-t-use-XIEvent-serial-numbers.patch deleted file mode 100644 index d78d8bd..0000000 --- a/SOURCES/0001-events-Don-t-use-XIEvent-serial-numbers.patch +++ /dev/null @@ -1,99 +0,0 @@ -From b21bd3f820e875aa67b8f8dcb7b648eaebb7d926 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Thu, 9 Jul 2015 17:39:05 +0200 -Subject: [PATCH] events: Don't use XIEvent serial numbers - -XInput2 uses the raw sequence number for XIEvent serials, which only -matches the serial number in XEvents up to 16 bits[0]. So in order to -be able to make reliable comparisons with serials from other events or -calls to XNextRequest(), always use the field from the original XEvent -rather than the XIEvent serial. - -[0] http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/XlibInt.c#n265 ---- - src/x11/events.c | 20 +++++++++++--------- - 1 file changed, 11 insertions(+), 9 deletions(-) - -diff --git a/src/x11/events.c b/src/x11/events.c -index bf2dd9b..fbfd2dd 100644 ---- a/src/x11/events.c -+++ b/src/x11/events.c -@@ -691,7 +691,8 @@ meta_spew_event_print (MetaDisplay *display, - static gboolean - handle_window_focus_event (MetaDisplay *display, - MetaWindow *window, -- XIEnterEvent *event) -+ XIEnterEvent *event, -+ unsigned long serial) - { - MetaWindow *focus_window; - #ifdef WITH_VERBOSE_MODE -@@ -726,7 +727,7 @@ handle_window_focus_event (MetaDisplay *display, - event->event, window_type, - meta_event_mode_to_string (event->mode), - meta_event_detail_to_string (event->mode), -- event->serial); -+ serial); - #endif - - /* FIXME our pointer tracking is broken; see how -@@ -770,7 +771,7 @@ handle_window_focus_event (MetaDisplay *display, - if (event->evtype == XI_FocusIn) - { - display->server_focus_window = event->event; -- display->server_focus_serial = event->serial; -+ display->server_focus_serial = serial; - focus_window = window; - } - else if (event->evtype == XI_FocusOut) -@@ -784,7 +785,7 @@ handle_window_focus_event (MetaDisplay *display, - } - - display->server_focus_window = None; -- display->server_focus_serial = event->serial; -+ display->server_focus_serial = serial; - focus_window = NULL; - } - else -@@ -834,8 +835,9 @@ crossing_serial_is_ignored (MetaDisplay *display, - } - - static gboolean --handle_input_xevent (MetaDisplay *display, -- XIEvent *input_event) -+handle_input_xevent (MetaDisplay *display, -+ XIEvent *input_event, -+ unsigned long serial) - { - XIEnterEvent *enter_event = (XIEnterEvent *) input_event; - Window modified; -@@ -872,7 +874,7 @@ handle_input_xevent (MetaDisplay *display, - /* Check if we've entered a window; do this even if window->has_focus to - * avoid races. - */ -- if (window && !crossing_serial_is_ignored (display, input_event->serial) && -+ if (window && !crossing_serial_is_ignored (display, serial) && - enter_event->mode != XINotifyGrab && - enter_event->mode != XINotifyUngrab && - enter_event->detail != XINotifyInferior && -@@ -897,7 +899,7 @@ handle_input_xevent (MetaDisplay *display, - break; - case XI_FocusIn: - case XI_FocusOut: -- if (handle_window_focus_event (display, window, enter_event) && -+ if (handle_window_focus_event (display, window, enter_event, serial) && - enter_event->event == enter_event->root) - { - if (enter_event->evtype == XI_FocusIn && -@@ -1741,7 +1743,7 @@ meta_display_handle_xevent (MetaDisplay *display, - } - #endif /* HAVE_XI23 */ - -- if (handle_input_xevent (display, input_event)) -+ if (handle_input_xevent (display, input_event, event->xany.serial)) - { - bypass_gtk = bypass_compositor = TRUE; - goto out; --- -2.4.3 - diff --git a/SOURCES/0001-monitor-config-Consider-external-layout-before-defau.patch b/SOURCES/0001-monitor-config-Consider-external-layout-before-defau.patch index 63c96f3..2527d38 100644 --- a/SOURCES/0001-monitor-config-Consider-external-layout-before-defau.patch +++ b/SOURCES/0001-monitor-config-Consider-external-layout-before-defau.patch @@ -1,4 +1,4 @@ -From c09d160a23cfed81c86be784e17f7d06777430f8 Mon Sep 17 00:00:00 2001 +From d2cc8089a6fd31e302b23ac787d84ff5a3257b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 28 Jan 2016 15:26:33 +0100 Subject: [PATCH] monitor-config: Consider external layout before default @@ -11,14 +11,14 @@ which is not desirable. Instead, base the initial configuration on the existing layout if it passes some sanity checks before falling back to the default linear config. --- - src/backends/meta-monitor-config.c | 75 ++++++++++++++++++++++++++++++-------- - 1 file changed, 59 insertions(+), 16 deletions(-) + src/backends/meta-monitor-config.c | 76 +++++++++++++++++++++++++++++--------- + 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/src/backends/meta-monitor-config.c b/src/backends/meta-monitor-config.c -index 3255490..8f273b3 100644 +index 21e3126f2..492b0ffe1 100644 --- a/src/backends/meta-monitor-config.c +++ b/src/backends/meta-monitor-config.c -@@ -1097,6 +1097,23 @@ init_config_from_preferred_mode (MetaOutputConfig *config, +@@ -1130,6 +1130,23 @@ init_config_from_preferred_mode (MetaOutputConfig *config, config->is_presentation = FALSE; } @@ -36,13 +36,13 @@ index 3255490..8f273b3 100644 + config->transform = output->crtc->transform; + config->is_primary = output->is_primary; + config->is_presentation = output->is_presentation; ++ config->is_underscanning = output->is_underscanning; +} + -+ /* This function handles configuring the outputs when the driver provides a * suggested layout position for each output. This is done in recent versions * of qxl and allows displays to be aligned on the guest in the same order as -@@ -1250,6 +1267,45 @@ extend_stored_config (MetaMonitorConfig *self, +@@ -1368,6 +1385,45 @@ extend_stored_config (MetaMonitorConfig *self, return FALSE; } @@ -88,7 +88,7 @@ index 3255490..8f273b3 100644 static MetaConfiguration * make_default_config (MetaMonitorConfig *self, MetaOutput *outputs, -@@ -1281,6 +1337,9 @@ make_default_config (MetaMonitorConfig *self, +@@ -1399,6 +1455,9 @@ make_default_config (MetaMonitorConfig *self, extend_stored_config (self, outputs, n_outputs, max_width, max_height, ret)) goto check_limits; @@ -98,7 +98,7 @@ index 3255490..8f273b3 100644 make_linear_config (self, outputs, n_outputs, max_width, max_height, ret); check_limits: -@@ -1397,22 +1456,6 @@ meta_monitor_config_make_default (MetaMonitorConfig *self, +@@ -1500,23 +1559,6 @@ meta_monitor_config_make_default (MetaMonitorConfig *self, } } @@ -116,11 +116,12 @@ index 3255490..8f273b3 100644 - config->transform = output->crtc->transform; - config->is_primary = output->is_primary; - config->is_presentation = output->is_presentation; +- config->is_underscanning = output->is_underscanning; -} - void meta_monitor_config_update_current (MetaMonitorConfig *self, MetaMonitorManager *manager) -- -2.7.4 +2.12.0 diff --git a/SOURCES/0001-monitor-manager-Fix-the-max-potential-number-of-logi.patch b/SOURCES/0001-monitor-manager-Fix-the-max-potential-number-of-logi.patch deleted file mode 100644 index 0054482..0000000 --- a/SOURCES/0001-monitor-manager-Fix-the-max-potential-number-of-logi.patch +++ /dev/null @@ -1,36 +0,0 @@ -From f7b298e717f6a891867ad3b2fb105e59d41aae12 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Fri, 3 Jul 2015 18:01:14 +0200 -Subject: [PATCH] monitor-manager: Fix the max potential number of logical - monitors - -The max potential number of logical monitors (i.e. MetaMonitorInfos) -is the number of CRTCs, not the number of outputs. - -In cases where we have more enabled CRTCs than connected outputs we -would end up appending more MetaMonitorInfos to the GArray than the -size it was initialized with which means the array would get -re-allocated rendering invalid some MetaCRTC->logical_monitor pointers -assigned previously and thus ending in crashes later on. - -https://bugzilla.gnome.org/show_bug.cgi?id=751638 ---- - src/backends/meta-monitor-manager.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c -index 0cb2fc7..95d81de 100644 ---- a/src/backends/meta-monitor-manager.c -+++ b/src/backends/meta-monitor-manager.c -@@ -104,7 +104,7 @@ make_logical_config (MetaMonitorManager *manager) - unsigned int i, j; - - monitor_infos = g_array_sized_new (FALSE, TRUE, sizeof (MetaMonitorInfo), -- manager->n_outputs); -+ manager->n_crtcs); - - /* Walk the list of MetaCRTCs, and build a MetaMonitorInfo - for each of them, unless they reference a rectangle that --- -2.5.0 - diff --git a/SOURCES/0001-monitor-manager-xrandr-Be-more-robust-when-reading-X.patch b/SOURCES/0001-monitor-manager-xrandr-Be-more-robust-when-reading-X.patch deleted file mode 100644 index e38dccd..0000000 --- a/SOURCES/0001-monitor-manager-xrandr-Be-more-robust-when-reading-X.patch +++ /dev/null @@ -1,91 +0,0 @@ -From fe1d707a8ca1656063a1b93bf47a78ac20225d7b Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Thu, 15 Oct 2015 19:34:40 +0200 -Subject: [PATCH 1/4] monitor-manager-xrandr: Be more robust when reading - XRROutputInfos - -We might get modes in XRROutputInfos that aren't in the -XRRScreenResources we get earlier. This always seems to be transient, -i.e. when it happens, the X server will usually send us a follow up -RRScreenChangeNotify where we then get a "stable" view of the world -again. - -In any case, when these glitches happen, we end up with NULL pointers -in the MetaOutput->modes array which makes us crash later on. This -patch ensures that doesn't happen. - -https://bugzilla.gnome.org/show_bug.cgi?id=756660 ---- - src/backends/x11/meta-monitor-manager-xrandr.c | 42 ++++++++++++++++++-------- - 1 file changed, 29 insertions(+), 13 deletions(-) - -diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c -index 9c65cab..6653b33 100644 ---- a/src/backends/x11/meta-monitor-manager-xrandr.c -+++ b/src/backends/x11/meta-monitor-manager-xrandr.c -@@ -406,6 +406,32 @@ output_get_suggested_y (MetaMonitorManagerXrandr *manager_xrandr, - return -1; - } - -+static void -+output_get_modes (MetaMonitorManager *manager, -+ MetaOutput *meta_output, -+ XRROutputInfo *output) -+{ -+ guint j, k; -+ guint n_actual_modes; -+ -+ meta_output->modes = g_new0 (MetaMonitorMode *, output->nmode); -+ -+ n_actual_modes = 0; -+ for (j = 0; j < (guint)output->nmode; j++) -+ { -+ for (k = 0; k < manager->n_modes; k++) -+ { -+ if (output->modes[j] == (XID)manager->modes[k].mode_id) -+ { -+ meta_output->modes[n_actual_modes] = &manager->modes[k]; -+ n_actual_modes += 1; -+ break; -+ } -+ } -+ } -+ meta_output->n_modes = n_actual_modes; -+} -+ - static char * - get_xmode_name (XRRModeInfo *xmode) - { -@@ -548,6 +574,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) - MetaOutput *meta_output; - - output = XRRGetOutputInfo (manager_xrandr->xdisplay, resources, resources->outputs[i]); -+ if (!output) -+ continue; - - meta_output = &manager->outputs[n_actual_outputs]; - -@@ -596,19 +624,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) - meta_output->suggested_x = output_get_suggested_x (manager_xrandr, meta_output); - meta_output->suggested_y = output_get_suggested_y (manager_xrandr, meta_output); - -- meta_output->n_modes = output->nmode; -- meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes); -- for (j = 0; j < meta_output->n_modes; j++) -- { -- for (k = 0; k < manager->n_modes; k++) -- { -- if (output->modes[j] == (XID)manager->modes[k].mode_id) -- { -- meta_output->modes[j] = &manager->modes[k]; -- break; -- } -- } -- } -+ output_get_modes (manager, meta_output, output); - meta_output->preferred_mode = meta_output->modes[0]; - - meta_output->n_possible_crtcs = output->ncrtc; --- -2.5.0 - diff --git a/SOURCES/0001-monitor-manager-xrandr-Force-an-update-when-resuming.patch b/SOURCES/0001-monitor-manager-xrandr-Force-an-update-when-resuming.patch new file mode 100644 index 0000000..c81b5bb --- /dev/null +++ b/SOURCES/0001-monitor-manager-xrandr-Force-an-update-when-resuming.patch @@ -0,0 +1,228 @@ +From 677c216fbf52e5cbc1d5f0890ebc1ee9216cfd27 Mon Sep 17 00:00:00 2001 +From: Rui Matos +Date: Sun, 25 Oct 2015 16:14:58 +0100 +Subject: [PATCH] monitor-manager-xrandr: Force an update when resuming from + suspend + +The stack below us isn't as reliable as we'd like and in some cases +doesn't generate RRScreenChangeNotify events when e.g. resuming a +laptop on a dock, meaning that we'd miss newly attached outputs. +--- + src/backends/x11/meta-monitor-manager-xrandr.c | 157 +++++++++++++++++++------ + 1 file changed, 122 insertions(+), 35 deletions(-) + +diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c +index 4a27b3a14..aa3ff76f5 100644 +--- a/src/backends/x11/meta-monitor-manager-xrandr.c ++++ b/src/backends/x11/meta-monitor-manager-xrandr.c +@@ -58,6 +58,11 @@ struct _MetaMonitorManagerXrandr + XRRScreenResources *resources; + int rr_event_base; + int rr_error_base; ++ ++ guint logind_watch_id; ++ guint logind_signal_sub_id; ++ ++ gboolean need_hardware_poll; + gboolean has_randr15; + }; + +@@ -763,8 +768,15 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) + manager->screen_width = WidthOfScreen (screen); + manager->screen_height = HeightOfScreen (screen); + +- resources = XRRGetScreenResourcesCurrent (manager_xrandr->xdisplay, +- DefaultRootWindow (manager_xrandr->xdisplay)); ++ if (manager_xrandr->need_hardware_poll) ++ { ++ resources = XRRGetScreenResources (manager_xrandr->xdisplay, ++ DefaultRootWindow (manager_xrandr->xdisplay)); ++ manager_xrandr->need_hardware_poll = FALSE; ++ } ++ else ++ resources = XRRGetScreenResourcesCurrent (manager_xrandr->xdisplay, ++ DefaultRootWindow (manager_xrandr->xdisplay)); + if (!resources) + return; + +@@ -1414,6 +1426,100 @@ meta_monitor_manager_xrandr_init_monitors(MetaMonitorManagerXrandr *manager_xran + } + #endif + ++static gboolean ++is_xvnc (MetaMonitorManager *manager) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < manager->n_outputs; ++i) ++ if (g_str_has_prefix (manager->outputs[i].name, "VNC-")) ++ return TRUE; ++ ++ return FALSE; ++} ++ ++static void ++meta_monitor_manager_xrandr_update (MetaMonitorManagerXrandr *manager_xrandr) ++{ ++ MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr); ++ gboolean hotplug; ++ unsigned int timestamp; ++ ++ meta_monitor_manager_read_current_config (manager); ++ ++ timestamp = manager_xrandr->resources->timestamp; ++ if (is_xvnc (manager)) ++ timestamp += 100; ++ ++ hotplug = timestamp < manager_xrandr->resources->configTimestamp; ++ if (hotplug) ++ { ++ /* This is a hotplug event, so go ahead and build a new configuration. */ ++ meta_monitor_manager_on_hotplug (manager); ++ } ++ else ++ { ++ /* Something else changed -- tell the world about it. */ ++ meta_monitor_manager_rebuild_derived (manager); ++ } ++} ++ ++static void ++logind_signal_handler (GDBusConnection *connection, ++ const gchar *sender_name, ++ const gchar *object_path, ++ const gchar *interface_name, ++ const gchar *signal_name, ++ GVariant *parameters, ++ gpointer user_data) ++{ ++ MetaMonitorManagerXrandr *manager_xrandr = user_data; ++ gboolean suspending; ++ ++ if (!g_str_equal (signal_name, "PrepareForSleep")) ++ return; ++ ++ g_variant_get (parameters, "(b)", &suspending); ++ if (!suspending) ++ { ++ manager_xrandr->need_hardware_poll = TRUE; ++ meta_monitor_manager_xrandr_update (manager_xrandr); ++ } ++} ++ ++static void ++logind_appeared (GDBusConnection *connection, ++ const gchar *name, ++ const gchar *name_owner, ++ gpointer user_data) ++{ ++ MetaMonitorManagerXrandr *manager_xrandr = user_data; ++ ++ manager_xrandr->logind_signal_sub_id = g_dbus_connection_signal_subscribe (connection, ++ "org.freedesktop.login1", ++ "org.freedesktop.login1.Manager", ++ "PrepareForSleep", ++ "/org/freedesktop/login1", ++ NULL, ++ G_DBUS_SIGNAL_FLAGS_NONE, ++ logind_signal_handler, ++ manager_xrandr, ++ NULL); ++} ++ ++static void ++logind_vanished (GDBusConnection *connection, ++ const gchar *name, ++ gpointer user_data) ++{ ++ MetaMonitorManagerXrandr *manager_xrandr = user_data; ++ ++ if (connection && manager_xrandr->logind_signal_sub_id > 0) ++ g_dbus_connection_signal_unsubscribe (connection, manager_xrandr->logind_signal_sub_id); ++ ++ manager_xrandr->logind_signal_sub_id = 0; ++} ++ + static void + meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr) + { +@@ -1449,6 +1555,15 @@ meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr) + meta_monitor_manager_xrandr_init_monitors (manager_xrandr); + #endif + } ++ ++ manager_xrandr->logind_watch_id = g_bus_watch_name (G_BUS_TYPE_SYSTEM, ++ "org.freedesktop.login1", ++ G_BUS_NAME_WATCHER_FLAGS_NONE, ++ logind_appeared, ++ logind_vanished, ++ manager_xrandr, ++ NULL); ++ manager_xrandr->need_hardware_poll = TRUE; + } + + static void +@@ -1460,6 +1575,10 @@ meta_monitor_manager_xrandr_finalize (GObject *object) + XRRFreeScreenResources (manager_xrandr->resources); + manager_xrandr->resources = NULL; + ++ if (manager_xrandr->logind_watch_id > 0) ++ g_bus_unwatch_name (manager_xrandr->logind_watch_id); ++ manager_xrandr->logind_watch_id = 0; ++ + G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->finalize (object); + } + +@@ -1484,48 +1603,16 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass) + #endif + } + +-static gboolean +-is_xvnc (MetaMonitorManager *manager) +-{ +- unsigned int i; +- +- for (i = 0; i < manager->n_outputs; ++i) +- if (g_str_has_prefix (manager->outputs[i].name, "VNC-")) +- return TRUE; +- +- return FALSE; +-} +- + gboolean + meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xrandr, + XEvent *event) + { +- MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr); +- gboolean hotplug; +- unsigned int timestamp; +- + if ((event->type - manager_xrandr->rr_event_base) != RRScreenChangeNotify) + return FALSE; + + XRRUpdateConfiguration (event); + +- meta_monitor_manager_read_current_config (manager); +- +- timestamp = manager_xrandr->resources->timestamp; +- if (is_xvnc (manager)) +- timestamp += 100; +- +- hotplug = timestamp < manager_xrandr->resources->configTimestamp; +- if (hotplug) +- { +- /* This is a hotplug event, so go ahead and build a new configuration. */ +- meta_monitor_manager_on_hotplug (manager); +- } +- else +- { +- /* Something else changed -- tell the world about it. */ +- meta_monitor_manager_rebuild_derived (manager); +- } ++ meta_monitor_manager_xrandr_update (manager_xrandr); + + return TRUE; + } +-- +2.12.0 + diff --git a/SOURCES/0001-monitor-manager-xrandr-Use-CurrentTime-when-applying.patch b/SOURCES/0001-monitor-manager-xrandr-Use-CurrentTime-when-applying.patch deleted file mode 100644 index 4366be1..0000000 --- a/SOURCES/0001-monitor-manager-xrandr-Use-CurrentTime-when-applying.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 016b8f5b4ac4631538061e29d7c3c4adb2122166 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Thu, 16 Oct 2014 13:28:46 +0200 -Subject: [PATCH] monitor-manager-xrandr: Use CurrentTime when applying - configurations - -This is what the xrandr CLI tool does and will allow us to do less -work when we get RRScreenChangeNotify events. - -https://bugzilla.gnome.org/show_bug.cgi?id=738630 ---- - src/backends/x11/meta-monitor-manager-xrandr.c | 8 +++----- - 1 file changed, 3 insertions(+), 5 deletions(-) - -diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c -index 4f2590e..a5251fe 100644 ---- a/src/backends/x11/meta-monitor-manager-xrandr.c -+++ b/src/backends/x11/meta-monitor-manager-xrandr.c -@@ -57,7 +57,6 @@ struct _MetaMonitorManagerXrandr - - Display *xdisplay; - XRRScreenResources *resources; -- int time; - int rr_event_base; - int rr_error_base; - }; -@@ -413,7 +412,6 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) - return; - - manager_xrandr->resources = resources; -- manager_xrandr->time = resources->configTimestamp; - manager->n_outputs = resources->noutput; - manager->n_crtcs = resources->ncrtc; - manager->n_modes = resources->nmode; -@@ -747,7 +745,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, - XRRSetCrtcConfig (manager_xrandr->xdisplay, - manager_xrandr->resources, - (XID)crtc->crtc_id, -- manager_xrandr->time, -+ CurrentTime, - 0, 0, - None, - RR_Rotate_0, -@@ -777,7 +775,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, - XRRSetCrtcConfig (manager_xrandr->xdisplay, - manager_xrandr->resources, - (XID)crtc->crtc_id, -- manager_xrandr->time, -+ CurrentTime, - 0, 0, - None, - RR_Rotate_0, -@@ -860,7 +858,7 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager, - ok = XRRSetCrtcConfig (manager_xrandr->xdisplay, - manager_xrandr->resources, - (XID)crtc->crtc_id, -- manager_xrandr->time, -+ CurrentTime, - crtc_info->x, crtc_info->y, - (XID)mode->mode_id, - meta_monitor_transform_to_xrandr (crtc_info->transform), --- -2.4.3 - diff --git a/SOURCES/0001-monitor-manager-xrandr-Work-around-spurious-hotplugs.patch b/SOURCES/0001-monitor-manager-xrandr-Work-around-spurious-hotplugs.patch index 99b89bd..f77a18f 100644 --- a/SOURCES/0001-monitor-manager-xrandr-Work-around-spurious-hotplugs.patch +++ b/SOURCES/0001-monitor-manager-xrandr-Work-around-spurious-hotplugs.patch @@ -1,4 +1,4 @@ -From 073a328a3031faa82d388805c0a6890d4de001df Mon Sep 17 00:00:00 2001 +From 257c8e8d3b7103973dfdc2665d210c63496be457 Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Tue, 6 Oct 2015 21:16:18 +0200 Subject: [PATCH] monitor-manager-xrandr: Work around spurious hotplugs on Xvnc @@ -13,11 +13,11 @@ hotplug. 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c -index 4c1b16c..190aeac 100644 +index b82120af9..4a27b3a14 100644 --- a/src/backends/x11/meta-monitor-manager-xrandr.c +++ b/src/backends/x11/meta-monitor-manager-xrandr.c -@@ -1064,6 +1064,18 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass) - manager_class->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma; +@@ -1484,12 +1484,25 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass) + #endif } +static gboolean @@ -35,27 +35,26 @@ index 4c1b16c..190aeac 100644 gboolean meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xrandr, XEvent *event) -@@ -1075,6 +1087,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra - unsigned int n_old_outputs, n_old_modes; - gboolean new_config; - gboolean applied_config = FALSE; + { + MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr); + gboolean hotplug; + unsigned int timestamp; if ((event->type - manager_xrandr->rr_event_base) != RRScreenChangeNotify) return FALSE; -@@ -1091,7 +1104,11 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra - manager->serial++; - meta_monitor_manager_xrandr_read_current (manager); +@@ -1498,7 +1511,11 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra -- new_config = manager_xrandr->resources->timestamp >= manager_xrandr->resources->configTimestamp; + meta_monitor_manager_read_current_config (manager); + +- hotplug = manager_xrandr->resources->timestamp < manager_xrandr->resources->configTimestamp; + timestamp = manager_xrandr->resources->timestamp; + if (is_xvnc (manager)) + timestamp += 100; + -+ new_config = timestamp >= manager_xrandr->resources->configTimestamp; - - /* If this is the X server telling us we set a new configuration, - * we can simply short-cut to rebuilding our logical configuration. ++ hotplug = timestamp < manager_xrandr->resources->configTimestamp; + if (hotplug) + { + /* This is a hotplug event, so go ahead and build a new configuration. */ -- -2.4.3 +2.12.0 diff --git a/SOURCES/0001-screen-Remove-stray-assert.patch b/SOURCES/0001-screen-Remove-stray-assert.patch new file mode 100644 index 0000000..221f9ef --- /dev/null +++ b/SOURCES/0001-screen-Remove-stray-assert.patch @@ -0,0 +1,41 @@ +From fd41db64169f6e0b36d56e054967cb406e32fa74 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Mon, 26 Jun 2017 17:56:36 +0200 +Subject: [PATCH] screen: Remove stray assert + +When the number of (static) workspaces decreases, we relocate windows +from extra workspaces before removing them. As removing a non-empty +workspace is not allowed, we assert that it doesn't contain any windows +before removing it. + +However that assert is + + - pointless, because meta_workspace_remove() already asserts that + the workspace is empty + + - wrong, because even empty workspaces contain windows that are set + to show on all workspaces + +Simply drop the assert to avoid a crash when trying to remove a workspace +while on-all-workspaces windows are present. + +https://bugzilla.gnome.org/show_bug.cgi?id=784223 +--- + src/core/screen.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/src/core/screen.c b/src/core/screen.c +index d6b5eac53..c6aa9e194 100644 +--- a/src/core/screen.c ++++ b/src/core/screen.c +@@ -1260,7 +1260,6 @@ update_num_workspaces (MetaScreen *screen, + { + MetaWorkspace *w = l->data; + +- g_assert (w->windows == NULL); + meta_workspace_remove (w); + } + +-- +2.13.0 + diff --git a/SOURCES/0001-session-Fix-crash-when-saving-sticky-windows.patch b/SOURCES/0001-session-Fix-crash-when-saving-sticky-windows.patch deleted file mode 100644 index 1ac4797..0000000 --- a/SOURCES/0001-session-Fix-crash-when-saving-sticky-windows.patch +++ /dev/null @@ -1,55 +0,0 @@ -From a95ae4d178e9dba911c01de53f372f18be34df47 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Thu, 15 Oct 2015 15:35:33 +0200 -Subject: [PATCH] session: Fix crash when saving sticky windows - -Since commit 527c53a2a058, window->workspace is set to %NULL when -the window is sticky (see comment[0]), so don't try to save the -workspace index in that case. - -[0] https://git.gnome.org/browse/mutter/tree/src/core/window.c#n4307 - -https://bugzilla.gnome.org/show_bug.cgi?id=756642 ---- - src/x11/session.c | 18 +++++++++--------- - 1 file changed, 9 insertions(+), 9 deletions(-) - -diff --git a/src/x11/session.c b/src/x11/session.c -index 6f68729..13cf764 100644 ---- a/src/x11/session.c -+++ b/src/x11/session.c -@@ -946,7 +946,15 @@ save_state (void) - - /* Sticky */ - if (window->on_all_workspaces_requested) -- fputs (" \n", outfile); -+ { -+ fputs (" \n", outfile); -+ } else { -+ int n; -+ n = meta_workspace_index (window->workspace); -+ fprintf (outfile, -+ " \n", n); -+ } -+ - - /* Minimized */ - if (window->minimized) -@@ -963,14 +971,6 @@ save_state (void) - window->saved_rect.height); - } - -- /* Workspaces we're on */ -- { -- int n; -- n = meta_workspace_index (window->workspace); -- fprintf (outfile, -- " \n", n); -- } -- - /* Gravity */ - { - int x, y, w, h; --- -2.5.0 - diff --git a/SOURCES/0001-stack-Don-t-prefer-windows-in-the-same-group-as-not_.patch b/SOURCES/0001-stack-Don-t-prefer-windows-in-the-same-group-as-not_.patch deleted file mode 100644 index 542eb04..0000000 --- a/SOURCES/0001-stack-Don-t-prefer-windows-in-the-same-group-as-not_.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 8c97b4bc745dea0d15fcaf0e9e08093e172c882d Mon Sep 17 00:00:00 2001 -From: "Jasper St. Pierre" -Date: Sun, 5 Jul 2015 14:31:17 -0700 -Subject: [PATCH] stack: Don't prefer windows in the same group as not_this_one - -The only time we ever execute this code is when we're minimizing or -hiding a window, in which case we should respect stacking order. - -This fixes weird "bugs" where windows from the same app magically pop up -over other windows. ---- - src/core/stack.c | 43 ++++--------------------------------------- - 1 file changed, 4 insertions(+), 39 deletions(-) - -diff --git a/src/core/stack.c b/src/core/stack.c -index f618ef2..32e252e 100644 ---- a/src/core/stack.c -+++ b/src/core/stack.c -@@ -1238,24 +1238,10 @@ get_default_focus_window (MetaStack *stack, - { - /* Find the topmost, focusable, mapped, window. - * not_this_one is being unfocused or going away, so exclude it. -- * Also, prefer to focus transient parent of not_this_one, -- * or top window in same group as not_this_one. - */ - -- MetaWindow *transient_parent; -- MetaWindow *topmost_in_group; -- MetaWindow *topmost_overall; -- MetaGroup *not_this_one_group; - GList *l; - -- transient_parent = NULL; -- topmost_in_group = NULL; -- topmost_overall = NULL; -- if (not_this_one) -- not_this_one_group = meta_window_get_group (not_this_one); -- else -- not_this_one_group = NULL; -- - stack_ensure_sorted (stack); - - /* top of this layer is at the front of the list */ -@@ -1284,34 +1270,13 @@ get_default_focus_window (MetaStack *stack, - if (must_be_at_point && !window_contains_point (window, root_x, root_y)) - continue; - -- if (not_this_one != NULL) -- { -- if (transient_parent == NULL && -- meta_window_get_transient_for (not_this_one) == window) -- transient_parent = window; -- -- if (topmost_in_group == NULL && -- not_this_one_group != NULL && -- not_this_one_group == meta_window_get_group (window)) -- topmost_in_group = window; -- } -- -- if (topmost_overall == NULL && window->type != META_WINDOW_DOCK) -- topmost_overall = window; -+ if (window->type == META_WINDOW_DOCK) -+ continue; - -- /* We could try to bail out early here for efficiency in -- * some cases, but it's just not worth the code. -- */ -+ return window; - } - -- if (transient_parent) -- return transient_parent; -- else if (topmost_in_group) -- return topmost_in_group; -- else if (topmost_overall) -- return topmost_overall; -- else -- return NULL; -+ return NULL; - } - - MetaWindow* --- -2.7.4 - diff --git a/SOURCES/0001-stack-Don-t-try-to-focus-hidden-windows.patch b/SOURCES/0001-stack-Don-t-try-to-focus-hidden-windows.patch deleted file mode 100644 index ae441e2..0000000 --- a/SOURCES/0001-stack-Don-t-try-to-focus-hidden-windows.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 06cd7aae14cb966875d22173e653e1bb8abac747 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Mon, 29 Jun 2015 20:23:42 +0200 -Subject: [PATCH] stack: Don't try to focus hidden windows - -A window may be hidden even if not minimized itself, for instance -when an ancestor is minimized. As meta_window_focus() will refuse -to actually focus the window in that case, don't pick it in the first -place. - -https://bugzilla.gnome.org/show_bug.cgi?id=751715 ---- - src/core/stack.c | 5 +---- - 1 file changed, 1 insertion(+), 4 deletions(-) - -diff --git a/src/core/stack.c b/src/core/stack.c -index 037e878..f618ef2 100644 ---- a/src/core/stack.c -+++ b/src/core/stack.c -@@ -1272,16 +1272,13 @@ get_default_focus_window (MetaStack *stack, - if (window->unmaps_pending > 0) - continue; - -- if (window->minimized) -- continue; -- - if (window->unmanaging) - continue; - - if (!(window->input || window->take_focus)) - continue; - -- if (workspace != NULL && !meta_window_located_on_workspace (window, workspace)) -+ if (!meta_window_should_be_showing (window)) - continue; - - if (must_be_at_point && !window_contains_point (window, root_x, root_y)) --- -2.4.3 - diff --git a/SOURCES/0001-stack-tracker-Keep-override-redirect-windows-on-top.patch b/SOURCES/0001-stack-tracker-Keep-override-redirect-windows-on-top.patch new file mode 100644 index 0000000..3ee1d5d --- /dev/null +++ b/SOURCES/0001-stack-tracker-Keep-override-redirect-windows-on-top.patch @@ -0,0 +1,83 @@ +From 245a3c2e12b4aad2e752675f82be9517235d5498 Mon Sep 17 00:00:00 2001 +From: Rui Matos +Date: Fri, 19 May 2017 17:11:19 +0200 +Subject: [PATCH] stack-tracker: Keep override redirect windows on top + +Since commit 6b5cf2e, we keep override redirect windows on a layer +above regular windows in the clutter actor scene graph. In the X +server, and thus for input purposes, these windows might end up being +stacked below regular windows though, e.g. because a new regular +window is mapped after an OR window. + +Fix this disconnect by re-stacking OR windows on top when syncing the +window stack with the compositor. + +https://bugzilla.gnome.org/show_bug.cgi?id=780485 +--- + src/core/stack-tracker.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +diff --git a/src/core/stack-tracker.c b/src/core/stack-tracker.c +index a76b42cbf..82afd644a 100644 +--- a/src/core/stack-tracker.c ++++ b/src/core/stack-tracker.c +@@ -168,6 +168,9 @@ struct _MetaStackTracker + guint sync_stack_later; + }; + ++static void ++meta_stack_tracker_keep_override_redirect_on_top (MetaStackTracker *tracker); ++ + static inline const char * + get_window_desc (MetaStackTracker *tracker, + guint64 window) +@@ -835,6 +838,8 @@ meta_stack_tracker_sync_stack (MetaStackTracker *tracker) + tracker->sync_stack_later = 0; + } + ++ meta_stack_tracker_keep_override_redirect_on_top (tracker); ++ + meta_stack_tracker_get_stack (tracker, &windows, &n_windows); + + meta_windows = NULL; +@@ -1040,6 +1045,37 @@ meta_stack_tracker_lower (MetaStackTracker *tracker, + meta_stack_tracker_raise_above (tracker, window, None); + } + ++static void ++meta_stack_tracker_keep_override_redirect_on_top (MetaStackTracker *tracker) ++{ ++ MetaWindow *window; ++ guint64 *stack; ++ int n_windows, i; ++ int topmost_non_or; ++ ++ meta_stack_tracker_get_stack (tracker, &stack, &n_windows); ++ ++ for (i = n_windows - 1; i >= 0; i--) ++ { ++ window = meta_display_lookup_stack_id (tracker->screen->display, stack[i]); ++ if (window && window->layer != META_LAYER_OVERRIDE_REDIRECT) ++ break; ++ } ++ ++ topmost_non_or = i; ++ ++ for (i -= 1; i >= 0; i--) ++ { ++ window = meta_display_lookup_stack_id (tracker->screen->display, stack[i]); ++ if (window && window->layer == META_LAYER_OVERRIDE_REDIRECT) ++ { ++ meta_stack_tracker_raise_above (tracker, stack[i], stack[topmost_non_or]); ++ meta_stack_tracker_get_stack (tracker, &stack, &n_windows); ++ topmost_non_or -= 1; ++ } ++ } ++} ++ + void + meta_stack_tracker_restack_managed (MetaStackTracker *tracker, + const guint64 *managed, +-- +2.13.0 + diff --git a/SOURCES/0001-surface-actor-Keep-track-of-ignored-damage.patch b/SOURCES/0001-surface-actor-Keep-track-of-ignored-damage.patch deleted file mode 100644 index ac00e89..0000000 --- a/SOURCES/0001-surface-actor-Keep-track-of-ignored-damage.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 8a951218911168ab386642769b98de42f177a279 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Fri, 17 Jun 2016 17:45:20 +0200 -Subject: [PATCH] surface-actor: Keep track of ignored damage - -We ignore all damage while a surface is frozen and queue a full -update instead once it's thawed. While not super efficient, this -isn't overly bad for the intended case of catching up with any -updates that happened during a compositor effect. However when -extended frame sync is used, surfaces are also frozen while the -client is drawing a frame, in which case the current behavior is -pretty damaging (pun intended), as we end up redrawing the entire -window each frame. To address this, keep track of the actual damage -we ignore and apply it when the surface is thawed. - -https://bugzilla.gnome.org/show_bug.cgi?id=767798 ---- - src/compositor/meta-surface-actor.c | 33 +++++++++++++++++++++------------ - 1 file changed, 21 insertions(+), 12 deletions(-) - -diff --git a/src/compositor/meta-surface-actor.c b/src/compositor/meta-surface-actor.c -index bb85478..5844b37 100644 ---- a/src/compositor/meta-surface-actor.c -+++ b/src/compositor/meta-surface-actor.c -@@ -25,7 +25,7 @@ struct _MetaSurfaceActorPrivate - cairo_region_t *input_region; - - /* Freeze/thaw accounting */ -- guint needs_damage_all : 1; -+ cairo_region_t *pending_damage; - guint frozen : 1; - }; - -@@ -247,9 +247,8 @@ meta_surface_actor_process_damage (MetaSurfaceActor *self, - * here on the off chance that this will stop the corresponding - * texture_from_pixmap from being update. - * -- * needs_damage_all tracks that some unknown damage happened while the -- * window was frozen so that when the window becomes unfrozen we can -- * issue a full window update to cover any lost damage. -+ * pending_damage tracks any damage that happened while the window was -+ * frozen so that when can apply it when the window becomes unfrozen. - * - * It should be noted that this is an unreliable mechanism since it's - * quite likely that drivers will aim to provide a zero-copy -@@ -257,7 +256,12 @@ meta_surface_actor_process_damage (MetaSurfaceActor *self, - * any drawing done to the window is always immediately reflected in the - * texture regardless of damage event handling. - */ -- priv->needs_damage_all = TRUE; -+ cairo_rectangle_int_t rect = { .x = x, .y = y, .width = width, .height = height }; -+ -+ if (!priv->pending_damage) -+ priv->pending_damage = cairo_region_create_rectangle (&rect); -+ else -+ cairo_region_union_rectangle (priv->pending_damage, &rect); - return; - } - -@@ -318,16 +322,21 @@ meta_surface_actor_set_frozen (MetaSurfaceActor *self, - - priv->frozen = frozen; - -- if (!frozen && priv->needs_damage_all) -+ if (!frozen && priv->pending_damage) - { -+ int i, n_rects = cairo_region_num_rectangles (priv->pending_damage); -+ cairo_rectangle_int_t rect; -+ - /* Since we ignore damage events while a window is frozen for certain effects -- * we may need to issue an update_area() covering the whole pixmap if we -- * don't know what real damage has happened. */ -+ * we need to apply the tracked damage now. */ - -- meta_surface_actor_process_damage (self, 0, 0, -- clutter_actor_get_width (CLUTTER_ACTOR (priv->texture)), -- clutter_actor_get_height (CLUTTER_ACTOR (priv->texture))); -- priv->needs_damage_all = FALSE; -+ for (i = 0; i < n_rects; i++) -+ { -+ cairo_region_get_rectangle (priv->pending_damage, i, &rect); -+ meta_surface_actor_process_damage (self, rect.x, rect.y, -+ rect.width, rect.height); -+ } -+ g_clear_pointer (&priv->pending_damage, cairo_region_destroy); - } - } - --- -2.7.4 - diff --git a/SOURCES/0001-surface-actor-x11-Make-sure-to-set-a-size-when-unred.patch b/SOURCES/0001-surface-actor-x11-Make-sure-to-set-a-size-when-unred.patch deleted file mode 100644 index f96bea3..0000000 --- a/SOURCES/0001-surface-actor-x11-Make-sure-to-set-a-size-when-unred.patch +++ /dev/null @@ -1,159 +0,0 @@ -From 75776b869cfd533335610908f36297114ca24a86 Mon Sep 17 00:00:00 2001 -From: "Jasper St. Pierre" -Date: Tue, 23 Jun 2015 16:23:45 -0700 -Subject: [PATCH] surface-actor-x11: Make sure to set a size when unredirected - -When we're unredirected, we don't have a pixmap, and thus our allocation -becomes 0x0. So when events come in, they pass right through our actor, -going to the one underneath in the stack. - -Fix this by having a fallback size on the shaped texture actor when -we're unredirected, causing it to always have a valid allocation. - -This fixes clicking on stuff in sloppy / mouse mode focus. ---- - src/compositor/meta-shaped-texture-private.h | 3 ++ - src/compositor/meta-shaped-texture.c | 50 +++++++++++++++++++++++++--- - src/compositor/meta-surface-actor-x11.c | 2 ++ - 3 files changed, 50 insertions(+), 5 deletions(-) - -diff --git a/src/compositor/meta-shaped-texture-private.h b/src/compositor/meta-shaped-texture-private.h -index 4ee8027..21c6335 100644 ---- a/src/compositor/meta-shaped-texture-private.h -+++ b/src/compositor/meta-shaped-texture-private.h -@@ -32,6 +32,9 @@ - ClutterActor *meta_shaped_texture_new (void); - void meta_shaped_texture_set_texture (MetaShapedTexture *stex, - CoglTexture *texture); -+void meta_shaped_texture_set_fallback_size (MetaShapedTexture *stex, -+ guint fallback_width, -+ guint fallback_height); - gboolean meta_shaped_texture_is_obscured (MetaShapedTexture *self); - - #endif -diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c -index 163c5e6..e2d6060 100644 ---- a/src/compositor/meta-shaped-texture.c -+++ b/src/compositor/meta-shaped-texture.c -@@ -86,6 +86,7 @@ struct _MetaShapedTexturePrivate - cairo_region_t *unobscured_region; - - guint tex_width, tex_height; -+ guint fallback_width, fallback_height; - - guint create_mipmaps : 1; - }; -@@ -136,7 +137,23 @@ set_unobscured_region (MetaShapedTexture *self, - g_clear_pointer (&priv->unobscured_region, (GDestroyNotify) cairo_region_destroy); - if (unobscured_region) - { -- cairo_rectangle_int_t bounds = { 0, 0, priv->tex_width, priv->tex_height }; -+ cairo_rectangle_int_t bounds; -+ guint width, height; -+ -+ if (priv->texture) -+ { -+ width = priv->tex_width; -+ height = priv->tex_height; -+ } -+ else -+ { -+ width = priv->fallback_width; -+ height = priv->fallback_height; -+ } -+ -+ bounds.x = bounds.y = 0; -+ bounds.width = width; -+ bounds.height = height; - priv->unobscured_region = cairo_region_copy (unobscured_region); - cairo_region_intersect_rectangle (priv->unobscured_region, &bounds); - } -@@ -499,16 +516,22 @@ meta_shaped_texture_get_preferred_width (ClutterActor *self, - gfloat *natural_width_p) - { - MetaShapedTexturePrivate *priv; -+ guint width; - - g_return_if_fail (META_IS_SHAPED_TEXTURE (self)); - - priv = META_SHAPED_TEXTURE (self)->priv; - -+ if (priv->texture) -+ width = priv->tex_width; -+ else -+ width = priv->fallback_width; -+ - if (min_width_p) -- *min_width_p = priv->tex_width; -+ *min_width_p = width; - - if (natural_width_p) -- *natural_width_p = priv->tex_width; -+ *natural_width_p = width; - } - - static void -@@ -518,16 +541,22 @@ meta_shaped_texture_get_preferred_height (ClutterActor *self, - gfloat *natural_height_p) - { - MetaShapedTexturePrivate *priv; -+ guint height; - - g_return_if_fail (META_IS_SHAPED_TEXTURE (self)); - - priv = META_SHAPED_TEXTURE (self)->priv; - -+ if (priv->texture) -+ height = priv->tex_height; -+ else -+ height = priv->fallback_height; -+ - if (min_height_p) -- *min_height_p = priv->tex_height; -+ *min_height_p = height; - - if (natural_height_p) -- *natural_height_p = priv->tex_height; -+ *natural_height_p = height; - } - - static cairo_region_t * -@@ -860,6 +889,17 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex, - return surface; - } - -+void -+meta_shaped_texture_set_fallback_size (MetaShapedTexture *self, -+ guint fallback_width, -+ guint fallback_height) -+{ -+ MetaShapedTexturePrivate *priv = self->priv; -+ -+ priv->fallback_width = fallback_width; -+ priv->fallback_height = fallback_height; -+} -+ - static void - meta_shaped_texture_cull_out (MetaCullable *cullable, - cairo_region_t *unobscured_region, -diff --git a/src/compositor/meta-surface-actor-x11.c b/src/compositor/meta-surface-actor-x11.c -index 4aa7ecd..b50b8f2 100644 ---- a/src/compositor/meta-surface-actor-x11.c -+++ b/src/compositor/meta-surface-actor-x11.c -@@ -416,6 +416,7 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self, - int width, int height) - { - MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); -+ MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); - - if (priv->last_width == width && - priv->last_height == height) -@@ -424,4 +425,5 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self, - priv->size_changed = TRUE; - priv->last_width = width; - priv->last_height = height; -+ meta_shaped_texture_set_fallback_size (stex, width, height); - } --- -2.5.0 - diff --git a/SOURCES/0001-wayland-xdg-shell-Handle-the-wl_output-on-the-set_fu.patch b/SOURCES/0001-wayland-xdg-shell-Handle-the-wl_output-on-the-set_fu.patch new file mode 100644 index 0000000..5ef1077 --- /dev/null +++ b/SOURCES/0001-wayland-xdg-shell-Handle-the-wl_output-on-the-set_fu.patch @@ -0,0 +1,42 @@ +From 4ee272a5a88351a03619deae4e5dd4ab16f32b07 Mon Sep 17 00:00:00 2001 +From: Rui Matos +Date: Wed, 2 Nov 2016 17:55:01 +0100 +Subject: [PATCH] wayland-xdg-shell: Handle the wl_output on the set_fullscreen + request + +This makes us fullscreen wayland windows on the requested monitor. + +https://bugzilla.gnome.org/show_bug.cgi?id=772525 +--- + src/wayland/meta-wayland-xdg-shell.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c +index 450acda..e1195c7 100644 +--- a/src/wayland/meta-wayland-xdg-shell.c ++++ b/src/wayland/meta-wayland-xdg-shell.c +@@ -27,6 +27,7 @@ + + #include "core/window-private.h" + #include "wayland/meta-wayland.h" ++#include "wayland/meta-wayland-outputs.h" + #include "wayland/meta-wayland-popup.h" + #include "wayland/meta-wayland-private.h" + #include "wayland/meta-wayland-seat.h" +@@ -363,6 +364,13 @@ xdg_toplevel_set_fullscreen (struct wl_client *client, + { + MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource); + ++ if (output_resource) ++ { ++ MetaWaylandOutput *output = wl_resource_get_user_data (output_resource); ++ if (output) ++ meta_window_move_to_monitor (surface->window, output->monitor_info->number); ++ } ++ + meta_window_make_fullscreen (surface->window); + } + +-- +2.9.3 + diff --git a/SOURCES/0001-window-Remove-fullscreen_after_placement-special-cas.patch b/SOURCES/0001-window-Remove-fullscreen_after_placement-special-cas.patch deleted file mode 100644 index 36affe5..0000000 --- a/SOURCES/0001-window-Remove-fullscreen_after_placement-special-cas.patch +++ /dev/null @@ -1,111 +0,0 @@ -From 5d53aacdae7666887c5776888974db3973278a5e Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Wed, 29 Jul 2015 19:02:48 +0200 -Subject: [PATCH] window: Remove fullscreen_after_placement special case - -This was introduced in commit c6793d477a324f857d31d0704f84ed9de0f1d680 -to prevent window self-maximisation. It turns out that that bug seems -to have been fixed meanwhile in a different way since the reproducer -in https://bugzilla.gnome.org/show_bug.cgi?id=461927#c37 now works -fine with this special handling removed. - -In fact, failing to set window->fullscreen immediately when loading -the initial set of X properties causes us to create a UI frame for a -window that sets _NET_WM_STATE_FULLSCREEN. - -This, in turn, might cause the fullscreen constrain code to fail if -the window also sets min_width/min_height size hints to be the monitor -size since the UI frame size added to those makes the rectangle too -big to fit the monitor. If the window doesn't set these hints, we -fullscreen it but the window will get sized such that the UI frame is -taken into account while it really shouldn't (see the reproducer -above). - -https://bugzilla.gnome.org/show_bug.cgi?id=753020 ---- - src/core/constraints.c | 16 +++------------- - src/core/window-private.h | 3 --- - src/core/window.c | 1 - - src/x11/window-props.c | 5 ++++- - 4 files changed, 7 insertions(+), 18 deletions(-) - -diff --git a/src/core/constraints.c b/src/core/constraints.c -index 1cff417..46e524f 100644 ---- a/src/core/constraints.c -+++ b/src/core/constraints.c -@@ -508,11 +508,10 @@ place_window_if_needed(MetaWindow *window, - if (window->placed || did_placement) - { - if (window->maximize_horizontally_after_placement || -- window->maximize_vertically_after_placement || -- window->fullscreen_after_placement) -+ window->maximize_vertically_after_placement) - { -- /* define a sane saved_rect so that the user can unmaximize or -- * make unfullscreen to something reasonable. -+ /* define a sane saved_rect so that the user can unmaximize to -+ * something reasonable. - */ - if (info->current.width >= info->work_area_monitor.width) - { -@@ -540,15 +539,6 @@ place_window_if_needed(MetaWindow *window, - (window->maximize_vertically_after_placement ? - META_MAXIMIZE_VERTICAL : 0), &info->current); - -- if (window->fullscreen_after_placement) -- { -- window->saved_rect = info->current; -- window->fullscreen = TRUE; -- window->fullscreen_after_placement = FALSE; -- -- g_object_notify (G_OBJECT (window), "fullscreen"); -- } -- - window->maximize_horizontally_after_placement = FALSE; - window->maximize_vertically_after_placement = FALSE; - } -diff --git a/src/core/window-private.h b/src/core/window-private.h -index 713acd3..9f98739 100644 ---- a/src/core/window-private.h -+++ b/src/core/window-private.h -@@ -174,9 +174,6 @@ struct _MetaWindow - /* Whether the window is marked as urgent */ - guint urgent : 1; - -- /* Whether we have to fullscreen after placement */ -- guint fullscreen_after_placement : 1; -- - /* Area to cover when in fullscreen mode. If _NET_WM_FULLSCREEN_MONITORS has - * been overridden (via a client message), the window will cover the union of - * these monitors. If not, this is the single monitor which the window's -diff --git a/src/core/window.c b/src/core/window.c -index 2e82741..9e2ebf5 100644 ---- a/src/core/window.c -+++ b/src/core/window.c -@@ -860,7 +860,6 @@ _meta_window_shared_new (MetaDisplay *display, - window->maximize_vertically_after_placement = FALSE; - window->minimize_after_placement = FALSE; - window->fullscreen = FALSE; -- window->fullscreen_after_placement = FALSE; - window->fullscreen_monitors[0] = -1; - window->require_fully_onscreen = TRUE; - window->require_on_single_monitor = TRUE; -diff --git a/src/x11/window-props.c b/src/x11/window-props.c -index 3164985..0851f22 100644 ---- a/src/x11/window-props.c -+++ b/src/x11/window-props.c -@@ -819,7 +819,10 @@ reload_net_wm_state (MetaWindow *window, - else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SKIP_PAGER) - priv->wm_state_skip_pager = TRUE; - else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_FULLSCREEN) -- window->fullscreen_after_placement = TRUE; -+ { -+ window->fullscreen = TRUE; -+ g_object_notify (G_OBJECT (window), "fullscreen"); -+ } - else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_ABOVE) - window->wm_state_above = TRUE; - else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_BELOW) --- -2.4.3 - diff --git a/SOURCES/0001-window-actor-Make-sync_visibility-public.patch b/SOURCES/0001-window-actor-Make-sync_visibility-public.patch deleted file mode 100644 index 82f2bfd..0000000 --- a/SOURCES/0001-window-actor-Make-sync_visibility-public.patch +++ /dev/null @@ -1,42 +0,0 @@ -From adc2d9db178edf17c4f2f289153112ce4a8d2400 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Thu, 15 Sep 2016 15:10:18 +0200 -Subject: [PATCH] window-actor: Make sync_visibility() public - -When we mess with a window actor's visibility from the shell side -(yes, I know :-( ), we should at least restore the proper visibility -when we're done with it ... - -https://bugzilla.gnome.org/show_bug.cgi?id=771536 ---- - src/compositor/meta-window-actor-private.h | 1 - - src/meta/meta-window-actor.h | 1 + - 2 files changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h -index fe72dce..dcf5823 100644 ---- a/src/compositor/meta-window-actor-private.h -+++ b/src/compositor/meta-window-actor-private.h -@@ -46,7 +46,6 @@ void meta_window_actor_set_unredirected (MetaWindowActor *self, - gboolean meta_window_actor_effect_in_progress (MetaWindowActor *self); - void meta_window_actor_sync_actor_geometry (MetaWindowActor *self, - gboolean did_placement); --void meta_window_actor_sync_visibility (MetaWindowActor *self); - void meta_window_actor_update_shape (MetaWindowActor *self); - void meta_window_actor_update_opacity (MetaWindowActor *self); - void meta_window_actor_mapped (MetaWindowActor *self); -diff --git a/src/meta/meta-window-actor.h b/src/meta/meta-window-actor.h -index 2055ca8..c18c7c0 100644 ---- a/src/meta/meta-window-actor.h -+++ b/src/meta/meta-window-actor.h -@@ -60,6 +60,7 @@ GType meta_window_actor_get_type (void); - Window meta_window_actor_get_x_window (MetaWindowActor *self); - MetaWindow * meta_window_actor_get_meta_window (MetaWindowActor *self); - ClutterActor * meta_window_actor_get_texture (MetaWindowActor *self); -+void meta_window_actor_sync_visibility (MetaWindowActor *self); - gboolean meta_window_actor_is_destroyed (MetaWindowActor *self); - - #endif /* META_WINDOW_ACTOR_H */ --- -2.9.3 - diff --git a/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch b/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch new file mode 100644 index 0000000..fad3a5f --- /dev/null +++ b/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch @@ -0,0 +1,35 @@ +From 4cd334074a411f1bdc018f74ef51e9ac8dea9fa0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Fri, 12 May 2017 13:40:31 +0200 +Subject: [PATCH] window-actor: Special-case shaped Java windows + +OpenJDK wrongly assumes that shaping a window implies no shadows. +They got lucky until commit b975676c changed the fallback case, +but now their compliance tests are broken. Make them happy again +by special-casing shaped Java windows. +--- + src/compositor/meta-window-actor.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c +index 7595adb66..8768b477c 100644 +--- a/src/compositor/meta-window-actor.c ++++ b/src/compositor/meta-window-actor.c +@@ -842,6 +842,14 @@ meta_window_actor_has_shadow (MetaWindowActor *self) + return FALSE; + + /* ++ * OpenJDK wrongly assumes that shaping a window implies no compositor ++ * shadows; make its compliance tests happy to give it what it wants ... ++ */ ++ if (g_strcmp0 (priv->window->res_name, "sun-awt-X11-XWindowPeer") == 0 && ++ priv->window->shape_region != NULL) ++ return FALSE; ++ ++ /* + * Generate shadows for all other windows. + */ + return TRUE; +-- +2.12.2 + diff --git a/SOURCES/0002-feedback-actor-Fix-a-typo.patch b/SOURCES/0002-feedback-actor-Fix-a-typo.patch deleted file mode 100644 index 3d6439a..0000000 --- a/SOURCES/0002-feedback-actor-Fix-a-typo.patch +++ /dev/null @@ -1,29 +0,0 @@ -From ad51c52b695d5eef3de51ad687ba7346df19917f Mon Sep 17 00:00:00 2001 -From: Matthias Clasen -Date: Mon, 20 Jul 2015 17:39:09 -0400 -Subject: [PATCH 2/2] feedback actor: Fix a typo - -The code for setting an anchor was comparing apples and oranges. -This was pointed out by coverity. - -https://bugzilla.gnome.org/show_bug.cgi?id=752552 ---- - src/compositor/meta-feedback-actor.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/compositor/meta-feedback-actor.c b/src/compositor/meta-feedback-actor.c -index b162584..72658aa 100644 ---- a/src/compositor/meta-feedback-actor.c -+++ b/src/compositor/meta-feedback-actor.c -@@ -187,7 +187,7 @@ meta_feedback_actor_set_anchor (MetaFeedbackActor *self, - if (priv->anchor_x == anchor_x && priv->anchor_y == anchor_y) - return; - -- if (priv->anchor_x != anchor_y) -+ if (priv->anchor_x != anchor_x) - { - priv->anchor_x = anchor_x; - g_object_notify (G_OBJECT (self), "anchor-x"); --- -2.4.5 - diff --git a/SOURCES/0002-monitor-manager-xrandr-Ignore-outputs-without-modes.patch b/SOURCES/0002-monitor-manager-xrandr-Ignore-outputs-without-modes.patch deleted file mode 100644 index 8f683c4..0000000 --- a/SOURCES/0002-monitor-manager-xrandr-Ignore-outputs-without-modes.patch +++ /dev/null @@ -1,43 +0,0 @@ -From f8c3fda5c7dbfff74a03713ae2a39dfbcd155693 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Tue, 20 Oct 2015 16:01:30 +0200 -Subject: [PATCH 2/4] monitor-manager-xrandr: Ignore outputs without modes - -In some cases we get outputs without any valid mode. We need to ignore -them or we'll crash later. - -https://bugzilla.gnome.org/show_bug.cgi?id=756796 ---- - src/backends/x11/meta-monitor-manager-xrandr.c | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - -diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c -index 6653b33..9a64bb2 100644 ---- a/src/backends/x11/meta-monitor-manager-xrandr.c -+++ b/src/backends/x11/meta-monitor-manager-xrandr.c -@@ -579,7 +579,13 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) - - meta_output = &manager->outputs[n_actual_outputs]; - -- if (output->connection != RR_Disconnected) -+ /* Get this first so that if there are no valid modes we -+ can immediately skip to the next output without having -+ to unwind all the assignments below. */ -+ output_get_modes (manager, meta_output, output); -+ -+ if (output->connection != RR_Disconnected && -+ meta_output->n_modes > 0) - { - GBytes *edid; - MonitorInfo *parsed_edid; -@@ -624,7 +630,6 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) - meta_output->suggested_x = output_get_suggested_x (manager_xrandr, meta_output); - meta_output->suggested_y = output_get_suggested_y (manager_xrandr, meta_output); - -- output_get_modes (manager, meta_output, output); - meta_output->preferred_mode = meta_output->modes[0]; - - meta_output->n_possible_crtcs = output->ncrtc; --- -2.5.0 - diff --git a/SOURCES/0003-window-Properly-update-window-monitor-for-the-deskto.patch b/SOURCES/0003-window-Properly-update-window-monitor-for-the-deskto.patch deleted file mode 100644 index dec8277..0000000 --- a/SOURCES/0003-window-Properly-update-window-monitor-for-the-deskto.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 54771511fe477eafbb4c28e8c7ddc2455cfc7283 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Sat, 24 Oct 2015 18:46:12 +0200 -Subject: [PATCH 3/4] window: Properly update window->monitor for the desktop - window - -We don't want to move the desktop window but we still need to update -window->monitor or otherwise we'll be left with a pointer to invalid -memory. ---- - src/core/window.c | 5 +---- - 1 file changed, 1 insertion(+), 4 deletions(-) - -diff --git a/src/core/window.c b/src/core/window.c -index f9fae9e..faa0296 100644 ---- a/src/core/window.c -+++ b/src/core/window.c -@@ -3513,12 +3513,9 @@ meta_window_update_for_monitors_changed (MetaWindow *window) - { - const MetaMonitorInfo *old, *new; - -- if (window->type == META_WINDOW_DESKTOP) -- return; -- - old = window->monitor; - -- if (!old || window->screen->n_monitor_infos == 0 || window->override_redirect) -+ if (!old || window->screen->n_monitor_infos == 0 || window->override_redirect || window->type == META_WINDOW_DESKTOP) - { - meta_window_update_monitor (window, FALSE); - return; --- -2.5.0 - diff --git a/SOURCES/0004-monitor-manager-xrandr-Force-an-update-when-resuming.patch b/SOURCES/0004-monitor-manager-xrandr-Force-an-update-when-resuming.patch deleted file mode 100644 index 5bbbe6c..0000000 --- a/SOURCES/0004-monitor-manager-xrandr-Force-an-update-when-resuming.patch +++ /dev/null @@ -1,277 +0,0 @@ -From 0a205c86df3422c4918d225c29adc0a06bc4e2d5 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Sun, 25 Oct 2015 16:14:58 +0100 -Subject: [PATCH 4/4] monitor-manager-xrandr: Force an update when resuming - from suspend - -The stack below us isn't as reliable as we'd like and in some cases -doesn't generate RRScreenChangeNotify events when e.g. resuming a -laptop on a dock, meaning that we'd miss newly attached outputs. ---- - src/backends/x11/meta-monitor-manager-xrandr.c | 215 +++++++++++++++++-------- - 1 file changed, 151 insertions(+), 64 deletions(-) - -diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c -index 9a64bb2..d2a5df2 100644 ---- a/src/backends/x11/meta-monitor-manager-xrandr.c -+++ b/src/backends/x11/meta-monitor-manager-xrandr.c -@@ -59,6 +59,11 @@ struct _MetaMonitorManagerXrandr - XRRScreenResources *resources; - int rr_event_base; - int rr_error_base; -+ -+ guint logind_watch_id; -+ guint logind_signal_sub_id; -+ -+ gboolean need_hardware_poll; - }; - - struct _MetaMonitorManagerXrandrClass -@@ -506,8 +511,15 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) - manager->screen_width = WidthOfScreen (screen); - manager->screen_height = HeightOfScreen (screen); - -- resources = XRRGetScreenResourcesCurrent (manager_xrandr->xdisplay, -- DefaultRootWindow (manager_xrandr->xdisplay)); -+ if (manager_xrandr->need_hardware_poll) -+ { -+ resources = XRRGetScreenResources (manager_xrandr->xdisplay, -+ DefaultRootWindow (manager_xrandr->xdisplay)); -+ manager_xrandr->need_hardware_poll = FALSE; -+ } -+ else -+ resources = XRRGetScreenResourcesCurrent (manager_xrandr->xdisplay, -+ DefaultRootWindow (manager_xrandr->xdisplay)); - if (!resources) - return; - -@@ -1083,60 +1095,6 @@ meta_monitor_manager_xrandr_rebuild_derived (MetaMonitorManager *manager) - meta_monitor_manager_rebuild_derived (manager); - } - --static void --meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr) --{ -- MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ()); -- -- manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (backend); -- -- if (!XRRQueryExtension (manager_xrandr->xdisplay, -- &manager_xrandr->rr_event_base, -- &manager_xrandr->rr_error_base)) -- { -- return; -- } -- else -- { -- /* We only use ScreenChangeNotify, but GDK uses the others, -- and we don't want to step on its toes */ -- XRRSelectInput (manager_xrandr->xdisplay, -- DefaultRootWindow (manager_xrandr->xdisplay), -- RRScreenChangeNotifyMask -- | RRCrtcChangeNotifyMask -- | RROutputPropertyNotifyMask); -- } --} -- --static void --meta_monitor_manager_xrandr_finalize (GObject *object) --{ -- MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (object); -- -- if (manager_xrandr->resources) -- XRRFreeScreenResources (manager_xrandr->resources); -- manager_xrandr->resources = NULL; -- -- G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->finalize (object); --} -- --static void --meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass) --{ -- MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass); -- GObjectClass *object_class = G_OBJECT_CLASS (klass); -- -- object_class->finalize = meta_monitor_manager_xrandr_finalize; -- -- manager_class->read_current = meta_monitor_manager_xrandr_read_current; -- manager_class->read_edid = meta_monitor_manager_xrandr_read_edid; -- manager_class->apply_configuration = meta_monitor_manager_xrandr_apply_configuration; -- manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode; -- manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight; -- manager_class->get_crtc_gamma = meta_monitor_manager_xrandr_get_crtc_gamma; -- manager_class->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma; --} -- - static gboolean - is_xvnc (MetaMonitorManager *manager) - { -@@ -1149,9 +1107,8 @@ is_xvnc (MetaMonitorManager *manager) - return FALSE; - } - --gboolean --meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xrandr, -- XEvent *event) -+static void -+meta_monitor_manager_xrandr_update (MetaMonitorManagerXrandr *manager_xrandr) - { - MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr); - MetaOutput *old_outputs; -@@ -1162,11 +1119,6 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra - gboolean applied_config = FALSE; - unsigned int timestamp; - -- if ((event->type - manager_xrandr->rr_event_base) != RRScreenChangeNotify) -- return FALSE; -- -- XRRUpdateConfiguration (event); -- - /* Save the old structures, so they stay valid during the update */ - old_outputs = manager->outputs; - n_old_outputs = manager->n_outputs; -@@ -1210,6 +1162,141 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra - meta_monitor_manager_free_output_array (old_outputs, n_old_outputs); - meta_monitor_manager_free_mode_array (old_modes, n_old_modes); - g_free (old_crtcs); -+} -+ -+static void -+logind_signal_handler (GDBusConnection *connection, -+ const gchar *sender_name, -+ const gchar *object_path, -+ const gchar *interface_name, -+ const gchar *signal_name, -+ GVariant *parameters, -+ gpointer user_data) -+{ -+ MetaMonitorManagerXrandr *manager_xrandr = user_data; -+ gboolean suspending; -+ -+ if (!g_str_equal (signal_name, "PrepareForSleep")) -+ return; -+ -+ g_variant_get (parameters, "(b)", &suspending); -+ if (!suspending) -+ { -+ manager_xrandr->need_hardware_poll = TRUE; -+ meta_monitor_manager_xrandr_update (manager_xrandr); -+ } -+} -+ -+static void -+logind_appeared (GDBusConnection *connection, -+ const gchar *name, -+ const gchar *name_owner, -+ gpointer user_data) -+{ -+ MetaMonitorManagerXrandr *manager_xrandr = user_data; -+ -+ manager_xrandr->logind_signal_sub_id = g_dbus_connection_signal_subscribe (connection, -+ "org.freedesktop.login1", -+ "org.freedesktop.login1.Manager", -+ "PrepareForSleep", -+ "/org/freedesktop/login1", -+ NULL, -+ G_DBUS_SIGNAL_FLAGS_NONE, -+ logind_signal_handler, -+ manager_xrandr, -+ NULL); -+} -+ -+static void -+logind_vanished (GDBusConnection *connection, -+ const gchar *name, -+ gpointer user_data) -+{ -+ MetaMonitorManagerXrandr *manager_xrandr = user_data; -+ -+ if (connection && manager_xrandr->logind_signal_sub_id > 0) -+ g_dbus_connection_signal_unsubscribe (connection, manager_xrandr->logind_signal_sub_id); -+ -+ manager_xrandr->logind_signal_sub_id = 0; -+} -+ -+static void -+meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr) -+{ -+ MetaBackendX11 *backend = META_BACKEND_X11 (meta_get_backend ()); -+ -+ manager_xrandr->xdisplay = meta_backend_x11_get_xdisplay (backend); -+ -+ if (!XRRQueryExtension (manager_xrandr->xdisplay, -+ &manager_xrandr->rr_event_base, -+ &manager_xrandr->rr_error_base)) -+ { -+ return; -+ } -+ else -+ { -+ /* We only use ScreenChangeNotify, but GDK uses the others, -+ and we don't want to step on its toes */ -+ XRRSelectInput (manager_xrandr->xdisplay, -+ DefaultRootWindow (manager_xrandr->xdisplay), -+ RRScreenChangeNotifyMask -+ | RRCrtcChangeNotifyMask -+ | RROutputPropertyNotifyMask); -+ } -+ -+ manager_xrandr->logind_watch_id = g_bus_watch_name (G_BUS_TYPE_SYSTEM, -+ "org.freedesktop.login1", -+ G_BUS_NAME_WATCHER_FLAGS_NONE, -+ logind_appeared, -+ logind_vanished, -+ manager_xrandr, -+ NULL); -+ manager_xrandr->need_hardware_poll = TRUE; -+} -+ -+static void -+meta_monitor_manager_xrandr_finalize (GObject *object) -+{ -+ MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (object); -+ -+ if (manager_xrandr->resources) -+ XRRFreeScreenResources (manager_xrandr->resources); -+ manager_xrandr->resources = NULL; -+ -+ if (manager_xrandr->logind_watch_id > 0) -+ g_bus_unwatch_name (manager_xrandr->logind_watch_id); -+ manager_xrandr->logind_watch_id = 0; -+ -+ G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->finalize (object); -+} -+ -+static void -+meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass) -+{ -+ MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass); -+ GObjectClass *object_class = G_OBJECT_CLASS (klass); -+ -+ object_class->finalize = meta_monitor_manager_xrandr_finalize; -+ -+ manager_class->read_current = meta_monitor_manager_xrandr_read_current; -+ manager_class->read_edid = meta_monitor_manager_xrandr_read_edid; -+ manager_class->apply_configuration = meta_monitor_manager_xrandr_apply_configuration; -+ manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode; -+ manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight; -+ manager_class->get_crtc_gamma = meta_monitor_manager_xrandr_get_crtc_gamma; -+ manager_class->set_crtc_gamma = meta_monitor_manager_xrandr_set_crtc_gamma; -+} -+ -+gboolean -+meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xrandr, -+ XEvent *event) -+{ -+ if ((event->type - manager_xrandr->rr_event_base) != RRScreenChangeNotify) -+ return FALSE; -+ -+ XRRUpdateConfiguration (event); -+ -+ meta_monitor_manager_xrandr_update (manager_xrandr); - - return TRUE; - } --- -2.5.0 - diff --git a/SOURCES/0008-Add-support-for-quad-buffer-stereo.patch b/SOURCES/0008-Add-support-for-quad-buffer-stereo.patch new file mode 100644 index 0000000..1a44410 --- /dev/null +++ b/SOURCES/0008-Add-support-for-quad-buffer-stereo.patch @@ -0,0 +1,978 @@ +From 1292ea32ce34e804b709af0cdbc9fda87d142e9b Mon Sep 17 00:00:00 2001 +From: "Owen W. Taylor" +Date: Thu, 8 May 2014 18:44:15 -0400 +Subject: [PATCH 8/8] Add support for quad-buffer stereo + +Track the stereo status of windows using the new EXT_stereo_tree +GLX extension. + +When stereo is enabled or disabled, a restart is triggered via +meta_restart() after a timeout, setting a _META_ENABLE_STEREO +property on the root window to indicate whether we should +turn on a stereo stage for clutter. The property avoids a loop, +since we need to enable stereo *before* initializing Clutter and GL, +but we need GL to figure out whether we have stereo windows. + +Stereo windows are drawn to the stage using new functionality +in Cogl to setup a stereo context, select which buffer to draw +to, and draw either the left or right buffer of a stereo +texture_from_pixmap. +--- + src/Makefile.am | 2 + + src/compositor/compositor-private.h | 9 ++ + src/compositor/compositor.c | 128 ++++++++++++++++++++++ + src/compositor/meta-shaped-texture-private.h | 5 +- + src/compositor/meta-shaped-texture.c | 157 ++++++++++++++++++++------- + src/compositor/meta-surface-actor-wayland.c | 2 +- + src/compositor/meta-surface-actor-x11.c | 56 ++++++++-- + src/compositor/meta-surface-actor-x11.h | 5 + + src/compositor/meta-window-actor-private.h | 5 + + src/compositor/meta-window-actor.c | 22 ++++ + src/core/main.c | 4 + + src/core/stereo.c | 153 ++++++++++++++++++++++++++ + src/core/stereo.h | 28 +++++ + 13 files changed, 526 insertions(+), 50 deletions(-) + create mode 100644 src/core/stereo.c + create mode 100644 src/core/stereo.h + +diff --git a/src/Makefile.am b/src/Makefile.am +index da4e3df..aea37da 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -233,6 +233,8 @@ libmutter_la_SOURCES = \ + core/stack.h \ + core/stack-tracker.c \ + core/stack-tracker.h \ ++ core/stereo.c \ ++ core/stereo.h \ + core/util.c \ + meta/util.h \ + core/util-private.h \ +diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h +index 4629fa5..27813ba 100644 +--- a/src/compositor/compositor-private.h ++++ b/src/compositor/compositor-private.h +@@ -21,6 +21,10 @@ struct _MetaCompositor + gint64 server_time_query_time; + gint64 server_time_offset; + ++ int glx_opcode; ++ guint stereo_tree_ext : 1; ++ guint have_stereo_windows : 1; ++ + guint server_time_is_monotonic_time : 1; + guint no_mipmaps : 1; + +@@ -59,6 +63,11 @@ void meta_end_modal_for_plugin (MetaCompositor *compositor, + gint64 meta_compositor_monotonic_time_to_server_time (MetaDisplay *display, + gint64 monotonic_time); + ++gboolean meta_compositor_window_is_stereo (MetaScreen *screen, ++ Window xwindow); ++void meta_compositor_select_stereo_notify (MetaScreen *screen, ++ Window xwindow); ++ + void meta_compositor_flash_window (MetaCompositor *compositor, + MetaWindow *window); + +diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c +index f001dfd..f8198d5 100644 +--- a/src/compositor/compositor.c ++++ b/src/compositor/compositor.c +@@ -70,6 +70,8 @@ + #include "meta-window-group.h" + #include "window-private.h" /* to check window->hidden */ + #include "display-private.h" /* for meta_display_lookup_x_window() and meta_display_cancel_touch() */ ++#include "stack-tracker.h" ++#include "stereo.h" + #include "util-private.h" + #include "frame.h" + #include +@@ -477,6 +479,97 @@ redirect_windows (MetaScreen *screen) + } + } + ++#define GLX_STEREO_TREE_EXT 0x20F5 ++#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 ++#define GLX_STEREO_NOTIFY_EXT 0x00000000 ++ ++typedef struct { ++ int type; ++ unsigned long serial; ++ Bool send_event; ++ Display *display; ++ int extension; ++ int evtype; ++ Drawable window; ++ Bool stereo_tree; ++} StereoNotifyEvent; ++ ++static gboolean ++screen_has_stereo_tree_ext (MetaScreen *screen) ++{ ++ MetaDisplay *display = meta_screen_get_display (screen); ++ Display *xdisplay = meta_display_get_xdisplay (display); ++ const char *extensions_string; ++ ++ static const char * (*query_extensions_string) (Display *display, ++ int screen); ++ ++ if (query_extensions_string == NULL) ++ query_extensions_string = ++ (const char * (*) (Display *, int)) ++ cogl_get_proc_address ("glXQueryExtensionsString"); ++ ++ extensions_string = query_extensions_string (xdisplay, ++ meta_screen_get_screen_number (screen)); ++ ++ return strstr (extensions_string, "EXT_stereo_tree") != 0; ++} ++ ++#include ++ ++gboolean ++meta_compositor_window_is_stereo (MetaScreen *screen, ++ Window xwindow) ++{ ++ MetaCompositor *compositor = get_compositor_for_screen (screen); ++ MetaDisplay *display = meta_screen_get_display (screen); ++ Display *xdisplay = meta_display_get_xdisplay (display); ++ ++ static int (*query_drawable) (Display *dpy, ++ Drawable draw, ++ int attribute, ++ unsigned int *value); ++ ++ if (compositor->stereo_tree_ext) ++ { ++ unsigned int stereo_tree = 0; ++ ++ if (query_drawable == NULL) ++ query_drawable = ++ (int (*) (Display *, Drawable, int, unsigned int *)) ++ cogl_get_proc_address ("glXQueryDrawable"); ++ ++ query_drawable (xdisplay, xwindow, GLX_STEREO_TREE_EXT, &stereo_tree); ++ ++ return stereo_tree != 0; ++ } ++ else ++ return FALSE; ++} ++ ++void ++meta_compositor_select_stereo_notify (MetaScreen *screen, ++ Window xwindow) ++{ ++ MetaCompositor *compositor = get_compositor_for_screen (screen); ++ MetaDisplay *display = meta_screen_get_display (screen); ++ Display *xdisplay = meta_display_get_xdisplay (display); ++ ++ static void (*select_event) (Display *dpy, ++ Drawable draw, ++ unsigned long event_mask); ++ ++ if (compositor->stereo_tree_ext) ++ { ++ if (select_event == NULL) ++ select_event = ++ (void (*) (Display *, Drawable, unsigned long)) ++ cogl_get_proc_address ("glXSelectEvent"); ++ ++ select_event (xdisplay, xwindow, GLX_STEREO_NOTIFY_MASK_EXT); ++ } ++} ++ + void + meta_compositor_manage (MetaCompositor *compositor) + { +@@ -485,6 +578,8 @@ meta_compositor_manage (MetaCompositor *compositor) + MetaScreen *screen = display->screen; + MetaBackend *backend = meta_get_backend (); + ++ compositor->stereo_tree_ext = screen_has_stereo_tree_ext (screen); ++ + meta_screen_set_cm_selection (display->screen); + + compositor->stage = meta_backend_get_stage (backend); +@@ -749,6 +844,23 @@ meta_compositor_process_event (MetaCompositor *compositor, + if (window) + process_damage (compositor, (XDamageNotifyEvent *) event, window); + } ++ else if (!meta_is_wayland_compositor () && ++ event->type == GenericEvent && ++ event->xcookie.extension == compositor->glx_opcode) ++ { ++ if (event->xcookie.evtype == GLX_STEREO_NOTIFY_EXT) ++ { ++ StereoNotifyEvent *stereo_event = (StereoNotifyEvent *)(event->xcookie.data); ++ window = meta_display_lookup_x_window (compositor->display, stereo_event->window); ++ ++ if (window != NULL) ++ { ++ MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); ++ meta_window_actor_stereo_notify (window_actor, stereo_event->stereo_tree); ++ meta_stack_tracker_queue_sync_stack (window->screen->stack_tracker); ++ } ++ } ++ } + + if (compositor->have_x11_sync_object) + meta_sync_ring_handle_event (event); +@@ -923,6 +1035,7 @@ meta_compositor_sync_stack (MetaCompositor *compositor, + GList *stack) + { + GList *old_stack; ++ int stereo_window_count = 0; + + /* This is painful because hidden windows that we are in the process + * of animating out of existence. They'll be at the bottom of the +@@ -998,12 +1111,16 @@ meta_compositor_sync_stack (MetaCompositor *compositor, + * near the front of the other.) + */ + compositor->windows = g_list_prepend (compositor->windows, actor); ++ if (meta_window_actor_is_stereo (actor)) ++ stereo_window_count++; + + stack = g_list_remove (stack, window); + old_stack = g_list_remove (old_stack, actor); + } + + sync_actor_stacking (compositor); ++ ++ meta_stereo_set_have_stereo_windows (stereo_window_count > 0); + } + + void +@@ -1193,6 +1310,17 @@ meta_compositor_new (MetaDisplay *display) + meta_post_paint_func, + compositor, + NULL); ++ if (!meta_is_wayland_compositor ()) ++ { ++ Display *xdisplay = meta_display_get_xdisplay (display); ++ int glx_major_opcode, glx_first_event, glx_first_error; ++ ++ if (XQueryExtension (xdisplay, ++ "GLX", ++ &glx_major_opcode, &glx_first_event, &glx_first_error)) ++ compositor->glx_opcode = glx_major_opcode; ++ } ++ + return compositor; + } + +diff --git a/src/compositor/meta-shaped-texture-private.h b/src/compositor/meta-shaped-texture-private.h +index 1a841de..79912e7 100644 +--- a/src/compositor/meta-shaped-texture-private.h ++++ b/src/compositor/meta-shaped-texture-private.h +@@ -30,8 +30,9 @@ + #include + + ClutterActor *meta_shaped_texture_new (void); +-void meta_shaped_texture_set_texture (MetaShapedTexture *stex, +- CoglTexture *texture); ++void meta_shaped_texture_set_textures (MetaShapedTexture *stex, ++ CoglTexture *texture, ++ CoglTexture *texture_right); + void meta_shaped_texture_set_fallback_size (MetaShapedTexture *stex, + guint fallback_width, + guint fallback_height); +diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c +index 5b2630b..830aa67 100644 +--- a/src/compositor/meta-shaped-texture.c ++++ b/src/compositor/meta-shaped-texture.c +@@ -74,8 +74,10 @@ static guint signals[LAST_SIGNAL]; + struct _MetaShapedTexturePrivate + { + MetaTextureTower *paint_tower; ++ MetaTextureTower *paint_tower_right; + + CoglTexture *texture; ++ CoglTexture *texture_right; + CoglTexture *mask_texture; + + /* The region containing only fully opaque pixels */ +@@ -122,8 +124,10 @@ meta_shaped_texture_init (MetaShapedTexture *self) + priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self); + + priv->paint_tower = meta_texture_tower_new (); ++ priv->paint_tower_right = NULL; /* demand create */ + + priv->texture = NULL; ++ priv->texture_right = NULL; + priv->mask_texture = NULL; + priv->create_mipmaps = TRUE; + } +@@ -173,11 +177,11 @@ meta_shaped_texture_dispose (GObject *object) + MetaShapedTexture *self = (MetaShapedTexture *) object; + MetaShapedTexturePrivate *priv = self->priv; + +- if (priv->paint_tower) +- meta_texture_tower_free (priv->paint_tower); +- priv->paint_tower = NULL; ++ g_clear_pointer (&priv->paint_tower, meta_texture_tower_free); ++ g_clear_pointer (&priv->paint_tower_right, meta_texture_tower_free); + + g_clear_pointer (&priv->texture, cogl_object_unref); ++ g_clear_pointer (&priv->texture_right, cogl_object_unref); + g_clear_pointer (&priv->opaque_region, cairo_region_destroy); + + meta_shaped_texture_set_mask_texture (self, NULL); +@@ -271,8 +275,9 @@ paint_clipped_rectangle (CoglFramebuffer *fb, + } + + static void +-set_cogl_texture (MetaShapedTexture *stex, +- CoglTexture *cogl_tex) ++set_cogl_textures (MetaShapedTexture *stex, ++ CoglTexture *cogl_tex, ++ CoglTexture *cogl_tex_right) + { + MetaShapedTexturePrivate *priv; + guint width, height; +@@ -283,8 +288,11 @@ set_cogl_texture (MetaShapedTexture *stex, + + if (priv->texture) + cogl_object_unref (priv->texture); ++ if (priv->texture_right) ++ cogl_object_unref (priv->texture_right); + + priv->texture = cogl_tex; ++ priv->texture_right = cogl_tex_right; + + if (cogl_tex != NULL) + { +@@ -298,6 +306,9 @@ set_cogl_texture (MetaShapedTexture *stex, + height = 0; + } + ++ if (cogl_tex_right != NULL) ++ cogl_object_ref (cogl_tex_right); ++ + if (priv->tex_width != width || + priv->tex_height != height) + { +@@ -313,52 +324,41 @@ set_cogl_texture (MetaShapedTexture *stex, + * previous buffer. We only queue a redraw in response to surface + * damage. */ + ++ if (cogl_tex_right != NULL) ++ { ++ if (priv->paint_tower_right == NULL) ++ priv->paint_tower_right = meta_texture_tower_new (); ++ } ++ else ++ { ++ g_clear_pointer (&priv->paint_tower_right, meta_texture_tower_free); ++ } ++ + if (priv->create_mipmaps) +- meta_texture_tower_set_base_texture (priv->paint_tower, cogl_tex); ++ { ++ meta_texture_tower_set_base_texture (priv->paint_tower, cogl_tex); ++ ++ if (priv->paint_tower_right) ++ meta_texture_tower_set_base_texture (priv->paint_tower_right, cogl_tex_right); ++ } + } + + static void +-meta_shaped_texture_paint (ClutterActor *actor) ++paint_texture (MetaShapedTexture *stex, ++ CoglTexture *paint_tex) + { +- MetaShapedTexture *stex = (MetaShapedTexture *) actor; ++ ClutterActor *actor = CLUTTER_ACTOR (stex); + MetaShapedTexturePrivate *priv = stex->priv; + guint tex_width, tex_height; + guchar opacity; + CoglContext *ctx; + CoglFramebuffer *fb; +- CoglTexture *paint_tex; + ClutterActorBox alloc; + CoglPipelineFilter filter; + + if (priv->clip_region && cairo_region_is_empty (priv->clip_region)) + return; + +- if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR (stex))) +- clutter_actor_realize (CLUTTER_ACTOR (stex)); +- +- /* The GL EXT_texture_from_pixmap extension does allow for it to be +- * used together with SGIS_generate_mipmap, however this is very +- * rarely supported. Also, even when it is supported there +- * are distinct performance implications from: +- * +- * - Updating mipmaps that we don't need +- * - Having to reallocate pixmaps on the server into larger buffers +- * +- * So, we just unconditionally use our mipmap emulation code. If we +- * wanted to use SGIS_generate_mipmap, we'd have to query COGL to +- * see if it was supported (no API currently), and then if and only +- * if that was the case, set the clutter texture quality to HIGH. +- * Setting the texture quality to high without SGIS_generate_mipmap +- * support for TFP textures will result in fallbacks to XGetImage. +- */ +- if (priv->create_mipmaps) +- paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower); +- else +- paint_tex = COGL_TEXTURE (priv->texture); +- +- if (paint_tex == NULL) +- return; +- + tex_width = priv->tex_width; + tex_height = priv->tex_height; + +@@ -519,6 +519,76 @@ meta_shaped_texture_paint (ClutterActor *actor) + } + + static void ++meta_shaped_texture_paint (ClutterActor *actor) ++{ ++ MetaShapedTexture *stex = (MetaShapedTexture *) actor; ++ MetaShapedTexturePrivate *priv = stex->priv; ++ CoglFramebuffer *fb; ++ gboolean stereo; ++ CoglTexture *paint_tex; ++ CoglTexture *paint_tex_right; ++ ++ if (priv->clip_region && cairo_region_is_empty (priv->clip_region)) ++ return; ++ ++ if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR (stex))) ++ clutter_actor_realize (CLUTTER_ACTOR (stex)); ++ ++ /* The GL EXT_texture_from_pixmap extension does allow for it to be ++ * used together with SGIS_generate_mipmap, however this is very ++ * rarely supported. Also, even when it is supported there ++ * are distinct performance implications from: ++ * ++ * - Updating mipmaps that we don't need ++ * - Having to reallocate pixmaps on the server into larger buffers ++ * ++ * So, we just unconditionally use our mipmap emulation code. If we ++ * wanted to use SGIS_generate_mipmap, we'd have to query COGL to ++ * see if it was supported (no API currently), and then if and only ++ * if that was the case, set the clutter texture quality to HIGH. ++ * Setting the texture quality to high without SGIS_generate_mipmap ++ * support for TFP textures will result in fallbacks to XGetImage. ++ */ ++ if (priv->create_mipmaps) ++ paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower); ++ else ++ paint_tex = COGL_TEXTURE (priv->texture); ++ ++ if (paint_tex == NULL) ++ return; ++ ++ fb = cogl_get_draw_framebuffer (); ++ ++ stereo = priv->texture_right && cogl_framebuffer_get_is_stereo (fb); ++ ++ if (stereo) ++ { ++ if (priv->create_mipmaps) ++ paint_tex_right = meta_texture_tower_get_paint_texture (priv->paint_tower_right); ++ else ++ paint_tex_right = COGL_TEXTURE (priv->texture_right); ++ } ++ else ++ paint_tex_right = NULL; ++ ++ if (paint_tex != NULL) ++ { ++ if (stereo) ++ cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_LEFT); ++ paint_texture (stex, paint_tex); ++ if (stereo) ++ cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_BOTH); ++ } ++ ++ if (paint_tex_right != NULL) ++ { ++ cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_RIGHT); ++ paint_texture (stex, paint_tex_right); ++ cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_BOTH); ++ } ++} ++ ++static void + meta_shaped_texture_get_preferred_width (ClutterActor *self, + gfloat for_height, + gfloat *min_width_p, +@@ -637,6 +707,12 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex, + priv->create_mipmaps = create_mipmaps; + base_texture = create_mipmaps ? priv->texture : NULL; + meta_texture_tower_set_base_texture (priv->paint_tower, base_texture); ++ ++ if (priv->paint_tower_right) ++ { ++ base_texture = create_mipmaps ? priv->texture_right : NULL; ++ meta_texture_tower_set_base_texture (priv->paint_tower_right, base_texture); ++ } + } + } + +@@ -702,6 +778,8 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex, + return FALSE; + + meta_texture_tower_update_area (priv->paint_tower, x, y, width, height); ++ if (priv->paint_tower_right) ++ meta_texture_tower_update_area (priv->paint_tower_right, x, y, width, height); + + unobscured_region = effective_unobscured_region (stex); + if (unobscured_region) +@@ -734,17 +812,18 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex, + } + + /** +- * meta_shaped_texture_set_texture: ++ * meta_shaped_texture_set_textures: + * @stex: The #MetaShapedTexture + * @pixmap: The #CoglTexture to display + */ + void +-meta_shaped_texture_set_texture (MetaShapedTexture *stex, +- CoglTexture *texture) ++meta_shaped_texture_set_textures (MetaShapedTexture *stex, ++ CoglTexture *texture, ++ CoglTexture *texture_right) + { + g_return_if_fail (META_IS_SHAPED_TEXTURE (stex)); + +- set_cogl_texture (stex, texture); ++ set_cogl_textures (stex, texture, texture_right); + } + + /** +diff --git a/src/compositor/meta-surface-actor-wayland.c b/src/compositor/meta-surface-actor-wayland.c +index 33036d8..f38c7d3 100644 +--- a/src/compositor/meta-surface-actor-wayland.c ++++ b/src/compositor/meta-surface-actor-wayland.c +@@ -477,7 +477,7 @@ meta_surface_actor_wayland_set_texture (MetaSurfaceActorWayland *self, + CoglTexture *texture) + { + MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); +- meta_shaped_texture_set_texture (stex, texture); ++ meta_shaped_texture_set_textures (stex, texture, NULL); + } + + MetaWaylandSurface * +diff --git a/src/compositor/meta-surface-actor-x11.c b/src/compositor/meta-surface-actor-x11.c +index d32aeb6..52db380 100644 +--- a/src/compositor/meta-surface-actor-x11.c ++++ b/src/compositor/meta-surface-actor-x11.c +@@ -31,6 +31,7 @@ + #include + + #include ++#include "compositor-private.h" + #include "window-private.h" + #include "meta-shaped-texture-private.h" + #include "meta-cullable.h" +@@ -43,6 +44,7 @@ struct _MetaSurfaceActorX11Private + MetaDisplay *display; + + CoglTexture *texture; ++ CoglTexture *texture_right; + Pixmap pixmap; + Damage damage; + +@@ -58,6 +60,8 @@ struct _MetaSurfaceActorX11Private + guint size_changed : 1; + + guint unredirected : 1; ++ ++ guint stereo : 1; + }; + typedef struct _MetaSurfaceActorX11Private MetaSurfaceActorX11Private; + +@@ -94,7 +98,7 @@ detach_pixmap (MetaSurfaceActorX11 *self) + * you are supposed to be able to free a GLXPixmap after freeing the underlying + * pixmap, but it certainly doesn't work with current DRI/Mesa + */ +- meta_shaped_texture_set_texture (stex, NULL); ++ meta_shaped_texture_set_textures (stex, NULL, NULL); + cogl_flush (); + + meta_error_trap_push (display); +@@ -103,6 +107,7 @@ detach_pixmap (MetaSurfaceActorX11 *self) + meta_error_trap_pop (display); + + g_clear_pointer (&priv->texture, cogl_object_unref); ++ g_clear_pointer (&priv->texture_right, cogl_object_unref); + } + + static void +@@ -114,23 +119,35 @@ set_pixmap (MetaSurfaceActorX11 *self, + CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); + MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); + CoglError *error = NULL; +- CoglTexture *texture; ++ CoglTexturePixmapX11 *texture; ++ CoglTexturePixmapX11 *texture_right; + + g_assert (priv->pixmap == None); + priv->pixmap = pixmap; + +- texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->pixmap, FALSE, &error)); ++ if (priv->stereo) ++ texture = cogl_texture_pixmap_x11_new_left (ctx, pixmap, FALSE, &error); ++ else ++ texture = cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, &error); ++ ++ if (priv->stereo) ++ texture_right = cogl_texture_pixmap_x11_new_right (texture); ++ else ++ texture_right = NULL; + + if (error != NULL) + { + g_warning ("Failed to allocate stex texture: %s", error->message); + cogl_error_free (error); + } +- else if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture)))) ++ else if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (texture))) + g_warning ("NOTE: Not using GLX TFP!\n"); + +- priv->texture = texture; +- meta_shaped_texture_set_texture (stex, texture); ++ priv->texture = COGL_TEXTURE (texture); ++ if (priv->stereo) ++ priv->texture_right = COGL_TEXTURE (texture_right); ++ ++ meta_shaped_texture_set_textures (stex, COGL_TEXTURE (texture), COGL_TEXTURE (texture_right)); + } + + static void +@@ -433,8 +450,8 @@ reset_texture (MetaSurfaceActorX11 *self) + /* Setting the texture to NULL will cause all the FBO's cached by the + * shaped texture's MetaTextureTower to be discarded and recreated. + */ +- meta_shaped_texture_set_texture (stex, NULL); +- meta_shaped_texture_set_texture (stex, priv->texture); ++ meta_shaped_texture_set_textures (stex, NULL, NULL); ++ meta_shaped_texture_set_textures (stex, priv->texture, priv->texture_right); + } + + MetaSurfaceActor * +@@ -443,12 +460,17 @@ meta_surface_actor_x11_new (MetaWindow *window) + MetaSurfaceActorX11 *self = g_object_new (META_TYPE_SURFACE_ACTOR_X11, NULL); + MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); + MetaDisplay *display = meta_window_get_display (window); ++ Window xwindow; + + g_assert (!meta_is_wayland_compositor ()); + + priv->window = window; + priv->display = display; + ++ xwindow = meta_window_x11_get_toplevel_xwindow (window); ++ priv->stereo = meta_compositor_window_is_stereo (display->screen, xwindow); ++ meta_compositor_select_stereo_notify (display->screen, xwindow); ++ + g_signal_connect_object (priv->display, "gl-video-memory-purged", + G_CALLBACK (reset_texture), self, G_CONNECT_SWAPPED); + +@@ -479,3 +501,21 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self, + priv->last_height = height; + meta_shaped_texture_set_fallback_size (stex, width, height); + } ++ ++void ++meta_surface_actor_x11_stereo_notify (MetaSurfaceActorX11 *self, ++ gboolean stereo_tree) ++{ ++ MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); ++ ++ priv->stereo = stereo_tree != FALSE; ++ detach_pixmap (self); ++} ++ ++gboolean ++meta_surface_actor_x11_is_stereo (MetaSurfaceActorX11 *self) ++{ ++ MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); ++ ++ return priv->stereo; ++} +diff --git a/src/compositor/meta-surface-actor-x11.h b/src/compositor/meta-surface-actor-x11.h +index 0e692ee..4b2eccc 100644 +--- a/src/compositor/meta-surface-actor-x11.h ++++ b/src/compositor/meta-surface-actor-x11.h +@@ -64,6 +64,11 @@ MetaSurfaceActor * meta_surface_actor_x11_new (MetaWindow *window); + void meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self, + int width, int height); + ++void meta_surface_actor_x11_stereo_notify (MetaSurfaceActorX11 *self, ++ gboolean stereo_tree); ++ ++gboolean meta_surface_actor_x11_is_stereo (MetaSurfaceActorX11 *self); ++ + G_END_DECLS + + #endif /* __META_SURFACE_ACTOR_X11_H__ */ +diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h +index 72dcd14..035d756 100644 +--- a/src/compositor/meta-window-actor-private.h ++++ b/src/compositor/meta-window-actor-private.h +@@ -59,4 +59,9 @@ void meta_window_actor_effect_completed (MetaWindowActor *actor, + MetaSurfaceActor *meta_window_actor_get_surface (MetaWindowActor *self); + void meta_window_actor_update_surface (MetaWindowActor *self); + ++void meta_window_actor_stereo_notify (MetaWindowActor *actor, ++ gboolean stereo_tree); ++ ++gboolean meta_window_actor_is_stereo (MetaWindowActor *actor); ++ + #endif /* META_WINDOW_ACTOR_PRIVATE_H */ +diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c +index 9395caa..f763964 100644 +--- a/src/compositor/meta-window-actor.c ++++ b/src/compositor/meta-window-actor.c +@@ -2146,3 +2146,25 @@ meta_window_actor_sync_updates_frozen (MetaWindowActor *self) + + meta_window_actor_set_updates_frozen (self, meta_window_updates_are_frozen (window)); + } ++ ++void ++meta_window_actor_stereo_notify (MetaWindowActor *self, ++ gboolean stereo_tree) ++{ ++ MetaWindowActorPrivate *priv = self->priv; ++ ++ if (META_IS_SURFACE_ACTOR_X11 (priv->surface)) ++ meta_surface_actor_x11_stereo_notify (META_SURFACE_ACTOR_X11 (priv->surface), ++ stereo_tree); ++} ++ ++gboolean ++meta_window_actor_is_stereo (MetaWindowActor *self) ++{ ++ MetaWindowActorPrivate *priv = self->priv; ++ ++ if (META_IS_SURFACE_ACTOR_X11 (priv->surface)) ++ return meta_surface_actor_x11_is_stereo (META_SURFACE_ACTOR_X11 (priv->surface)); ++ else ++ return FALSE; ++} +diff --git a/src/core/main.c b/src/core/main.c +index 25586be..23d9d6d 100644 +--- a/src/core/main.c ++++ b/src/core/main.c +@@ -47,6 +47,7 @@ + #include + #include "util-private.h" + #include "display-private.h" ++#include "stereo.h" + #include + #include "ui.h" + #include +@@ -490,6 +491,9 @@ meta_init (void) + + meta_init_backend (backend_type); + ++ if (!meta_is_wayland_compositor ()) ++ meta_stereo_init (); ++ + meta_clutter_init (); + + #ifdef HAVE_WAYLAND +diff --git a/src/core/stereo.c b/src/core/stereo.c +new file mode 100644 +index 0000000..5a232b6 +--- /dev/null ++++ b/src/core/stereo.c +@@ -0,0 +1,153 @@ ++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ ++ ++/* ++ * Copyright (C) 2014 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the ++ * License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ */ ++ ++/* ++ * SECTION:stereo ++ * @short_description: Keep track of whether we are a stereo compositor ++ * ++ * With GLX, we need to use a different GL context for stereo and ++ * non-stereo support. Support for multiple GL contexts is unfinished ++ * in Cogl and entirely lacking in Clutter, so it's by far easier ++ * to just restart Mutter when we detect a stereo window. ++ * ++ * A property _MUTTER_ENABLE_STEREO is maintained on the root window ++ * to know whether we should initialize clutter for stereo or not. ++ * When the presence or absence of stereo windows mismatches the ++ * stereo-enabled state for a sufficiently long period of time, ++ * we restart Mutter. ++ */ ++ ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include "ui.h" ++#include ++#include "display-private.h" ++#include "stereo.h" ++#include "util-private.h" ++ ++static guint stereo_switch_id = 0; ++static gboolean stereo_enabled = FALSE; ++/* -1 so the first time meta_stereo_set_have_stereo_windows() is called ++ * we avoid the short-circuit and set up a timeout to restart ++ * if necessary */ ++static gboolean stereo_have_windows = (gboolean)-1; ++static gboolean stereo_restart = FALSE; ++ ++#define STEREO_ENABLE_WAIT 1000 ++#define STEREO_DISABLE_WAIT 5000 ++ ++void ++meta_stereo_init (void) ++{ ++ Display *xdisplay; ++ Window root; ++ Atom atom_enable_stereo; ++ Atom type; ++ int format; ++ unsigned long n_items, bytes_after; ++ guchar *data; ++ ++ xdisplay = XOpenDisplay (NULL); ++ if (xdisplay == NULL) ++ meta_fatal ("Unable to open X display %s\n", XDisplayName (NULL)); ++ ++ root = DefaultRootWindow (xdisplay); ++ atom_enable_stereo = XInternAtom (xdisplay, "_MUTTER_ENABLE_STEREO", False); ++ ++ XGetWindowProperty (xdisplay, root, atom_enable_stereo, ++ 0, 1, False, XA_INTEGER, ++ &type, &format, &n_items, &bytes_after, &data); ++ if (type == XA_INTEGER) ++ { ++ if (format == 32 && n_items == 1 && bytes_after == 0) ++ { ++ stereo_enabled = *(long *)data; ++ } ++ else ++ { ++ meta_warning ("Bad value for _MUTTER_ENABLE_STEREO property\n"); ++ } ++ ++ XFree (data); ++ } ++ else if (type != None) ++ { ++ meta_warning ("Bad type for _MUTTER_ENABLE_STEREO property\n"); ++ } ++ ++ meta_verbose ("On startup, _MUTTER_ENABLE_STEREO=%s", ++ stereo_enabled ? "yes" : "no"); ++ clutter_x11_set_use_stereo_stage (stereo_enabled); ++ XCloseDisplay (xdisplay); ++} ++ ++static gboolean ++meta_stereo_switch (gpointer data) ++{ ++ stereo_switch_id = 0; ++ stereo_restart = TRUE; ++ ++ meta_restart (stereo_have_windows ? ++ _("Enabling stereo...") : ++ _("Disabling stereo...")); ++ ++ return FALSE; ++} ++ ++void ++meta_stereo_set_have_stereo_windows (gboolean have_windows) ++{ ++ have_windows = have_windows != FALSE; ++ ++ if (!stereo_restart && have_windows != stereo_have_windows) ++ { ++ MetaDisplay *display = meta_get_display (); ++ Display *xdisplay = meta_display_get_xdisplay (display); ++ Window root = DefaultRootWindow (xdisplay); ++ Atom atom_enable_stereo = XInternAtom (xdisplay, "_MUTTER_ENABLE_STEREO", False); ++ long value; ++ ++ stereo_have_windows = have_windows; ++ ++ if (stereo_have_windows) ++ meta_verbose ("Detected stereo windows\n"); ++ else ++ meta_verbose ("No stereo windows detected\n"); ++ ++ value = stereo_have_windows; ++ XChangeProperty (xdisplay, root, ++ atom_enable_stereo, XA_INTEGER, 32, ++ PropModeReplace, (guchar *)&value, 1); ++ ++ if (stereo_switch_id != 0) ++ { ++ g_source_remove (stereo_switch_id); ++ stereo_switch_id = 0; ++ } ++ ++ if (stereo_have_windows != stereo_enabled) ++ stereo_switch_id = g_timeout_add (stereo_have_windows ? STEREO_ENABLE_WAIT : STEREO_DISABLE_WAIT, ++ meta_stereo_switch, NULL); ++ } ++} +diff --git a/src/core/stereo.h b/src/core/stereo.h +new file mode 100644 +index 0000000..ccd1d70 +--- /dev/null ++++ b/src/core/stereo.h +@@ -0,0 +1,28 @@ ++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ ++ ++/* ++ * Copyright (C) 2014 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the ++ * License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ */ ++ ++#ifndef META_STEREO_H ++#define META_STEREO_H ++ ++void meta_stereo_init (void); ++void meta_stereo_set_have_stereo_windows (gboolean have_windows); ++gboolean meta_stereo_is_restart (void); ++void meta_stereo_finish_restart (void); ++ ++#endif +-- +2.9.3 + diff --git a/SOURCES/Enable-threaded-swap-wait.patch b/SOURCES/Enable-threaded-swap-wait.patch deleted file mode 100644 index c71f29a..0000000 --- a/SOURCES/Enable-threaded-swap-wait.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff -up mutter-3.14.4/src/backends/x11/meta-backend-x11.c.threaded-swap-wait mutter-3.14.4/src/backends/x11/meta-backend-x11.c ---- mutter-3.14.4/src/backends/x11/meta-backend-x11.c.threaded-swap-wait 2016-06-29 15:25:56.267633457 -0400 -+++ mutter-3.14.4/src/backends/x11/meta-backend-x11.c 2016-06-29 15:26:35.800269586 -0400 -@@ -696,6 +696,15 @@ meta_backend_x11_class_init (MetaBackend - static void - meta_backend_x11_init (MetaBackendX11 *x11) - { -+ /* Set up things so that if the INTEL_swap_event extension is not present, -+ * but the driver is known to have good thread support, we use an extra -+ * thread and call glXWaitVideoSync() in the thread. This allows idles -+ * to work properly, even when Mutter is constantly redrawing new frames; -+ * otherwise, without INTEL_swap_event, we'll just block in glXSwapBuffers(). -+ */ -+ XInitThreads(); -+ clutter_x11_enable_threaded_swap_wait (); -+ - clutter_x11_request_reset_on_video_memory_purge (); - - /* We do X11 event retrieval ourselves */ diff --git a/SOURCES/Enable-threeaded-swap-wait.patch b/SOURCES/Enable-threeaded-swap-wait.patch new file mode 100644 index 0000000..5e27d79 --- /dev/null +++ b/SOURCES/Enable-threeaded-swap-wait.patch @@ -0,0 +1,887 @@ +From 4d1005e3b86050f8b5bab41baf08704117f89b21 Mon Sep 17 00:00:00 2001 +From: "Owen W. Taylor" +Date: Thu, 11 Feb 2016 15:06:23 -0500 +Subject: [PATCH 1/7] CoglGPUInfo - fix check for NVIDIA + +NVIDIA drivers have a vendor of "NVIDIA Corporation" not "NVIDIA". +Check for both in case older drivers did use "NVIDIA" + +https://bugzilla.gnome.org/show_bug.cgi?id=779039 +--- + cogl/cogl/cogl-gpu-info.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/cogl/cogl/cogl-gpu-info.c b/cogl/cogl/cogl-gpu-info.c +index 845382881..23a846616 100644 +--- a/cogl/cogl/cogl-gpu-info.c ++++ b/cogl/cogl/cogl-gpu-info.c +@@ -169,7 +169,8 @@ check_qualcomm_vendor (const CoglGpuInfoStrings *strings) + static CoglBool + check_nvidia_vendor (const CoglGpuInfoStrings *strings) + { +- if (strcmp (strings->vendor_string, "NVIDIA") != 0) ++ if (strcmp (strings->vendor_string, "NVIDIA") != 0 && ++ strcmp (strings->vendor_string, "NVIDIA Corporation") != 0) + return FALSE; + + return TRUE; +-- +2.12.0 + + +From 62a66bddf3aba14e65ab913746237d3d19a502dd Mon Sep 17 00:00:00 2001 +From: "Owen W. Taylor" +Date: Thu, 11 Feb 2016 16:33:03 -0500 +Subject: [PATCH 2/7] CoglWinsysGLX: factor out some duplicated code + +Add a helper function for repeated calls to clock_gettime(CLOCK_MONOTONIC) + +https://bugzilla.gnome.org/show_bug.cgi?id=779039 +--- + cogl/cogl/winsys/cogl-winsys-glx.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c +index c50db3a04..379658e8a 100644 +--- a/cogl/cogl/winsys/cogl-winsys-glx.c ++++ b/cogl/cogl/winsys/cogl-winsys-glx.c +@@ -192,6 +192,15 @@ find_onscreen_for_xid (CoglContext *context, uint32_t xid) + return NULL; + } + ++static int64_t ++get_monotonic_time_ns (void) ++{ ++ struct timespec ts; ++ ++ clock_gettime (CLOCK_MONOTONIC, &ts); ++ return ts.tv_sec * G_GINT64_CONSTANT (1000000000) + ts.tv_nsec; ++} ++ + static void + ensure_ust_type (CoglRenderer *renderer, + GLXDrawable drawable) +@@ -202,7 +211,6 @@ ensure_ust_type (CoglRenderer *renderer, + int64_t msc; + int64_t sbc; + struct timeval tv; +- struct timespec ts; + int64_t current_system_time; + int64_t current_monotonic_time; + +@@ -232,9 +240,7 @@ ensure_ust_type (CoglRenderer *renderer, + + /* This is the time source that the newer (fixed) linux drm + * drivers use (Linux >= 3.8) */ +- clock_gettime (CLOCK_MONOTONIC, &ts); +- current_monotonic_time = (ts.tv_sec * G_GINT64_CONSTANT (1000000)) + +- (ts.tv_nsec / G_GINT64_CONSTANT (1000)); ++ current_monotonic_time = get_monotonic_time_ns () / 1000; + + if (current_monotonic_time > ust - 1000000 && + current_monotonic_time < ust + 1000000) +@@ -310,10 +316,7 @@ _cogl_winsys_get_clock_time (CoglContext *context) + } + case COGL_GLX_UST_IS_MONOTONIC_TIME: + { +- struct timespec ts; +- +- clock_gettime (CLOCK_MONOTONIC, &ts); +- return ts.tv_sec * G_GINT64_CONSTANT (1000000000) + ts.tv_nsec; ++ return get_monotonic_time_ns (); + } + } + +@@ -1682,16 +1685,13 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen) + else + { + uint32_t current_count; +- struct timespec ts; + + glx_renderer->glXGetVideoSync (¤t_count); + glx_renderer->glXWaitVideoSync (2, + (current_count + 1) % 2, + ¤t_count); + +- clock_gettime (CLOCK_MONOTONIC, &ts); +- info->presentation_time = +- ts.tv_sec * G_GINT64_CONSTANT (1000000000) + ts.tv_nsec; ++ info->presentation_time = get_monotonic_time_ns (); + } + } + } +-- +2.12.0 + + +From 69e156c91c663e6f41759eec9f7c729a67da7dc5 Mon Sep 17 00:00:00 2001 +From: "Owen W. Taylor" +Date: Thu, 11 Feb 2016 17:04:08 -0500 +Subject: [PATCH 3/7] Usability of SGI_video_sync is per-display not + per-renderer + +As previously commented in the code, SGI_video_sync is per-display, rather +than per-renderer. The is_direct flag for the renderer was tested before +it was initialized (per-display) and that resulted in SGI_video_sync +never being used. + +https://bugzilla.gnome.org/show_bug.cgi?id=779039 +--- + cogl/cogl/cogl-glx-display-private.h | 3 ++ + cogl/cogl/cogl-glx-renderer-private.h | 2 -- + cogl/cogl/winsys/cogl-winsys-glx.c | 52 +++++++++++++++++++---------------- + 3 files changed, 31 insertions(+), 26 deletions(-) + +diff --git a/cogl/cogl/cogl-glx-display-private.h b/cogl/cogl/cogl-glx-display-private.h +index 133c1188c..1d1afc0cf 100644 +--- a/cogl/cogl/cogl-glx-display-private.h ++++ b/cogl/cogl/cogl-glx-display-private.h +@@ -51,6 +51,9 @@ typedef struct _CoglGLXDisplay + + CoglBool found_fbconfig; + CoglBool fbconfig_has_rgba_visual; ++ CoglBool is_direct; ++ CoglBool have_vblank_counter; ++ CoglBool can_vblank_wait; + GLXFBConfig fbconfig; + + /* Single context for all wins */ +diff --git a/cogl/cogl/cogl-glx-renderer-private.h b/cogl/cogl/cogl-glx-renderer-private.h +index cb8ff97f8..061f2ccb5 100644 +--- a/cogl/cogl/cogl-glx-renderer-private.h ++++ b/cogl/cogl/cogl-glx-renderer-private.h +@@ -43,8 +43,6 @@ typedef struct _CoglGLXRenderer + int glx_error_base; + int glx_event_base; + +- CoglBool is_direct; +- + /* Vblank stuff */ + int dri_fd; + +diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c +index 379658e8a..5a2700176 100644 +--- a/cogl/cogl/winsys/cogl-winsys-glx.c ++++ b/cogl/cogl/winsys/cogl-winsys-glx.c +@@ -715,23 +715,25 @@ update_base_winsys_features (CoglRenderer *renderer) + + g_strfreev (split_extensions); + +- /* Note: the GLX_SGI_video_sync spec explicitly states this extension +- * only works for direct contexts. */ +- if (!glx_renderer->is_direct) +- { +- glx_renderer->glXGetVideoSync = NULL; +- glx_renderer->glXWaitVideoSync = NULL; +- COGL_FLAGS_SET (glx_renderer->base_winsys_features, +- COGL_WINSYS_FEATURE_VBLANK_COUNTER, +- FALSE); +- } ++ /* The GLX_SGI_video_sync spec explicitly states this extension ++ * only works for direct contexts; we don't know per-renderer ++ * if the context is direct or not, so we turn off the feature ++ * flag; we still use the extension within this file looking ++ * instead at glx_display->have_vblank_counter. ++ */ ++ COGL_FLAGS_SET (glx_renderer->base_winsys_features, ++ COGL_WINSYS_FEATURE_VBLANK_COUNTER, ++ FALSE); ++ + + COGL_FLAGS_SET (glx_renderer->base_winsys_features, + COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN, + TRUE); + +- if (glx_renderer->glXWaitVideoSync || +- glx_renderer->glXWaitForMsc) ++ /* Because of the direct-context dependency, the VBLANK_WAIT feature ++ * doesn't reflect the presence of GLX_SGI_video_sync. ++ */ ++ if (glx_renderer->glXWaitForMsc) + COGL_FLAGS_SET (glx_renderer->base_winsys_features, + COGL_WINSYS_FEATURE_VBLANK_WAIT, + TRUE); +@@ -864,7 +866,7 @@ update_winsys_features (CoglContext *context, CoglError **error) + * by the SwapInterval so we have to throttle swap_region requests + * manually... */ + if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SWAP_REGION) && +- _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT)) ++ (glx_display->have_vblank_counter || glx_display->can_vblank_wait)) + COGL_FLAGS_SET (context->winsys_features, + COGL_WINSYS_FEATURE_SWAP_REGION_THROTTLE, TRUE); + +@@ -1142,11 +1144,13 @@ create_context (CoglDisplay *display, CoglError **error) + return FALSE; + } + +- glx_renderer->is_direct = ++ glx_display->is_direct = + glx_renderer->glXIsDirect (xlib_renderer->xdpy, glx_display->glx_context); ++ glx_display->have_vblank_counter = glx_display->is_direct && glx_renderer->glXWaitVideoSync; ++ glx_display->can_vblank_wait = glx_renderer->glXWaitForMsc || glx_display->have_vblank_counter; + + COGL_NOTE (WINSYS, "Setting %s context", +- glx_renderer->is_direct ? "direct" : "indirect"); ++ glx_display->is_direct ? "direct" : "indirect"); + + /* XXX: GLX doesn't let us make a context current without a window + * so we create a dummy window that we can use while no CoglOnscreen +@@ -1658,12 +1662,13 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen) + CoglContext *ctx = framebuffer->context; + CoglGLXRenderer *glx_renderer; + CoglXlibRenderer *xlib_renderer; ++ CoglGLXDisplay *glx_display; + + glx_renderer = ctx->display->renderer->winsys; + xlib_renderer = _cogl_xlib_renderer_get_data (ctx->display->renderer); ++ glx_display = ctx->display->winsys; + +- if (glx_renderer->glXWaitForMsc || +- glx_renderer->glXGetVideoSync) ++ if (glx_display->can_vblank_wait) + { + CoglFrameInfo *info = g_queue_peek_tail (&onscreen->pending_frame_infos); + +@@ -1759,6 +1764,7 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, + CoglXlibRenderer *xlib_renderer = + _cogl_xlib_renderer_get_data (context->display->renderer); + CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; ++ CoglGLXDisplay *glx_display = context->display->winsys; + CoglOnscreenXlib *xlib_onscreen = onscreen->winsys; + CoglOnscreenGLX *glx_onscreen = onscreen->winsys; + GLXDrawable drawable = +@@ -1815,9 +1821,8 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, + + if (framebuffer->config.swap_throttled) + { +- have_counter = +- _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_COUNTER); +- can_wait = _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT); ++ have_counter = glx_display->have_vblank_counter; ++ can_wait = glx_display->can_vblank_wait; + } + else + { +@@ -1974,6 +1979,7 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, + CoglXlibRenderer *xlib_renderer = + _cogl_xlib_renderer_get_data (context->display->renderer); + CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; ++ CoglGLXDisplay *glx_display = context->display->winsys; + CoglOnscreenXlib *xlib_onscreen = onscreen->winsys; + CoglOnscreenGLX *glx_onscreen = onscreen->winsys; + CoglBool have_counter; +@@ -1993,8 +1999,7 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, + { + uint32_t end_frame_vsync_counter = 0; + +- have_counter = +- _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_COUNTER); ++ have_counter = glx_display->have_vblank_counter; + + /* If the swap_region API is also being used then we need to track + * the vsync counter for each swap request so we can manually +@@ -2004,8 +2009,7 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, + + if (!glx_renderer->glXSwapInterval) + { +- CoglBool can_wait = +- _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT); ++ CoglBool can_wait = glx_display->can_vblank_wait; + + /* If we are going to wait for VBLANK manually, we not only + * need to flush out pending drawing to the GPU before we +-- +2.12.0 + + +From 55b8900c1d66a4568ff261a0498d12ca857d2431 Mon Sep 17 00:00:00 2001 +From: "Owen W. Taylor" +Date: Thu, 11 Feb 2016 17:12:09 -0500 +Subject: [PATCH 4/7] Fix the get_clock_time() without GLX_OML_sync_control + +When we don't have GLX_OML_sync_control, we still can set the +frame presentation time, but we always use the system monotonic time, +so return that from get_clock_time(). + +https://bugzilla.gnome.org/show_bug.cgi?id=779039 +--- + cogl/cogl/winsys/cogl-winsys-glx.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c +index 5a2700176..7ad1a3fdf 100644 +--- a/cogl/cogl/winsys/cogl-winsys-glx.c ++++ b/cogl/cogl/winsys/cogl-winsys-glx.c +@@ -296,6 +296,9 @@ _cogl_winsys_get_clock_time (CoglContext *context) + { + CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; + ++ if (!glx_renderer->glXWaitForMsc) ++ return get_monotonic_time_ns (); ++ + /* We don't call ensure_ust_type() because we don't have a drawable + * to work with. cogl_get_clock_time() is documented to only work + * once a valid, non-zero, timestamp has been retrieved from Cogl. +-- +2.12.0 + + +From cb784a7be6c72453bc441f03ced27a531ee687d5 Mon Sep 17 00:00:00 2001 +From: "Owen W. Taylor" +Date: Thu, 11 Feb 2016 17:15:13 -0500 +Subject: [PATCH 5/7] For NVIDIA proprietary drivers, implement sync events + with a thread + +It's a good guess that the buffer swap will occur at the next vblank, +so use glXWaitVideoSync in a separate thread to deliver a sync event +rather than just letting the client block when frame drawing, which +can signficantly change app logic as compared to the INTEL_swap_event +case. + +https://bugzilla.gnome.org/show_bug.cgi?id=779039 +--- + cogl/cogl/cogl-private.h | 3 + + cogl/cogl/winsys/cogl-winsys-glx.c | 294 +++++++++++++++++++++++++++++++++++-- + 2 files changed, 286 insertions(+), 11 deletions(-) + +diff --git a/cogl/cogl/cogl-private.h b/cogl/cogl/cogl-private.h +index 333955c65..e5dc9feda 100644 +--- a/cogl/cogl/cogl-private.h ++++ b/cogl/cogl/cogl-private.h +@@ -77,6 +77,9 @@ typedef enum + COGL_PRIVATE_FEATURE_GL_PROGRAMMABLE, + COGL_PRIVATE_FEATURE_GL_EMBEDDED, + COGL_PRIVATE_FEATURE_GL_WEB, ++ /* This is currently only implemented for GLX, but isn't actually ++ * that winsys dependent */ ++ COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT, + + COGL_N_PRIVATE_FEATURES + } CoglPrivateFeature; +diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c +index 7ad1a3fdf..1418d1501 100644 +--- a/cogl/cogl/winsys/cogl-winsys-glx.c ++++ b/cogl/cogl/winsys/cogl-winsys-glx.c +@@ -65,12 +65,16 @@ + #include + #include + #include ++#include + #include + #include ++#include + + #include + #include + ++#include ++ + /* This is a relatively new extension */ + #ifndef GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV + #define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7 +@@ -100,6 +104,14 @@ typedef struct _CoglOnscreenGLX + CoglBool pending_sync_notify; + CoglBool pending_complete_notify; + CoglBool pending_resize_notify; ++ ++ GThread *swap_wait_thread; ++ GQueue *swap_wait_queue; ++ GCond swap_wait_cond; ++ GMutex swap_wait_mutex; ++ int swap_wait_pipe[2]; ++ GLXContext swap_wait_context; ++ CoglBool closing_down; + } CoglOnscreenGLX; + + typedef struct _CoglPixmapTextureEyeGLX +@@ -885,6 +897,28 @@ update_winsys_features (CoglContext *context, CoglError **error) + COGL_FEATURE_ID_PRESENTATION_TIME, + TRUE); + } ++ else ++ { ++ CoglGpuInfo *info = &context->gpu; ++ if (glx_display->have_vblank_counter && ++ info->vendor == COGL_GPU_INFO_VENDOR_NVIDIA) ++ { ++ COGL_FLAGS_SET (context->winsys_features, ++ COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT, TRUE); ++ COGL_FLAGS_SET (context->winsys_features, ++ COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT, TRUE); ++ /* TODO: remove this deprecated feature */ ++ COGL_FLAGS_SET (context->features, ++ COGL_FEATURE_ID_SWAP_BUFFERS_EVENT, ++ TRUE); ++ COGL_FLAGS_SET (context->features, ++ COGL_FEATURE_ID_PRESENTATION_TIME, ++ TRUE); ++ COGL_FLAGS_SET (context->private_features, ++ COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT, ++ TRUE); ++ } ++ } + + /* We'll manually handle queueing dirty events in response to + * Expose events from X */ +@@ -1481,7 +1515,8 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen, + } + + #ifdef GLX_INTEL_swap_event +- if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT)) ++ if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT) && ++ !_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT)) + { + GLXDrawable drawable = + glx_onscreen->glxwin ? glx_onscreen->glxwin : xlib_onscreen->xwin; +@@ -1524,6 +1559,31 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen) + xlib_onscreen->output = NULL; + } + ++ if (glx_onscreen->swap_wait_thread) ++ { ++ g_mutex_lock (&glx_onscreen->swap_wait_mutex); ++ glx_onscreen->closing_down = TRUE; ++ g_cond_signal (&glx_onscreen->swap_wait_cond); ++ g_mutex_unlock (&glx_onscreen->swap_wait_mutex); ++ g_thread_join (glx_onscreen->swap_wait_thread); ++ glx_onscreen->swap_wait_thread = NULL; ++ ++ g_cond_clear (&glx_onscreen->swap_wait_cond); ++ g_mutex_clear (&glx_onscreen->swap_wait_mutex); ++ ++ g_queue_free (glx_onscreen->swap_wait_queue); ++ glx_onscreen->swap_wait_queue = NULL; ++ ++ _cogl_poll_renderer_remove_fd (context->display->renderer, ++ glx_onscreen->swap_wait_pipe[0]); ++ ++ close (glx_onscreen->swap_wait_pipe[0]); ++ close (glx_onscreen->swap_wait_pipe[1]); ++ ++ glx_renderer->glXDestroyContext (xlib_renderer->xdpy, ++ glx_onscreen->swap_wait_context); ++ } ++ + _cogl_xlib_renderer_trap_errors (context->display->renderer, &old_state); + + drawable = +@@ -1757,6 +1817,199 @@ set_frame_info_output (CoglOnscreen *onscreen, + } + } + ++static gpointer ++threaded_swap_wait (gpointer data) ++{ ++ CoglOnscreen *onscreen = data; ++ ++ CoglOnscreenGLX *glx_onscreen = onscreen->winsys; ++ ++ CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); ++ CoglContext *context = framebuffer->context; ++ CoglDisplay *display = context->display; ++ CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (display->renderer); ++ CoglGLXDisplay *glx_display = display->winsys; ++ CoglGLXRenderer *glx_renderer = display->renderer->winsys; ++ GLXDrawable dummy_drawable; ++ ++ if (glx_display->dummy_glxwin) ++ dummy_drawable = glx_display->dummy_glxwin; ++ else ++ dummy_drawable = glx_display->dummy_xwin; ++ ++ glx_renderer->glXMakeContextCurrent (xlib_renderer->xdpy, ++ dummy_drawable, ++ dummy_drawable, ++ glx_onscreen->swap_wait_context); ++ ++ g_mutex_lock (&glx_onscreen->swap_wait_mutex); ++ ++ while (TRUE) ++ { ++ gpointer queue_element; ++ uint32_t vblank_counter; ++ ++ while (!glx_onscreen->closing_down && glx_onscreen->swap_wait_queue->length == 0) ++ g_cond_wait (&glx_onscreen->swap_wait_cond, &glx_onscreen->swap_wait_mutex); ++ ++ if (glx_onscreen->closing_down) ++ break; ++ ++ queue_element = g_queue_pop_tail (glx_onscreen->swap_wait_queue); ++ vblank_counter = GPOINTER_TO_UINT(queue_element); ++ ++ g_mutex_unlock (&glx_onscreen->swap_wait_mutex); ++ glx_renderer->glXWaitVideoSync (2, ++ (vblank_counter + 1) % 2, ++ &vblank_counter); ++ g_mutex_lock (&glx_onscreen->swap_wait_mutex); ++ ++ if (!glx_onscreen->closing_down) ++ { ++ int bytes_written = 0; ++ ++ union { ++ char bytes[8]; ++ int64_t presentation_time; ++ } u; ++ ++ u.presentation_time = get_monotonic_time_ns (); ++ ++ while (bytes_written < 8) ++ { ++ int res = write (glx_onscreen->swap_wait_pipe[1], u.bytes + bytes_written, 8 - bytes_written); ++ if (res == -1) ++ { ++ if (errno != EINTR) ++ g_error ("Error writing to swap notification pipe: %s\n", ++ g_strerror (errno)); ++ } ++ else ++ { ++ bytes_written += res; ++ } ++ } ++ } ++ } ++ ++ g_mutex_unlock (&glx_onscreen->swap_wait_mutex); ++ ++ glx_renderer->glXMakeContextCurrent (xlib_renderer->xdpy, ++ None, ++ None, ++ NULL); ++ ++ return NULL; ++} ++ ++static int64_t ++threaded_swap_wait_pipe_prepare (void *user_data) ++{ ++ return -1; ++} ++ ++static void ++threaded_swap_wait_pipe_dispatch (void *user_data, int revents) ++{ ++ CoglOnscreen *onscreen = user_data; ++ CoglOnscreenGLX *glx_onscreen = onscreen->winsys; ++ ++ CoglFrameInfo *info; ++ ++ if ((revents & COGL_POLL_FD_EVENT_IN)) ++ { ++ int bytes_read = 0; ++ ++ union { ++ char bytes[8]; ++ int64_t presentation_time; ++ } u; ++ ++ while (bytes_read < 8) ++ { ++ int res = read (glx_onscreen->swap_wait_pipe[0], u.bytes + bytes_read, 8 - bytes_read); ++ if (res == -1) ++ { ++ if (errno != EINTR) ++ g_error ("Error reading from swap notification pipe: %s\n", ++ g_strerror (errno)); ++ } ++ else ++ { ++ bytes_read += res; ++ } ++ } ++ ++ set_sync_pending (onscreen); ++ set_complete_pending (onscreen); ++ ++ info = g_queue_peek_head (&onscreen->pending_frame_infos); ++ info->presentation_time = u.presentation_time; ++ } ++} ++ ++static void ++start_threaded_swap_wait (CoglOnscreen *onscreen, ++ uint32_t vblank_counter) ++{ ++ CoglOnscreenGLX *glx_onscreen = onscreen->winsys; ++ CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); ++ CoglContext *context = framebuffer->context; ++ ++ if (glx_onscreen->swap_wait_thread == NULL) ++ { ++ CoglDisplay *display = context->display; ++ CoglGLXRenderer *glx_renderer = display->renderer->winsys; ++ CoglGLXDisplay *glx_display = display->winsys; ++ CoglOnscreenXlib *xlib_onscreen = onscreen->winsys; ++ CoglXlibRenderer *xlib_renderer = ++ _cogl_xlib_renderer_get_data (display->renderer); ++ ++ GLXDrawable drawable = ++ glx_onscreen->glxwin ? glx_onscreen->glxwin : xlib_onscreen->xwin; ++ int i; ++ ++ ensure_ust_type (display->renderer, drawable); ++ ++ if ((pipe (glx_onscreen->swap_wait_pipe) == -1)) ++ g_error ("Couldn't create pipe for swap notification: %s\n", ++ g_strerror (errno)); ++ ++ for (i = 0; i < 2; i++) ++ { ++ if (fcntl(glx_onscreen->swap_wait_pipe[i], F_SETFD, ++ fcntl(glx_onscreen->swap_wait_pipe[i], F_GETFD, 0) | FD_CLOEXEC) == -1) ++ g_error ("Couldn't set swap notification pipe CLOEXEC: %s\n", ++ g_strerror (errno)); ++ } ++ ++ _cogl_poll_renderer_add_fd (display->renderer, ++ glx_onscreen->swap_wait_pipe[0], ++ COGL_POLL_FD_EVENT_IN, ++ threaded_swap_wait_pipe_prepare, ++ threaded_swap_wait_pipe_dispatch, ++ onscreen); ++ ++ glx_onscreen->swap_wait_queue = g_queue_new (); ++ g_mutex_init (&glx_onscreen->swap_wait_mutex); ++ g_cond_init (&glx_onscreen->swap_wait_cond); ++ glx_onscreen->swap_wait_context = ++ glx_renderer->glXCreateNewContext (xlib_renderer->xdpy, ++ glx_display->fbconfig, ++ GLX_RGBA_TYPE, ++ glx_display->glx_context, ++ True); ++ glx_onscreen->swap_wait_thread = g_thread_new ("cogl_glx_swap_wait", ++ threaded_swap_wait, ++ onscreen); ++ } ++ ++ g_mutex_lock (&glx_onscreen->swap_wait_mutex); ++ g_queue_push_head (glx_onscreen->swap_wait_queue, GUINT_TO_POINTER(vblank_counter)); ++ g_cond_signal (&glx_onscreen->swap_wait_cond); ++ g_mutex_unlock (&glx_onscreen->swap_wait_mutex); ++} ++ + static void + _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, + const int *user_rectangles, +@@ -2000,19 +2253,38 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, + + if (framebuffer->config.swap_throttled) + { +- uint32_t end_frame_vsync_counter = 0; +- + have_counter = glx_display->have_vblank_counter; + +- /* If the swap_region API is also being used then we need to track +- * the vsync counter for each swap request so we can manually +- * throttle swap_region requests. */ +- if (have_counter) +- end_frame_vsync_counter = _cogl_winsys_get_vsync_counter (context); +- +- if (!glx_renderer->glXSwapInterval) ++ if (glx_renderer->glXSwapInterval) + { +- CoglBool can_wait = glx_display->can_vblank_wait; ++ if (_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT)) ++ { ++ /* If we didn't wait for the GPU here, then it's easy to get the case ++ * where there is a VBlank between the point where we get the vsync counter ++ * and the point where the GPU is ready to actually perform the glXSwapBuffers(), ++ * and the swap wait terminates at the first VBlank rather than the one ++ * where the swap buffers happens. Calling glFinish() here makes this a ++ * rare race since the GPU is already ready to swap when we call glXSwapBuffers(). ++ * The glFinish() also prevents any serious damage if the rare race happens, ++ * since it will wait for the preceding glXSwapBuffers() and prevent us from ++ * getting premanently ahead. (For NVIDIA drivers, glFinish() after glXSwapBuffers() ++ * waits for the buffer swap to happen.) ++ */ ++ _cogl_winsys_wait_for_gpu (onscreen); ++ start_threaded_swap_wait (onscreen, _cogl_winsys_get_vsync_counter (context)); ++ } ++ } ++ else ++ { ++ CoglBool can_wait = have_counter || glx_display->can_vblank_wait; ++ ++ uint32_t end_frame_vsync_counter = 0; ++ ++ /* If the swap_region API is also being used then we need to track ++ * the vsync counter for each swap request so we can manually ++ * throttle swap_region requests. */ ++ if (have_counter) ++ end_frame_vsync_counter = _cogl_winsys_get_vsync_counter (context); + + /* If we are going to wait for VBLANK manually, we not only + * need to flush out pending drawing to the GPU before we +-- +2.12.0 + + +From fb0978b4ea33c88e7a42d4f478d60ef86e271414 Mon Sep 17 00:00:00 2001 +From: "Owen W. Taylor" +Date: Wed, 29 Jun 2016 13:52:59 -0400 +Subject: [PATCH 6/7] Add cogl_xlib_renderer_set_threaded_swap_wait_enabled() + +Because the threaded-swap-wait functionality requires XInitThreads(), +and because it isn't clear that it is a win for all applications, +add a API function to conditionally enable it. + +Fix the cogl-crate example not to just have a hard-coded dependency +on libX11. + +https://bugzilla.gnome.org/show_bug.cgi?id=779039 +--- + cogl/cogl/cogl-renderer-private.h | 1 + + cogl/cogl/cogl-renderer.c | 11 +++++++++++ + cogl/cogl/cogl-xlib-renderer.h | 30 ++++++++++++++++++++++++++++++ + cogl/cogl/winsys/cogl-winsys-glx.c | 1 + + 4 files changed, 43 insertions(+) + +diff --git a/cogl/cogl/cogl-renderer-private.h b/cogl/cogl/cogl-renderer-private.h +index 8627b6cc6..33ed0ceac 100644 +--- a/cogl/cogl/cogl-renderer-private.h ++++ b/cogl/cogl/cogl-renderer-private.h +@@ -69,6 +69,7 @@ struct _CoglRenderer + Display *foreign_xdpy; + CoglBool xlib_enable_event_retrieval; + CoglBool xlib_want_reset_on_video_memory_purge; ++ CoglBool xlib_enable_threaded_swap_wait; + #endif + + CoglDriver driver; +diff --git a/cogl/cogl/cogl-renderer.c b/cogl/cogl/cogl-renderer.c +index 51a04ffdd..e6575d808 100644 +--- a/cogl/cogl/cogl-renderer.c ++++ b/cogl/cogl/cogl-renderer.c +@@ -285,6 +285,17 @@ cogl_xlib_renderer_request_reset_on_video_memory_purge (CoglRenderer *renderer, + + renderer->xlib_want_reset_on_video_memory_purge = enable; + } ++ ++void ++cogl_xlib_renderer_set_threaded_swap_wait_enabled (CoglRenderer *renderer, ++ CoglBool enable) ++{ ++ _COGL_RETURN_IF_FAIL (cogl_is_renderer (renderer)); ++ /* NB: Renderers are considered immutable once connected */ ++ _COGL_RETURN_IF_FAIL (!renderer->connected); ++ ++ renderer->xlib_enable_threaded_swap_wait = enable; ++} + #endif /* COGL_HAS_XLIB_SUPPORT */ + + CoglBool +diff --git a/cogl/cogl/cogl-xlib-renderer.h b/cogl/cogl/cogl-xlib-renderer.h +index f3c1d7c09..3c0db189b 100644 +--- a/cogl/cogl/cogl-xlib-renderer.h ++++ b/cogl/cogl/cogl-xlib-renderer.h +@@ -168,6 +168,36 @@ cogl_xlib_renderer_set_event_retrieval_enabled (CoglRenderer *renderer, + CoglBool enable); + + /** ++ * cogl_xlib_renderer_set_threaded_swap_wait_enabled: ++ * @renderer: a #CoglRenderer ++ * @enable: The new value ++ * ++ * Sets whether Cogl is allowed to use a separate threaded to wait for the ++ * completion of glXSwapBuffers() and call the frame callback for the ++ * corresponding #CoglOnscreen. This is a way of emulating the ++ * INTEL_swap_event extension, and will only ever be used if ++ * INTEL_swap_event is not present; it will also only be used for ++ * specific white-listed drivers that are known to work correctly with ++ * multiple contexts sharing state between threads. ++ * ++ * The advantage of enabling this is that it will allow your main loop ++ * to do other work while waiting for the system to be ready to draw ++ * the next frame, instead of blocking in glXSwapBuffers(). A disadvantage ++ * is that the driver will be prevented from buffering up multiple frames ++ * even if it thinks that it would be advantageous. In general, this ++ * will work best for something like a system compositor that is doing ++ * simple drawing but handling lots of other complex tasks. ++ * ++ * If you enable this, you must call XInitThreads() before any other ++ * X11 calls in your program. (See the documentation for XInitThreads()) ++ * ++ * Stability: unstable ++ */ ++void ++cogl_xlib_renderer_set_threaded_swap_wait_enabled (CoglRenderer *renderer, ++ CoglBool enable); ++ ++/** + * cogl_xlib_renderer_get_display: (skip) + */ + Display * +diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c +index 1418d1501..74b0895d1 100644 +--- a/cogl/cogl/winsys/cogl-winsys-glx.c ++++ b/cogl/cogl/winsys/cogl-winsys-glx.c +@@ -901,6 +901,7 @@ update_winsys_features (CoglContext *context, CoglError **error) + { + CoglGpuInfo *info = &context->gpu; + if (glx_display->have_vblank_counter && ++ context->display->renderer->xlib_enable_threaded_swap_wait && + info->vendor == COGL_GPU_INFO_VENDOR_NVIDIA) + { + COGL_FLAGS_SET (context->winsys_features, +-- +2.12.0 + + +From 9505ce8cce4fe14443b5c9868e4e7301268a8d23 Mon Sep 17 00:00:00 2001 +From: "Owen W. Taylor" +Date: Tue, 21 Feb 2017 13:51:16 -0500 +Subject: [PATCH 7/7] Call cogl_xlib_renderer_set_threaded_swap_wait_enabled() + +Set up things so that if the INTEL_swap_event extension is not present, +but the driver is known to have good thread support, we use an extra +thread and call glXWaitVideoSync() in the thread. This allows idles +to work properly, even when Mutter is constantly redrawing new frames; +otherwise, without INTEL_swap_event, we'll just block in glXSwapBuffers(). + +https://bugzilla.gnome.org/show_bug.cgi?id=779039 +--- + src/backends/x11/meta-backend-x11.c | 6 ++++++ + src/backends/x11/meta-renderer-x11.c | 8 ++++++++ + 2 files changed, 14 insertions(+) + +diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c +index a0b196efe..413b0622a 100644 +--- a/src/backends/x11/meta-backend-x11.c ++++ b/src/backends/x11/meta-backend-x11.c +@@ -913,6 +913,12 @@ meta_backend_x11_init (MetaBackendX11 *x11) + { + MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); + ++ /* XInitThreads() is needed to use the "threaded swap wait" functionality ++ * in Cogl - see meta_renderer_x11_create_cogl_renderer(). We call it here ++ * to hopefully call it before any other use of XLib. ++ */ ++ XInitThreads(); ++ + clutter_x11_request_reset_on_video_memory_purge (); + + /* We do X11 event retrieval ourselves */ +diff --git a/src/backends/x11/meta-renderer-x11.c b/src/backends/x11/meta-renderer-x11.c +index c0405bedc..9a86f493a 100644 +--- a/src/backends/x11/meta-renderer-x11.c ++++ b/src/backends/x11/meta-renderer-x11.c +@@ -65,6 +65,14 @@ meta_renderer_x11_create_cogl_renderer (MetaRenderer *renderer) + cogl_renderer_set_custom_winsys (cogl_renderer, get_x11_cogl_winsys_vtable); + cogl_xlib_renderer_set_foreign_display (cogl_renderer, xdisplay); + ++ /* Set up things so that if the INTEL_swap_event extension is not present, ++ * but the driver is known to have good thread support, we use an extra ++ * thread and call glXWaitVideoSync() in the thread. This allows idles ++ * to work properly, even when Mutter is constantly redrawing new frames; ++ * otherwise, without INTEL_swap_event, we'll just block in glXSwapBuffers(). ++ */ ++ cogl_xlib_renderer_set_threaded_swap_wait_enabled (cogl_renderer, TRUE); ++ + return cogl_renderer; + } + +-- +2.12.0 + diff --git a/SOURCES/deal-more-gracefully-with-oversized-windows.patch b/SOURCES/deal-more-gracefully-with-oversized-windows.patch index f5caaad..b91bd6f 100644 --- a/SOURCES/deal-more-gracefully-with-oversized-windows.patch +++ b/SOURCES/deal-more-gracefully-with-oversized-windows.patch @@ -1,4 +1,4 @@ -From 7db4306b3ca67f651466f26302f013504f70a464 Mon Sep 17 00:00:00 2001 +From 196f9e68c5c95989225870a8554eac7f61e974f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 12 Mar 2014 02:04:13 +0100 Subject: [PATCH] constraints: Enforce X11 size limits @@ -10,18 +10,18 @@ to keep insanely huge windows from crashing the WM. 1 file changed, 42 insertions(+) diff --git a/src/core/constraints.c b/src/core/constraints.c -index d0ac4fa..9f5f127 100644 +index e7dcacd84..67b52c994 100644 --- a/src/core/constraints.c +++ b/src/core/constraints.c -@@ -102,6 +102,7 @@ typedef enum - PRIORITY_SIZE_HINTS_LIMITS = 3, +@@ -103,6 +103,7 @@ typedef enum PRIORITY_TITLEBAR_VISIBLE = 4, PRIORITY_PARTIALLY_VISIBLE_ON_WORKAREA = 4, + PRIORITY_CUSTOM_RULE = 4, + PRIORITY_XLIMITS = 4, PRIORITY_MAXIMUM = 4 /* Dummy value used for loop end = max(all priorities) */ } ConstraintPriority; -@@ -188,6 +189,10 @@ static gboolean constrain_partially_onscreen (MetaWindow *window, +@@ -193,6 +194,10 @@ static gboolean constrain_partially_onscreen (MetaWindow *window, ConstraintInfo *info, ConstraintPriority priority, gboolean check_only); @@ -32,7 +32,7 @@ index d0ac4fa..9f5f127 100644 static void setup_constraint_info (ConstraintInfo *info, MetaWindow *window, -@@ -222,6 +227,7 @@ static const Constraint all_constraints[] = { +@@ -228,6 +233,7 @@ static const Constraint all_constraints[] = { {constrain_fully_onscreen, "constrain_fully_onscreen"}, {constrain_titlebar_visible, "constrain_titlebar_visible"}, {constrain_partially_onscreen, "constrain_partially_onscreen"}, @@ -40,7 +40,7 @@ index d0ac4fa..9f5f127 100644 {NULL, NULL} }; -@@ -1429,3 +1435,39 @@ constrain_partially_onscreen (MetaWindow *window, +@@ -1659,3 +1665,39 @@ constrain_partially_onscreen (MetaWindow *window, return retval; } @@ -81,5 +81,5 @@ index d0ac4fa..9f5f127 100644 + return TRUE; +} -- -2.3.3 +2.12.0 diff --git a/SOURCES/fall-back-to-xorg-on-hybrid-gpus.patch b/SOURCES/fall-back-to-xorg-on-hybrid-gpus.patch new file mode 100644 index 0000000..0e26bc3 --- /dev/null +++ b/SOURCES/fall-back-to-xorg-on-hybrid-gpus.patch @@ -0,0 +1,596 @@ +From 5bea406b353f39867eb86307b1c8b4093f22968e Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 18 Oct 2016 16:40:14 -0400 +Subject: [PATCH 1/4] native: only match drm subsystem devices + +Despite g_udev_client_new taking a list of subsystems, it doesn't +implicitly filter results to those subsystems. + +This commit explicitly adds a subsystem match to make sure sound cards +don't end up in the resulting list of video cards. + +https://bugzilla.gnome.org/show_bug.cgi?id=771442 +--- + src/backends/native/meta-launcher.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/backends/native/meta-launcher.c b/src/backends/native/meta-launcher.c +index ea28e5a..03a928a 100644 +--- a/src/backends/native/meta-launcher.c ++++ b/src/backends/native/meta-launcher.c +@@ -268,60 +268,65 @@ sync_active (MetaLauncher *self) + self->session_active = active; + + if (active) + session_unpause (); + else + session_pause (); + } + + static void + on_active_changed (Login1Session *session, + GParamSpec *pspec, + gpointer user_data) + { + MetaLauncher *self = user_data; + sync_active (self); + } + + static gchar * + get_primary_gpu_path (const gchar *seat_name) + { + const gchar *subsystems[] = {"drm", NULL}; + gchar *path = NULL; + GList *devices, *tmp; + + g_autoptr (GUdevClient) gudev_client = g_udev_client_new (subsystems); + g_autoptr (GUdevEnumerator) enumerator = g_udev_enumerator_new (gudev_client); + + g_udev_enumerator_add_match_name (enumerator, "card*"); + g_udev_enumerator_add_match_tag (enumerator, "seat"); + ++ /* We need to explicitly match the subsystem for now. ++ * https://bugzilla.gnome.org/show_bug.cgi?id=773224 ++ */ ++ g_udev_enumerator_add_match_subsystem (enumerator, "drm"); ++ + devices = g_udev_enumerator_execute (enumerator); + if (!devices) + goto out; + + for (tmp = devices; tmp != NULL; tmp = tmp->next) + { + g_autoptr (GUdevDevice) platform_device = NULL; + g_autoptr (GUdevDevice) pci_device = NULL; + GUdevDevice *dev = tmp->data; + gint boot_vga; + const gchar *device_seat; + + /* filter out devices that are not character device, like card0-VGA-1 */ + if (g_udev_device_get_device_type (dev) != G_UDEV_DEVICE_TYPE_CHAR) + continue; + + device_seat = g_udev_device_get_property (dev, "ID_SEAT"); + if (!device_seat) + { + /* when ID_SEAT is not set, it means seat0 */ + device_seat = "seat0"; + } + else if (g_strcmp0 (device_seat, "seat0") != 0) + { + /* if the device has been explicitly assigned other seat + * than seat0, it is probably the right device to use */ + path = g_strdup (g_udev_device_get_device_file (dev)); + break; + } + +-- +2.10.1 + + +From d9dc6ac094080a4190508297e8244a8905a8dcb4 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Wed, 19 Oct 2016 10:41:14 -0400 +Subject: [PATCH 2/4] native: shore up matching of card device + +Right now we accept any character device that matches the glob card*. + +That's fine, but we can be a little more specific by checking that +the devtype is what we expect. + +This commit does that. + +https://bugzilla.gnome.org/show_bug.cgi?id=771442 +--- + src/backends/native/meta-launcher.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/src/backends/native/meta-launcher.c b/src/backends/native/meta-launcher.c +index 03a928a..765e5ef 100644 +--- a/src/backends/native/meta-launcher.c ++++ b/src/backends/native/meta-launcher.c +@@ -20,60 +20,62 @@ + #include "config.h" + + #include "meta-launcher.h" + + #include + + #include + #include + #include + + #include + #include + #include + #include + #include + #include + #include + #include + + #include + #include + + #include "dbus-utils.h" + #include "meta-dbus-login1.h" + + #include "backends/meta-backend-private.h" + #include "meta-cursor-renderer-native.h" + #include "meta-idle-monitor-native.h" + #include "meta-renderer-native.h" + ++#define DRM_CARD_UDEV_DEVICE_TYPE "drm_minor" ++ + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevDevice, g_object_unref) + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevClient, g_object_unref) + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevEnumerator, g_object_unref) + + struct _MetaLauncher + { + Login1Session *session_proxy; + Login1Seat *seat_proxy; + + gboolean session_active; + + int kms_fd; + }; + + static Login1Session * + get_session_proxy (GCancellable *cancellable, + GError **error) + { + g_autofree char *proxy_path = NULL; + g_autofree char *session_id = NULL; + Login1Session *session_proxy; + + if (sd_pid_get_session (getpid (), &session_id) < 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_NOT_FOUND, + "Could not get session ID: %m"); + return NULL; + } +@@ -283,66 +285,71 @@ on_active_changed (Login1Session *session, + } + + static gchar * + get_primary_gpu_path (const gchar *seat_name) + { + const gchar *subsystems[] = {"drm", NULL}; + gchar *path = NULL; + GList *devices, *tmp; + + g_autoptr (GUdevClient) gudev_client = g_udev_client_new (subsystems); + g_autoptr (GUdevEnumerator) enumerator = g_udev_enumerator_new (gudev_client); + + g_udev_enumerator_add_match_name (enumerator, "card*"); + g_udev_enumerator_add_match_tag (enumerator, "seat"); + + /* We need to explicitly match the subsystem for now. + * https://bugzilla.gnome.org/show_bug.cgi?id=773224 + */ + g_udev_enumerator_add_match_subsystem (enumerator, "drm"); + + devices = g_udev_enumerator_execute (enumerator); + if (!devices) + goto out; + + for (tmp = devices; tmp != NULL; tmp = tmp->next) + { + g_autoptr (GUdevDevice) platform_device = NULL; + g_autoptr (GUdevDevice) pci_device = NULL; + GUdevDevice *dev = tmp->data; + gint boot_vga; ++ const gchar *device_type; + const gchar *device_seat; + + /* filter out devices that are not character device, like card0-VGA-1 */ + if (g_udev_device_get_device_type (dev) != G_UDEV_DEVICE_TYPE_CHAR) + continue; + ++ device_type = g_udev_device_get_property (dev, "DEVTYPE"); ++ if (g_strcmp0 (device_type, DRM_CARD_UDEV_DEVICE_TYPE) != 0) ++ continue; ++ + device_seat = g_udev_device_get_property (dev, "ID_SEAT"); + if (!device_seat) + { + /* when ID_SEAT is not set, it means seat0 */ + device_seat = "seat0"; + } + else if (g_strcmp0 (device_seat, "seat0") != 0) + { + /* if the device has been explicitly assigned other seat + * than seat0, it is probably the right device to use */ + path = g_strdup (g_udev_device_get_device_file (dev)); + break; + } + + /* skip devices that do not belong to our seat */ + if (g_strcmp0 (seat_name, device_seat)) + continue; + + platform_device = g_udev_device_get_parent_with_subsystem (dev, "platform", NULL); + if (platform_device != NULL) + { + path = g_strdup (g_udev_device_get_device_file (dev)); + break; + } + + pci_device = g_udev_device_get_parent_with_subsystem (dev, "pci", NULL); + if (pci_device != NULL) + { + /* get value of boot_vga attribute or 0 if the device has no boot_vga */ + boot_vga = g_udev_device_get_sysfs_attr_as_int (pci_device, "boot_vga"); +-- +2.10.1 + + +From 54ceafff8c8b0b02cd9124eae56a05da4f117033 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 18 Oct 2016 16:43:04 -0400 +Subject: [PATCH 3/4] native: fail on systems with connectors spread across + multiple gpus + +We don't support using more than one GPU for output yet, so we should fail +if we encounter that situation, so GDM will fall back to X. + +https://bugzilla.gnome.org/show_bug.cgi?id=771442 +--- + src/backends/native/meta-launcher.c | 63 ++++++++++++++++++++++++++++++++++++- + 1 file changed, 62 insertions(+), 1 deletion(-) + +diff --git a/src/backends/native/meta-launcher.c b/src/backends/native/meta-launcher.c +index 765e5ef..a2885a1 100644 +--- a/src/backends/native/meta-launcher.c ++++ b/src/backends/native/meta-launcher.c +@@ -257,141 +257,202 @@ on_evdev_device_close (int fd, + + out: + close (fd); + } + + static void + sync_active (MetaLauncher *self) + { + gboolean active = login1_session_get_active (LOGIN1_SESSION (self->session_proxy)); + + if (active == self->session_active) + return; + + self->session_active = active; + + if (active) + session_unpause (); + else + session_pause (); + } + + static void + on_active_changed (Login1Session *session, + GParamSpec *pspec, + gpointer user_data) + { + MetaLauncher *self = user_data; + sync_active (self); + } + ++static guint ++count_devices_with_connectors (const gchar *seat_name, ++ GList *devices) ++{ ++ g_autoptr (GHashTable) cards = NULL; ++ GList *tmp; ++ ++ cards = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); ++ for (tmp = devices; tmp != NULL; tmp = tmp->next) ++ { ++ GUdevDevice *device = tmp->data; ++ g_autoptr (GUdevDevice) parent_device = NULL; ++ const gchar *parent_device_type = NULL; ++ const gchar *card_seat; ++ ++ /* filter out the real card devices, we only care about the connectors */ ++ if (g_udev_device_get_device_type (device) != G_UDEV_DEVICE_TYPE_NONE) ++ continue; ++ ++ /* only connectors have a modes attribute */ ++ if (!g_udev_device_has_sysfs_attr (device, "modes")) ++ continue; ++ ++ parent_device = g_udev_device_get_parent (device); ++ ++ if (g_udev_device_get_device_type (parent_device) == G_UDEV_DEVICE_TYPE_CHAR) ++ parent_device_type = g_udev_device_get_property (parent_device, "DEVTYPE"); ++ ++ if (g_strcmp0 (parent_device_type, DRM_CARD_UDEV_DEVICE_TYPE) != 0) ++ continue; ++ ++ card_seat = g_udev_device_get_property (parent_device, "ID_SEAT"); ++ ++ if (!card_seat) ++ card_seat = "seat0"; ++ ++ if (g_strcmp0 (seat_name, card_seat) != 0) ++ continue; ++ ++ g_hash_table_insert (cards, ++ (gpointer) g_udev_device_get_name (parent_device), ++ g_steal_pointer (&parent_device)); ++ } ++ ++ return g_hash_table_size (cards); ++} ++ + static gchar * + get_primary_gpu_path (const gchar *seat_name) + { + const gchar *subsystems[] = {"drm", NULL}; + gchar *path = NULL; + GList *devices, *tmp; + + g_autoptr (GUdevClient) gudev_client = g_udev_client_new (subsystems); + g_autoptr (GUdevEnumerator) enumerator = g_udev_enumerator_new (gudev_client); + + g_udev_enumerator_add_match_name (enumerator, "card*"); + g_udev_enumerator_add_match_tag (enumerator, "seat"); + + /* We need to explicitly match the subsystem for now. + * https://bugzilla.gnome.org/show_bug.cgi?id=773224 + */ + g_udev_enumerator_add_match_subsystem (enumerator, "drm"); + + devices = g_udev_enumerator_execute (enumerator); + if (!devices) + goto out; + ++ /* For now, fail on systems where some of the connectors ++ * are connected to secondary gpus. ++ * ++ * https://bugzilla.gnome.org/show_bug.cgi?id=771442 ++ */ ++ if (g_getenv ("MUTTER_ALLOW_HYBRID_GPUS") == NULL) ++ { ++ guint num_devices; ++ ++ num_devices = count_devices_with_connectors (seat_name, devices); ++ if (num_devices != 1) ++ goto out; ++ } ++ + for (tmp = devices; tmp != NULL; tmp = tmp->next) + { + g_autoptr (GUdevDevice) platform_device = NULL; + g_autoptr (GUdevDevice) pci_device = NULL; + GUdevDevice *dev = tmp->data; + gint boot_vga; + const gchar *device_type; + const gchar *device_seat; + + /* filter out devices that are not character device, like card0-VGA-1 */ + if (g_udev_device_get_device_type (dev) != G_UDEV_DEVICE_TYPE_CHAR) + continue; + + device_type = g_udev_device_get_property (dev, "DEVTYPE"); + if (g_strcmp0 (device_type, DRM_CARD_UDEV_DEVICE_TYPE) != 0) + continue; + + device_seat = g_udev_device_get_property (dev, "ID_SEAT"); + if (!device_seat) + { + /* when ID_SEAT is not set, it means seat0 */ + device_seat = "seat0"; + } + else if (g_strcmp0 (device_seat, "seat0") != 0) + { + /* if the device has been explicitly assigned other seat + * than seat0, it is probably the right device to use */ + path = g_strdup (g_udev_device_get_device_file (dev)); + break; + } + + /* skip devices that do not belong to our seat */ + if (g_strcmp0 (seat_name, device_seat)) + continue; + + platform_device = g_udev_device_get_parent_with_subsystem (dev, "platform", NULL); + if (platform_device != NULL) + { + path = g_strdup (g_udev_device_get_device_file (dev)); + break; + } + + pci_device = g_udev_device_get_parent_with_subsystem (dev, "pci", NULL); + if (pci_device != NULL) + { + /* get value of boot_vga attribute or 0 if the device has no boot_vga */ + boot_vga = g_udev_device_get_sysfs_attr_as_int (pci_device, "boot_vga"); + if (boot_vga == 1) + { + /* found the boot_vga device */ + path = g_strdup (g_udev_device_get_device_file (dev)); + break; + } + } + } + ++out: + g_list_free_full (devices, g_object_unref); + +-out: + return path; + } + + static gboolean + get_kms_fd (Login1Session *session_proxy, + const gchar *seat_id, + int *fd_out, + GError **error) + { + int major, minor; + int fd; + + g_autofree gchar *path = get_primary_gpu_path (seat_id); + if (!path) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_NOT_FOUND, + "could not find drm kms device"); + return FALSE; + } + + if (!get_device_info_from_path (path, &major, &minor)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_NOT_FOUND, + "Could not get device info for path %s: %m", path); + return FALSE; + } +-- +2.10.1 + + +From 0d87baa029329c409646e04bcf40bea5da67b5f7 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Wed, 19 Oct 2016 14:27:24 -0400 +Subject: [PATCH 4/4] native: don't call steal_pointer prematurely + +commit e2bfaf07514ed633f8721b5f521577685b6cccc0 does this: + +g_hash_table_insert (cards, + g_udev_device_get_name (parent_device), + g_steal_pointer (&parent_device)); + +The problem is the g_steal_pointer call may happen before the +g_udev_device_get_name call leading to a crash. + +This commit does the get_name call on an earlier line + +https://bugzilla.gnome.org/show_bug.cgi?id=771442 +--- + src/backends/native/meta-launcher.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/backends/native/meta-launcher.c b/src/backends/native/meta-launcher.c +index a2885a1..ddb7080 100644 +--- a/src/backends/native/meta-launcher.c ++++ b/src/backends/native/meta-launcher.c +@@ -270,88 +270,90 @@ sync_active (MetaLauncher *self) + self->session_active = active; + + if (active) + session_unpause (); + else + session_pause (); + } + + static void + on_active_changed (Login1Session *session, + GParamSpec *pspec, + gpointer user_data) + { + MetaLauncher *self = user_data; + sync_active (self); + } + + static guint + count_devices_with_connectors (const gchar *seat_name, + GList *devices) + { + g_autoptr (GHashTable) cards = NULL; + GList *tmp; + + cards = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); + for (tmp = devices; tmp != NULL; tmp = tmp->next) + { + GUdevDevice *device = tmp->data; + g_autoptr (GUdevDevice) parent_device = NULL; + const gchar *parent_device_type = NULL; ++ const gchar *parent_device_name = NULL; + const gchar *card_seat; + + /* filter out the real card devices, we only care about the connectors */ + if (g_udev_device_get_device_type (device) != G_UDEV_DEVICE_TYPE_NONE) + continue; + + /* only connectors have a modes attribute */ + if (!g_udev_device_has_sysfs_attr (device, "modes")) + continue; + + parent_device = g_udev_device_get_parent (device); + + if (g_udev_device_get_device_type (parent_device) == G_UDEV_DEVICE_TYPE_CHAR) + parent_device_type = g_udev_device_get_property (parent_device, "DEVTYPE"); + + if (g_strcmp0 (parent_device_type, DRM_CARD_UDEV_DEVICE_TYPE) != 0) + continue; + + card_seat = g_udev_device_get_property (parent_device, "ID_SEAT"); + + if (!card_seat) + card_seat = "seat0"; + + if (g_strcmp0 (seat_name, card_seat) != 0) + continue; + ++ parent_device_name = g_udev_device_get_name (parent_device); + g_hash_table_insert (cards, +- (gpointer) g_udev_device_get_name (parent_device), ++ (gpointer) parent_device_name , + g_steal_pointer (&parent_device)); + } + + return g_hash_table_size (cards); + } + + static gchar * + get_primary_gpu_path (const gchar *seat_name) + { + const gchar *subsystems[] = {"drm", NULL}; + gchar *path = NULL; + GList *devices, *tmp; + + g_autoptr (GUdevClient) gudev_client = g_udev_client_new (subsystems); + g_autoptr (GUdevEnumerator) enumerator = g_udev_enumerator_new (gudev_client); + + g_udev_enumerator_add_match_name (enumerator, "card*"); + g_udev_enumerator_add_match_tag (enumerator, "seat"); + + /* We need to explicitly match the subsystem for now. + * https://bugzilla.gnome.org/show_bug.cgi?id=773224 + */ + g_udev_enumerator_add_match_subsystem (enumerator, "drm"); + + devices = g_udev_enumerator_execute (enumerator); + if (!devices) + goto out; + + /* For now, fail on systems where some of the connectors + * are connected to secondary gpus. +-- +2.10.1 + diff --git a/SOURCES/fix-nvidia-screen-flickering.patch b/SOURCES/fix-nvidia-screen-flickering.patch deleted file mode 100644 index 98667a0..0000000 --- a/SOURCES/fix-nvidia-screen-flickering.patch +++ /dev/null @@ -1,1160 +0,0 @@ -From e13f43987b9cd3320441816de0b6b570be95c01f Mon Sep 17 00:00:00 2001 -From: Calvin Walton -Date: Tue, 24 Mar 2015 11:21:25 -0400 -Subject: [PATCH 1/5] Include libXrender as a dependency, link it to libmutter - -Mutter uses a function from libXrender (XRenderFindStandardFormat in -src/x11/iconcache.c), but doesn't link to libXrender. This causes -link issues on systems using the gold linker, particularly with --Wl,--as-needed. - -Since mutter is using a function from libXrender, adding 'xrender' -as a dependency seems appropriate, and fixes the issue. - -https://bugzilla.gnome.org/show_bug.cgi?id=746692 ---- - configure.ac | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/configure.ac b/configure.ac -index 74f4eeb..d193606 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -88,6 +88,7 @@ MUTTER_PC_MODULES=" - xi >= 1.6.0 - xkbfile - xkeyboard-config -+ xrender - xcb-randr - " - --- -2.5.0 - - -From 04173777a23549eea3823516483909112ac77303 Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Fri, 18 Apr 2014 20:21:20 +0200 -Subject: [PATCH 2/5] compositor: Add support for GL_EXT_x11_sync_object - -If GL advertises this extension we'll use it to synchronize X with GL -rendering instead of relying on the XSync() behavior with open source -drivers. - -Some driver bugs were uncovered while working on this so if we have -had to reboot the ring a few times, something is probably wrong and -we're likely to just make things worse by continuing to try. Let's -err on the side of caution, disable ourselves and fallback to the -XSync() path in the compositor. - -https://bugzilla.gnome.org/show_bug.cgi?id=728464 ---- - configure.ac | 5 + - src/Makefile.am | 2 + - src/backends/x11/meta-backend-x11.c | 3 + - src/compositor/compositor-private.h | 4 +- - src/compositor/compositor.c | 71 +++-- - src/compositor/meta-sync-ring.c | 566 ++++++++++++++++++++++++++++++++++++ - src/compositor/meta-sync-ring.h | 14 + - 7 files changed, 641 insertions(+), 24 deletions(-) - create mode 100644 src/compositor/meta-sync-ring.c - create mode 100644 src/compositor/meta-sync-ring.h - -diff --git a/configure.ac b/configure.ac -index d193606..fe1c1eb 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -312,6 +312,11 @@ fi - - GTK_DOC_CHECK([1.15], [--flavour no-tmpl]) - -+AC_CHECK_DECL([GL_EXT_x11_sync_object], -+ [], -+ [AC_MSG_ERROR([GL_EXT_x11_sync_object definition not found, please update your GL headers])], -+ [#include ]) -+ - #### Warnings (last since -Werror can disturb other tests) - - # Stay command-line compatible with the gnome-common configure option. Here -diff --git a/src/Makefile.am b/src/Makefile.am -index e73a053..d7a44bc 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -126,6 +126,8 @@ libmutter_la_SOURCES = \ - compositor/meta-surface-actor.h \ - compositor/meta-surface-actor-x11.c \ - compositor/meta-surface-actor-x11.h \ -+ compositor/meta-sync-ring.c \ -+ compositor/meta-sync-ring.h \ - compositor/meta-texture-rectangle.c \ - compositor/meta-texture-rectangle.h \ - compositor/meta-texture-tower.c \ -diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c -index 586f991..d77365d 100644 ---- a/src/backends/x11/meta-backend-x11.c -+++ b/src/backends/x11/meta-backend-x11.c -@@ -43,6 +43,7 @@ - #include - #include "display-private.h" - #include "compositor/compositor-private.h" -+#include "compositor/meta-sync-ring.h" - - struct _MetaBackendX11Private - { -@@ -183,6 +184,8 @@ handle_host_xevent (MetaBackend *backend, - MetaCompositor *compositor = display->compositor; - if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event)) - bypass_clutter = TRUE; -+ if (compositor->have_x11_sync_object) -+ meta_sync_ring_handle_event (event); - } - } - -diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h -index 80fb4e2..9e3e73d 100644 ---- a/src/compositor/compositor-private.h -+++ b/src/compositor/compositor-private.h -@@ -15,7 +15,8 @@ struct _MetaCompositor - { - MetaDisplay *display; - -- guint repaint_func_id; -+ guint pre_paint_func_id; -+ guint post_paint_func_id; - - gint64 server_time_query_time; - gint64 server_time_offset; -@@ -40,6 +41,7 @@ struct _MetaCompositor - MetaPluginManager *plugin_mgr; - - gboolean frame_has_updated_xsurfaces; -+ gboolean have_x11_sync_object; - }; - - /* Wait 2ms after vblank before starting to draw next frame */ -diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c -index 8bf469f..554faa1 100644 ---- a/src/compositor/compositor.c -+++ b/src/compositor/compositor.c -@@ -79,6 +79,7 @@ - #include "frame.h" - #include - #include -+#include "meta-sync-ring.h" - - #include "backends/x11/meta-backend-x11.h" - -@@ -125,7 +126,11 @@ meta_switch_workspace_completed (MetaCompositor *compositor) - void - meta_compositor_destroy (MetaCompositor *compositor) - { -- clutter_threads_remove_repaint_func (compositor->repaint_func_id); -+ clutter_threads_remove_repaint_func (compositor->pre_paint_func_id); -+ clutter_threads_remove_repaint_func (compositor->post_paint_func_id); -+ -+ if (compositor->have_x11_sync_object) -+ meta_sync_ring_destroy (); - } - - static void -@@ -468,13 +473,11 @@ meta_compositor_manage (MetaCompositor *compositor) - MetaDisplay *display = compositor->display; - Display *xdisplay = display->xdisplay; - MetaScreen *screen = display->screen; -+ MetaBackend *backend = meta_get_backend (); - - meta_screen_set_cm_selection (display->screen); - -- { -- MetaBackend *backend = meta_get_backend (); -- compositor->stage = meta_backend_get_stage (backend); -- } -+ compositor->stage = meta_backend_get_stage (backend); - - /* We use connect_after() here to accomodate code in GNOME Shell that, - * when benchmarking drawing performance, connects to ::after-paint -@@ -510,7 +513,7 @@ meta_compositor_manage (MetaCompositor *compositor) - - compositor->output = screen->composite_overlay_window; - -- xwin = meta_backend_x11_get_xwindow (META_BACKEND_X11 (meta_get_backend ())); -+ xwin = meta_backend_x11_get_xwindow (META_BACKEND_X11 (backend)); - - XReparentWindow (xdisplay, xwin, compositor->output, 0, 0); - -@@ -530,6 +533,9 @@ meta_compositor_manage (MetaCompositor *compositor) - * contents until we show the stage. - */ - XMapWindow (xdisplay, compositor->output); -+ -+ compositor->have_x11_sync_object = -+ meta_sync_ring_init (meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend))); - } - - redirect_windows (display->screen); -@@ -1044,11 +1050,12 @@ frame_callback (CoglOnscreen *onscreen, - } - } - --static void --pre_paint_windows (MetaCompositor *compositor) -+static gboolean -+meta_pre_paint_func (gpointer data) - { - GList *l; - MetaWindowActor *top_window; -+ MetaCompositor *compositor = data; - - if (compositor->onscreen == NULL) - { -@@ -1060,7 +1067,7 @@ pre_paint_windows (MetaCompositor *compositor) - } - - if (compositor->windows == NULL) -- return; -+ return TRUE; - - top_window = g_list_last (compositor->windows)->data; - -@@ -1077,10 +1084,12 @@ pre_paint_windows (MetaCompositor *compositor) - { - /* We need to make sure that any X drawing that happens before - * the XDamageSubtract() for each window above is visible to -- * subsequent GL rendering; the only standardized way to do this -- * is EXT_x11_sync_object, which isn't yet widely available. For -- * now, we count on details of Xorg and the open source drivers, -- * and hope for the best otherwise. -+ * subsequent GL rendering; the standardized way to do this is -+ * GL_EXT_X11_sync_object. Since this isn't implemented yet in -+ * mesa, we also have a path that relies on the implementation -+ * of the open source drivers. -+ * -+ * Anything else, we just hope for the best. - * - * Xorg and open source driver specifics: - * -@@ -1095,18 +1104,28 @@ pre_paint_windows (MetaCompositor *compositor) - * round trip request at this point is sufficient to flush the - * GLX buffers. - */ -- XSync (compositor->display->xdisplay, False); -- -- compositor->frame_has_updated_xsurfaces = FALSE; -+ if (compositor->have_x11_sync_object) -+ compositor->have_x11_sync_object = meta_sync_ring_insert_wait (); -+ else -+ XSync (compositor->display->xdisplay, False); - } -+ -+ return TRUE; - } - - static gboolean --meta_repaint_func (gpointer data) -+meta_post_paint_func (gpointer data) - { - MetaCompositor *compositor = data; -- if (meta_screen_get_n_monitors (compositor->display->screen) > 0) -- pre_paint_windows (compositor); -+ -+ if (compositor->frame_has_updated_xsurfaces) -+ { -+ if (compositor->have_x11_sync_object) -+ compositor->have_x11_sync_object = meta_sync_ring_after_frame (); -+ -+ compositor->frame_has_updated_xsurfaces = FALSE; -+ } -+ - return TRUE; - } - -@@ -1141,10 +1160,16 @@ meta_compositor_new (MetaDisplay *display) - G_CALLBACK (on_shadow_factory_changed), - compositor); - -- compositor->repaint_func_id = clutter_threads_add_repaint_func (meta_repaint_func, -- compositor, -- NULL); -- -+ compositor->pre_paint_func_id = -+ clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_PRE_PAINT, -+ meta_pre_paint_func, -+ compositor, -+ NULL); -+ compositor->post_paint_func_id = -+ clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT, -+ meta_post_paint_func, -+ compositor, -+ NULL); - return compositor; - } - -diff --git a/src/compositor/meta-sync-ring.c b/src/compositor/meta-sync-ring.c -new file mode 100644 -index 0000000..4ee61f8 ---- /dev/null -+++ b/src/compositor/meta-sync-ring.c -@@ -0,0 +1,566 @@ -+/* -+ * This is based on an original C++ implementation for compiz that -+ * carries the following copyright notice: -+ * -+ * -+ * Copyright © 2011 NVIDIA Corporation -+ * -+ * Permission to use, copy, modify, distribute, and sell this software -+ * and its documentation for any purpose is hereby granted without -+ * fee, provided that the above copyright notice appear in all copies -+ * and that both that copyright notice and this permission notice -+ * appear in supporting documentation, and that the name of NVIDIA -+ * Corporation not be used in advertising or publicity pertaining to -+ * distribution of the software without specific, written prior -+ * permission. NVIDIA Corporation makes no representations about the -+ * suitability of this software for any purpose. It is provided "as -+ * is" without express or implied warranty. -+ * -+ * NVIDIA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ * FITNESS, IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY -+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING -+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -+ * SOFTWARE. -+ * -+ * Authors: James Jones -+ */ -+ -+#include -+ -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include -+ -+#include "meta-sync-ring.h" -+ -+/* Theory of operation: -+ * -+ * We use a ring of NUM_SYNCS fence objects. On each frame we advance -+ * to the next fence in the ring. For each fence we do: -+ * -+ * 1. fence is XSyncTriggerFence()'d and glWaitSync()'d -+ * 2. NUM_SYNCS / 2 frames later, fence should be triggered -+ * 3. fence is XSyncResetFence()'d -+ * 4. NUM_SYNCS / 2 frames later, fence should be reset -+ * 5. go back to 1 and re-use fence -+ * -+ * glClientWaitSync() and XAlarms are used in steps 2 and 4, -+ * respectively, to double-check the expectections. -+ */ -+ -+#define NUM_SYNCS 10 -+#define MAX_SYNC_WAIT_TIME (1 * 1000 * 1000 * 1000) /* one sec */ -+#define MAX_REBOOT_ATTEMPTS 2 -+ -+typedef enum -+{ -+ META_SYNC_STATE_READY, -+ META_SYNC_STATE_WAITING, -+ META_SYNC_STATE_DONE, -+ META_SYNC_STATE_RESET_PENDING, -+} MetaSyncState; -+ -+typedef struct -+{ -+ Display *xdisplay; -+ -+ XSyncFence xfence; -+ GLsync glsync; -+ -+ XSyncCounter xcounter; -+ XSyncAlarm xalarm; -+ XSyncValue next_counter_value; -+ -+ MetaSyncState state; -+} MetaSync; -+ -+typedef struct -+{ -+ Display *xdisplay; -+ int xsync_event_base; -+ int xsync_error_base; -+ -+ GHashTable *alarm_to_sync; -+ -+ MetaSync *syncs_array[NUM_SYNCS]; -+ guint current_sync_idx; -+ MetaSync *current_sync; -+ guint warmup_syncs; -+ -+ guint reboots; -+} MetaSyncRing; -+ -+static MetaSyncRing meta_sync_ring = { 0 }; -+ -+static XSyncValue SYNC_VALUE_ZERO; -+static XSyncValue SYNC_VALUE_ONE; -+ -+static const char* (*meta_gl_get_string) (GLenum name); -+static void (*meta_gl_get_integerv) (GLenum pname, -+ GLint *params); -+static const char* (*meta_gl_get_stringi) (GLenum name, -+ GLuint index); -+static void (*meta_gl_delete_sync) (GLsync sync); -+static GLenum (*meta_gl_client_wait_sync) (GLsync sync, -+ GLbitfield flags, -+ GLuint64 timeout); -+static void (*meta_gl_wait_sync) (GLsync sync, -+ GLbitfield flags, -+ GLuint64 timeout); -+static GLsync (*meta_gl_import_sync) (GLenum external_sync_type, -+ GLintptr external_sync, -+ GLbitfield flags); -+ -+static MetaSyncRing * -+meta_sync_ring_get (void) -+{ -+ if (meta_sync_ring.reboots > MAX_REBOOT_ATTEMPTS) -+ return NULL; -+ -+ return &meta_sync_ring; -+} -+ -+static gboolean -+load_gl_symbol (const char *name, -+ void **func) -+{ -+ *func = cogl_get_proc_address (name); -+ if (!*func) -+ { -+ meta_verbose ("MetaSyncRing: failed to resolve required GL symbol \"%s\"\n", name); -+ return FALSE; -+ } -+ return TRUE; -+} -+ -+static gboolean -+check_gl_extensions (void) -+{ -+ ClutterBackend *backend; -+ CoglContext *cogl_context; -+ CoglDisplay *cogl_display; -+ CoglRenderer *cogl_renderer; -+ -+ backend = clutter_get_default_backend (); -+ cogl_context = clutter_backend_get_cogl_context (backend); -+ cogl_display = cogl_context_get_display (cogl_context); -+ cogl_renderer = cogl_display_get_renderer (cogl_display); -+ -+ switch (cogl_renderer_get_driver (cogl_renderer)) -+ { -+ case COGL_DRIVER_GL3: -+ { -+ int num_extensions, i; -+ gboolean arb_sync = FALSE; -+ gboolean x11_sync_object = FALSE; -+ -+ meta_gl_get_integerv (GL_NUM_EXTENSIONS, &num_extensions); -+ -+ for (i = 0; i < num_extensions; ++i) -+ { -+ const char *ext = meta_gl_get_stringi (GL_EXTENSIONS, i); -+ -+ if (g_strcmp0 ("GL_ARB_sync", ext) == 0) -+ arb_sync = TRUE; -+ else if (g_strcmp0 ("GL_EXT_x11_sync_object", ext) == 0) -+ x11_sync_object = TRUE; -+ } -+ -+ return arb_sync && x11_sync_object; -+ } -+ case COGL_DRIVER_GL: -+ { -+ const char *extensions = meta_gl_get_string (GL_EXTENSIONS); -+ return (extensions != NULL && -+ strstr (extensions, "GL_ARB_sync") != NULL && -+ strstr (extensions, "GL_EXT_x11_sync_object") != NULL); -+ } -+ default: -+ break; -+ } -+ -+ return FALSE; -+} -+ -+static gboolean -+load_required_symbols (void) -+{ -+ static gboolean success = FALSE; -+ -+ if (success) -+ return TRUE; -+ -+ /* We don't link against libGL directly because cogl may want to -+ * use something else. This assumes that cogl has been initialized -+ * and dynamically loaded libGL at this point. -+ */ -+ -+ if (!load_gl_symbol ("glGetString", (void **) &meta_gl_get_string)) -+ goto out; -+ if (!load_gl_symbol ("glGetIntegerv", (void **) &meta_gl_get_integerv)) -+ goto out; -+ if (!load_gl_symbol ("glGetStringi", (void **) &meta_gl_get_stringi)) -+ goto out; -+ -+ if (!check_gl_extensions ()) -+ { -+ meta_verbose ("MetaSyncRing: couldn't find required GL extensions\n"); -+ goto out; -+ } -+ -+ if (!load_gl_symbol ("glDeleteSync", (void **) &meta_gl_delete_sync)) -+ goto out; -+ if (!load_gl_symbol ("glClientWaitSync", (void **) &meta_gl_client_wait_sync)) -+ goto out; -+ if (!load_gl_symbol ("glWaitSync", (void **) &meta_gl_wait_sync)) -+ goto out; -+ if (!load_gl_symbol ("glImportSyncEXT", (void **) &meta_gl_import_sync)) -+ goto out; -+ -+ success = TRUE; -+ out: -+ return success; -+} -+ -+static void -+meta_sync_insert (MetaSync *self) -+{ -+ g_return_if_fail (self->state == META_SYNC_STATE_READY); -+ -+ XSyncTriggerFence (self->xdisplay, self->xfence); -+ XFlush (self->xdisplay); -+ -+ meta_gl_wait_sync (self->glsync, 0, GL_TIMEOUT_IGNORED); -+ -+ self->state = META_SYNC_STATE_WAITING; -+} -+ -+static GLenum -+meta_sync_check_update_finished (MetaSync *self, -+ GLuint64 timeout) -+{ -+ GLenum status = GL_WAIT_FAILED; -+ -+ switch (self->state) -+ { -+ case META_SYNC_STATE_DONE: -+ status = GL_ALREADY_SIGNALED; -+ break; -+ case META_SYNC_STATE_WAITING: -+ status = meta_gl_client_wait_sync (self->glsync, 0, timeout); -+ if (status == GL_ALREADY_SIGNALED || status == GL_CONDITION_SATISFIED) -+ self->state = META_SYNC_STATE_DONE; -+ break; -+ default: -+ break; -+ } -+ -+ g_warn_if_fail (status != GL_WAIT_FAILED); -+ -+ return status; -+} -+ -+static void -+meta_sync_reset (MetaSync *self) -+{ -+ XSyncAlarmAttributes attrs; -+ int overflow; -+ -+ g_return_if_fail (self->state == META_SYNC_STATE_DONE); -+ -+ XSyncResetFence (self->xdisplay, self->xfence); -+ -+ attrs.trigger.wait_value = self->next_counter_value; -+ -+ XSyncChangeAlarm (self->xdisplay, self->xalarm, XSyncCAValue, &attrs); -+ XSyncSetCounter (self->xdisplay, self->xcounter, self->next_counter_value); -+ -+ XSyncValueAdd (&self->next_counter_value, -+ self->next_counter_value, -+ SYNC_VALUE_ONE, -+ &overflow); -+ -+ self->state = META_SYNC_STATE_RESET_PENDING; -+} -+ -+static void -+meta_sync_handle_event (MetaSync *self, -+ XSyncAlarmNotifyEvent *event) -+{ -+ g_return_if_fail (event->alarm == self->xalarm); -+ g_return_if_fail (self->state == META_SYNC_STATE_RESET_PENDING); -+ -+ self->state = META_SYNC_STATE_READY; -+} -+ -+static MetaSync * -+meta_sync_new (Display *xdisplay) -+{ -+ MetaSync *self; -+ XSyncAlarmAttributes attrs; -+ -+ self = g_malloc0 (sizeof (MetaSync)); -+ -+ self->xdisplay = xdisplay; -+ -+ self->xfence = XSyncCreateFence (xdisplay, DefaultRootWindow (xdisplay), FALSE); -+ self->glsync = meta_gl_import_sync (GL_SYNC_X11_FENCE_EXT, self->xfence, 0); -+ -+ self->xcounter = XSyncCreateCounter (xdisplay, SYNC_VALUE_ZERO); -+ -+ attrs.trigger.counter = self->xcounter; -+ attrs.trigger.value_type = XSyncAbsolute; -+ attrs.trigger.wait_value = SYNC_VALUE_ONE; -+ attrs.trigger.test_type = XSyncPositiveTransition; -+ attrs.events = TRUE; -+ self->xalarm = XSyncCreateAlarm (xdisplay, -+ XSyncCACounter | -+ XSyncCAValueType | -+ XSyncCAValue | -+ XSyncCATestType | -+ XSyncCAEvents, -+ &attrs); -+ -+ XSyncIntToValue (&self->next_counter_value, 1); -+ -+ self->state = META_SYNC_STATE_READY; -+ -+ return self; -+} -+ -+static Bool -+alarm_event_predicate (Display *dpy, -+ XEvent *event, -+ XPointer data) -+{ -+ MetaSyncRing *ring = meta_sync_ring_get (); -+ -+ if (!ring) -+ return False; -+ -+ if (event->type == ring->xsync_event_base + XSyncAlarmNotify) -+ { -+ if (((MetaSync *) data)->xalarm == ((XSyncAlarmNotifyEvent *) event)->alarm) -+ return True; -+ } -+ return False; -+} -+ -+static void -+meta_sync_free (MetaSync *self) -+{ -+ /* When our assumptions don't hold, something has gone wrong but we -+ * don't know what, so we reboot the ring. While doing that, we -+ * trigger fences before deleting them to try to get ourselves out -+ * of a potentially stuck GPU state. -+ */ -+ switch (self->state) -+ { -+ case META_SYNC_STATE_WAITING: -+ case META_SYNC_STATE_DONE: -+ /* nothing to do */ -+ break; -+ case META_SYNC_STATE_RESET_PENDING: -+ { -+ XEvent event; -+ XIfEvent (self->xdisplay, &event, alarm_event_predicate, (XPointer) self); -+ meta_sync_handle_event (self, (XSyncAlarmNotifyEvent *) &event); -+ } -+ /* fall through */ -+ case META_SYNC_STATE_READY: -+ XSyncTriggerFence (self->xdisplay, self->xfence); -+ XFlush (self->xdisplay); -+ break; -+ default: -+ break; -+ } -+ -+ meta_gl_delete_sync (self->glsync); -+ XSyncDestroyFence (self->xdisplay, self->xfence); -+ XSyncDestroyCounter (self->xdisplay, self->xcounter); -+ XSyncDestroyAlarm (self->xdisplay, self->xalarm); -+ -+ g_free (self); -+} -+ -+gboolean -+meta_sync_ring_init (Display *xdisplay) -+{ -+ gint major, minor; -+ guint i; -+ MetaSyncRing *ring = meta_sync_ring_get (); -+ -+ if (!ring) -+ return FALSE; -+ -+ g_return_val_if_fail (xdisplay != NULL, FALSE); -+ g_return_val_if_fail (ring->xdisplay == NULL, FALSE); -+ -+ if (!load_required_symbols ()) -+ return FALSE; -+ -+ if (!XSyncQueryExtension (xdisplay, &ring->xsync_event_base, &ring->xsync_error_base) || -+ !XSyncInitialize (xdisplay, &major, &minor)) -+ return FALSE; -+ -+ XSyncIntToValue (&SYNC_VALUE_ZERO, 0); -+ XSyncIntToValue (&SYNC_VALUE_ONE, 1); -+ -+ ring->xdisplay = xdisplay; -+ -+ ring->alarm_to_sync = g_hash_table_new (NULL, NULL); -+ -+ for (i = 0; i < NUM_SYNCS; ++i) -+ { -+ MetaSync *sync = meta_sync_new (ring->xdisplay); -+ ring->syncs_array[i] = sync; -+ g_hash_table_replace (ring->alarm_to_sync, (gpointer) sync->xalarm, sync); -+ } -+ -+ ring->current_sync_idx = 0; -+ ring->current_sync = ring->syncs_array[0]; -+ ring->warmup_syncs = 0; -+ -+ return TRUE; -+} -+ -+void -+meta_sync_ring_destroy (void) -+{ -+ guint i; -+ MetaSyncRing *ring = meta_sync_ring_get (); -+ -+ if (!ring) -+ return; -+ -+ g_return_if_fail (ring->xdisplay != NULL); -+ -+ ring->current_sync_idx = 0; -+ ring->current_sync = NULL; -+ ring->warmup_syncs = 0; -+ -+ for (i = 0; i < NUM_SYNCS; ++i) -+ meta_sync_free (ring->syncs_array[i]); -+ -+ g_hash_table_destroy (ring->alarm_to_sync); -+ -+ ring->xsync_event_base = 0; -+ ring->xsync_error_base = 0; -+ ring->xdisplay = NULL; -+} -+ -+static gboolean -+meta_sync_ring_reboot (Display *xdisplay) -+{ -+ MetaSyncRing *ring = meta_sync_ring_get (); -+ -+ if (!ring) -+ return FALSE; -+ -+ meta_sync_ring_destroy (); -+ -+ ring->reboots += 1; -+ -+ if (!meta_sync_ring_get ()) -+ { -+ meta_warning ("MetaSyncRing: Too many reboots -- disabling\n"); -+ return FALSE; -+ } -+ -+ return meta_sync_ring_init (xdisplay); -+} -+ -+gboolean -+meta_sync_ring_after_frame (void) -+{ -+ MetaSyncRing *ring = meta_sync_ring_get (); -+ -+ if (!ring) -+ return FALSE; -+ -+ g_return_if_fail (ring->xdisplay != NULL); -+ -+ if (ring->warmup_syncs >= NUM_SYNCS / 2) -+ { -+ guint reset_sync_idx = (ring->current_sync_idx + NUM_SYNCS - (NUM_SYNCS / 2)) % NUM_SYNCS; -+ MetaSync *sync_to_reset = ring->syncs_array[reset_sync_idx]; -+ -+ GLenum status = meta_sync_check_update_finished (sync_to_reset, 0); -+ if (status == GL_TIMEOUT_EXPIRED) -+ { -+ meta_warning ("MetaSyncRing: We should never wait for a sync -- add more syncs?\n"); -+ status = meta_sync_check_update_finished (sync_to_reset, MAX_SYNC_WAIT_TIME); -+ } -+ -+ if (status != GL_ALREADY_SIGNALED && status != GL_CONDITION_SATISFIED) -+ { -+ meta_warning ("MetaSyncRing: Timed out waiting for sync object.\n"); -+ return meta_sync_ring_reboot (ring->xdisplay); -+ } -+ -+ meta_sync_reset (sync_to_reset); -+ } -+ else -+ { -+ ring->warmup_syncs += 1; -+ } -+ -+ ring->current_sync_idx += 1; -+ ring->current_sync_idx %= NUM_SYNCS; -+ -+ ring->current_sync = ring->syncs_array[ring->current_sync_idx]; -+ -+ return TRUE; -+} -+ -+gboolean -+meta_sync_ring_insert_wait (void) -+{ -+ MetaSyncRing *ring = meta_sync_ring_get (); -+ -+ if (!ring) -+ return FALSE; -+ -+ g_return_if_fail (ring->xdisplay != NULL); -+ -+ if (ring->current_sync->state != META_SYNC_STATE_READY) -+ { -+ meta_warning ("MetaSyncRing: Sync object is not ready -- were events handled properly?\n"); -+ if (!meta_sync_ring_reboot (ring->xdisplay)) -+ return FALSE; -+ } -+ -+ meta_sync_insert (ring->current_sync); -+ -+ return TRUE; -+} -+ -+void -+meta_sync_ring_handle_event (XEvent *xevent) -+{ -+ XSyncAlarmNotifyEvent *event; -+ MetaSync *sync; -+ MetaSyncRing *ring = meta_sync_ring_get (); -+ -+ if (!ring) -+ return; -+ -+ g_return_if_fail (ring->xdisplay != NULL); -+ -+ if (xevent->type != (ring->xsync_event_base + XSyncAlarmNotify)) -+ return; -+ -+ event = (XSyncAlarmNotifyEvent *) xevent; -+ -+ sync = g_hash_table_lookup (ring->alarm_to_sync, (gpointer) event->alarm); -+ if (sync) -+ meta_sync_handle_event (sync, event); -+} -diff --git a/src/compositor/meta-sync-ring.h b/src/compositor/meta-sync-ring.h -new file mode 100644 -index 0000000..6dca8ef ---- /dev/null -+++ b/src/compositor/meta-sync-ring.h -@@ -0,0 +1,14 @@ -+#ifndef _META_SYNC_RING_H_ -+#define _META_SYNC_RING_H_ -+ -+#include -+ -+#include -+ -+gboolean meta_sync_ring_init (Display *dpy); -+void meta_sync_ring_destroy (void); -+gboolean meta_sync_ring_after_frame (void); -+gboolean meta_sync_ring_insert_wait (void); -+void meta_sync_ring_handle_event (XEvent *event); -+ -+#endif /* _META_SYNC_RING_H_ */ --- -2.5.0 - - -From 8b889d6ff46971edd4af7f412275e116e293e72a Mon Sep 17 00:00:00 2001 -From: Aaron Plattner -Date: Mon, 3 Aug 2015 21:15:15 -0700 -Subject: [PATCH 3/5] compositor: Fix GL_EXT_x11_sync_object race condition - -The compositor maintains a ring of shared fences with the X server in order to -properly synchronize rendering between the X server and the compositor's GPU -channel. When all of the fences have been used, the compositor needs to reset -one so that it can be reused. It does this by first waiting on the CPU for the -fence to become triggered, and then sending a request to the X server to reset -the fence. - -If the compositor's GPU channel is busy processing other work (e.g. the desktop -switcher animation), then the X server may process the reset request before the -GPU has consumed the fence. This causes the GPU channel to hang. - -Fix the problem by having the compositor's GPU channel trigger its own fence -after waiting for the X server's fence. Wait for that fence on the CPU before -sending the reset request to the X server. This ensures that the GPU has -consumed the X11 fence before the server resets it. - -Signed-off-by: Aaron Plattner - -https://bugzilla.gnome.org/show_bug.cgi?id=728464 ---- - src/compositor/meta-sync-ring.c | 25 +++++++++++++++++++------ - 1 file changed, 19 insertions(+), 6 deletions(-) - -diff --git a/src/compositor/meta-sync-ring.c b/src/compositor/meta-sync-ring.c -index 4ee61f8..44b1c41 100644 ---- a/src/compositor/meta-sync-ring.c -+++ b/src/compositor/meta-sync-ring.c -@@ -73,7 +73,8 @@ typedef struct - Display *xdisplay; - - XSyncFence xfence; -- GLsync glsync; -+ GLsync gl_x11_sync; -+ GLsync gpu_fence; - - XSyncCounter xcounter; - XSyncAlarm xalarm; -@@ -118,6 +119,8 @@ static void (*meta_gl_wait_sync) (GLsync sync, - static GLsync (*meta_gl_import_sync) (GLenum external_sync_type, - GLintptr external_sync, - GLbitfield flags); -+static GLsync (*meta_gl_fence_sync) (GLenum condition, -+ GLbitfield flags); - - static MetaSyncRing * - meta_sync_ring_get (void) -@@ -224,6 +227,8 @@ load_required_symbols (void) - goto out; - if (!load_gl_symbol ("glImportSyncEXT", (void **) &meta_gl_import_sync)) - goto out; -+ if (!load_gl_symbol ("glFenceSync", (void **) &meta_gl_fence_sync)) -+ goto out; - - success = TRUE; - out: -@@ -238,7 +243,8 @@ meta_sync_insert (MetaSync *self) - XSyncTriggerFence (self->xdisplay, self->xfence); - XFlush (self->xdisplay); - -- meta_gl_wait_sync (self->glsync, 0, GL_TIMEOUT_IGNORED); -+ meta_gl_wait_sync (self->gl_x11_sync, 0, GL_TIMEOUT_IGNORED); -+ self->gpu_fence = meta_gl_fence_sync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - - self->state = META_SYNC_STATE_WAITING; - } -@@ -255,9 +261,13 @@ meta_sync_check_update_finished (MetaSync *self, - status = GL_ALREADY_SIGNALED; - break; - case META_SYNC_STATE_WAITING: -- status = meta_gl_client_wait_sync (self->glsync, 0, timeout); -+ status = meta_gl_client_wait_sync (self->gpu_fence, 0, timeout); - if (status == GL_ALREADY_SIGNALED || status == GL_CONDITION_SATISFIED) -- self->state = META_SYNC_STATE_DONE; -+ { -+ self->state = META_SYNC_STATE_DONE; -+ meta_gl_delete_sync (self->gpu_fence); -+ self->gpu_fence = 0; -+ } - break; - default: - break; -@@ -312,7 +322,8 @@ meta_sync_new (Display *xdisplay) - self->xdisplay = xdisplay; - - self->xfence = XSyncCreateFence (xdisplay, DefaultRootWindow (xdisplay), FALSE); -- self->glsync = meta_gl_import_sync (GL_SYNC_X11_FENCE_EXT, self->xfence, 0); -+ self->gl_x11_sync = meta_gl_import_sync (GL_SYNC_X11_FENCE_EXT, self->xfence, 0); -+ self->gpu_fence = 0; - - self->xcounter = XSyncCreateCounter (xdisplay, SYNC_VALUE_ZERO); - -@@ -365,6 +376,8 @@ meta_sync_free (MetaSync *self) - switch (self->state) - { - case META_SYNC_STATE_WAITING: -+ meta_gl_delete_sync (self->gpu_fence); -+ break; - case META_SYNC_STATE_DONE: - /* nothing to do */ - break; -@@ -383,7 +396,7 @@ meta_sync_free (MetaSync *self) - break; - } - -- meta_gl_delete_sync (self->glsync); -+ meta_gl_delete_sync (self->gl_x11_sync); - XSyncDestroyFence (self->xdisplay, self->xfence); - XSyncDestroyCounter (self->xdisplay, self->xcounter); - XSyncDestroyAlarm (self->xdisplay, self->xalarm); --- -2.5.0 - - -From 271b864a3a5fe2a59523a0ead0667072170e7bbe Mon Sep 17 00:00:00 2001 -From: Ting-Wei Lan -Date: Sat, 8 Aug 2015 20:12:09 +0800 -Subject: [PATCH 4/5] build: Fix return value in meta-sync-ring.c - -https://bugzilla.gnome.org/show_bug.cgi?id=753380 ---- - src/compositor/meta-sync-ring.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/compositor/meta-sync-ring.c b/src/compositor/meta-sync-ring.c -index 44b1c41..217ebe5 100644 ---- a/src/compositor/meta-sync-ring.c -+++ b/src/compositor/meta-sync-ring.c -@@ -499,7 +499,7 @@ meta_sync_ring_after_frame (void) - if (!ring) - return FALSE; - -- g_return_if_fail (ring->xdisplay != NULL); -+ g_return_val_if_fail (ring->xdisplay != NULL, FALSE); - - if (ring->warmup_syncs >= NUM_SYNCS / 2) - { -@@ -542,7 +542,7 @@ meta_sync_ring_insert_wait (void) - if (!ring) - return FALSE; - -- g_return_if_fail (ring->xdisplay != NULL); -+ g_return_val_if_fail (ring->xdisplay != NULL, FALSE); - - if (ring->current_sync->state != META_SYNC_STATE_READY) - { --- -2.5.0 - - -From 4d4bd1fb39cf396733de4dff4f3041b5266b803a Mon Sep 17 00:00:00 2001 -From: Rui Matos -Date: Wed, 12 Aug 2015 15:26:34 +0200 -Subject: [PATCH 5/5] compositor: Handle fences in the frontend X connection - -Since mutter has two X connections and does damage handling on the -frontend while fence triggering is done on the backend, we have a race -between XDamageSubtract() and XSyncFenceTrigger() causing missed -redraws in the GL_EXT_X11_sync_object path. - -If the fence trigger gets processed first by the server, any client -drawing that happens between that and the damage subtract being -processed and is completely contained in the last damage event box -that mutter got, won't be included in the current frame nor will it -cause a new damage event. - -A simple fix for this would be XSync()ing on the frontend connection -after doing all the damage subtracts but that would add a round trip -on every frame again which defeats the asynchronous design of X -fences. - -Instead, if we move fence handling to the frontend we automatically -get the right ordering between damage subtracts and fence triggers. - -https://bugzilla.gnome.org/show_bug.cgi?id=728464 ---- - src/backends/x11/meta-backend-x11.c | 3 --- - src/compositor/compositor.c | 6 ++++-- - src/compositor/meta-sync-ring.c | 15 ++++++++++++++- - 3 files changed, 18 insertions(+), 6 deletions(-) - -diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c -index d77365d..586f991 100644 ---- a/src/backends/x11/meta-backend-x11.c -+++ b/src/backends/x11/meta-backend-x11.c -@@ -43,7 +43,6 @@ - #include - #include "display-private.h" - #include "compositor/compositor-private.h" --#include "compositor/meta-sync-ring.h" - - struct _MetaBackendX11Private - { -@@ -184,8 +183,6 @@ handle_host_xevent (MetaBackend *backend, - MetaCompositor *compositor = display->compositor; - if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event)) - bypass_clutter = TRUE; -- if (compositor->have_x11_sync_object) -- meta_sync_ring_handle_event (event); - } - } - -diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c -index 554faa1..2e182c2 100644 ---- a/src/compositor/compositor.c -+++ b/src/compositor/compositor.c -@@ -534,8 +534,7 @@ meta_compositor_manage (MetaCompositor *compositor) - */ - XMapWindow (xdisplay, compositor->output); - -- compositor->have_x11_sync_object = -- meta_sync_ring_init (meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend))); -+ compositor->have_x11_sync_object = meta_sync_ring_init (xdisplay); - } - - redirect_windows (display->screen); -@@ -737,6 +736,9 @@ meta_compositor_process_event (MetaCompositor *compositor, - process_damage (compositor, (XDamageNotifyEvent *) event, window); - } - -+ if (compositor->have_x11_sync_object) -+ meta_sync_ring_handle_event (event); -+ - /* Clutter needs to know about MapNotify events otherwise it will - think the stage is invisible */ - if (!meta_is_wayland_compositor () && event->type == MapNotify) -diff --git a/src/compositor/meta-sync-ring.c b/src/compositor/meta-sync-ring.c -index 217ebe5..336ccd4 100644 ---- a/src/compositor/meta-sync-ring.c -+++ b/src/compositor/meta-sync-ring.c -@@ -322,7 +322,7 @@ meta_sync_new (Display *xdisplay) - self->xdisplay = xdisplay; - - self->xfence = XSyncCreateFence (xdisplay, DefaultRootWindow (xdisplay), FALSE); -- self->gl_x11_sync = meta_gl_import_sync (GL_SYNC_X11_FENCE_EXT, self->xfence, 0); -+ self->gl_x11_sync = 0; - self->gpu_fence = 0; - - self->xcounter = XSyncCreateCounter (xdisplay, SYNC_VALUE_ZERO); -@@ -347,6 +347,13 @@ meta_sync_new (Display *xdisplay) - return self; - } - -+static void -+meta_sync_import (MetaSync *self) -+{ -+ g_return_if_fail (self->gl_x11_sync == 0); -+ self->gl_x11_sync = meta_gl_import_sync (GL_SYNC_X11_FENCE_EXT, self->xfence, 0); -+} -+ - static Bool - alarm_event_predicate (Display *dpy, - XEvent *event, -@@ -437,6 +444,12 @@ meta_sync_ring_init (Display *xdisplay) - ring->syncs_array[i] = sync; - g_hash_table_replace (ring->alarm_to_sync, (gpointer) sync->xalarm, sync); - } -+ /* Since the connection we create the X fences on isn't the same as -+ * the one used for the GLX context, we need to XSync() here to -+ * ensure glImportSync() succeeds. */ -+ XSync (xdisplay, False); -+ for (i = 0; i < NUM_SYNCS; ++i) -+ meta_sync_import (ring->syncs_array[i]); - - ring->current_sync_idx = 0; - ring->current_sync = ring->syncs_array[0]; --- -2.5.0 - diff --git a/SOURCES/focus-a-window-when-starting.patch b/SOURCES/focus-a-window-when-starting.patch deleted file mode 100644 index 6d30d5f..0000000 --- a/SOURCES/focus-a-window-when-starting.patch +++ /dev/null @@ -1,89 +0,0 @@ -diff -up mutter-3.14.4/src/core/display.c.initial-focus mutter-3.14.4/src/core/display.c ---- mutter-3.14.4/src/core/display.c.initial-focus 2016-02-04 14:03:35.444859922 -0500 -+++ mutter-3.14.4/src/core/display.c 2016-02-04 15:46:05.445776848 -0500 -@@ -532,6 +532,7 @@ meta_display_open (void) - MetaScreen *screen; - int i; - guint32 timestamp; -+ Window old_active_xwindow = None; - - /* A list of all atom names, so that we can intern them in one go. */ - char *atom_names[] = { -@@ -905,6 +906,11 @@ meta_display_open (void) - - display->screen = screen; - -+ if (!meta_is_wayland_compositor ()) -+ meta_prop_get_window (display, display->screen->xroot, -+ display->atom__NET_ACTIVE_WINDOW, -+ &old_active_xwindow); -+ - meta_screen_init_workspaces (screen); - - enable_compositor (display); -@@ -921,44 +927,17 @@ meta_display_open (void) - */ - if (!meta_is_wayland_compositor ()) - meta_screen_manage_all_windows (screen); -- -- { -- Window focus; -- int ret_to; -- -- /* kinda bogus because GetInputFocus has no possible errors */ -- meta_error_trap_push (display); -- -- /* FIXME: This is totally broken; see comment 9 of bug 88194 about this */ -- focus = None; -- ret_to = RevertToPointerRoot; -- XGetInputFocus (display->xdisplay, &focus, &ret_to); -- -- /* Force a new FocusIn (does this work?) */ -- -- /* Use the same timestamp that was passed to meta_screen_new(), -- * as it is the most recent timestamp. -- */ -- if (focus == None || focus == PointerRoot) -- /* Just focus the no_focus_window on the first screen */ -- meta_display_focus_the_no_focus_window (display, -- display->screen, -- timestamp); -- else -- { -- MetaWindow * window; -- window = meta_display_lookup_x_window (display, focus); -- if (window) -- meta_display_set_input_focus_window (display, window, FALSE, timestamp); -- else -- /* Just focus the no_focus_window on the first screen */ -- meta_display_focus_the_no_focus_window (display, -- display->screen, -- timestamp); -- } -- -- meta_error_trap_pop (display); -- } -+ -+ if (old_active_xwindow != None) -+ { -+ MetaWindow *old_active_window = meta_display_lookup_x_window (display, old_active_xwindow); -+ if (old_active_window) -+ meta_window_focus (old_active_window, timestamp); -+ else -+ meta_display_focus_the_no_focus_window (display, display->screen, timestamp); -+ } -+ else -+ meta_display_focus_the_no_focus_window (display, display->screen, timestamp); - - meta_idle_monitor_init_dbus (); - -@@ -2047,6 +2026,9 @@ meta_display_update_active_window_hint ( - { - gulong data[1]; - -+ if (display->closing) -+ return; /* Leave old value for a replacement */ -+ - if (display->focus_window) - data[0] = display->focus_window->xwindow; - else diff --git a/SOURCES/make-cogl-errors-non-fatal.patch b/SOURCES/make-cogl-errors-non-fatal.patch deleted file mode 100644 index f2c4175..0000000 --- a/SOURCES/make-cogl-errors-non-fatal.patch +++ /dev/null @@ -1,314 +0,0 @@ -From 42781fbacd22546266ce5d29e257cdc2b2661a4a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Thu, 14 Apr 2016 16:51:13 +0200 -Subject: [PATCH 1/2] Do not try to unref NULL CoglObjects - -https://bugzilla.gnome.org/show_bug.cgi?id=765058 ---- - src/backends/meta-cursor.c | 3 ++- - src/compositor/meta-surface-actor-x11.c | 3 +-- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/backends/meta-cursor.c b/src/backends/meta-cursor.c -index 22a8a76..ad468c0 100644 ---- a/src/backends/meta-cursor.c -+++ b/src/backends/meta-cursor.c -@@ -55,7 +55,8 @@ meta_cursor_reference_ref (MetaCursorReference *self) - static void - meta_cursor_image_free (MetaCursorImage *image) - { -- cogl_object_unref (image->texture); -+ if (image->texture) -+ cogl_object_unref (image->texture); - - #ifdef HAVE_NATIVE_BACKEND - if (image->bo) -diff --git a/src/compositor/meta-surface-actor-x11.c b/src/compositor/meta-surface-actor-x11.c -index 4aa7ecd..4a5ac00 100644 ---- a/src/compositor/meta-surface-actor-x11.c -+++ b/src/compositor/meta-surface-actor-x11.c -@@ -102,8 +102,7 @@ detach_pixmap (MetaSurfaceActorX11 *self) - priv->pixmap = None; - meta_error_trap_pop (display); - -- cogl_object_unref (priv->texture); -- priv->texture = NULL; -+ g_clear_pointer (&priv->texture, cogl_object_unref); - } - - static void --- -2.7.3 - - -From 9522c6ff9bf311c9590ceb6a54cadc75f27ea6e0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Thu, 14 Apr 2016 15:30:31 +0200 -Subject: [PATCH 2/2] Do not skip CoglError parameters - -While CoglError is a define to GError, it doesn't follow the convention -of ignoring errors when NULL is passed, but rather treats the error as -fatal :-( -That's clearly unwanted for a compositor, so make sure to always pass -an error parameter where a runtime error is possible (i.e. any CoglError -that is not a malformed blend string). - -https://bugzilla.gnome.org/show_bug.cgi?id=765058 ---- - src/backends/meta-cursor-tracker.c | 9 ++++++++- - src/backends/meta-cursor.c | 18 ++++++++++++++++-- - src/compositor/meta-background-image.c | 4 +++- - src/compositor/meta-background.c | 10 +++++++++- - src/compositor/meta-shadow-factory.c | 10 +++++++++- - src/compositor/meta-surface-actor-x11.c | 10 ++++++++-- - src/compositor/meta-window-actor.c | 10 +++++++++- - src/wayland/meta-wayland-buffer.c | 8 +++++++- - 8 files changed, 69 insertions(+), 10 deletions(-) - -diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c -index a649cb4..e2ce3af 100644 ---- a/src/backends/meta-cursor-tracker.c -+++ b/src/backends/meta-cursor-tracker.c -@@ -213,6 +213,7 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker) - guint8 *cursor_data; - gboolean free_cursor_data; - CoglContext *ctx; -+ CoglError *error = NULL; - - if (tracker->xfixes_cursor) - return; -@@ -254,11 +255,17 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker) - CLUTTER_CAIRO_FORMAT_ARGB32, - cursor_image->width * 4, /* stride */ - cursor_data, -- NULL); -+ &error); - - if (free_cursor_data) - g_free (cursor_data); - -+ if (error != NULL) -+ { -+ meta_warning ("Failed to allocate cursor sprite texture: %s\n", error->message); -+ cogl_error_free (error); -+ } -+ - if (sprite != NULL) - { - MetaCursorReference *cursor = meta_cursor_reference_take_texture (sprite, -diff --git a/src/backends/meta-cursor.c b/src/backends/meta-cursor.c -index ad468c0..e2a7f76 100644 ---- a/src/backends/meta-cursor.c -+++ b/src/backends/meta-cursor.c -@@ -222,6 +222,7 @@ meta_cursor_image_load_from_xcursor_image (MetaCursorImage *image, - CoglPixelFormat cogl_format; - ClutterBackend *clutter_backend; - CoglContext *cogl_context; -+ CoglError *error = NULL; - - width = xc_image->width; - height = xc_image->height; -@@ -243,7 +244,13 @@ meta_cursor_image_load_from_xcursor_image (MetaCursorImage *image, - cogl_format, - rowstride, - (uint8_t *) xc_image->pixels, -- NULL); -+ &error); -+ -+ if (error) -+ { -+ meta_warning ("Failed to allocate cursor texture: %s\n", error->message); -+ cogl_error_free (error); -+ } - - #ifdef HAVE_NATIVE_BACKEND - struct gbm_device *gbm = get_gbm_device (); -@@ -284,6 +291,7 @@ meta_cursor_image_load_from_buffer (MetaCursorImage *image, - { - ClutterBackend *backend; - CoglContext *cogl_context; -+ CoglError *error = NULL; - - image->hot_x = hot_x; - image->hot_y = hot_y; -@@ -291,7 +299,13 @@ meta_cursor_image_load_from_buffer (MetaCursorImage *image, - backend = clutter_get_default_backend (); - cogl_context = clutter_backend_get_cogl_context (backend); - -- image->texture = cogl_wayland_texture_2d_new_from_buffer (cogl_context, buffer, NULL); -+ image->texture = cogl_wayland_texture_2d_new_from_buffer (cogl_context, buffer, &error); -+ -+ if (error) -+ { -+ meta_warning ("Failed to allocate cursor texture:%s\n", error->message); -+ cogl_error_free (error); -+ } - - #ifdef HAVE_NATIVE_BACKEND - struct gbm_device *gbm = get_gbm_device (); -diff --git a/src/compositor/meta-background-image.c b/src/compositor/meta-background-image.c -index af66755..0d36246 100644 ---- a/src/compositor/meta-background-image.c -+++ b/src/compositor/meta-background-image.c -@@ -144,6 +144,7 @@ file_loaded (GObject *source_object, - { - MetaBackgroundImage *image = META_BACKGROUND_IMAGE (source_object); - GError *error = NULL; -+ CoglError *catch_error = NULL; - GTask *task; - CoglTexture *texture; - GdkPixbuf *pixbuf; -@@ -176,9 +177,10 @@ file_loaded (GObject *source_object, - has_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888, - row_stride, - pixels, 0, -- NULL)) -+ &catch_error)) - { - g_warning ("Failed to create texture for background"); -+ cogl_error_free (catch_error); - cogl_object_unref (texture); - } - -diff --git a/src/compositor/meta-background.c b/src/compositor/meta-background.c -index 75fbc28..de0407b 100644 ---- a/src/compositor/meta-background.c -+++ b/src/compositor/meta-background.c -@@ -17,6 +17,7 @@ - * along with this program; if not, see . - */ - -+#include - #include - #include - #include "meta-background-private.h" -@@ -515,6 +516,7 @@ ensure_color_texture (MetaBackground *self) - { - ClutterBackend *backend = clutter_get_default_backend (); - CoglContext *ctx = clutter_backend_get_cogl_context (backend); -+ CoglError *error = NULL; - uint8_t pixels[6]; - int width, height; - -@@ -555,7 +557,13 @@ ensure_color_texture (MetaBackground *self) - COGL_PIXEL_FORMAT_RGB_888, - width * 3, - pixels, -- NULL)); -+ &error)); -+ -+ if (error != NULL) -+ { -+ meta_warning ("Failed to allocate color texture: %s\n", error->message); -+ cogl_error_free (error); -+ } - } - } - -diff --git a/src/compositor/meta-shadow-factory.c b/src/compositor/meta-shadow-factory.c -index 0a60398..b2c5a1e 100644 ---- a/src/compositor/meta-shadow-factory.c -+++ b/src/compositor/meta-shadow-factory.c -@@ -26,6 +26,7 @@ - #include - #include - -+#include - #include "cogl-utils.h" - #include "meta-shadow-factory-private.h" - #include "region-utils.h" -@@ -706,6 +707,7 @@ make_shadow (MetaShadow *shadow, - { - ClutterBackend *backend = clutter_get_default_backend (); - CoglContext *ctx = clutter_backend_get_cogl_context (backend); -+ CoglError *error = NULL; - int d = get_box_filter_size (shadow->key.radius); - int spread = get_shadow_spread (shadow->key.radius); - cairo_rectangle_int_t extents; -@@ -803,7 +805,13 @@ make_shadow (MetaShadow *shadow, - (buffer + - (y_offset - shadow->outer_border_top) * buffer_width + - (x_offset - shadow->outer_border_left)), -- NULL)); -+ &error)); -+ -+ if (error) -+ { -+ meta_warning ("Failed to allocate shadow texture: %s\n", error->message); -+ cogl_error_free (error); -+ } - - cairo_region_destroy (row_convolve_region); - cairo_region_destroy (column_convolve_region); -diff --git a/src/compositor/meta-surface-actor-x11.c b/src/compositor/meta-surface-actor-x11.c -index 4a5ac00..62f517b 100644 ---- a/src/compositor/meta-surface-actor-x11.c -+++ b/src/compositor/meta-surface-actor-x11.c -@@ -113,14 +113,20 @@ set_pixmap (MetaSurfaceActorX11 *self, - - CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); - MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self)); -+ CoglError *error = NULL; - CoglTexture *texture; - - g_assert (priv->pixmap == None); - priv->pixmap = pixmap; - -- texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->pixmap, FALSE, NULL)); -+ texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->pixmap, FALSE, &error)); - -- if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture)))) -+ if (error != NULL) -+ { -+ g_warning ("Failed to allocate stex texture: %s", error->message); -+ cogl_error_free (error); -+ } -+ else if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture)))) - g_warning ("NOTE: Not using GLX TFP!\n"); - - priv->texture = texture; -diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c -index 476abbf..edc21e3 100644 ---- a/src/compositor/meta-window-actor.c -+++ b/src/compositor/meta-window-actor.c -@@ -1791,9 +1791,17 @@ build_and_scan_frame_mask (MetaWindowActor *self, - } - else - { -+ CoglError *error = NULL; -+ - mask_texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, tex_width, tex_height, - COGL_PIXEL_FORMAT_A_8, -- stride, mask_data, NULL)); -+ stride, mask_data, &error)); -+ -+ if (error) -+ { -+ g_warning ("Failed to allocate mask texture: %s", error->message); -+ cogl_error_free (error); -+ } - } - - meta_shaped_texture_set_mask_texture (stex, mask_texture); -diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c -index 40db3b0..eda2326 100644 ---- a/src/wayland/meta-wayland-buffer.c -+++ b/src/wayland/meta-wayland-buffer.c -@@ -131,7 +131,13 @@ meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer, - cogl_wayland_texture_set_region_from_shm_buffer (buffer->texture, - rect.x, rect.y, rect.width, rect.height, - shm_buffer, -- rect.x, rect.y, 0, NULL); -+ rect.x, rect.y, 0, &error); -+ -+ if (error) -+ { -+ meta_warning ("Failed to set texture region: %s\n", error->message); -+ cogl_error_free (error); -+ } - } - } - } --- -2.7.3 - diff --git a/SOURCES/mutter-3.14.4-EL7.3_translations.patch b/SOURCES/mutter-3.14.4-EL7.3_translations.patch deleted file mode 100644 index f1040b3..0000000 --- a/SOURCES/mutter-3.14.4-EL7.3_translations.patch +++ /dev/null @@ -1,13768 +0,0 @@ -diff -urN mutter-3.14.4/po/de.po mutter-3.14.4_localized/po/de.po ---- mutter-3.14.4/po/de.po 2014-10-02 19:59:20.000000000 +0530 -+++ mutter-3.14.4_localized/po/de.po 2016-06-25 07:51:12.468149324 +0530 -@@ -7,22 +7,20 @@ - # Christian Kirbach , 2009, 2011, 2012. - # Wolfgang Stöggl 2011. - # Tobias Endrigkeit , 2012. --# - msgid "" - msgstr "" - "Project-Id-Version: mutter master\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=mutter&keywords=I18N+L10N&component=general\n" --"POT-Creation-Date: 2014-09-19 22:00+0000\n" --"PO-Revision-Date: 2014-09-20 11:39+0100\n" --"Last-Translator: \n" --"Language-Team: Deutsch \n" --"Language: de\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-04-19 09:49+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2014-09-20 10:39+0000\n" -+"Last-Translator: \n" -+"Language-Team: Deutsch \n" -+"Language: de\n" - "Plural-Forms: nplurals=2; plural=(n != 1);\n" --"X-Generator: Poedit 1.5.4\n" -+"X-Generator: Zanata 3.8.2\n" - - #: ../data/50-mutter-navigation.xml.in.h:1 - msgid "Navigation" -@@ -235,7 +233,8 @@ - #: ../data/50-mutter-windows.xml.in.h:12 - msgid "Toggle window on all workspaces or one" - msgstr "" --"Festlegen, ob das Fenster auf allen oder nur einer Arbeitsfläche sichtbar ist" -+"Festlegen, ob das Fenster auf allen oder nur einer Arbeitsfläche sichtbar " -+"ist" - - #: ../data/50-mutter-windows.xml.in.h:13 - msgid "Raise window if covered, otherwise lower it" -@@ -282,9 +281,9 @@ - msgstr "" - "Dieser Schlüssel wird die »Überlagerung« auslösen, d.h. eine kombinierte " - "Fensterübersicht und ein System zum Starten von Anwendungen. Als " --"Voreinstellung ist die Windows-Taste der Tastatur von PC-Hardware " --"vorgesehen. Man geht davon aus, dass diese Tastenverknüpfung entweder die " --"Vorgabe ist oder als leere Zeichenkette gesetzt ist." -+"Voreinstellung ist die Windows-Taste der Tastatur von PC-Hardware vorgesehen." -+" Man geht davon aus, dass diese Tastenverknüpfung entweder die Vorgabe ist " -+"oder als leere Zeichenkette gesetzt ist." - - #: ../data/org.gnome.mutter.gschema.xml.in.h:3 - msgid "Attach modal dialogs" -@@ -308,8 +307,8 @@ - #: ../data/org.gnome.mutter.gschema.xml.in.h:6 - 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." -+"vertically and resizes them horizontally to cover half of the available area." -+" Dropping windows on the top screen edge maximizes them completely." - msgstr "" - "Falls aktiviert, wird bei Berührung eines Fensters mit den senkrechten " - "Bildschirmrändern dieses vertikal maximiert und horizontal angepasst, um die " -@@ -442,33 +441,33 @@ - msgid "Switch to VT 7" - msgstr "Zum virtuellen Terminal 7 wechseln" - --#: ../src/backends/meta-monitor-manager.c:412 -+#: ../src/backends/meta-monitor-manager.c:375 - msgid "Built-in display" - msgstr "Eingebaute Anzeige" - --#: ../src/backends/meta-monitor-manager.c:437 -+#: ../src/backends/meta-monitor-manager.c:400 - msgid "Unknown" - msgstr "Unbekannt" - --#: ../src/backends/meta-monitor-manager.c:439 -+#: ../src/backends/meta-monitor-manager.c:402 - msgid "Unknown Display" - msgstr "Unbekannte Anzeige" - - #. TRANSLATORS: this is a monitor vendor name, followed by a - #. * size in inches, like 'Dell 15"' --#. --#: ../src/backends/meta-monitor-manager.c:447 -+#. -+#: ../src/backends/meta-monitor-manager.c:410 - #, c-format - msgid "%s %s" - msgstr "%s %s" - - #. 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:443 -+#: ../src/compositor/compositor.c:461 - #, c-format - msgid "" --"Another compositing manager is already running on screen %i on display \"%s" --"\"." -+"Another compositing manager is already running on screen %i on display " -+"\"%s\"." - msgstr "" - "Ein weiterer Compositing-Verwalter läuft bereits auf Bildschirm %i der " - "Anzeige »%s«." -@@ -502,7 +501,7 @@ - msgid "_Force Quit" - msgstr "_Beenden erzwingen" - --#: ../src/core/display.c:547 -+#: ../src/core/display.c:550 - #, c-format - msgid "Failed to open X Window System display '%s'\n" - msgstr "X-Window-Systemanzeige »%s« konnte nicht geöffnet werden\n" -@@ -578,17 +577,17 @@ - msgid "Mutter plugin to use" - msgstr "Zu benutzendes Mutter-Plugin" - --#: ../src/core/prefs.c:2065 -+#: ../src/core/prefs.c:2064 - #, c-format - msgid "Workspace %d" - msgstr "Arbeitsfläche %d" - --#: ../src/core/screen.c:543 -+#: ../src/core/screen.c:537 - #, c-format - msgid "Screen %d on display '%s' is invalid\n" - msgstr "Bildschirm %d auf Anzeige »%s« ist ungültig\n" - --#: ../src/core/screen.c:559 -+#: ../src/core/screen.c:553 - #, c-format - msgid "" - "Screen %d on display \"%s\" already has a window manager; try using the --" -@@ -598,7 +597,7 @@ - "die Option »--replace« an, um zu versuchen, den aktuellen Fensterverwalter " - "zu ersetzen.\n" - --#: ../src/core/screen.c:652 -+#: ../src/core/screen.c:646 - #, c-format - msgid "Screen %d on display \"%s\" already has a window manager\n" - msgstr "Bildschirm %d auf Anzeige »%s« hat bereits einen Fensterverwalter\n" -@@ -609,7 +608,7 @@ - - #. Translators: This represents the size of a window. The first number is - #. * the width of the window and the second is the height. --#. -+#. - #: ../src/ui/resizepopup.c:134 - #, c-format - msgid "%d x %d" -@@ -728,7 +727,8 @@ - #: ../src/ui/theme.c:1363 - #, c-format - msgid "Could not parse alpha value \"%s\" in blended color" --msgstr "Der Alphawert »%s« in einer Mischfarbe konnte nicht verarbeitet werden" -+msgstr "" -+"Der Alphawert »%s« in einer Mischfarbe konnte nicht verarbeitet werden" - - #: ../src/ui/theme.c:1373 - #, c-format -@@ -826,7 +826,8 @@ - #: ../src/ui/theme.c:2235 - #, c-format - msgid "Coordinate expression ended with an operator instead of an operand" --msgstr "Der Koordinatenausdruck endet mit einem Operator statt einem Operanden" -+msgstr "" -+"Der Koordinatenausdruck endet mit einem Operator statt einem Operanden" - - #: ../src/ui/theme.c:2245 - #, c-format -@@ -857,7 +858,8 @@ - - #: ../src/ui/theme.c:2588 - #, c-format --msgid "Coordinate expression had an open parenthesis with no close parenthesis" -+msgid "" -+"Coordinate expression had an open parenthesis with no close parenthesis" - msgstr "" - "Der Koordinatenausdruck enthält eine öffnende Klammer, jedoch keine " - "Schließende" -@@ -884,10 +886,8 @@ - - #: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995 - #, c-format --msgid "" --"Missing " --msgstr "" --" fehlt" -+msgid "Missing " -+msgstr " fehlt" - - #: ../src/ui/theme.c:5041 - #, c-format -@@ -911,8 +911,7 @@ - - #: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745 - #, c-format --msgid "" --"User-defined constants must begin with a capital letter; \"%s\" does not" -+msgid "User-defined constants must begin with a capital letter; \"%s\" does not" - msgstr "" - "Benutzerdefinierte Konstanten müssen mit einem Großbuchstaben beginnen; »%s« " - "jedoch nicht" -@@ -924,7 +923,7 @@ - - #. Translators: This means that an attribute which should have been found - #. * on an XML element was not in fact found. --#. -+#. - #: ../src/ui/theme-parser.c:234 - #, c-format - msgid "No \"%s\" attribute on element <%s>" -@@ -992,8 +991,8 @@ - #: ../src/ui/theme-parser.c:865 - #, c-format - msgid "" --"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium," --"large,x-large,xx-large)\n" -+"Invalid title scale \"%s\" (must be one of xx-small,x-" -+"small,small,medium,large,x-large,xx-large)\n" - msgstr "" - "Ungültiger Titelmaßstab »%s« (muss xx-small, x-small, small, medium, large, " - "x-large oder xx-large sein)\n" -@@ -1026,6 +1025,7 @@ - msgid "You must specify a background for an alpha value to be meaningful" - msgstr "" - "Es muss ein Hintergrund festgelegt werden, damit ein Alpha-Wert sinnvoll ist." -+"" - - #: ../src/ui/theme-parser.c:1266 - #, c-format -@@ -1318,657 +1318,7 @@ - "Diese Fenster unterstützen das Speichern der aktuellen Einstellungen nicht " - "und müssen bei der nächsten Anmeldung manuell neu gestartet werden." - --#: ../src/x11/window-props.c:515 -+#: ../src/x11/window-props.c:558 - #, c-format - msgid "%s (on %s)" - msgstr "%s (auf %s)" -- --#~ msgid "background texture could not be created from file" --#~ msgstr "Hintergrundtextur konnte aus Datei nicht erzeugt werden" -- --#~ msgid "Unknown window information request: %d" --#~ msgstr "Unbekannte Fensterinformation angefordert: %d" -- --#~ msgid "Missing %s extension required for compositing" --#~ msgstr "Die für Compositing benötigte %s-Erweiterung wurde nicht gefunden" -- --#~ msgid "" --#~ "Some other program is already using the key %s with modifiers %x as a " --#~ "binding\n" --#~ msgstr "" --#~ "Ein anderes Programm verwendet die Taste %s bereits mit den Umschaltern " --#~ "%x als Tastenkombination\n" -- --#~ msgid "\"%s\" is not a valid accelerator\n" --#~ msgstr "»%s« ist keine zulässige Zugriffstaste\n" -- --#~ msgid "" --#~ "Workarounds for broken applications disabled. Some applications may not " --#~ "behave properly.\n" --#~ msgstr "" --#~ "Provisorien (Workarounds) für defekte Anwendungen abgeschaltet. " --#~ "Möglicherweise funktionieren manche Anwendungen nicht richtig.\n" -- --#~ msgid "Could not parse font description \"%s\" from GSettings key %s\n" --#~ msgstr "" --#~ "Schriftbeschreibung »%s« aus GConf-Schlüssel %s konnte nicht verarbeitet " --#~ "werden\n" -- --#~ msgid "" --#~ "\"%s\" found in configuration database is not a valid value for mouse " --#~ "button modifier\n" --#~ msgstr "" --#~ "In der Konfigurationsdatenbank gefundenes »%s« ist kein zulässiger Wert " --#~ "für den Maustastenumschalter\n" -- --#~ msgid "" --#~ "\"%s\" found in configuration database is not a valid value for " --#~ "keybinding \"%s\"\n" --#~ msgstr "" --#~ "In der Konfigurationsdatenbank gefundenes »%s« ist kein zulässiger Wert " --#~ "für die Tastenkombination »%s«\n" -- --#~ msgid "" --#~ "Could not acquire window manager selection on screen %d display \"%s\"\n" --#~ msgstr "" --#~ "Markierung des Fensterverwalters auf Bildschirm %d auf Anzeige »%s« " --#~ "konnte nicht empfangen werden\n" -- --#~ msgid "Could not release screen %d on display \"%s\"\n" --#~ msgstr "Bildschirm %d auf Anzeige »%s« konnte nicht freigegeben werden\n" -- --#~ msgid "Could not create directory '%s': %s\n" --#~ msgstr "Ordner »%s« konnte nicht angelegt werden: %s\n" -- --#~ msgid "Could not open session file '%s' for writing: %s\n" --#~ msgstr "Sitzungsdatei »%s« konnte nicht zum Schreiben geöffnet werden: %s\n" -- --#~ msgid "Error writing session file '%s': %s\n" --#~ msgstr "Fehler beim Schreiben der Sitzungsdatei »%s«: %s\n" -- --#~ msgid "Error closing session file '%s': %s\n" --#~ msgstr "Fehler beim Schließen der Sitzungsdatei »%s«: %s\n" -- --#~ msgid "Failed to parse saved session file: %s\n" --#~ msgstr "Gespeicherte Sitzungsdatei konnte nicht verarbeitet werden: %s\n" -- --#~ msgid " attribute seen but we already have the session ID" --#~ msgstr "" --#~ "Attribut ist aufgetaucht, obwohl die Sitzungskennung " --#~ "bereits feststeht" -- --#~ msgid "Unknown attribute %s on <%s> element" --#~ msgstr "Unbekanntes Attribut %s in Element <%s>" -- --#~ msgid "nested tag" --#~ msgstr "verschachteltes Element " -- --#~ msgid "Unknown element %s" --#~ msgstr "Unbekanntes Element %s" -- --#~ msgid "Failed to open debug log: %s\n" --#~ msgstr "Diagnoseprotokoll konnte nicht geöffnet werden: %s\n" -- --#~ msgid "Failed to fdopen() log file %s: %s\n" --#~ msgstr "Protokolldatei %s konnte nicht mit fdopen() geöffnet werden: %s\n" -- --#~ msgid "Opened log file %s\n" --#~ msgstr "Protokolldatei %s geöffnet\n" -- --#~ msgid "Window manager: " --#~ msgstr "Fensterverwalter:" -- --#~ msgid "Bug in window manager: " --#~ msgstr "Fehler in Fensterverwalter:" -- --#~ msgid "Window manager warning: " --#~ msgstr "Fensterverwalter-Warnung:" -- --#~ msgid "Window manager error: " --#~ msgstr "Fensterverwalter-Fehler:" -- --#~ msgid "" --#~ "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER " --#~ "window as specified in the ICCCM.\n" --#~ msgstr "" --#~ "Fenster %s setzt SM_CLIENT_ID auf sich selbst, anstatt auf das " --#~ "WM_CLIENT_LEADER-Fenster, wie im ICCCM vorgegeben.\n" -- --# We ignore mwm_has_resize_func because WM_NORMAL_HINTS is the --# * authoritative source for that info. Some apps such as mplayer or --# * xine disable resize via MWM but not WM_NORMAL_HINTS, but that --# * leads to e.g. us not fullscreening their windows. Apps that set --# * MWM but not WM_NORMAL_HINTS are basically broken. We complain --# * about these apps but make them work. --#~ msgid "" --#~ "Window %s sets an MWM hint indicating it isn't resizable, but sets min " --#~ "size %d x %d and max size %d x %d; this doesn't make much sense.\n" --#~ msgstr "" --#~ "Fenster %s zeigt durch einen MWM-Hinweis an, dass die Größe nicht " --#~ "veränderbar ist, setzt jedoch die minimale Größe auf %d x %d und die " --#~ "maximale Größe auf %d x %d; dies ergibt keinen Sinn.\n" -- --#~ msgid "Application set a bogus _NET_WM_PID %lu\n" --#~ msgstr "Anwendung hat eine unsinnige _NET_WM_PID %lu angegeben\n" -- --#~ msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n" --#~ msgstr "Ungültiges WM_TRANSIENT_FOR-Fenster 0x%lx festgelegt für %s.\n" -- --#~ msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n" --#~ msgstr "" --#~ "WM_TRANSIENT_FOR-Fenster 0x%lx für %s würde eine Endlosschleife " --#~ "verursachen.\n" -- --#~ msgid "" --#~ "Window 0x%lx has property %s\n" --#~ "that was expected to have type %s format %d\n" --#~ "and actually has type %s format %d n_items %d.\n" --#~ "This is most likely an application bug, not a window manager bug.\n" --#~ "The window has title=\"%s\" class=\"%s\" name=\"%s\"\n" --#~ msgstr "" --#~ "Fenster 0x%lx hat die Eigenschaft %s,\n" --#~ "die Typ %s, Format %d sein sollte,\n" --#~ "jedoch Typ %s, Format %d n_items %d ist.\n" --#~ "Dies ist vermutlich ein Fehler in der Anwendung\n" --#~ "und nicht im Fensterverwalter. Das Fenster hat den\n" --#~ "Titel »%s«, die Klasse »%s« und den Namen »%s«\n" -- --#~ msgid "Property %s on window 0x%lx contained invalid UTF-8\n" --#~ msgstr "Eigenschaft %s von Fenster 0x%lx enthielt ungültiges UTF-8\n" -- --#~ msgid "" --#~ "Property %s on window 0x%lx contained invalid UTF-8 for item %d in the " --#~ "list\n" --#~ msgstr "" --#~ "Eigenschaft %s auf Fenster 0x%lx enthielt ungültiges UTF-8 für Objekt %d " --#~ "in der Liste\n" -- --#~ msgid "Mi_nimize" --#~ msgstr "_Minimieren" -- --#~ msgid "Ma_ximize" --#~ msgstr "Ma_ximieren" -- --#~ msgid "Unma_ximize" --#~ msgstr "_Wiederherstellen" -- --#~ msgid "Roll _Up" --#~ msgstr "Ein_rollen" -- --#~ msgid "_Unroll" --#~ msgstr "Aus_rollen" -- --#~ msgid "_Move" --#~ msgstr "_Verschieben" -- --#~ msgid "_Resize" --#~ msgstr "_Größe ändern" -- --#~ msgid "Move Titlebar On_screen" --#~ msgstr "_Titelleiste auf Bildschirm verschieben" -- --#~ msgid "Always on _Top" --#~ msgstr "Im V_ordergrund" -- --#~ msgid "_Always on Visible Workspace" --#~ msgstr "Immer auf der _sichtbaren Arbeitsfläche" -- --#~ msgid "_Only on This Workspace" --#~ msgstr "Nur auf _dieser Arbeitsfläche" -- --#~ msgid "Move to Workspace _Left" --#~ msgstr "Auf Arbeitsfläche _links verschieben" -- --#~ msgid "Move to Workspace R_ight" --#~ msgstr "Auf Arbeitsfläche _rechts verschieben" -- --#~ msgid "Move to Workspace _Up" --#~ msgstr "Auf Arbeitsfläche darü_ber verschieben" -- --#~ msgid "Move to Workspace _Down" --#~ msgstr "Auf Arbeitsfläche dar_unter verschieben" -- --#~ msgid "_Close" --#~ msgstr "S_chließen" -- --#~ msgid "Workspace %d%n" --#~ msgstr "Arbeitsfläche %d%n" -- --#~ msgid "Workspace 1_0" --#~ msgstr "Arbeitsfläche 1_0" -- --#~ msgid "Workspace %s%d" --#~ msgstr "Arbeitsfläche %s%d" -- --#~ msgid "Move to Another _Workspace" --#~ msgstr "Auf a_ndere Arbeitsfläche verschieben" -- --#~ msgid "Shift" --#~ msgstr "Shift" -- --#~ msgid "Ctrl" --#~ msgstr "Strg" -- --#~ msgid "Alt" --#~ msgstr "Alt" -- --#~ msgid "Meta" --#~ msgstr "Meta" -- --#~ msgid "Super" --#~ msgstr "Super" -- --#~ msgid "Hyper" --#~ msgstr "Hyper" -- --#~ msgid "Mod2" --#~ msgstr "Umschalter2" -- --#~ msgid "Mod3" --#~ msgstr "Umschalter3" -- --#~ msgid "Mod4" --#~ msgstr "Umschalter4" -- --#~ msgid "Mod5" --#~ msgstr "Umschalter5" -- --#~ msgid "Usage: %s\n" --#~ msgstr "Aufruf: %s\n" -- --#~ msgid "_Windows" --#~ msgstr "_Fenster" -- --#~ msgid "_Dialog" --#~ msgstr "_Dialogfenster" -- --#~ msgid "_Modal dialog" --#~ msgstr "_Modales Dialogfenster" -- --#~ msgid "_Utility" --#~ msgstr "_Werkzeug" -- --#~ msgid "_Splashscreen" --#~ msgstr "_Begrüßungsbildschirm" -- --#~ msgid "_Top dock" --#~ msgstr "_Oberes Dock" -- --#~ msgid "_Bottom dock" --#~ msgstr "_Unteres Dock" -- --#~ msgid "_Left dock" --#~ msgstr "_Linkes Dock" -- --#~ msgid "_Right dock" --#~ msgstr "_Rechtes Dock" -- --#~ msgid "_All docks" --#~ msgstr "_Alle Docks" -- --#~ msgid "Des_ktop" --#~ msgstr "Arbeitsfl_äche" -- --#~ msgid "Open another one of these windows" --#~ msgstr "Noch eines dieser Fenster öffnen" -- --#~ msgid "This is a demo button with an 'open' icon" --#~ msgstr "Dies ist ein Demo-Knopf mit einem »Öffnen«-Symbol" -- --#~ msgid "This is a demo button with a 'quit' icon" --#~ msgstr "Dies ist ein Demo-Knopf mit einem »Beenden«-Symbol" -- --#~ msgid "This is a sample message in a sample dialog" --#~ msgstr "Dies ist eine Beispielnachricht in einem Beispieldialog" -- --#~ msgid "Fake menu item %d\n" --#~ msgstr "Pseudo-Menüeintrag %d\n" -- --#~ msgid "Border-only window" --#~ msgstr "Fenster ausschließlich mit Rand" -- --#~ msgid "Bar" --#~ msgstr "Leiste" -- --#~ msgid "Normal Application Window" --#~ msgstr "Normales Anwendungsfenster" -- --#~ msgid "Dialog Box" --#~ msgstr "Dialogfenster" -- --#~ msgid "Modal Dialog Box" --#~ msgstr "Modales Dialogfenster" -- --#~ msgid "Utility Palette" --#~ msgstr "Werkzeugpalette" -- --#~ msgid "Torn-off Menu" --#~ msgstr "Abgerissenes Menü" -- --#~ msgid "Border" --#~ msgstr "Rand" -- --#~ msgid "Attached Modal Dialog" --#~ msgstr "Angehängter modaler Dialog" -- --#~ msgid "Button layout test %d" --#~ msgstr "Test der Knopfanordnung %d" -- --#~ msgid "%g milliseconds to draw one window frame" --#~ msgstr "%g Millisekunden zum Zeichnen eines Fensterrahmens" -- --#~ msgid "Usage: metacity-theme-viewer [THEMENAME]\n" --#~ msgstr "Aufruf: metacity-theme-viewer [THEMENNAME]\n" -- --#~ msgid "Error loading theme: %s\n" --#~ msgstr "Fehler beim Laden des Themas: %s\n" -- --#~ msgid "Loaded theme \"%s\" in %g seconds\n" --#~ msgstr "Thema »%s« in %g Sekunden geladen\n" -- --#~ msgid "Normal Title Font" --#~ msgstr "Normale Titelschrift" -- --#~ msgid "Small Title Font" --#~ msgstr "Kleine Titelschrift" -- --#~ msgid "Large Title Font" --#~ msgstr "Große Titelschrift" -- --#~ msgid "Button Layouts" --#~ msgstr "Anordnungen der Knöpfe" -- --#~ msgid "Benchmark" --#~ msgstr "Leistungserfassung" -- --#~ msgid "Window Title Goes Here" --#~ msgstr "Hierher kommt der Fenstertitel" -- --# CHECK - wall clock --#~ msgid "" --#~ "Drew %d frames in %g client-side seconds (%g milliseconds per frame) and " --#~ "%g seconds wall clock time including X server resources (%g milliseconds " --#~ "per frame)\n" --#~ msgstr "" --#~ "%d Rahmen in %g Sekunden auf Client-Seite gezeichnet (%g Millisekunden " --#~ "pro Rahmen) bzw. in %g Sekunden Gesamtzeit inkl. X-Server-Ressourcen (%g " --#~ "Millisekunden pro Rahmen).\n" -- --#~ msgid "position expression test returned TRUE but set error" --#~ msgstr "Positionsausdruckstest lieferte WAHR, jedoch auch einen Fehler" -- --#~ msgid "position expression test returned FALSE but didn't set error" --#~ msgstr "Positionsausdruckstest lieferte FALSCH, jedoch keinen Fehler" -- --#~ msgid "Error was expected but none given" --#~ msgstr "Fehler erwartet, jedoch nicht übergeben" -- --#~ msgid "Error %d was expected but %d given" --#~ msgstr "Fehler %d erwartet, jedoch %d übergeben" -- --#~ msgid "Error not expected but one was returned: %s" --#~ msgstr "Kein Fehler erwartet, jedoch einer übergeben: %s" -- --#~ msgid "x value was %d, %d was expected" --#~ msgstr "X-Wert war %d, %d erwartet" -- --#~ msgid "y value was %d, %d was expected" --#~ msgstr "Y-Wert war %d, %d erwartet" -- --#~ msgid "" --#~ "%d coordinate expressions parsed in %g seconds (%g seconds average)\n" --#~ msgstr "" --#~ "%d Koordinatenausdrücke in %g Sekunden verarbeitet (im Durchschnitt %g " --#~ "pro Sekunde)\n" -- --#, fuzzy --#~ msgid "Minimize window" --#~ msgstr "Fenster minimieren" -- --#~ msgid "Comma-separated list of compositor plugins" --#~ msgstr "Eine durch Kommata getrennte Liste von Plugins für den Compositor" -- --#~ msgid "Live Hidden Windows" --#~ msgstr "Verborgene Fenster erhalten" -- --#~ msgid "" --#~ "Determines whether hidden windows (i.e., minimized windows and windows on " --#~ "other workspaces than the current one) should be kept alive." --#~ msgstr "" --#~ "Legt fest, ob verborgene Fenster (d.h. minimierte Fenster und Fenster auf " --#~ "anderen Arbeitsflächen) erhalten bleiben sollen." -- --#~ msgid "Switch to workspace 8" --#~ msgstr "Zur Arbeitsfläche 8 wechseln" -- --#~ msgid "Switch to workspace 9" --#~ msgstr "Zur Arbeitsfläche 9 wechseln" -- --#~ msgid "Switch to workspace 10" --#~ msgstr "Zur Arbeitsfläche 10 wechseln" -- --#~ msgid "Switch to workspace 11" --#~ msgstr "Zur Arbeitsfläche 11 wechseln" -- --#~ msgid "Switch to workspace 12" --#~ msgstr "Zur Arbeitsfläche 12 wechseln" -- --#~ msgid "Switch to workspace on the left of the current workspace" --#~ msgstr "Zur Arbeitsfläche links der aktuellen wechseln" -- --#~ msgid "Switch to workspace on the right of the current workspace" --#~ msgstr "Zur Arbeitsfläche rechts der aktuellen wechseln" -- --#~ msgid "Switch to workspace above the current workspace" --#~ msgstr "Zur Arbeitsfläche oberhalb der aktuellen wechseln" -- --#~ msgid "Switch to workspace below the current workspace" --#~ msgstr "Zur Arbeitsfläche unterhalb der aktuellen wechseln" -- --#~ msgid "Move between windows of an application, using a popup window" --#~ msgstr "" --#~ "Zwischen den Fenstern einer Anwendung mittels einer Fensterliste wechseln" -- --#~ msgid "" --#~ "Move backward between windows of an application, using a popup window" --#~ msgstr "" --#~ "Zwischen den Fenstern einer Anwendung mittels einer Fensterliste in " --#~ "umgekehrter Reihenfolge wechseln" -- --#~ msgid "Move between windows, using a popup window" --#~ msgstr "Zwischen den Fenstern mittels einer Fensterliste wechseln" -- --#~ msgid "Move backward between windows, using a popup window" --#~ msgstr "" --#~ "Zwischen den Fenstern mittels einer Fensterliste in umgekehrter " --#~ "Reihenfolge wechseln" -- --#~ msgid "Move between panels and the desktop, using a popup window" --#~ msgstr "" --#~ "Zwischen Panels und der Arbeitsfläche mittels einer Fensterliste wechseln" -- --#~ msgid "Move backward between panels and the desktop, using a popup window" --#~ msgstr "" --#~ "Zwischen Panels und der Arbeitsfläche in umgekehrter Reihenfolge mittels " --#~ "einer Fensterliste wechseln" -- --#~ msgid "Move between windows of an application immediately" --#~ msgstr "Zwischen den Fenstern einer Anwendung sofort wechseln" -- --#~ msgid "Move backward between windows of an application immediately" --#~ msgstr "" --#~ "Zwischen den Fenstern einer Anwendung in umgekehrter Reihenfolge sofort " --#~ "wechseln" -- --#~ msgid "Move between windows immediately" --#~ msgstr "Zwischen Fenstern sofort wechseln" -- --#~ msgid "Move backward between windows immediately" --#~ msgstr "Zwischen Fenstern in umgekehrter Reihenfolge sofort wechseln" -- --#~ msgid "Move between panels and the desktop immediately" --#~ msgstr "Zwischen Panels und der Arbeitsfläche sofort wechseln" -- --#~ msgid "Move backward between panels and the desktop immediately" --#~ msgstr "" --#~ "Zwischen Panels und der Arbeitsfläche in umgekehrter Reihenfolge sofort " --#~ "wechseln" -- --#~ msgid "Hide all normal windows and set focus to the desktop" --#~ msgstr "Alle normalen Fenster verbergen und die Arbeitsfläche fokussieren" -- --#~ msgid "Show the panel's main menu" --#~ msgstr "Das Hauptmenü des Panels anzeigen" -- --#~ msgid "Show the panel's \"Run Application\" dialog box" --#~ msgstr "Das Dialogfenster »Anwendung ausführen« des Panels anzeigen" -- --#~ msgid "Start or stop recording the session" --#~ msgstr "Die Sitzungsaufzeichnung starten oder beenden" -- --#~ msgid "Take a screenshot" --#~ msgstr "Ein Bildschirmfoto aufnehmen" -- --#~ msgid "Take a screenshot of a window" --#~ msgstr "Ein Bildschirmfoto eines Fensters aufnehmen" -- --#~ msgid "Run a terminal" --#~ msgstr "Ein Terminal starten" -- --#~ msgid "Toggle whether a window will always be visible over other windows" --#~ msgstr "Fenster ständig im Vordergrund ein-/ausschalten" -- --#~ msgid "Toggle whether window is on all workspaces or just one" --#~ msgstr "Fenster sichtbar auf allen Arbeitsflächen ein-/ausschalten" -- --#~ msgid "Move window to workspace 5" --#~ msgstr "Fenster auf Arbeitsfläche 5 verschieben" -- --#~ msgid "Move window to workspace 6" --#~ msgstr "Fenster auf Arbeitsfläche 6 verschieben" -- --#~ msgid "Move window to workspace 7" --#~ msgstr "Fenster auf Arbeitsfläche 7 verschieben" -- --#~ msgid "Move window to workspace 8" --#~ msgstr "Fenster auf Arbeitsfläche 8 verschieben" -- --#~ msgid "Move window to workspace 9" --#~ msgstr "Fenster auf Arbeitsfläche 9 verschieben" -- --#~ msgid "Move window to workspace 10" --#~ msgstr "Fenster auf Arbeitsfläche 10 verschieben" -- --#~ msgid "Move window to workspace 11" --#~ msgstr "Fenster auf Arbeitsfläche 11 verschieben" -- --#~ msgid "Move window to workspace 12" --#~ msgstr "Fenster auf Arbeitsfläche 12 verschieben" -- --#~ msgid "Raise window if it's covered by another window, otherwise lower it" --#~ msgstr "Fenster anheben falls überdeckt, sonst absenken" -- --#~ msgid "Move window to north-west (top left) corner" --#~ msgstr "Fenster in linke obere Ecke des Bildschirms verschieben" -- --#~ msgid "Move window to north-east (top right) corner" --#~ msgstr "Fenster in rechte obere Ecke des Bildschirms verschieben" -- --#~ msgid "Move window to south-west (bottom left) corner" --#~ msgstr "Fenster in linke untere Ecke des Bildschirms verschieben" -- --#~ msgid "Move window to south-east (bottom right) corner" --#~ msgstr "Fenster in rechte untere Ecke des Bildschirms verschieben" -- --#~ msgid "Move window to north (top) side of screen" --#~ msgstr "Fenster zur oberen Seite des Bildschirms verschieben" -- --#~ msgid "Move window to south (bottom) side of screen" --#~ msgstr "Fenster zur unteren Seite des Bildschirms verschieben" -- --#~ msgid "Move window to east (right) side of screen" --#~ msgstr "Fenster zur rechten Seite des Bildschirms verschieben" -- --#~ msgid "Move window to west (left) side of screen" --#~ msgstr "Fenster zur linken Seite des Bildschirms verschieben" -- --#~ msgid "Move window to center of screen" --#~ msgstr "Fenster in die Mitte des Bildschirms verschieben" -- --#~ msgid "" --#~ "There was an error running %s:\n" --#~ "\n" --#~ "%s" --#~ msgstr "" --#~ "Beim Ausführen von %s ist ein Fehler aufgetreten:\n" --#~ "\n" --#~ "%s" -- --#~ msgid "No command %d has been defined.\n" --#~ msgstr "Es wurde kein Befehl %d festgelegt.\n" -- --#~ msgid "No terminal command has been defined.\n" --#~ msgstr "Es wurde kein Terminal-Befehl festgelegt.\n" -- --#~ msgid "GConf key '%s' is set to an invalid value\n" --#~ msgstr "Wert des GConf-Schlüssels »%s« unzulässig\n" -- --#~ msgid "%d stored in GConf key %s is out of range %d to %d\n" --#~ msgstr "" --#~ "%d, gespeichert in GConf-Schlüssel %s, liegt außerhalb des Bereichs %d-" --#~ "%d\n" -- --#~ msgid "GConf key \"%s\" is set to an invalid type\n" --#~ msgstr "Typ des GConf-Schlüssels »%s« ungültig\n" -- --#~ msgid "GConf key %s is already in use and can't be used to override %s\n" --#~ msgstr "" --#~ "Der GConf-Schlüssel %s wird bereits benutzt und kann nicht zum " --#~ "Überschreiben von %s verwendet werden\n" -- --#~ msgid "Can't override GConf key, %s not found\n" --#~ msgstr "" --#~ "GConf-Schlüssel kann nicht überschrieben werden, %s wurde nicht gefunden\n" -- --#~ msgid "Error setting number of workspaces to %d: %s\n" --#~ msgstr "Fehler beim Festlegen der Anzahl der Arbeitsflächen auf %d: %s\n" -- --#~ msgid "Error setting name for workspace %d to \"%s\": %s\n" --#~ msgstr "" --#~ "Fehler beim Festlegen des Namens der Arbeitsflächen %d auf »%s«: %s\n" -- --#~ msgid "Error setting live hidden windows status status: %s\n" --#~ msgstr "Fehler beim Festlegen des Status des verborgenen Fensters: %s\n" -- --#~ msgid "Error setting no tab popup status: %s\n" --#~ msgstr "Fehler beim Festlegen des Status des Einblendfensters: %s\n" -- --#~ msgid "Close Window" --#~ msgstr "Fenster schließen" -- --#~ msgid "Window Menu" --#~ msgstr "Fenstermenü" -- --#~ msgid "Minimize Window" --#~ msgstr "Fenster minimieren" -- --#~ msgid "Maximize Window" --#~ msgstr "Fenster maximieren" -- --#~ msgid "Restore Window" --#~ msgstr "Fenster wiederherstellen" -- --#~ msgid "Roll Up Window" --#~ msgstr "Fenster einrollen" -- --#~ msgid "Unroll Window" --#~ msgstr "Fenster abrollen" -- --#~ msgid "Keep Window On Top" --#~ msgstr "Fenster immer im Vordergrund" -- --#~ msgid "Always On Visible Workspace" --#~ msgstr "Immer auf der sichtbaren Arbeitsfläche" -- --#~ msgid "Put Window On Only One Workspace" --#~ msgstr "Soll das Fenster auf nur einer Arbeitsfläche sichtbar sein?" -diff -urN mutter-3.14.4/po/es.po mutter-3.14.4_localized/po/es.po ---- mutter-3.14.4/po/es.po 2015-03-23 22:19:32.000000000 +0530 -+++ mutter-3.14.4_localized/po/es.po 2016-06-25 07:51:12.473149324 +0530 -@@ -2,28 +2,26 @@ - # Spanish trasnlation for Metacity - # Copyright © 2001,2002,2003, 2006, 2007, 2008 Free Software Foundation, Inc. - # This file is distributed under the same license as the metacity package. --# -+# - # Héctor García Álvarez , 2001. - # Pablo Gonzalo del Campo ,2002,2003. - # Francisco Javier F. Serrador , 2004, 2005, 2006. - # Jorge González , 2007, 2008, 2009, 2010, 2011. - # Daniel Mustieles , 2011, 2012, 2013, 2014. --# - msgid "" - msgstr "" - "Project-Id-Version: mutter.master\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=mutter&keywords=I18N+L10N&component=general\n" --"POT-Creation-Date: 2014-08-19 09:51+0000\n" --"PO-Revision-Date: 2014-08-19 12:46+0200\n" --"Last-Translator: Daniel Mustieles \n" --"Language-Team: Español; Castellano \n" --"Language: \n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-04-19 09:49+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2014-08-18 10:46+0000\n" -+"Last-Translator: Daniel Mustieles \n" -+"Language-Team: Español; Castellano \n" -+"Language: es\n" - "Plural-Forms: nplurals=2; plural=(n != 1);\n" --"X-Generator: Gtranslator 2.91.6\n" -+"X-Generator: Zanata 3.8.2\n" - - #: ../data/50-mutter-navigation.xml.in.h:1 - msgid "Navigation" -@@ -86,7 +84,6 @@ - msgstr "Cambiar entre aplicaciones" - - #: ../data/50-mutter-navigation.xml.in.h:16 --#| msgid "Switch applications" - msgid "Switch to previous application" - msgstr "Cambiar a la aplicación anterior" - -@@ -95,7 +92,6 @@ - msgstr "Cambiar entre ventanas" - - #: ../data/50-mutter-navigation.xml.in.h:18 --#| msgid "Switch windows" - msgid "Switch to previous window" - msgstr "Cambiar a la ventana anterior" - -@@ -104,7 +100,6 @@ - msgstr "Cambiar entre ventanas de una aplicación" - - #: ../data/50-mutter-navigation.xml.in.h:20 --#| msgid "Switch windows of an application" - msgid "Switch to previous window of an application" - msgstr "Cambiar a la ventana anterior de una aplicación" - -@@ -113,7 +108,6 @@ - msgstr "Cambiar entre controles del sistema" - - #: ../data/50-mutter-navigation.xml.in.h:22 --#| msgid "Switch system controls" - msgid "Switch to previous system control" - msgstr "Cambiar al control del sistema anterior" - -@@ -130,7 +124,6 @@ - msgstr "Cambiar entre ventanas de una aplicación directamente" - - #: ../data/50-mutter-navigation.xml.in.h:26 --#| msgid "Switch windows of an application" - msgid "Switch directly to previous window of an app" - msgstr "Cambiar directamente a la ventana anterior de una aplicación" - -@@ -139,7 +132,6 @@ - msgstr "Cambiar entre controles del sistema directamente" - - #: ../data/50-mutter-navigation.xml.in.h:28 --#| msgid "Switch system controls" - msgid "Switch directly to previous system control" - msgstr "Cambiar directamente al control del sistema anterior" - -@@ -316,8 +308,8 @@ - #: ../data/org.gnome.mutter.gschema.xml.in.h:6 - 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." -+"vertically and resizes them horizontally to cover half of the available area." -+" Dropping windows on the top screen edge maximizes them completely." - msgstr "" - "Si está activada, arrastrar ventanas a los bordes verticales de la pantalla " - "las maximiza verticalmente y las redimensiona horizontalmente para cubrir la " -@@ -450,41 +442,37 @@ - msgid "Switch to VT 7" - msgstr "Cambiar al VT 7" - --#: ../src/backends/meta-monitor-manager.c:412 -+#: ../src/backends/meta-monitor-manager.c:375 - msgid "Built-in display" - msgstr "Pantalla integrada" - --#: ../src/backends/meta-monitor-manager.c:437 -+#: ../src/backends/meta-monitor-manager.c:400 - msgid "Unknown" - msgstr "Desconocida" - --#: ../src/backends/meta-monitor-manager.c:439 -+#: ../src/backends/meta-monitor-manager.c:402 - msgid "Unknown Display" - msgstr "Pantalla desconocida" - - #. TRANSLATORS: this is a monitor vendor name, followed by a - #. * size in inches, like 'Dell 15"' --#. --#: ../src/backends/meta-monitor-manager.c:447 -+#. -+#: ../src/backends/meta-monitor-manager.c:410 - #, c-format - msgid "%s %s" - msgstr "%s %s" - - #. 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:441 -+#: ../src/compositor/compositor.c:461 - #, c-format - msgid "" --"Another compositing manager is already running on screen %i on display \"%s" --"\"." -+"Another compositing manager is already running on screen %i on display " -+"\"%s\"." - msgstr "" - "Ya existe un gestor de composición ejecutándose en la monitor %i, pantalla " - "«%s»." - --#: ../src/compositor/meta-background.c:1044 --msgid "background texture could not be created from file" --msgstr "no se pudo crear la textura de fondo a partir de archivo" -- - #: ../src/core/bell.c:185 - msgid "Bell event" - msgstr "Evento de campana" -@@ -514,7 +502,7 @@ - msgid "_Force Quit" - msgstr "_Forzar la salida" - --#: ../src/core/display.c:547 -+#: ../src/core/display.c:550 - #, c-format - msgid "Failed to open X Window System display '%s'\n" - msgstr "Ocurrió un error al abrir la pantalla de X Window System «%s»\n" -@@ -551,12 +539,12 @@ - msgid "Run as a full display server, rather than nested" - msgstr "Ejecutar como servidor completo, en lugar de anidado" - --#: ../src/core/main.c:459 -+#: ../src/core/main.c:451 - #, c-format - msgid "Failed to scan themes directory: %s\n" - msgstr "Falló al inspeccionar la carpeta de temas: %s\n" - --#: ../src/core/main.c:475 -+#: ../src/core/main.c:467 - #, c-format - msgid "" - "Could not find a theme! Be sure %s exists and contains the usual themes.\n" -@@ -587,17 +575,17 @@ - msgid "Mutter plugin to use" - msgstr "Complemento de mutter que usar" - --#: ../src/core/prefs.c:2100 -+#: ../src/core/prefs.c:2064 - #, c-format - msgid "Workspace %d" - msgstr "Área de trabajo %d" - --#: ../src/core/screen.c:548 -+#: ../src/core/screen.c:537 - #, c-format - msgid "Screen %d on display '%s' is invalid\n" - msgstr "La ventana %d en la pantalla «%s» no es válida\n" - --#: ../src/core/screen.c:564 -+#: ../src/core/screen.c:553 - #, c-format - msgid "" - "Screen %d on display \"%s\" already has a window manager; try using the --" -@@ -606,7 +594,7 @@ - "La ventana %d en la pantalla «%s» ya tiene un gestor de ventanas, intente " - "usar la opción «--replace» para reemplazar el gestor de ventanas activo.\n" - --#: ../src/core/screen.c:657 -+#: ../src/core/screen.c:646 - #, c-format - msgid "Screen %d on display \"%s\" already has a window manager\n" - msgstr "La ventana %d en la pantalla «%s» ya tiene un gestor de ventanas\n" -@@ -617,7 +605,7 @@ - - #. Translators: This represents the size of a window. The first number is - #. * the width of the window and the second is the height. --#. -+#. - #: ../src/ui/resizepopup.c:134 - #, c-format - msgid "%d x %d" -@@ -690,8 +678,8 @@ - "Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not " - "fit the format" - msgstr "" --"El formato de «gtk:custom» es «gtk:custom(nombre_de_color," --"nombre_alternativo)», «%s» no respeta el formato" -+"El formato de «gtk:custom» es «gtk:" -+"custom(nombre_de_color,nombre_alternativo)», «%s» no respeta el formato" - - #: ../src/ui/theme.c:1286 - #, c-format -@@ -699,9 +687,8 @@ - "GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] " - "where NORMAL is the state; could not parse \"%s\"" - msgstr "" --"La especificación de color GTK debe tener el estado entre corchetes, " --"ejemplo. gtk:fg[NORMAL] donde NORMAL es el estado ; no se ha podido " --"interpretar «%s»" -+"La especificación de color GTK debe tener el estado entre corchetes, ejemplo." -+" gtk:fg[NORMAL] donde NORMAL es el estado ; no se ha podido interpretar «%s»" - - #: ../src/ui/theme.c:1300 - #, c-format -@@ -788,7 +775,8 @@ - #, c-format - msgid "Coordinate expression contains integer '%s' which could not be parsed" - msgstr "" --"La expresión de coordenadas contenía un entero «%s» que no pudo ser analizado" -+"La expresión de coordenadas contenía un entero «%s» que no pudo ser " -+"analizado" - - #: ../src/ui/theme.c:1940 - #, c-format -@@ -866,7 +854,8 @@ - - #: ../src/ui/theme.c:2588 - #, c-format --msgid "Coordinate expression had an open parenthesis with no close parenthesis" -+msgid "" -+"Coordinate expression had an open parenthesis with no close parenthesis" - msgstr "" - "La expresión de coordenadas tenía un paréntesis abierto sin un paréntesis " - "cerrado" -@@ -874,7 +863,8 @@ - #: ../src/ui/theme.c:2599 - #, c-format - msgid "Coordinate expression doesn't seem to have any operators or operands" --msgstr "La expresión de coordenadas no parece tener ni operadores ni operandos" -+msgstr "" -+"La expresión de coordenadas no parece tener ni operadores ni operandos" - - #: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852 - #, c-format -@@ -892,10 +882,8 @@ - - #: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995 - #, c-format --msgid "" --"Missing " --msgstr "" --"Falta " -+msgid "Missing " -+msgstr "Falta " - - #: ../src/ui/theme.c:5041 - #, c-format -@@ -919,8 +907,7 @@ - - #: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745 - #, c-format --msgid "" --"User-defined constants must begin with a capital letter; \"%s\" does not" -+msgid "User-defined constants must begin with a capital letter; \"%s\" does not" - msgstr "" - "Las constantes definidas por el usuario deben comenzar con una letra " - "mayúscula; «%s» no lo hace" -@@ -932,7 +919,7 @@ - - #. Translators: This means that an attribute which should have been found - #. * on an XML element was not in fact found. --#. -+#. - #: ../src/ui/theme-parser.c:234 - #, c-format - msgid "No \"%s\" attribute on element <%s>" -@@ -998,11 +985,11 @@ - #: ../src/ui/theme-parser.c:865 - #, c-format - msgid "" --"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium," --"large,x-large,xx-large)\n" -+"Invalid title scale \"%s\" (must be one of xx-small,x-" -+"small,small,medium,large,x-large,xx-large)\n" - msgstr "" --"Escala de título no válida «%s» (debe ser una de xx-small,x-small,small," --"medium,large,x-large,xx-large)\n" -+"Escala de título no válida «%s» (debe ser una de xx-small,x-" -+"small,small,medium,large,x-large,xx-large)\n" - - #: ../src/ui/theme-parser.c:1021 ../src/ui/theme-parser.c:1084 - #: ../src/ui/theme-parser.c:1118 ../src/ui/theme-parser.c:1221 -@@ -1329,2543 +1316,7 @@ - "Estas ventanas no soportan «guardar la configuración actual» y tendrán que " - "reiniciarse manualmente la próxima vez que inicie una sesión." - --#: ../src/x11/window-props.c:515 -+#: ../src/x11/window-props.c:558 - #, c-format - msgid "%s (on %s)" - msgstr "%s (on %s)" -- --#~ msgid "Mi_nimize" --#~ msgstr "Mi_nimizar" -- --#~ msgid "Ma_ximize" --#~ msgstr "Ma_ximizar" -- --#~ msgid "Unma_ximize" --#~ msgstr "Desma_ximizar" -- --#~ msgid "Roll _Up" --#~ msgstr "Enro_llar" -- --#~ msgid "_Unroll" --#~ msgstr "De_senrollar" -- --#~ msgid "_Move" --#~ msgstr "_Mover" -- --#~ msgid "_Resize" --#~ msgstr "_Redimensionar" -- --#~ msgid "Move Titlebar On_screen" --#~ msgstr "Mover la barra de título a la _pantalla" -- --#~ msgid "Always on _Top" --#~ msgstr "Siempre _encima" -- --#~ msgid "_Always on Visible Workspace" --#~ msgstr "Siempre en el área de trabajo _visible" -- --#~ msgid "_Only on This Workspace" --#~ msgstr "_Sólo en este área de trabajo" -- --#~ msgid "Move to Workspace _Left" --#~ msgstr "Mover al área de trabajo de la _izquierda" -- --#~ msgid "Move to Workspace R_ight" --#~ msgstr "Mover al área de trabajo de la _derecha" -- --#~ msgid "Move to Workspace _Up" --#~ msgstr "Mover al área de trabajo de _arriba" -- --#~ msgid "Move to Workspace _Down" --#~ msgstr "Mover al área de trabajo de a_bajo" -- --#~ msgid "_Close" --#~ msgstr "_Cerrar" -- --#~ msgid "Workspace %d%n" --#~ msgstr "Área de trabajo %d%n" -- --#~ msgid "Workspace 1_0" --#~ msgstr "Área de trabajo 1_0" -- --#~ msgid "Workspace %s%d" --#~ msgstr "Área de trabajo %s%d" -- --#~ msgid "Move to Another _Workspace" --#~ msgstr "Mover a _otro área de trabajo" -- --#~ msgid "Shift" --#~ msgstr "Mayús." -- --#~ msgid "Ctrl" --#~ msgstr "Ctrl" -- --#~ msgid "Alt" --#~ msgstr "Alt" -- --#~ msgid "Meta" --#~ msgstr "Meta" -- --#~ msgid "Super" --#~ msgstr "Super" -- --#~ msgid "Hyper" --#~ msgstr "Hiper" -- --#~ msgid "Mod2" --#~ msgstr "Mod2" -- --#~ msgid "Mod3" --#~ msgstr "Mod3" -- --#~ msgid "Mod4" --#~ msgstr "Mod4" -- --#~ msgid "Mod5" --#~ msgstr "Mod5" -- --#~ msgid "Mutter (wayland compositor)" --#~ msgstr "Mutter (compositor Wayland)" -- --#~ msgid "Unknown window information request: %d" --#~ msgstr "Petición de información de ventana desconocida: %d" -- --#~ msgid "Missing %s extension required for compositing" --#~ msgstr "Falta la extensión %s requerida para la composición" -- --#~ msgid "" --#~ "Some other program is already using the key %s with modifiers %x as a " --#~ "binding\n" --#~ msgstr "" --#~ "Algún otro programa ya está usando la clave %s con el modificador %x como " --#~ "una vinculación\n" -- --#~ msgid "\"%s\" is not a valid accelerator\n" --#~ msgstr "«%s» no es un acelerador válido\n" -- --#~ msgid "" --#~ "Workarounds for broken applications disabled. Some applications may not " --#~ "behave properly.\n" --#~ msgstr "" --#~ "Los arreglos para aplicaciones rotas se han deshabilitado. Algunas " --#~ "aplicaciones podrían no comportarse correctamente.\n" -- --#~ msgid "Could not parse font description \"%s\" from GSettings key %s\n" --#~ msgstr "" --#~ "No se pudo analizar la descripción de la tipografía «%s» de la clave " --#~ "GSettings %s\n" -- --#~ msgid "" --#~ "\"%s\" found in configuration database is not a valid value for mouse " --#~ "button modifier\n" --#~ msgstr "" --#~ "«%s» encontrado en la base de datos de configuración no es un valor " --#~ "válido para el modificador del botón del ratón\n" -- --#~ msgid "" --#~ "\"%s\" found in configuration database is not a valid value for " --#~ "keybinding \"%s\"\n" --#~ msgstr "" --#~ "«%s» encontrado en la base de datos de configuración no es un valor " --#~ "válido para la combinación de teclas «%s»\n" -- --#~ msgid "" --#~ "Could not acquire window manager selection on screen %d display \"%s\"\n" --#~ msgstr "" --#~ "No se ha podido obtener la selección del gestor de ventanas en la ventana " --#~ "%d en la pantalla «%s»\n" -- --#~ msgid "Could not release screen %d on display \"%s\"\n" --#~ msgstr "No se ha podido liberar el monitor %d en la pantalla «%s»\n" -- --#~ msgid "Could not create directory '%s': %s\n" --#~ msgstr "No se ha podido crear la carpeta «%s»: %s\n" -- --#~ msgid "Could not open session file '%s' for writing: %s\n" --#~ msgstr "" --#~ "No se ha podido abrir para escritura el archivo de sesión «%s»: %s\n" -- --#~ msgid "Error writing session file '%s': %s\n" --#~ msgstr "Ocurrió un error al escribir en el archivo de sesión «%s»: %s\n" -- --#~ msgid "Error closing session file '%s': %s\n" --#~ msgstr "Ocurrió un error al cerrar el archivo de sesión «%s»: %s\n" -- --#~ msgid "Failed to parse saved session file: %s\n" --#~ msgstr "Ocurrió un error al interpretar el archivo de sesión guardado: %s\n" -- --#~ msgid " attribute seen but we already have the session ID" --#~ msgstr "" --#~ "Se ha visto el atributo pero ya tenemos el ID de la " --#~ "sesión" -- --#~ msgid "Unknown attribute %s on <%s> element" --#~ msgstr "Atributo desconocido %s en el elemento <%s>" -- --#~ msgid "nested tag" --#~ msgstr "etiqueta anidada" -- --#~ msgid "Unknown element %s" --#~ msgstr "Elemento desconocido %s" -- --#~ msgid "Failed to open debug log: %s\n" --#~ msgstr "Ocurrió un error al abrir el registro de errores: %s\n" -- --#~ msgid "Failed to fdopen() log file %s: %s\n" --#~ msgstr "" --#~ "Ocurrió un error al hacer fdopen() en el archivo de registro %s: %s\n" -- --#~ msgid "Opened log file %s\n" --#~ msgstr "Archivo de registro %s abierto\n" -- --#~ msgid "Window manager: " --#~ msgstr "Administrador de ventanas: " -- --# Diferenciar de eRRor en el gestor de ventanas, más abajo --#~ msgid "Bug in window manager: " --#~ msgstr "Error en el gestor de ventanas: " -- --#~ msgid "Window manager warning: " --#~ msgstr "Advertencia del gestor de ventanas: " -- --#~ msgid "Window manager error: " --#~ msgstr "Error del gestor de ventanas: " -- --#~ msgid "" --#~ "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER " --#~ "window as specified in the ICCCM.\n" --#~ msgstr "" --#~ "La ventana %s ha establecido SM_CLIENT_ID sobre sí misma en vez de " --#~ "hacerlo en la ventana WM_CLIENT_LEADER como está especificado en el " --#~ "ICCCM.\n" -- --#~ msgid "" --#~ "Window %s sets an MWM hint indicating it isn't resizable, but sets min " --#~ "size %d x %d and max size %d x %d; this doesn't make much sense.\n" --#~ msgstr "" --#~ "La ventana %s ha establecido la propiedad MWM indicando que no es " --#~ "redimensionable, pero configuró el tamaño mínimo a %d x %d y el tamaño " --#~ "máximo a %d x %d ; esto no tiene mucho sentido.\n" -- --#~ msgid "Application set a bogus _NET_WM_PID %lu\n" --#~ msgstr "La aplicación establecio un _NET_WM_PID %lu erróneo\n" -- --#~ msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n" --#~ msgstr "" --#~ "WM_TRANSIENT_FOR no válido para la ventana 0x%lx especificada para %s.\n" -- --#~ msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n" --#~ msgstr "WM_TRANSIENT_FOR ventana 0x%lx para %s crearía un bucle.\n" -- --#~ msgid "" --#~ "Window 0x%lx has property %s\n" --#~ "that was expected to have type %s format %d\n" --#~ "and actually has type %s format %d n_items %d.\n" --#~ "This is most likely an application bug, not a window manager bug.\n" --#~ "The window has title=\"%s\" class=\"%s\" name=\"%s\"\n" --#~ msgstr "" --#~ "La ventana 0x%lx tiene la propiedad %s \n" --#~ "que se esperaba tuviese el tipo %s con el formato %d\n" --#~ "y actualmente tiene un tipo %s con el formato %d y n_items %d\n" --#~ "Esto no parece ser un error de la aplicación ni del gestor de ventanas.\n" --#~ "La ventana tiene título=«%s» la clase=«%s» y el nombre=«%s»\n" -- --#~ msgid "Property %s on window 0x%lx contained invalid UTF-8\n" --#~ msgstr "La propiedad %s en la ventana 0x%lx contiene UTF-8 no válido\n" -- --#~ msgid "" --#~ "Property %s on window 0x%lx contained invalid UTF-8 for item %d in the " --#~ "list\n" --#~ msgstr "" --#~ "La propiedad %s en la ventana 0x%lx contiene UTF-8 no válido para el " --#~ "elemento %d de la lista\n" -- --#~ msgid "Usage: %s\n" --#~ msgstr "Uso: %s\n" -- --#~ msgid "_Windows" --#~ msgstr "_Ventanas" -- --#~ msgid "_Dialog" --#~ msgstr "_Diálogo" -- --#~ msgid "_Modal dialog" --#~ msgstr "Diálogo _modal" -- --#~ msgid "_Utility" --#~ msgstr "_Utilidades" -- --#~ msgid "_Splashscreen" --#~ msgstr "_Pantalla de inicio" -- --#~ msgid "_Top dock" --#~ msgstr "Empotrable _superior" -- --#~ msgid "_Bottom dock" --#~ msgstr "Empotrable _inferior" -- --#~ msgid "_Left dock" --#~ msgstr "Empotrable i_zquierdo" -- --#~ msgid "_Right dock" --#~ msgstr "Empotrable de_recho" -- --#~ msgid "_All docks" --#~ msgstr "_Todos los empotrables" -- --#~ msgid "Des_ktop" --#~ msgstr "_Escritorio" -- --#~ msgid "Open another one of these windows" --#~ msgstr "Abrir otra de estas ventanas" -- --#~ msgid "This is a demo button with an 'open' icon" --#~ msgstr "Esto es un botón de demostración con un icono de apertura" -- --#~ msgid "This is a demo button with a 'quit' icon" --#~ msgstr "Esto es un botón de demostración con un icono de salida" -- --#~ msgid "This is a sample message in a sample dialog" --#~ msgstr "Esto es un mensaje de ejemplo en un diálogo de ejemplo" -- --#~ msgid "Fake menu item %d\n" --#~ msgstr "Elemento de menú de pega %d\n" -- --#~ msgid "Border-only window" --#~ msgstr "Ventana con sólo borde" -- --#~ msgid "Bar" --#~ msgstr "Barra" -- --#~ msgid "Normal Application Window" --#~ msgstr "Ventana de aplicación normal" -- --#~ msgid "Dialog Box" --#~ msgstr "Caja de diálogo" -- --#~ msgid "Modal Dialog Box" --#~ msgstr "Caja de diálogo modal" -- --#~ msgid "Utility Palette" --#~ msgstr "Paleta de utilidades" -- --#~ msgid "Torn-off Menu" --#~ msgstr "Menú apagado" -- --#~ msgid "Border" --#~ msgstr "Borde" -- --#~ msgid "Attached Modal Dialog" --#~ msgstr "Diálogo modal adjunto" -- --#~ msgid "Button layout test %d" --#~ msgstr "Test de distribución de botones %d" -- --#~ msgid "%g milliseconds to draw one window frame" --#~ msgstr "%g milisegundos para dibujar un marco de ventana" -- --#~ msgid "Usage: metacity-theme-viewer [THEMENAME]\n" --#~ msgstr "Uso: metacity-theme-viewer [NOMBRETEMA]\n" -- --#~ msgid "Error loading theme: %s\n" --#~ msgstr "Ocurrió un error al cargar el tema:«%s»\n" -- --#~ msgid "Loaded theme \"%s\" in %g seconds\n" --#~ msgstr "Se cargó el tema «%s» en %g segundos\n" -- --#~ msgid "Normal Title Font" --#~ msgstr "Tipografía de título normal" -- --#~ msgid "Small Title Font" --#~ msgstr "Tipografía de título pequeña" -- --#~ msgid "Large Title Font" --#~ msgstr "Tipografía de título grande" -- --#~ msgid "Button Layouts" --#~ msgstr "Distribución de botones" -- --#~ msgid "Benchmark" --#~ msgstr "Banco de pruebas" -- --#~ msgid "Window Title Goes Here" --#~ msgstr "El título de la ventana va aquí" -- --#~ msgid "" --#~ "Drew %d frames in %g client-side seconds (%g milliseconds per frame) and " --#~ "%g seconds wall clock time including X server resources (%g milliseconds " --#~ "per frame)\n" --#~ msgstr "" --#~ "Dibujó %d marcos en %g segundos del lado del cliente (%g milisegundos por " --#~ "marco) y %g segundos de tiempo estándar incluyendo recursos del servidor " --#~ "X (%g milisegundos por marco)\n" -- --#~ msgid "position expression test returned TRUE but set error" --#~ msgstr "" --#~ "prueba de expresión de la posición devolvió TRUE pero estableció un error" -- --#~ msgid "position expression test returned FALSE but didn't set error" --#~ msgstr "" --#~ "prueba de expresión de la posición devolvió FASE pero no estableció un " --#~ "error" -- --#~ msgid "Error was expected but none given" --#~ msgstr "Se esperaba un error, pero no se dio ninguno" -- --#~ msgid "Error %d was expected but %d given" --#~ msgstr "Se esperaba el error %d pero se dio el %d" -- --#~ msgid "Error not expected but one was returned: %s" --#~ msgstr "No se esperaba un error pero se devolvió uno: %s" -- --#~ msgid "x value was %d, %d was expected" --#~ msgstr "el valor x era %d, se esperaba %d" -- --#~ msgid "y value was %d, %d was expected" --#~ msgstr "el valor y era %d, se esperaba %d" -- --#~ msgid "" --#~ "%d coordinate expressions parsed in %g seconds (%g seconds average)\n" --#~ msgstr "" --#~ "%d expresiones de coordenadas interpretadas en %g segundos (%g segundos " --#~ "de media)\n" -- --#~ msgid "Minimize window" --#~ msgstr "Minimizar la ventana" -- --#~ msgid "Comma-separated list of compositor plugins" --#~ msgstr "Lista de complementos del compositor separados por comas" -- --#~ msgid "Live Hidden Windows" --#~ msgstr "Ventanas activas ocultas" -- --#~ msgid "" --#~ "Determines whether hidden windows (i.e., minimized windows and windows on " --#~ "other workspaces than the current one) should be kept alive." --#~ msgstr "" --#~ "Determina si las ventanas ocultas (e.g., ventanas minimizadas y ventanas " --#~ "en otros escritorios distintos del actual) deberían mantenerse activas." -- --#~ msgid "Close Window" --#~ msgstr "Cerrar la ventana" -- --#~ msgid "Window Menu" --#~ msgstr "Menú de la ventana" -- --#~ msgid "Minimize Window" --#~ msgstr "Minimizar la ventana" -- --#~ msgid "Maximize Window" --#~ msgstr "Maximizar la ventana" -- --#~ msgid "Restore Window" --#~ msgstr "Restablecer la ventana" -- --#~ msgid "Roll Up Window" --#~ msgstr "Enrollar ventana" -- --#~ msgid "Unroll Window" --#~ msgstr "Desenrollar ventana" -- --#~ msgid "Keep Window On Top" --#~ msgstr "Mantener la ventana encima" -- --#~ msgid "Remove Window From Top" --#~ msgstr "Quitar ventana de encima" -- --#~ msgid "Always On Visible Workspace" --#~ msgstr "Siempre en el área de trabajo visible" -- --#~ msgid "Put Window On Only One Workspace" --#~ msgstr "Poner la ventana sólo en un área de trabajo" -- --#~ msgid "Switch to workspace 8" --#~ msgstr "Cambiar al área de trabajo 8" -- --#~ msgid "Switch to workspace 9" --#~ msgstr "Cambiar al área de trabajo 9" -- --#~ msgid "Switch to workspace 10" --#~ msgstr "Cambiar al área de trabajo 10" -- --#~ msgid "Switch to workspace 11" --#~ msgstr "Cambiar al área de trabajo 11" -- --#~ msgid "Switch to workspace 12" --#~ msgstr "Cambiar al área de trabajo 12" -- --#~ msgid "Switch to workspace on the left of the current workspace" --#~ msgstr "" --#~ "Cambiar al área de trabajo a la izquierda del área de trabajo actual" -- --#~ msgid "Switch to workspace on the right of the current workspace" --#~ msgstr "Cambiar al área de trabajo a la derecha del área de trabajo actual" -- --#~ msgid "Switch to workspace above the current workspace" --#~ msgstr "Cambiar al área de trabajo encima del área de trabajo actual" -- --#~ msgid "Switch to workspace below the current workspace" --#~ msgstr "Cambiar al área de trabajo debajo del área de trabajo actual" -- --#~ msgid "Move between windows of an application, using a popup window" --#~ msgstr "" --#~ "Moverse entre las ventanas de una aplicación usando una ventana emergente" -- --#~ msgid "" --#~ "Move backward between windows of an application, using a popup window" --#~ msgstr "" --#~ "Retroceder entre las ventanas de una aplicación usando una ventana " --#~ "emergente" -- --#~ msgid "Move between windows, using a popup window" --#~ msgstr "Moverse entre las ventanas usando una ventana emergente" -- --#~ msgid "Move backward between windows, using a popup window" --#~ msgstr "Retroceder entre ventanas usando una ventana emegernte" -- --#~ msgid "Move between panels and the desktop, using a popup window" --#~ msgstr "" --#~ "Moverse entre los paneles y el escritorio usando una ventana emergente" -- --#~ msgid "Move backward between panels and the desktop, using a popup window" --#~ msgstr "" --#~ "Retroceder entre los paneles y escritorio usando una ventana emergente" -- --#~ msgid "Move between windows of an application immediately" --#~ msgstr "Moverse entre las ventanas de una aplicación inmediatamente" -- --#~ msgid "Move backward between windows of an application immediately" --#~ msgstr "Retroceder entre las ventanas de una aplicación inmediatamente" -- --#~ msgid "Move between windows immediately" --#~ msgstr "Moverse entre las ventanas inmediatamente" -- --#~ msgid "Move backward between windows immediately" --#~ msgstr "Retroceder entre las ventanas inmediatamente" -- --#~ msgid "Move between panels and the desktop immediately" --#~ msgstr "Moverse entre los paneles y el escritorio inmediatamente" -- --#~ msgid "Move backward between panels and the desktop immediately" --#~ msgstr "Retroceder entre los paneles y el escritorio inmediatamente" -- --#~ msgid "Hide all normal windows and set focus to the desktop" --#~ msgstr "Ocultar todas las ventanas normales y dar foco al escritorio" -- --#~ msgid "Show the panel's main menu" --#~ msgstr "Mostrar el menú principal del panel" -- --#~ msgid "Show the panel's \"Run Application\" dialog box" --#~ msgstr "Mostrar el cuadro de diálogo del panel «Ejecutar aplicación»" -- --#~ msgid "Start or stop recording the session" --#~ msgstr "Comenzar o detener grabación de la sesión" -- --#~ msgid "Take a screenshot" --#~ msgstr "Capturar la pantalla" -- --#~ msgid "Take a screenshot of a window" --#~ msgstr "Capturar una ventana" -- --#~ msgid "Run a terminal" --#~ msgstr "Ejecutar en un terminal" -- --#~ msgid "Toggle whether a window will always be visible over other windows" --#~ msgstr "Conmutar si una ventana siempre se verá encima de otras ventanas" -- --#~ msgid "Toggle whether window is on all workspaces or just one" --#~ msgstr "" --#~ "Conmutar si la ventana aparece en todas las áreas de trabajo o sólo en una" -- --#~ msgid "Move window to workspace 5" --#~ msgstr "Mover la ventana al área de trabajo 5" -- --#~ msgid "Move window to workspace 6" --#~ msgstr "Mover la ventana al área de trabajo 6" -- --#~ msgid "Move window to workspace 7" --#~ msgstr "Mover la ventana al área de trabajo 7" -- --#~ msgid "Move window to workspace 8" --#~ msgstr "Mover la ventana al área de trabajo 8" -- --#~ msgid "Move window to workspace 9" --#~ msgstr "Mover la ventana al área de trabajo 9" -- --#~ msgid "Move window to workspace 10" --#~ msgstr "Mover la ventana al área de trabajo 10" -- --#~ msgid "Move window to workspace 11" --#~ msgstr "Mover la ventana al área de trabajo 11" -- --#~ msgid "Move window to workspace 12" --#~ msgstr "Mover la ventana al área de trabajo 12" -- --#~ msgid "Raise window if it's covered by another window, otherwise lower it" --#~ msgstr "" --#~ "Levantar la ventana si está cubierta por otra ventana, minimizarla en " --#~ "otro caso" -- --#~ msgid "Move window to north-west (top left) corner" --#~ msgstr "Mover la ventana a la esquina noroeste (arriba a la izquierda)" -- --#~ msgid "Move window to north-east (top right) corner" --#~ msgstr "Mover la ventana a la esquina noreste (arriba a la derecha)" -- --#~ msgid "Move window to south-west (bottom left) corner" --#~ msgstr "Mover la ventana a la esquina sureste (abajo a la izquierda)" -- --#~ msgid "Move window to south-east (bottom right) corner" --#~ msgstr "Mover la ventana a la esquina suroeste (abajo a la derecha)" -- --#~ msgid "Move window to north (top) side of screen" --#~ msgstr "Mover la ventana al lado norte (arriba) de la pantalla" -- --#~ msgid "Move window to south (bottom) side of screen" --#~ msgstr "Mover la ventana al lado sur (abajo) de la pantalla" -- --#~ msgid "Move window to east (right) side of screen" --#~ msgstr "Mover la ventana al lado este (derecha) de la pantalla" -- --#~ msgid "Move window to west (left) side of screen" --#~ msgstr "Mover la ventana al lado oeste (izquierda) de la pantalla" -- --#~ msgid "Move window to center of screen" --#~ msgstr "Mover la ventana al centro de la pantalla" -- --#~ msgid "" --#~ "There was an error running %s:\n" --#~ "\n" --#~ "%s" --#~ msgstr "" --#~ "Hubo un error al ejecutar %s:\n" --#~ "\n" --#~ "%s" -- --#~ msgid "No command %d has been defined.\n" --#~ msgstr "No ha sido definido ningún comando %d.\n" -- --#~ msgid "No terminal command has been defined.\n" --#~ msgstr "No ha sido definido ningún comando de terminal.\n" -- --#~ msgid "GConf key '%s' is set to an invalid value\n" --#~ msgstr "La clave GConf «%s» está configurada con un valor inválido\n" -- --#~ msgid "%d stored in GConf key %s is out of range %d to %d\n" --#~ msgstr "" --#~ "%d almacenado en la clave de GConf %s está fuera de rango %d hasta %d\n" -- --#~ msgid "GConf key \"%s\" is set to an invalid type\n" --#~ msgstr "La clave GConf «%s» está configurada con un tipo inválido\n" -- --#~ msgid "GConf key %s is already in use and can't be used to override %s\n" --#~ msgstr "" --#~ "La clave de GConf %s ya está en uso y no se puede usar para sobrescribir " --#~ "%s\n" -- --#~ msgid "Can't override GConf key, %s not found\n" --#~ msgstr "No se puede sobrescribir la clave de GConf, no se encontró %s\n" -- --#~ msgid "Error setting number of workspaces to %d: %s\n" --#~ msgstr "" --#~ "Ocurrió un error configurando la número de espacios de trabajo para %d: " --#~ "%s\n" -- --#~ msgid "Error setting name for workspace %d to \"%s\": %s\n" --#~ msgstr "" --#~ "Ocurrió un error al establecer el nombre del área de trabajo %d como " --#~ "«%s»: %s \n" -- --#~ msgid "Error setting live hidden windows status status: %s\n" --#~ msgstr "Error al establecer el estado de vida de las ventanas ocultas: %s\n" -- --#~ msgid "Error setting no tab popup status: %s\n" --#~ msgstr "" --#~ "Error al establecer el estado de las pestañas en ventanas emergentes: %s\n" -- --#~ msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n" --#~ msgstr "Falló al obtener el color %s[%s] del tema de GTK+.\n" -- --#~ msgid "" --#~ "Don't make fullscreen windows that are maximized and have no decorations" --#~ msgstr "" --#~ "No poner a pantalla completa las ventanas maximizadas que no tienen " --#~ "decoración" -- --#~ msgid "Whether window popup/frame should be shown when cycling windows." --#~ msgstr "" --#~ "Indica si se debe mostrar el marco de la ventana al cambiar entre " --#~ "ventanas." -- --#~ msgid "Internal argument for GObject introspection" --#~ msgstr "Argumento interno para introspección de GObject" -- --#~ msgid "Failed to restart: %s\n" --#~ msgstr "No se pudo reiniciar: %s\n" -- --#~ msgid "Error setting clutter plugin list: %s\n" --#~ msgstr "Error al establecer la lista de complementos de «Clutter»: %s\n" -- --#~ msgid "Plugins to load for the Clutter-based compositing manager." --#~ msgstr "" --#~ "Complementos que cargar para la gestión de composición basada en " --#~ "«Clutter»." -- --#~ msgid "Turn compositing on" --#~ msgstr "Activar la composición" -- --#~ msgid "Turn compositing off" --#~ msgstr "Desactivar la composición" -- --#~ msgid "Error setting compositor status: %s\n" --#~ msgstr "Error al establecer el estado del compositor: %s\n" -- --#~ msgid "" --#~ "Lost connection to the display '%s';\n" --#~ "most likely the X server was shut down or you killed/destroyed\n" --#~ "the window manager.\n" --#~ msgstr "" --#~ "Se ha perdido la conexión con la pantalla «%s»; \n" --#~ "parece que el servidor X fue apagado o que usted ha matado o destruido el " --#~ "gestor de ventanas.\n" -- --#~ msgid "Fatal IO error %d (%s) on display '%s'.\n" --#~ msgstr "Error fatal de E/S %d (%s) en la pantalla «%s».\n" -- --#~ msgid "Failed to get hostname: %s\n" --#~ msgstr "Ocurrió un error al obtener el nombre del host: %s\n" -- --#~ msgid "/Windows/tearoff" --#~ msgstr "/Ventanas/tirador" -- --#~ msgid "/Windows/_Dialog" --#~ msgstr "/Ventanas/_Diálogo" -- --#~ msgid "/Windows/_Modal dialog" --#~ msgstr "/Ventanas/Diálogo _modal" -- --#~ msgid "/Windows/Des_ktop" --#~ msgstr "/Ventanas/_Escritorio" -- --#~ msgid "Theme file %s did not contain a root element" --#~ msgstr "El archivo de tema %s no contiene un elemento raíz " -- --#~ msgid "Failed to read saved session file %s: %s\n" --#~ msgstr "Ocurrió un error al leer el archivo de sesión guardado %s: %s\n" -- --#~ msgid " specified twice for this theme" --#~ msgstr " especificado dos veces para este tema" -- --#~ msgid " specified twice for this theme" --#~ msgstr " especificado dos veces para este tema" -- --#~ msgid " specified twice for this theme" --#~ msgstr " especificada dos veces para este tema" -- --#~ msgid " specified twice for this theme" --#~ msgstr " especificada dos veces para este tema" -- --#~ msgid "Window Management" --#~ msgstr "Administrador de ventanas" -- --#~ msgid "Failed to parse message \"%s\" from dialog process\n" --#~ msgstr "" --#~ "Ocurrió un error al interpretar el mensaje «%s» desde el proceso de " --#~ "diálogo\n" -- --#~ msgid "Error reading from dialog display process: %s\n" --#~ msgstr "" --#~ "Ocurrió un error leyendo desde el proceso de diálogo de pantalla: %s\n" -- --#~ msgid "" --#~ "Error launching metacity-dialog to ask about killing an application: %s\n" --#~ msgstr "" --#~ "Ocurrió un error al lanzar metacity-dialog para preguntar acerca de matar " --#~ "una aplicación: %s\n" -- --#~ msgid "" --#~ "The format looks like \"a\" or F1\".\n" --#~ "\n" --#~ "The parser is fairly liberal and allows lower or upper case, and also " --#~ "abbreviations such as \"\" and \"\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "El formato parece a «a» o «F1».\n" --#~ "\n" --#~ "El intérprete es bastante liberal y permite tanto mayúsculas como " --#~ "minúsculas además de abreviaturas como por ejemplo «» y «». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The format looks like \"a\" or F1\".\n" --#~ "\n" --#~ "The parser is fairly liberal and allows lower or upper case, and also " --#~ "abbreviations such as \"\" and \"\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action.\n" --#~ "\n" --#~ "This keybinding may be reversed by holding down the \"shift\" key; " --#~ "therefore, \"shift\" cannot be one of the keys it uses." --#~ msgstr "" --#~ "El formato se parece a «a» o «F1»\n" --#~ "\n" --#~ "El intérprete es bastante liberal y permite tanto mayúsculas como " --#~ "minúsculas además de abreviaturas como por ejemplo «» y «». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción.\n" --#~ "\n" --#~ "Esta combinación de teclas puede invertirse manteniendo pulsada la tecla " --#~ "«Mayús»; por ello «Mayús» no puede ser una de las teclas de la " --#~ "combinación." -- --#~ msgid "" --#~ "Error launching metacity-dialog to warn about apps that don't support " --#~ "session management: %s\n" --#~ msgstr "" --#~ "Ocurrió un error al lanzar metacity-dialog para advertir acerca de las " --#~ "aplicaciones que no soportan gestión de sesión: %s\n" -- --#~ msgid "Metacity" --#~ msgstr "Metacity" -- --#~ msgid "" --#~ "(Not implemented) Navigation works in terms of applications not windows" --#~ msgstr "" --#~ "(No implementado) La navegación funciona en términos de aplicaciones, no " --#~ "ventanas" -- --#~ msgid "" --#~ "A font description string describing a font for window titlebars. The " --#~ "size from the description will only be used if the titlebar_font_size " --#~ "option is set to 0. Also, this option is disabled if the " --#~ "titlebar_uses_desktop_font option is set to true." --#~ msgstr "" --#~ "Una cadena de descripción de tipografía describiendo una tipografía para " --#~ "los títulos de las ventanas. El tamaño de la descripción sólo se usará si " --#~ "la opción titlebar_font_size está establecida a 0. Además, esta opción " --#~ "también está deshabilitada si la opción titlebar_uses_desktop_font está " --#~ "puesta a «true» ." -- --#~ msgid "Action on title bar double-click" --#~ msgstr "Acción al pulsar dos veces en la barra de títulos" -- --#~ msgid "Action on title bar middle-click" --#~ msgstr "Acción al pulsar con el botón central en la barra de títulos" -- --#~ msgid "Action on title bar right-click" --#~ msgstr "Acción al pulsar con el botón derecho en la barra de títulos" -- --#~ msgid "Arrangement of buttons on the titlebar" --#~ msgstr "Distribución de botones en la barra de títulos" -- --#~ msgid "" --#~ "Arrangement of buttons on the titlebar. The value should be a string, " --#~ "such as \"menu:minimize,maximize,spacer,close\"; the colon separates the " --#~ "left corner of the window from the right corner, and the button names are " --#~ "comma-separated. Duplicate buttons are not allowed. Unknown button names " --#~ "are silently ignored so that buttons can be added in future metacity " --#~ "versions without breaking older versions. A special spacer tag can be " --#~ "used to insert some space between two adjacent buttons." --#~ msgstr "" --#~ "Distribución de botones en la barra de títulos. El valor debe ser una " --#~ "cadena, como \"menu:minimize,maximize,spacer,close\" ; los dos puntos " --#~ "separan la esquina izquierda de la ventana de la esquina derecha, y los " --#~ "nombres de los botones están separados por comas. No se permiten botones " --#~ "duplicados. Los nombres desconocidos de botones se ignoran ignorados sin " --#~ "avisar de este modo esos botones puedan añadirse en las versiones futuras " --#~ "de metacity sin problemas con las versiones más antiguas. Se puede usar " --#~ "una etiqueta espaciadora para insertar algunos espacios entre dos botones " --#~ "adyacentes." -- --#~ msgid "Automatically raises the focused window" --#~ msgstr "Elevar automáticamente la ventana que tiene el foco" -- --#~ 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 \"<Alt>\" " --#~ "or \"<Super>\" for example." --#~ msgstr "" --#~ "Al pulsar sobre una ventana manteniendo presionada esta tecla " --#~ "modificadora se moverá la ventana (botón izquierdo), se redimensionará la " --#~ "ventana (botón del medio) o se mostrará el menú de la ventana (botón " --#~ "derecho). Las operaciones izquierda y derecha se pueden intercambiar " --#~ "usando la tecla modificadora \"mouse_button_resize\". El modificador se " --#~ "expresa por ejemplo como «<Alt>» o «<Super>»." -- --#~ msgid "Commands to run in response to keybindings" --#~ msgstr "Comandos a ejecutar en respuesta a combinaciones de teclas" -- --#~ msgid "Compositing Manager" --#~ msgstr "Gestor de composición" -- --#~ msgid "Control how new windows get focus" --#~ msgstr "Controla cómo obtienen el foco las ventanas nuevas" -- --#~ msgid "Current theme" --#~ msgstr "Tema actual" -- --#~ msgid "Delay in milliseconds for the auto raise option" --#~ msgstr "Retardo en milisegundos para la opción auto-elevar" -- --#~ msgid "Determines whether Metacity is a compositing manager." --#~ msgstr "Determina si Metacity es un gestor de composición." -- --#~ msgid "" --#~ "Determines whether applications or the system can generate audible " --#~ "'beeps'; may be used in conjunction with 'visual bell' to allow silent " --#~ "'beeps'." --#~ msgstr "" --#~ "Determina si las aplicaciones o el sistema pueden generar «bips» " --#~ "audibles; podría usarse en conjunto con «la campana visual» para permitir " --#~ "«bips» silenciosos." -- --#~ msgid "Disable misfeatures that are required by old or broken applications" --#~ msgstr "" --#~ "Deshabilitar características antiguas que son requeridas por aplicaciones " --#~ "antiguas o rotas" -- --#~ msgid "Enable Visual Bell" --#~ msgstr "Activar la campana visual" -- --#~ msgid "" --#~ "If true, ignore the titlebar_font option, and use the standard " --#~ "application font for window titles." --#~ msgstr "" --#~ "Si es verdadero ignora la opción titlebar_font y usa la tipografía " --#~ "estándar de la aplicación para los títulos de las ventanas." -- --#~ msgid "" --#~ "If true, metacity will give the user less feedback by using wireframes, " --#~ "avoiding animations, or other means. This is a significant reduction in " --#~ "usability for many users, but may allow legacy applications to continue " --#~ "working, and may also be a useful tradeoff for terminal servers. However, " --#~ "the wireframe feature is disabled when accessibility is on." --#~ msgstr "" --#~ "Si es «true», metacity dará al usuario menos información y menos " --#~ "sensación de «manipulación directa», usando marcos de alambre, evitando " --#~ "animaciones, u otros medios. Esto es una reducción significante en " --#~ "usabilidad para muchos usuarios, pero puede permitir funcionar a las " --#~ "aplicaciones heredadas y servidores de terminal cuando de otra forma " --#~ "sería impracticable. Sin embargo, la característica de marcos de alambre " --#~ "se desactiva cuando la accesibilidad está activada." -- --#~ msgid "" --#~ "If true, then Metacity works in terms of applications rather than " --#~ "windows. The concept is a bit abstract, but in general an application-" --#~ "based setup is more like the Mac and less like Windows. When you focus a " --#~ "window in application-based mode, all the windows in the application will " --#~ "be raised. Also, in application-based mode, focus clicks are not passed " --#~ "through to windows in other applications. Application-based mode is, " --#~ "however, largely unimplemented at the moment." --#~ msgstr "" --#~ "Si es «true», entonces Metacity funciona en términos de aplicaciones en " --#~ "vez de ventanas. El concepto es un poco abstracto, pero en general una " --#~ "configuración basada en aplicaciones es más parecida a un Mac y menos a " --#~ "un Windows. Cuando enfoca a una ventana en el modo basado en aplicación " --#~ "todas las ventanas en la aplicación se elevan. También en el modo basado " --#~ "en aplicación las pulsaciones del foco no se pasan a través de las " --#~ "ventanas en otras aplicaciones. El modo basado en aplicaciones está, sin " --#~ "embargo, no implementado en gran parte en este momento." -- --#~ msgid "If true, trade off usability for less resource usage" --#~ msgstr "Si es «true», reducir usabilidad para menos uso de recursos" -- --#~ msgid "Name of workspace" --#~ msgstr "Nombre del área de trabajo" -- --#~ msgid "Number of workspaces" --#~ msgstr "Número de áreas de trabajo" -- --#~ msgid "" --#~ "Number of workspaces. Must be more than zero, and has a fixed maximum to " --#~ "prevent making the desktop unusable by accidentally asking for too many " --#~ "workspaces." --#~ msgstr "" --#~ "Número de áreas de trabajo. Debe ser mayor que cero, y tiene un máximo " --#~ "fijo para prevenir la inutilización del escritorio al pedir " --#~ "accidentalmente demasiadas áreas de trabajo." -- --#~ msgid "Run a defined command" --#~ msgstr "Ejecuta un comando definido" -- --#~ msgid "" --#~ "Set this to true to resize with the right button and show a menu with the " --#~ "middle button while holding down the key given in \"mouse_button_modifier" --#~ "\"; set it to false to make it work the opposite way around." --#~ msgstr "" --#~ "Establezca esto a «verdadero» para redimensionar con el botón derecho y " --#~ "mostrar un menú con el botón del medio mientras se mantiene pulsada la " --#~ "tecla dada en \"mouse_button_modifier\"; establézcalo a «falso» para " --#~ "hacer que se comporte de forma contraria." -- --#~ msgid "" --#~ "Setting this option to false can lead to buggy behavior, so users are " --#~ "strongly discouraged from changing it from the default of true. Many " --#~ "actions (e.g. clicking in the client area, moving or resizing the window) " --#~ "normally raise the window as a side-effect. Setting this option to false, " --#~ "which is strongly discouraged, will decouple raising from other user " --#~ "actions, and ignore raise requests generated by applications. See http://" --#~ "bugzilla.gnome.org/show_bug.cgi?id=445447#c6. Even when this option is " --#~ "false, windows can still be raised by an alt-left-click anywhere on the " --#~ "window, a normal click on the window decorations, or by special messages " --#~ "from pagers, such as activation requests from tasklist applets. This " --#~ "option is currently disabled in click-to-focus mode. Note that the list " --#~ "of ways to raise windows when raise_on_click is false does not include " --#~ "programmatic requests from applications to raise windows; such requests " --#~ "will be ignored regardless of the reason for the request. If you are an " --#~ "application developer and have a user complaining that your application " --#~ "does not work with this setting disabled, tell them it is _their_ fault " --#~ "for breaking their window manager and that they need to change this " --#~ "option back to true or live with the \"bug\" they requested." --#~ msgstr "" --#~ "Ajustar esta opción a «false» puede llevar a un comportamiento erróneo, " --#~ "de tal forma que se recomienda encarecidamente a los usuarios que no la " --#~ "cambien del valor «true». Muchas acciones (ej. pulsar en el área del " --#~ "cliente, mover o redimensionar la ventana) generalmente levantan la " --#~ "ventana como efecto colateral. Ajustar este valor a «false», algo que se " --#~ "desaconseja, desacoplará el levantado de las otras acciones del usuario e " --#~ "ignorará las peticiones de levantar que generen las aplicaciones. " --#~ "Consulte http://bugzilla.gnome.org/show_bug.cgi?id=445447#c6. Incluso " --#~ "cuando esta opción es «false», las ventanas aún se pueden levantar " --#~ "pulsando con el botón izquierdo del ratón sobre cualquier parte de la " --#~ "ventana, una pulsación normal en la decoración de la ventana, o por " --#~ "mensajes especiales de alguna aplicación, tal como las peticiones de " --#~ "activación de las miniaplicaciones de listas de tareas. Actualmente esta " --#~ "opción está desactivada en el modo pulsar para dar el foco. Note que la " --#~ "lista de formas de levantar ventanas cuando raise_on_click está a «false» " --#~ "no incluye peticiones programadas de las aplicaciones para levantar las " --#~ "ventanas; tales peticiones se ignoran independientemente de la razón de " --#~ "la petición. Si es un desarrollador de aplicaciones y tiene un usuario " --#~ "quejándose de que su aplicación no funciona con este ajuste desactivado, " --#~ "dígale que es _su_ problema (de él) por romper el gestor de ventanas y " --#~ "que deben cambiar la opción a «true» o vivir con el error que han " --#~ "solicitado." -- --#~ msgid "" --#~ "Some applications disregard specifications in ways that result in window " --#~ "manager misfeatures. This option puts Metacity in a rigorously correct " --#~ "mode, which gives a more consistent user interface, provided one does not " --#~ "need to run any misbehaving applications." --#~ msgstr "" --#~ "Algunas aplicaciones no hacen caso de las especificaciones en formas que " --#~ "resultan en comportamiento incorrecto del gestor de ventanas. Esta opción " --#~ "pone a Metacity en un modo rigurosamente correcto, lo que da un interfaz " --#~ "de usuario más consistente, supuesto que uno no necesita ejecutar ninguna " --#~ "aplicación que se comporte mal." -- --#~ msgid "System Bell is Audible" --#~ msgstr "La campana del sistema es audible" -- --#~ msgid "" --#~ "Tells Metacity how to implement the visual indication that the system " --#~ "bell or another application 'bell' indicator has been rung. Currently " --#~ "there are two valid values, \"fullscreen\", which causes a fullscreen " --#~ "white-black flash, and \"frame_flash\" which causes the titlebar of the " --#~ "application which sent the bell signal to flash. If the application which " --#~ "sent the bell is unknown (as is usually the case for the default \"system " --#~ "beep\"), the currently focused window's titlebar is flashed." --#~ msgstr "" --#~ "Le dice a Metacity cómo implementar la indicación visual de que ha sonado " --#~ "la campana del sistema o la campana de indicación de otra aplicación. " --#~ "Actualmente hay dos valores válidos, «fullscreen», que causa un parpadeo " --#~ "en blanco y negro en toda la pantalla y «frame_flash» que causa que la " --#~ "barra de títulos de la ventana de la aplicación que ha enviado la señal " --#~ "de campana parpadee. Si la aplicación que ha enviado la campana es " --#~ "desconocida (como es usualmente el caso para el «bip del sistema» " --#~ "predeterminado), la barra de títulos de la ventana actual que tenga el " --#~ "foco parpadeará." -- --#~ msgid "" --#~ "The /apps/metacity/global_keybindings/run_command_N keys define " --#~ "keybindings that correspond to these commands. Pressing the keybinding " --#~ "for run_command_N will execute command_N." --#~ msgstr "" --#~ "Las claves /apps/metacity/global_keybindings/run_command_N definen las " --#~ "combinaciones de teclas que corresponden a esos comandos. Al presionar la " --#~ "combinación de teclas para «run_command_N» se ejecutará el «command_N»." -- --#~ msgid "" --#~ "The /apps/metacity/global_keybindings/run_command_screenshot key defines " --#~ "a keybinding which causes the command specified by this setting to be " --#~ "invoked." --#~ msgstr "" --#~ "La clave /apps/metacity/global_keybindings/run_command_screenshot define " --#~ "una combinación de teclas que hace que el comando especificado por esta " --#~ "configuración se invoque." -- --#~ msgid "" --#~ "The /apps/metacity/global_keybindings/run_command_window_screenshot key " --#~ "defines a keybinding which causes the command specified by this setting " --#~ "to be invoked." --#~ msgstr "" --#~ "La clave /apps/metacity/global_keybindings/run_command_window_screenshot " --#~ "define una combinación de teclas que hace que el comando especificado por " --#~ "esta configuración se invoque." -- --#~ msgid "" --#~ "The keybinding that runs the correspondingly-numbered command in /apps/" --#~ "metacity/keybinding_commands The format looks like \"<Control>a\" " --#~ "or \"<Shift><Alt>F1\". The parser is fairly liberal and " --#~ "allows lower or upper case, and also abbreviations such as \"<Ctl>" --#~ "\" and \"<Ctrl>\". If you set the option to the special string " --#~ "\"disabled\", then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas que ejecuta el comando numerado correspondiente " --#~ "en /apps/metacity/keybinding_commands. El formato se ve como «<" --#~ "Control>a» o «<Mayús><Alt>F1». El intérprete es bastante " --#~ "liberal y permite tanto mayúsculas como minúsculas además de abreviaturas " --#~ "como por ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción " --#~ "con la cadena especial «disabled» entonces no habrá combinación de teclas " --#~ "para esa acción." -- --#~ msgid "The name of a workspace." --#~ msgstr "El nombre de un área de trabajo." -- --#~ msgid "The screenshot command" --#~ msgstr "El comando de captura de pantalla" -- --#~ msgid "" --#~ "The theme determines the appearance of window borders, titlebar, and so " --#~ "forth." --#~ msgstr "" --#~ "El tema determina la apariencia de los bordes de la ventana, el título y " --#~ "demás." -- --#~ msgid "" --#~ "The time delay before raising a window if auto_raise is set to true. The " --#~ "delay is given in thousandths of a second." --#~ msgstr "" --#~ "El retardo antes de desplegar una ventana si «auto_rise» está configurado " --#~ "como verdadero. El retardo está especificado en milésimas de segundo." -- --#~ msgid "" --#~ "The window focus mode indicates how windows are activated. It has three " --#~ "possible values; \"click\" means windows must be clicked in order to " --#~ "focus them, \"sloppy\" means windows are focused when the mouse enters " --#~ "the window, and \"mouse\" means windows are focused when the mouse enters " --#~ "the window and unfocused when the mouse leaves the window." --#~ msgstr "" --#~ "El modo de foco de la ventana indica cómo son activadas las ventanas. " --#~ "Tiene tres valores posibles; «click» significa que la ventana debe " --#~ "seleccionarse para obtener el foco, «sloppy» significa que ventanas " --#~ "obtienen el foco cuando el ratón entra en la ventana y «mouse» significa " --#~ "que la ventanas obtienen el foco cuando el ratón entra en la ventana y lo " --#~ "pierden cuando el ratón sale de la ventana." -- --#~ msgid "The window screenshot command" --#~ msgstr "El comando de captura de una ventana" -- --#~ msgid "" --#~ "This option determines the effects of double-clicking on the title bar. " --#~ "Current valid options are 'toggle_shade', which will shade/unshade the " --#~ "window, 'toggle_maximize' which will maximize/unmaximize the window, " --#~ "'toggle_maximize_horizontally' and 'toggle_maximize_vertically' which " --#~ "will maximize/unmaximize the window in that direction only, 'minimize' " --#~ "which will minimize the window, 'shade' which will roll the window up, " --#~ "'menu' which will display the window menu, 'lower' which will put the " --#~ "window behind all the others, and 'none' which will not do anything." --#~ msgstr "" --#~ "Esta opción determina los efectos de la pulsación doble en la barra de " --#~ "títulos. Las opciones válidas actualmente son «toggle_shade», que enrolla/" --#~ "desenrolla la ventana, «toggle_maximized» que maximiza/desmaximiza la " --#~ "ventana, «toggle_maximize_horizontally» y «toggle_maximize_vertically» " --#~ "que maximiza/desmaximiza la ventana sólo en esa dirección, «minimize» que " --#~ "minimiza la ventana, «shade» que enrolla la ventana hacia arriba, «menu» " --#~ "que muestra la ventana de menú, «lower» que pone la ventana detrás de " --#~ "todas las demás y «none» que no hará nada." -- --#~ msgid "" --#~ "This option determines the effects of middle-clicking on the title bar. " --#~ "Current valid options are 'toggle_shade', which will shade/unshade the " --#~ "window, 'toggle_maximize' which will maximize/unmaximize the window, " --#~ "'toggle_maximize_horizontally' and 'toggle_maximize_vertically' which " --#~ "will maximize/unmaximize the window in that direction only, 'minimize' " --#~ "which will minimize the window, 'shade' which will roll the window up, " --#~ "'menu' which will display the window menu, 'lower' which will put the " --#~ "window behind all the others, and 'none' which will not do anything." --#~ msgstr "" --#~ "Esta opción determina los efectos de la pulsación con el botón central en " --#~ "la barra de títulos. Las opciones válidas actualmente son «toggle_shade», " --#~ "que enrolla/desenrolla la ventana, «toggle_maximized» que maximiza/" --#~ "desmaximiza la ventana, «toggle_maximize_horizontally» y " --#~ "«toggle_maximize_vertically» que maximiza/desmaximiza la ventana sólo en " --#~ "esa dirección, «minimize» que minimiza la ventana, «shade» que enrolla la " --#~ "ventana hacia arriba, «menu» que muestra la ventana de menú, «lower» que " --#~ "pone la ventana detrás de todas las demás y «none» que no hará nada." -- --#~ msgid "" --#~ "This option determines the effects of right-clicking on the title bar. " --#~ "Current valid options are 'toggle_shade', which will shade/unshade the " --#~ "window, 'toggle_maximize' which will maximize/unmaximize the window, " --#~ "'toggle_maximize_horizontally' and 'toggle_maximize_vertically' which " --#~ "will maximize/unmaximize the window in that direction only, 'minimize' " --#~ "which will minimize the window, 'shade' which will roll the window up, " --#~ "'menu' which will display the window menu, 'lower' which will put the " --#~ "window behind all the others, and 'none' which will not do anything." --#~ msgstr "" --#~ "Esta opción determina los efectos de la pulsación con el botón derecho en " --#~ "la barra de títulos. Las opciones válidas actualmente son «toggle_shade», " --#~ "que enrolla/desenrolla la ventana, «toggle_maximized» que maximiza/" --#~ "desmaximiza la ventana, «toggle_maximize_horizontally» y " --#~ "«toggle_maximize_vertically» que maximiza/desmaximiza la ventana sólo en " --#~ "esa dirección, «minimize» que minimiza la ventana, «shade» que enrolla la " --#~ "ventana hacia arriba, «menu» que muestra la ventana de menú, «lower» que " --#~ "pone la ventana detrás de todas las demás y «none» que no hará nada." -- --#~ msgid "" --#~ "This option provides additional control over how newly created windows " --#~ "get focus. It has two possible values; \"smart\" applies the user's " --#~ "normal focus mode, and \"strict\" results in windows started from a " --#~ "terminal not being given focus." --#~ msgstr "" --#~ "Esta opción proporciona control adicional sobre cómo las ventanas " --#~ "recientemente creadas obtienen foco. Tiene dos valores posibles: «smart» " --#~ "aplica el modo de foco normal del usuario, y «strict» hace que las " --#~ "ventanas iniciadas desde un terminal no se les dé el foco." -- --#~ msgid "" --#~ "Turns on a visual indication when an application or the system issues a " --#~ "'bell' or 'beep'; useful for the hard-of-hearing and for use in noisy " --#~ "environments." --#~ msgstr "" --#~ "Activa una indicación visual cuando una aplicación o el sistema emite una " --#~ "«campanada» o un «bip» ; es muy útil para los ambientes ruidosos y para " --#~ "las personas con dificultades auditivas." -- --#~ msgid "Use standard system font in window titles" --#~ msgstr "Usar tipografía estándar del sistema en los títulos de la ventana" -- --#~ msgid "Visual Bell Type" --#~ msgstr "Tipo de campana visual" -- --#~ msgid "Whether raising should be a side-effect of other user interactions" --#~ msgstr "" --#~ "Indica si elevar debe ser un efecto lateral de otras interacciones del " --#~ "usuario" -- --#~ msgid "Whether to resize with the right button" --#~ msgstr "Indica si se debe redimensionar con el botón derecho" -- --#~ msgid "Window focus mode" --#~ msgstr "Modo de foco de la ventana" -- --#~ msgid "Window title font" --#~ msgstr "Tipografía del título de la ventana" -- --#~ msgid "Title" --#~ msgstr "Título" -- --#~ msgid "Class" --#~ msgstr "Clase" -- --#~ msgid "" --#~ "There was an error running \"%s\":\n" --#~ "%s." --#~ msgstr "" --#~ "Ha ocurrido un error ejecutando «%s»:\n" --#~ "%s." -- --#~ msgid "Unmaximize window" --#~ msgstr "Desmaximizar la ventana" -- --#~ msgid "Unmaximize Window" --#~ msgstr "Desmaximizar la ventana" -- --#~ msgid "" --#~ "Many actions (e.g. clicking in the client area, moving or resizing the " --#~ "window) normally raise the window as a side-effect. Setting this option " --#~ "to false, which is strongly discouraged, will decouple raising from other " --#~ "user actions, and ignore raise requests generated by applications. See " --#~ "http://bugzilla.gnome.org/show_bug.cgi?id=445447#c6." --#~ msgstr "" --#~ "Muchas acciones (p.ej. pulsar en el área del cliente, mover o " --#~ "redimensionar la ventana) normalmente elevan la ventana como un efecto " --#~ "lateral. Al establecer esta opción como «false», lo que no se recomienda, " --#~ "desligará la acción de elevar la ventana de otras acciones del usuario e " --#~ "ignorará las peticiones de elevación generadas por las aplicaciones. " --#~ "Consulte http://bugzilla.gnome.org/show_bug.cgi?id=445447#6." -- --#~ msgid "" --#~ "Error launching metacity-dialog to print an error about a command: %s\n" --#~ msgstr "" --#~ "Ocurrió un error al lanzar metacity-dialog para imprimir un error acerca " --#~ "de un comando: %s\n" -- --#~ msgid "Unknown attribute %s on element" --#~ msgstr "Atributo desconocido %s en el elemento " -- --#~ msgid "Unknown attribute %s on element" --#~ msgstr "Atributo desconocido %s en el elemento " -- --#~ msgid "Unknown attribute %s on element" --#~ msgstr "Atributo desconocido %s en el elemento " -- --#~ msgid "" --#~ "The keybinding that switches to the workspace above the current " --#~ "workspace. The format looks like \"<Control>a\" or \"<Shift>" --#~ "<Alt>F1\". The parser is fairly liberal and allows lower or upper " --#~ "case, and also abbreviations such as \"<Ctl>\" and \"<Ctrl>" --#~ "\". If you set the option to the special string \"disabled\", then there " --#~ "will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo por encima de la " --#~ "actual. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to the workspace below the current " --#~ "workspace. The format looks like \"<Control>a\" or \"<Shift>" --#~ "<Alt>F1\". The parser is fairly liberal and allows lower or upper " --#~ "case, and also abbreviations such as \"<Ctl>\" and \"<Ctrl>" --#~ "\". If you set the option to the special string \"disabled\", then there " --#~ "will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo por debajo de la " --#~ "actual. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to the workspace on the left of the current " --#~ "workspace. The format looks like \"<Control>a\" or \"<Shift>" --#~ "<Alt>F1\". The parser is fairly liberal and allows lower or upper " --#~ "case, and also abbreviations such as \"<Ctl>\" and \"<Ctrl>" --#~ "\". If you set the option to the special string \"disabled\", then there " --#~ "will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo hacia la izquierda " --#~ "de la actual. El formato se ve como «<Control>a» o «<Mayús>" --#~ "<Alt>F1». El intérprete es bastante liberal y permite tanto " --#~ "mayúsculas como minúsculas además de abreviaturas como por ejemplo «<" --#~ "Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "The keybinding that switches to the workspace on the right of the current " --#~ "workspace. The format looks like \"<Control>a\" or \"<Shift>" --#~ "<Alt>F1\". The parser is fairly liberal and allows lower or upper " --#~ "case, and also abbreviations such as \"<Ctl>\" and \"<Ctrl>" --#~ "\". If you set the option to the special string \"disabled\", then there " --#~ "will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo hacia la derecha " --#~ "de la actual. El formato se ve como «<Control>a» o «<Mayús>" --#~ "<Alt>F1». El intérprete es bastante liberal y permite tanto " --#~ "mayúsculas como minúsculas además de abreviaturas como por ejemplo «<" --#~ "Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 1. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 1. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 10. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 10. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 11. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 11. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 12. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 12. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 2. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 2. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 3. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 3. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 4. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 4. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 5. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 5. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 6. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 6. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 7. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 7. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 8. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 8. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding that switches to workspace 9. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que cambia al área de trabajo 9. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to activate the window menu. The format looks like " --#~ "\"<Control>a\" or \"<Shift><Alt>F1\". The parser is " --#~ "fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usado para activar el menú de la ventana. El " --#~ "formato se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "intérprete es bastante liberal y permite tanto mayúsculas como " --#~ "minúsculas además de abreviaturas como por ejemplo «<Ctl>» y «<" --#~ "Ctrl>». Si configura esta opción con la cadena especial «disabled» " --#~ "entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to enter \"move mode\" and begin moving a window " --#~ "using the keyboard. The format looks like \"<Control>a\" or \"<" --#~ "Shift><Alt>F1\". The parser is fairly liberal and allows lower " --#~ "or upper case, and also abbreviations such as \"<Ctl>\" and \"<" --#~ "Ctrl>\". If you set the option to the special string \"disabled\", " --#~ "then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para activar el «modo mover» y poder mover " --#~ "una ventana utilizando el teclado. El formato se ve como «<Control>" --#~ "a» o «<Mayús><Alt>F1». El intérprete es bastante liberal y " --#~ "permite tanto mayúsculas como minúsculas además de abreviaturas como por " --#~ "ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción con la " --#~ "cadena especial «disabled» entonces no habrá combinación de teclas para " --#~ "esta acción." -- --#~ msgid "" --#~ "The keybinding used to enter \"resize mode\" and begin resizing a window " --#~ "using the keyboard. The format looks like \"<Control>a\" or \"<" --#~ "Shift><Alt>F1\". The parser is fairly liberal and allows lower " --#~ "or upper case, and also abbreviations such as \"<Ctl>\" and \"<" --#~ "Ctrl>\". If you set the option to the special string \"disabled\", " --#~ "then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para activar el «modo redimensionar» y " --#~ "poder redimensionar una ventana utilizando el teclado. El formato se ve " --#~ "como «<Control>a» o «<Mayús><Alt>F1». El analizador es " --#~ "bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to hide all normal windows and set the focus to the " --#~ "desktop background. The format looks like \"<Control>a\" or \"<" --#~ "Shift><Alt>F1\". The parser is fairly liberal and allows lower " --#~ "or upper case, and also abbreviations such as \"<Ctl>\" and \"<" --#~ "Ctrl>\". If you set the option to the special string \"disabled\", " --#~ "then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para ocultar todas las ventanas y darle el " --#~ "foco al fondo del escritorio. El formato se ve como «<Control>a» o " --#~ "«<Mayús><Alt>F1». El intérprete es bastante liberal y permite " --#~ "tanto mayúsculas como minúsculas además de abreviaturas como por ejemplo " --#~ "«<Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "The keybinding used to maximize a window. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas usada para maximizar una ventana. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El analizador " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to minimize a window. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas usada para minimizar una ventana. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El analizador " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window one workspace down. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana un área de trabajo " --#~ "hacia abajo. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window one workspace to the left. The " --#~ "format looks like \"<Control>a\" or \"<Shift><Alt>F1\". " --#~ "The parser is fairly liberal and allows lower or upper case, and also " --#~ "abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If you set " --#~ "the option to the special string \"disabled\", then there will be no " --#~ "keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana un área de trabajo " --#~ "hacia la izquierda. El formato se ve como «<Control>a» o «<" --#~ "Mayús><Alt>F1». El intérprete es bastante liberal y permite " --#~ "tanto mayúsculas como minúsculas además de abreviaturas como por ejemplo " --#~ "«<Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "The keybinding used to move a window one workspace to the right. The " --#~ "format looks like \"<Control>a\" or \"<Shift><Alt>F1\". " --#~ "The parser is fairly liberal and allows lower or upper case, and also " --#~ "abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If you set " --#~ "the option to the special string \"disabled\", then there will be no " --#~ "keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana un área de trabajo " --#~ "hacia la derecha. El formato se ve como «<Control>a» o «<" --#~ "Mayús><Alt>F1». El intérprete es bastante liberal y permite " --#~ "tanto mayúsculas como minúsculas además de abreviaturas como por ejemplo " --#~ "«<Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "The keybinding used to move a window one workspace up. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana un área de trabajo " --#~ "hacia arriba. El formato se ve como «<Control>a» o «<Mayús>" --#~ "<Alt>F1». El intérprete es bastante liberal y permite tanto " --#~ "mayúsculas como minúsculas además de abreviaturas como por ejemplo «<" --#~ "Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 1. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 1. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 10. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 10. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 11. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 11. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 12. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 12. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "»<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 2. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 2. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "»<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 3. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 3. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 4. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 4. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 5. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 5. El formato se ve como «<Control>a» o »<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "»<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 6. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 6. El formato se ve como «<Control>a» o »<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "»<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 7. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 7. El formato se ve como «<Control>a» o »<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "»<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 8. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 8. El formato se ve como «<Control>a» o »<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "»<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move a window to workspace 9. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover una ventana hacia el espacio de " --#~ "trabajo 9. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "»<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move focus backwards between panels and the " --#~ "desktop, using a popup window. The format looks like \"<Control>a\" " --#~ "or \"<Shift><Alt>F1\". The parser is fairly liberal and " --#~ "allows lower or upper case, and also abbreviations such as \"<Ctl>" --#~ "\" and \"<Ctrl>\". If you set the option to the special string " --#~ "\"disabled\", then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre los paneles y el " --#~ "escritorio usando una ventana emergente. El formato se ve como »<" --#~ "Control>a» o «<Mayús><Alt>F1». El analizador es bastante " --#~ "liberal y permite tanto mayúsculas como minúsculas además de abreviaturas " --#~ "como por ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción " --#~ "con la cadena especial «disabled» entonces no habrá combinación de teclas " --#~ "para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move focus backwards between panels and the " --#~ "desktop, without a popup window. The format looks like \"<Control>a" --#~ "\" or \"<Shift><Alt>F1\". The parser is fairly liberal and " --#~ "allows lower or upper case, and also abbreviations such as \"<Ctl>" --#~ "\" and \"<Ctrl>\". If you set the option to the special string " --#~ "\"disabled\", then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre los paneles y el " --#~ "escritorio, sin una ventana emergente. El formato se ve como «<" --#~ "Control>a» o «<Mayús><Alt>F1». El intérprete es bastante " --#~ "liberal y permite tanto mayúsculas como minúsculas además de abreviaturas " --#~ "como por ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción " --#~ "con la cadena especial «disabled» entonces no habrá combinación de teclas " --#~ "para esa acción." -- --#~ msgid "" --#~ "The keybinding used to move focus backwards between windows of an " --#~ "application without a popup window. Holding \"shift\" together with this " --#~ "binding makes the direction go forward again. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas usada para retroceder el foco entre las ventanas " --#~ "de una aplicación sin una ventana emergente. Manteniendo pulsada la tecla " --#~ "«Mayús.» junto con esta combinación hace que la dirección vaya hacia " --#~ "adelante de nuevo. El formato se ve como «<Control>a» o «<" --#~ "Mayús><Alt>F1». El analizador es bastante liberal y permite " --#~ "tanto mayúsculas como minúsculas además de abreviaturas como por ejemplo " --#~ "«<Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "The keybinding used to move focus backwards between windows of an " --#~ "application, using a popup window. Holding \"shift\" together with this " --#~ "binding makes the direction go forward again. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas usada para retroceder el foco entre las ventanas " --#~ "de una aplicación, usando una ventana emergente. Manteniendo pulsada la " --#~ "tecla «Mayús.» junto con esta combinación hace que la dirección vaya " --#~ "hacia adelante de nuevo. El formato se ve como «<Control>a» o «<" --#~ "Mayús><Alt>F1». El intérprete es bastante liberal y permite " --#~ "tanto mayúsculas como minúsculas además de abreviaturas como por ejemplo " --#~ "«<Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "The keybinding used to move focus backwards between windows without a " --#~ "popup window. Holding \"shift\" together with this binding makes the " --#~ "direction go forward again. The format looks like \"<Control>a\" or " --#~ "\"<Shift><Alt>F1\". The parser is fairly liberal and allows " --#~ "lower or upper case, and also abbreviations such as \"<Ctl>\" and " --#~ "\"<Ctrl>\". If you set the option to the special string \"disabled" --#~ "\", then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre ventanas sin una " --#~ "ventana emergente. Manteniendo pulsada la tecla «Mayús.» junto con esta " --#~ "combinación hace que la dirección vaya hacia adelante de nuevo. El " --#~ "formato se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "analizador es bastante liberal y permite tanto mayúsculas como minúsculas " --#~ "además de abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». " --#~ "Si configura esta opción con la cadena especial «disabled» entonces no " --#~ "habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move focus backwards between windows, using a " --#~ "popup window. Holding \"shift\" together with this binding makes the " --#~ "direction go forward again. The format looks like \"<Control>a\" or " --#~ "\"<Shift><Alt>F1\". The parser is fairly liberal and allows " --#~ "lower or upper case, and also abbreviations such as \"<Ctl>\" and " --#~ "\"<Ctrl>\". If you set the option to the special string \"disabled" --#~ "\", then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre ventanas, usando " --#~ "una ventana emergente. Manteniendo pulsada la tecla «Mayús.» junto con " --#~ "esta combinación hace que la dirección vaya hacia adelante de nuevo. El " --#~ "formato se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "intérprete es bastante liberal y permite tanto mayúsculas como " --#~ "minúsculas además de abreviaturas como por ejemplo «<Ctl>» y «<" --#~ "Ctrl>». Si configura esta opción con la cadena especial «disabled» " --#~ "entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move focus between panels and the desktop, using a " --#~ "popup window. The format looks like \"<Control>a\" or \"<" --#~ "Shift><Alt>F1\". The parser is fairly liberal and allows lower " --#~ "or upper case, and also abbreviations such as \"<Ctl>\" and \"<" --#~ "Ctrl>\". If you set the option to the special string \"disabled\", " --#~ "then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre los paneles y el " --#~ "escritorio usando una ventana emergente El formato se ve como «<" --#~ "Control>a» o «<Mayús><Alt>F1». El analizador es bastante " --#~ "liberal y permite tanto mayúsculas como minúsculas además de abreviaturas " --#~ "como por ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción " --#~ "con la cadena especial «disabled» entonces no habrá combinación de teclas " --#~ "para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move focus between panels and the desktop, without " --#~ "a popup window. The format looks like \"<Control>a\" or \"<" --#~ "Shift><Alt>F1\". The parser is fairly liberal and allows lower " --#~ "or upper case, and also abbreviations such as \"<Ctl>\" and \"<" --#~ "Ctrl>\". If you set the option to the special string \"disabled\", " --#~ "then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre los paneles y el " --#~ "escritorio, sin una ventana emergente. El formato se ve como «<" --#~ "Control>a» o «<Mayús><Alt>F1». El intérprete es bastante " --#~ "liberal y permite tanto mayúsculas como minúsculas además de abreviaturas " --#~ "como por ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción " --#~ "con la cadena especial «disabled» entonces no habrá combinación de teclas " --#~ "para esa acción." -- --#~ msgid "" --#~ "The keybinding used to move focus between windows of an application " --#~ "without a popup window. Holding the \"shift\" key while using this " --#~ "binding reverses the direction of movement. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre las ventanas de " --#~ "una aplicación sin una ventana emergente. Manteniendo pulsada la tecla " --#~ "«Mayús.» mientras se usa esta combinación invierte la dirección del " --#~ "movimiento. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El analizador es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move focus between windows of an application, " --#~ "using a popup window. (Traditionally <Alt>F6) Holding the \"shift\" " --#~ "key while using this binding reverses the direction of movement. The " --#~ "format looks like \"<Control>a\" or \"<Shift><Alt>F1\". " --#~ "The parser is fairly liberal and allows lower or upper case, and also " --#~ "abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If you set " --#~ "the option to the special string \"disabled\", then there will be no " --#~ "keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre las ventanas de " --#~ "una aplicación, usando una ventana emergente. (Tradicionalmente <" --#~ "Alt>F6). El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to move focus between windows without a popup window. " --#~ "(Traditionally <Alt>Escape) Holding the \"shift\" key while using " --#~ "this binding reverses the direction of movement. The format looks like " --#~ "\"<Control>a\" or \"<Shift><Alt>F1\". The parser is " --#~ "fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre ventanas sin una " --#~ "ventana emergente. (Tradicionalmente <Alt>Escape). Manteniendo " --#~ "pulsada la tecla «Mayús.» mientras se usa esta combinación invierte la " --#~ "dirección del movimiento. El formato se ve como «<Control>a» o «<" --#~ "Mayús><Alt>F1». El analizador es bastante liberal y permite " --#~ "tanto mayúsculas como minúsculas además de abreviaturas como por ejemplo " --#~ "«<Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "The keybinding used to move focus between windows, using a popup window. " --#~ "(Traditionally <Alt>Tab) Holding the \"shift\" key while using this " --#~ "binding reverses the direction of movement. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas usada para mover el foco entre ventanas, usando " --#~ "una ventana emergente. (Tradicionalmente <Alt>Tab). El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to toggle always on top. A window that is always on " --#~ "top will always be visible over other overlapping windows. The format " --#~ "looks like \"<Control>a\" or \"<Shift><Alt>F1\". The " --#~ "parser is fairly liberal and allows lower or upper case, and also " --#~ "abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If you set " --#~ "the option to the special string \"disabled\", then there will be no " --#~ "keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para activar siempre encima. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El analizador " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to toggle fullscreen mode. The format looks like " --#~ "\"<Control>a\" or \"<Shift><Alt>F1\". The parser is " --#~ "fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para activar el modo de pantalla completa. " --#~ "El formato se ve como «<Control>a» o «<Mayús><Alt>F1». " --#~ "El analizador es bastante liberal y permite tanto mayúsculas como " --#~ "minúsculas además de abreviaturas como por ejemplo «<Ctl>» y «<" --#~ "Ctrl>». Si configura esta opción con la cadena especial «disabled» " --#~ "entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to toggle maximization. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas usada para maximizar la ventana. El formato se " --#~ "ve como «<Control>a» o «<Mayús><Alt>F1». El intérprete " --#~ "es bastante liberal y permite tanto mayúsculas como minúsculas además de " --#~ "abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». Si " --#~ "configura esta opción con la cadena especial «disabled» entonces no habrá " --#~ "combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to toggle shaded/unshaded state. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas usada para enrollar o desenrollar la ventana. El " --#~ "formato se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "intérprete es bastante liberal y permite tanto mayúsculas como minúsculas " --#~ "además de abreviaturas como por ejemplo «<Ctl>» y »<Ctrl>». " --#~ "Si configura esta opción con la cadena especial «disabled» entonces no " --#~ "habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding used to toggle whether the window is on all workspaces or " --#~ "just one. The format looks like \"<Control>a\" or \"<Shift>" --#~ "<Alt>F1\". The parser is fairly liberal and allows lower or upper " --#~ "case, and also abbreviations such as \"<Ctl>\" and \"<Ctrl>" --#~ "\". If you set the option to the special string \"disabled\", then there " --#~ "will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas usada para activar una ventana en todos los " --#~ "espacios de trabajo o sólo en uno. El formato se ve como «<Control>" --#~ "a» o «<Mayús><Alt>F1». El intérprete es bastante liberal y " --#~ "permite tanto mayúsculas como minúsculas además de abreviaturas como por " --#~ "ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción con la " --#~ "cadena especial «disabled» entonces no habrá combinación de teclas para " --#~ "esta acción." -- --#~ msgid "" --#~ "The keybinding used to unmaximize a window. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas usada para desmaximizar una ventana. El formato " --#~ "se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "intérprete es bastante liberal y permite tanto mayúsculas como " --#~ "minúsculas además de abreviaturas como por ejemplo «<Ctl>» y «<" --#~ "Ctrl>». Si configura esta opción con la cadena especial «disabled» " --#~ "entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding which display's the panel's \"Run Application\" dialog " --#~ "box. The format looks like \"<Control>a\" or \"<Shift><" --#~ "Alt>F1\". The parser is fairly liberal and allows lower or upper case, " --#~ "and also abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If " --#~ "you set the option to the special string \"disabled\", then there will be " --#~ "no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas que muestra el diálogo del panel «Ejecutar " --#~ "aplicación». El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding which invokes a terminal. The format looks like \"<" --#~ "Control>a\" or \"<Shift><Alt>F1\". The parser is fairly " --#~ "liberal and allows lower or upper case, and also abbreviations such as " --#~ "\"<Ctl>\" and \"<Ctrl>\". If you set the option to the " --#~ "special string \"disabled\", then there will be no keybinding for this " --#~ "action." --#~ msgstr "" --#~ "La combinación de teclas que muestra el menú principal del panel. El " --#~ "formato se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "intérprete es bastante liberal y permite tanto mayúsculas como " --#~ "minúsculas además de abreviaturas como por ejemplo «<Ctl>» y «<" --#~ "Ctrl>». Si configura esta opción con la cadena especial «disabled» " --#~ "entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding which invokes the panel's screenshot utility to take a " --#~ "screenshot of a window. The format looks like \"<Control>a\" or " --#~ "\"<Shift><Alt>F1\". The parser is fairly liberal and allows " --#~ "lower or upper case, and also abbreviations such as \"<Ctl>\" and " --#~ "\"<Ctrl>\". If you set the option to the special string \"disabled" --#~ "\", then there will be no keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas que invoca la utilidad del panel de captura de " --#~ "pantalla para obtener una captura de pantalla de una ventana. El formato " --#~ "se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "intérprete es bastante liberal y permite tanto mayúsculas como " --#~ "minúsculas además de abreviaturas como por ejemplo «<Ctl>» y «<" --#~ "Ctrl>». Si configura esta opción con la cadena especial «disabled» " --#~ "entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding which invokes the panel's screenshot utility. The format " --#~ "looks like \"<Control>a\" or \"<Shift><Alt>F1\". The " --#~ "parser is fairly liberal and allows lower or upper case, and also " --#~ "abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If you set " --#~ "the option to the special string \"disabled\", then there will be no " --#~ "keybinding for this action." --#~ msgstr "" --#~ "La combinación de teclas que invoca a la utilidad de captura de pantalla " --#~ "del panel. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "The keybinding which shows the panel's main menu. The format looks like " --#~ "\"<Control>a\" or \"<Shift><Alt>F1\". The parser is " --#~ "fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "La combinación de teclas que muestra el menú principal del panel. El " --#~ "formato se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "intérprete es bastante liberal y permite tanto mayúsculas como " --#~ "minúsculas además de abreviaturas como por ejemplo «<Ctl>» y «<" --#~ "Ctrl>». Si configura esta opción con la cadena especial «disabled» " --#~ "entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "This keybinding changes whether a window is above or below other windows. " --#~ "If the window is covered by another one, it raises the window above all " --#~ "others, and if the window is already fully visible, it lowers it below " --#~ "all others. The format looks like \"<Control>a\" or \"<Shift>" --#~ "<Alt>F1\". The parser is fairly liberal and allows lower or upper " --#~ "case, and also abbreviations such as \"<Ctl>\" and \"<Ctrl>" --#~ "\". If you set the option to the special string \"disabled\", then there " --#~ "will be no keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas cambia dependiendo de si una ventana está " --#~ "encima o debajo de otras ventanas. Si la ventana está tapada por otra, " --#~ "levanta la ventana por encima de todas ellas y si la ventana ya está " --#~ "completamente visible, coloca la ventana debajo de todas las otras " --#~ "ventanas. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El intérprete es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "»<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "This keybinding lowers a window below other windows. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "Esta combinación de teclas coloca una ventana detrás de otras. El formato " --#~ "se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "analizador es bastante liberal y permite tanto mayúsculas como minúsculas " --#~ "además de abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». " --#~ "Si configura esta opción con la cadena especial «disabled» entonces no " --#~ "habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "This keybinding moves a window against the north (top) side of the " --#~ "screen. The format looks like \"<Control>a\" or \"<Shift><" --#~ "Alt>F1\". The parser is fairly liberal and allows lower or upper case, " --#~ "and also abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If " --#~ "you set the option to the special string \"disabled\", then there will be " --#~ "no keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas coloca una ventana al norte (arriba) de la " --#~ "pantalla. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El analizador es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "This keybinding moves a window into the east (right) side of the screen. " --#~ "The format looks like \"<Control>a\" or \"<Shift><Alt>" --#~ "F1\". The parser is fairly liberal and allows lower or upper case, and " --#~ "also abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If you " --#~ "set the option to the special string \"disabled\", then there will be no " --#~ "keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas coloca una ventana al este (derecha) de la " --#~ "pantalla. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El analizador es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "This keybinding moves a window into the north-east (top right) corner of " --#~ "the screen. The format looks like \"<Control>a\" or \"<Shift>" --#~ "<Alt>F1\". The parser is fairly liberal and allows lower or upper " --#~ "case, and also abbreviations such as \"<Ctl>\" and \"<Ctrl>" --#~ "\". If you set the option to the special string \"disabled\", then there " --#~ "will be no keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas mueve una ventana a la esquina noroeste " --#~ "(arriba a la derecha) de la pantalla. El formato se ve como «<" --#~ "Control>a» o «<Mayús><Alt>F1». El analizador es bastante " --#~ "liberal y permite tanto mayúsculas como minúsculas además de abreviaturas " --#~ "como por ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción " --#~ "con la cadena especial «disabled» entonces no habrá combinación de teclas " --#~ "para esta acción." -- --#~ msgid "" --#~ "This keybinding moves a window into the north-west (top left) corner of " --#~ "the screen. The format looks like \"<Control>a\" or \"<Shift>" --#~ "<Alt>F1\". The parser is fairly liberal and allows lower or upper " --#~ "case, and also abbreviations such as \"<Ctl>\" and \"<Ctrl>" --#~ "\". If you set the option to the special string \"disabled\", then there " --#~ "will be no keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas mueve una ventana a la esquina noroeste " --#~ "(arriba a la izquierda) de la pantalla. El formato se ve como «<" --#~ "Control>a» o «<Mayús><Alt>F1». El analizador es bastante " --#~ "liberal y permite tanto mayúsculas como minúsculas además de abreviaturas " --#~ "como por ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción " --#~ "con la cadena especial «disabled» entonces no habrá combinación de teclas " --#~ "para esta acción." -- --#~ msgid "" --#~ "This keybinding moves a window into the south (bottom) side of the " --#~ "screen. The format looks like \"<Control>a\" or \"<Shift><" --#~ "Alt>F1\". The parser is fairly liberal and allows lower or upper case, " --#~ "and also abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If " --#~ "you set the option to the special string \"disabled\", then there will be " --#~ "no keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas mueve una ventana al sur (abajo) de la " --#~ "pantalla. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El analizador es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "This keybinding moves a window into the south-east (bottom right) corner " --#~ "of the screen. The format looks like \"<Control>a\" or \"<" --#~ "Shift><Alt>F1\". The parser is fairly liberal and allows lower " --#~ "or upper case, and also abbreviations such as \"<Ctl>\" and \"<" --#~ "Ctrl>\". If you set the option to the special string \"disabled\", " --#~ "then there will be no keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas mueve una ventana a la esquina sureste (abajo " --#~ "a la derecha) de la pantalla. El formato se ve como «<Control>a» o " --#~ "«<Mayús><Alt>F1». El analizador es bastante liberal y permite " --#~ "tanto mayúsculas como minúsculas además de abreviaturas como por ejemplo " --#~ "«<Ctl>» y «<Ctrl>». Si configura esta opción con la cadena " --#~ "especial «disabled» entonces no habrá combinación de teclas para esta " --#~ "acción." -- --#~ msgid "" --#~ "This keybinding moves a window into the south-west (bottom left) corner " --#~ "of the screen. The format looks like \"<Control>a\" or \"<" --#~ "Shift><Alt>F1\". The parser is fairly liberal and allows lower " --#~ "or upper case, and also abbreviations such as \"<Ctl>\" and \"<" --#~ "Ctrl>\". If you set the option to the special string \"disabled\", " --#~ "then there will be no keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas mueve una ventana a la esquina suroeste (abajo " --#~ "a la izquierda) de la pantalla. El formato se ve como «<Control>a» " --#~ "o «<Mayús><Alt>F1». El analizador es bastante liberal y " --#~ "permite tanto mayúsculas como minúsculas además de abreviaturas como por " --#~ "ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción con la " --#~ "cadena especial «disabled» entonces no habrá combinación de teclas para " --#~ "esta acción." -- --#~ msgid "" --#~ "This keybinding moves a window into the west (left) side of the screen. " --#~ "The format looks like \"<Control>a\" or \"<Shift><Alt>" --#~ "F1\". The parser is fairly liberal and allows lower or upper case, and " --#~ "also abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If you " --#~ "set the option to the special string \"disabled\", then there will be no " --#~ "keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas mueve una ventana al lado oeste (izquierdo) de " --#~ "la pantalla. El formato se ve como «<Control>a» o «<Mayús><" --#~ "Alt>F1». El analizador es bastante liberal y permite tanto mayúsculas " --#~ "como minúsculas además de abreviaturas como por ejemplo «<Ctl>» y " --#~ "«<Ctrl>». Si configura esta opción con la cadena especial " --#~ "«disabled» entonces no habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "This keybinding raises the window above other windows. The format looks " --#~ "like \"<Control>a\" or \"<Shift><Alt>F1\". The parser " --#~ "is fairly liberal and allows lower or upper case, and also abbreviations " --#~ "such as \"<Ctl>\" and \"<Ctrl>\". If you set the option to " --#~ "the special string \"disabled\", then there will be no keybinding for " --#~ "this action." --#~ msgstr "" --#~ "Esta combinación de teclas eleva una ventana por encima de otras. El " --#~ "formato se ve como «<Control>a» o «<Mayús><Alt>F1». El " --#~ "analizador es bastante liberal y permite tanto mayúsculas como minúsculas " --#~ "además de abreviaturas como por ejemplo «<Ctl>» y «<Ctrl>». " --#~ "Si configura esta opción con la cadena especial «disabled» entonces no " --#~ "habrá combinación de teclas para esta acción." -- --#~ msgid "" --#~ "This keybinding resizes a window to fill available horizontal space. The " --#~ "format looks like \"<Control>a\" or \"<Shift><Alt>F1\". " --#~ "The parser is fairly liberal and allows lower or upper case, and also " --#~ "abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If you set " --#~ "the option to the special string \"disabled\", then there will be no " --#~ "keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas redimensiona una ventana para que rellene todo " --#~ "el espacio horizontal disponible. El formato se ve como «<Control>" --#~ "a» o «<Mayús><Alt>F1». El intérprete es bastante liberal y " --#~ "permite tanto mayúsculas como minúsculas además de abreviaturas como por " --#~ "ejemplo «<Ctl>» y «<Ctrl>». Si configura esta opción con la " --#~ "cadena especial «disabled» entonces no habrá combinación de teclas para " --#~ "esta acción." -- --#~ msgid "" --#~ "This keybinding resizes a window to fill available vertical space. The " --#~ "format looks like \"<Control>a\" or \"<Shift><Alt>F1\". " --#~ "The parser is fairly liberal and allows lower or upper case, and also " --#~ "abbreviations such as \"<Ctl>\" and \"<Ctrl>\". If you set " --#~ "the option to the special string \"disabled\", then there will be no " --#~ "keybinding for this action." --#~ msgstr "" --#~ "Esta combinación de teclas redimensiona una ventana para que rellene todo " --#~ "el espacio vertical disponible. El formato se ve como «<Control>a» " --#~ "o »<Mayús><Alt>F1». El intérprete es bastante liberal y " --#~ "permite tanto mayúsculas como minúsculas además de abreviaturas como por " --#~ "ejemplo »<Ctl>» y «<Ctrl>». Si configura esta opción con la " --#~ "cadena especial «disabled» entonces no habrá combinación de teclas para " --#~ "esta acción." -- --#~ msgid "Toggle always on top state" --#~ msgstr "Cambiar el estado de siempre encima" -- --#~ msgid "No \"%s\" attribute on <%s> element" --#~ msgstr "No hay atributo «%s» en el elemento <%s>" -- --#~ msgid "Theme already has a fallback icon" --#~ msgstr "El tema ya tiene un icono a prueba de fallos" -- --#~ msgid "Theme already has a fallback mini_icon" --#~ msgstr "El tema ya tiene un mini_icono a prueba de fallos" -- --#~ msgid "No \"name\" attribute on element <%s>" --#~ msgstr "No hay atributo \"name\" en el elemento <%s>" -- --#~ msgid "No \"value\" attribute on element <%s>" --#~ msgstr "No hay atributo \"value\" en el elemento <%s>" -- --#~ msgid "No \"top\" attribute on element <%s>" --#~ msgstr "No hay atributo \"top\" en el elemento <%s>" -- --#~ msgid "No \"bottom\" attribute on element <%s>" --#~ msgstr "No hay atributo \"bottom\" en el elemento <%s>" -- --#~ msgid "No \"left\" attribute on element <%s>" --#~ msgstr "No hay atributo \"left\" en el elemento <%s>" -- --#~ msgid "No \"right\" attribute on element <%s>" --#~ msgstr "No hay atributo \"right\" en el elemento <%s>" -- --#~ msgid "No \"color\" attribute on element <%s>" --#~ msgstr "No hay atributo «color» en el elemento <%s>" -- --#~ msgid "No \"x1\" attribute on element <%s>" --#~ msgstr "No hay atributo «x1» en el elemento <%s>" -- --#~ msgid "No \"y1\" attribute on element <%s>" --#~ msgstr "No hay atributo «y1» en el elemento <%s>" -- --#~ msgid "No \"x2\" attribute on element <%s>" --#~ msgstr "No hay atributo «x2» en el elemento <%s>" -- --#~ msgid "No \"y2\" attribute on element <%s>" --#~ msgstr "No hay atributo «y2» en el elemento <%s>" -- --#~ msgid "No \"y\" attribute on element <%s>" --#~ msgstr "No hay atributo «y» en el elemento <%s>" -- --#~ msgid "No \"width\" attribute on element <%s>" --#~ msgstr "No hay atributo «width» en el elemento <%s>" -- --#~ msgid "No \"height\" attribute on element <%s>" --#~ msgstr "No hay atributo «height» en el elemento <%s>" -- --#~ msgid "No \"start_angle\" attribute on element <%s>" --#~ msgstr "No hay atributo «start_angle» en el elemento <%s>" -- --#~ msgid "No \"extent_angle\" attribute on element <%s>" --#~ msgstr "No hay atributo «extent_angle» en el elemento <%s>" -- --#~ msgid "No \"alpha\" attribute on element <%s>" --#~ msgstr "No hay atributo «alfa» en el elemento <%s>" -- --#~ msgid "No \"type\" attribute on element <%s>" --#~ msgstr "No hay atributo «type» en el elemento <%s>" -- --#~ msgid "No \"filename\" attribute on element <%s>" --#~ msgstr "No hay atributo «filename» en el elemento <%s>" -- --#~ msgid "No \"state\" attribute on element <%s>" --#~ msgstr "No hay atributo «state» en el elemento <%s>" -- --#~ msgid "No \"shadow\" attribute on element <%s>" --#~ msgstr "No hay atributo «shadow» en el elemento <%s>" -- --#~ msgid "No \"arrow\" attribute on element <%s>" --#~ msgstr "No hay atributo «arrow» en el elemento <%s>" -- --#~ msgid "No \"value\" attribute on <%s> element" --#~ msgstr "No se definió el atributo «value» en el elemento <%s>" -- --#~ msgid "No \"position\" attribute on <%s> element" --#~ msgstr "No se definió el atributo «position» en el elemento <%s>" -- --#~ msgid "No \"function\" attribute on <%s> element" --#~ msgstr "No se definió el atributo «function» en el elemento <%s>" -- --#~ msgid "No \"state\" attribute on <%s> element" --#~ msgstr "No se definió el atributo «state» en el elemento <%s>" -- --#~ msgid "No \"focus\" attribute on <%s> element" --#~ msgstr "No se definió el atributo «focus» en el elemento <%s>" -- --#~ msgid "No \"style\" attribute on <%s> element" --#~ msgstr "No se definió el atributo «style» en el elemento <%s>" -- --#~ msgid "No \"resize\" attribute on <%s> element" --#~ msgstr "No hay un atributo «resize» en el elemento <%s>" -diff -urN mutter-3.14.4/po/fr.po mutter-3.14.4_localized/po/fr.po ---- mutter-3.14.4/po/fr.po 2015-03-23 22:19:32.000000000 +0530 -+++ mutter-3.14.4_localized/po/fr.po 2016-06-25 07:51:12.477149324 +0530 -@@ -1,7 +1,7 @@ - # French translation of mutter. - # Copyright (C) 2002-2014 Free Software Foundation, Inc. - # This file is distributed under the same license as the metacity package. --# -+# - # Christophe Fergeau , 2002. - # Christophe Merlet (RedFox) , 2002-2006. - # Sun G11n , 2002. -@@ -13,21 +13,20 @@ - # Stéphane Raimbault , 2007. - # Claude Paroz , 2008-2014. - # Bruno Brouard , 2011-12. --# - msgid "" - msgstr "" --"Project-Id-Version: mutter masterReport-Msgid-Bugs-To: http://bugzilla.gnome." --"org/enter_bug.cgi?product=mutter&component=general\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=mutter&keywords=I18N+L10N&component=general\n" --"POT-Creation-Date: 2014-08-29 21:52+0000\n" --"PO-Revision-Date: 2014-08-30 11:59+0200\n" --"Last-Translator: Claude Paroz \n" --"Language-Team: GNOME French Team \n" --"Language: fr\n" -+"Project-Id-Version: PACKAGE VERSION\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-04-19 09:49+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2014-08-30 09:59+0000\n" -+"Last-Translator: Claude Paroz \n" -+"Language-Team: GNOME French Team \n" -+"Language: fr\n" -+"X-Generator: Zanata 3.8.2\n" -+"Plural-Forms: nplurals=2; plural=(n > 1)\n" - - #: ../data/50-mutter-navigation.xml.in.h:1 - msgid "Navigation" -@@ -276,7 +275,8 @@ - - #: ../data/org.gnome.mutter.gschema.xml.in.h:1 - msgid "Modifier to use for extended window management operations" --msgstr "Touche à utiliser pour les opérations étendues de gestion des fenêtres" -+msgstr "" -+"Touche à utiliser pour les opérations étendues de gestion des fenêtres" - - #: ../data/org.gnome.mutter.gschema.xml.in.h:2 - msgid "" -@@ -311,8 +311,8 @@ - #: ../data/org.gnome.mutter.gschema.xml.in.h:6 - 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." -+"vertically and resizes them horizontally to cover half of the available area." -+" Dropping windows on the top screen edge maximizes them completely." - msgstr "" - "Si activé, le dépôt des fenêtres sur les bords verticaux de l'écran les " - "maximise verticalement et les redimensionne horizontalement pour recouvrir " -@@ -408,8 +408,8 @@ - "When true, the new windows will always be put in the center of the active " - "screen of the monitor." - msgstr "" --"Si true (vrai), les nouvelles fenêtres seront toujours placées au centre " --"de l'écran actif du moniteur." -+"Si true (vrai), les nouvelles fenêtres seront toujours placées au centre de " -+"l'écran actif du moniteur." - - #: ../data/org.gnome.mutter.gschema.xml.in.h:21 - msgid "Select window from tab popup" -@@ -449,41 +449,37 @@ - msgid "Switch to VT 7" - msgstr "Passer à l'émulateur de terminal 7" - --#: ../src/backends/meta-monitor-manager.c:412 -+#: ../src/backends/meta-monitor-manager.c:375 - msgid "Built-in display" - msgstr "Affichage intégré" - --#: ../src/backends/meta-monitor-manager.c:437 -+#: ../src/backends/meta-monitor-manager.c:400 - msgid "Unknown" - msgstr "Inconnu" - --#: ../src/backends/meta-monitor-manager.c:439 -+#: ../src/backends/meta-monitor-manager.c:402 - msgid "Unknown Display" - msgstr "Affichage inconnu" - - #. TRANSLATORS: this is a monitor vendor name, followed by a - #. * size in inches, like 'Dell 15"' --#. --#: ../src/backends/meta-monitor-manager.c:447 -+#. -+#: ../src/backends/meta-monitor-manager.c:410 - #, c-format - msgid "%s %s" - msgstr "%s %s" - - #. 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:443 -+#: ../src/compositor/compositor.c:461 - #, c-format - msgid "" --"Another compositing manager is already running on screen %i on display \"%s" --"\"." -+"Another compositing manager is already running on screen %i on display " -+"\"%s\"." - msgstr "" - "Un autre gestionnaire de composition est déjà lancé sur l'écran %i de " - "l'affichage « %s »." - --#: ../src/compositor/meta-background.c:1044 --msgid "background texture could not be created from file" --msgstr "la texture d'arrière-plan n'a pas pu être créée depuis le fichier" -- - #: ../src/core/bell.c:185 - msgid "Bell event" - msgstr "Évènement sonore" -@@ -513,7 +509,7 @@ - msgid "_Force Quit" - msgstr "_Forcer à quitter" - --#: ../src/core/display.c:547 -+#: ../src/core/display.c:550 - #, c-format - msgid "Failed to open X Window System display '%s'\n" - msgstr "Impossible d'ouvrir l'affichage « %s » du système X Window\n" -@@ -550,12 +546,12 @@ - msgid "Run as a full display server, rather than nested" - msgstr "Lancer comme un serveur d'affichage complet, plutôt qu'imbriqué" - --#: ../src/core/main.c:459 -+#: ../src/core/main.c:451 - #, c-format - msgid "Failed to scan themes directory: %s\n" - msgstr "Le parcours du répertoire de thèmes a échoué : %s\n" - --#: ../src/core/main.c:475 -+#: ../src/core/main.c:467 - #, c-format - msgid "" - "Could not find a theme! Be sure %s exists and contains the usual themes.\n" -@@ -587,17 +583,17 @@ - msgid "Mutter plugin to use" - msgstr "Greffon de Mutter à utiliser" - --#: ../src/core/prefs.c:2101 -+#: ../src/core/prefs.c:2064 - #, c-format - msgid "Workspace %d" - msgstr "Espace de travail %d" - --#: ../src/core/screen.c:548 -+#: ../src/core/screen.c:537 - #, c-format - msgid "Screen %d on display '%s' is invalid\n" - msgstr "L'écran %d sur l'affichage « %s » n'est pas valide\n" - --#: ../src/core/screen.c:564 -+#: ../src/core/screen.c:553 - #, c-format - msgid "" - "Screen %d on display \"%s\" already has a window manager; try using the --" -@@ -607,7 +603,7 @@ - "essayez d'utiliser l'option --replace pour remplacer le gestionnaire de " - "fenêtres actuel.\n" - --#: ../src/core/screen.c:657 -+#: ../src/core/screen.c:646 - #, c-format - msgid "Screen %d on display \"%s\" already has a window manager\n" - msgstr "L'écran %d sur l'affichage « %s » a déjà un gestionnaire de fenêtres\n" -@@ -618,7 +614,7 @@ - - #. Translators: This represents the size of a window. The first number is - #. * the width of the window and the second is the height. --#. -+#. - #: ../src/ui/resizepopup.c:134 - #, c-format - msgid "%d x %d" -@@ -873,7 +869,8 @@ - - #: ../src/ui/theme.c:2588 - #, c-format --msgid "Coordinate expression had an open parenthesis with no close parenthesis" -+msgid "" -+"Coordinate expression had an open parenthesis with no close parenthesis" - msgstr "" - "L'expression de la coordonnée comporte une parenthèse d'ouverture, mais pas " - "de parenthèse de fermeture" -@@ -901,10 +898,8 @@ - - #: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995 - #, c-format --msgid "" --"Missing " --msgstr "" --" manquant" -+msgid "Missing " -+msgstr " manquant" - - #: ../src/ui/theme.c:5041 - #, c-format -@@ -928,8 +923,7 @@ - - #: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745 - #, c-format --msgid "" --"User-defined constants must begin with a capital letter; \"%s\" does not" -+msgid "User-defined constants must begin with a capital letter; \"%s\" does not" - msgstr "" - "Les constantes définies par l'utilisateur doivent commencer par une " - "majuscule ; « %s » commence par une minuscule" -@@ -941,7 +935,7 @@ - - #. Translators: This means that an attribute which should have been found - #. * on an XML element was not in fact found. --#. -+#. - #: ../src/ui/theme-parser.c:234 - #, c-format - msgid "No \"%s\" attribute on element <%s>" -@@ -1008,8 +1002,8 @@ - #: ../src/ui/theme-parser.c:865 - #, c-format - msgid "" --"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium," --"large,x-large,xx-large)\n" -+"Invalid title scale \"%s\" (must be one of xx-small,x-" -+"small,small,medium,large,x-large,xx-large)\n" - msgstr "" - "Échelle de titre non valide « %s » (elle doit avoir l'une des valeurs " - "suivantes : xx-small, x-small, small, medium,large, x-large, xx-large)\n" -@@ -1071,9 +1065,8 @@ - "Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" " - "for buttons" - msgstr "" --"Impossible d'indiquer à la fois « button_width » / " --"« button_height » (largeur/hauteur) et « aspect_ratio » (proportion) pour " --"les boutons" -+"Impossible d'indiquer à la fois « button_width » / « button_height » " -+"(largeur/hauteur) et « aspect_ratio » (proportion) pour les boutons" - - #: ../src/ui/theme-parser.c:1452 - #, c-format -@@ -1279,8 +1272,8 @@ - #, c-format - msgid "Outermost element in theme must be not <%s>" - msgstr "" --"L'élément le plus extérieur dans le thème doit être et non <" --"%s>" -+"L'élément le plus extérieur dans le thème doit être et non " -+"<%s>" - - #: ../src/ui/theme-parser.c:3581 - #, c-format -@@ -1349,7 +1342,7 @@ - "configuration actuelle » et devront être redémarrées manuellement à la " - "prochaine connexion." - --#: ../src/x11/window-props.c:515 -+#: ../src/x11/window-props.c:558 - #, c-format - msgid "%s (on %s)" - msgstr "%s (sur %s)" -diff -urN mutter-3.14.4/po/it.po mutter-3.14.4_localized/po/it.po ---- mutter-3.14.4/po/it.po 2015-03-23 22:19:32.000000000 +0530 -+++ mutter-3.14.4_localized/po/it.po 2016-06-25 07:51:12.481149323 +0530 -@@ -6,22 +6,20 @@ - # Lapo Calamandrei , 2003. - # Luca Ferretti , 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. - # Milo Casagrande , 2012, 2013, 2014. --# - msgid "" - 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: 2014-10-05 10:09+0000\n" --"PO-Revision-Date: 2014-10-05 15:40+0100\n" --"Last-Translator: Milo Casagrande \n" --"Language-Team: Italian \n" --"Language: it\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-04-19 09:49+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2014-10-05 02:40+0000\n" -+"Last-Translator: Milo Casagrande \n" -+"Language-Team: Italian \n" -+"Language: it\n" - "Plural-Forms: nplurals=2; plural=(n!=1);\n" --"X-Generator: Poedit 1.6.9\n" -+"X-Generator: Zanata 3.8.2\n" - - #: ../data/50-mutter-navigation.xml.in.h:1 - msgid "Navigation" -@@ -257,7 +255,7 @@ - msgstr "Massimizza orizzontalmente la finestra" - - # scorciatoia per mettere la finestra a mezzo schermo intero sulla sinistra --# -+# - # traduzione infedele, ma "frazionamento della vista a sn/ds" mi pare peggio - #: ../data/50-mutter-windows.xml.in.h:18 - msgid "View split on left" -@@ -311,8 +309,8 @@ - #: ../data/org.gnome.mutter.gschema.xml.in.h:6 - 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." -+"vertically and resizes them horizontally to cover half of the available area." -+" Dropping windows on the top screen edge maximizes them completely." - msgstr "" - "Se abilitata, trascinando le finestre sui bordi verticali dello schermo, " - "queste vengono massimizzate verticalmente e ridimensionate orizzontalmente " -@@ -460,7 +458,7 @@ - - #. TRANSLATORS: this is a monitor vendor name, followed by a - #. * size in inches, like 'Dell 15"' --#. -+#. - #: ../src/backends/meta-monitor-manager.c:410 - #, c-format - msgid "%s %s" -@@ -468,11 +466,11 @@ - - #. 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:443 -+#: ../src/compositor/compositor.c:461 - #, c-format - msgid "" --"Another compositing manager is already running on screen %i on display \"%s" --"\"." -+"Another compositing manager is already running on screen %i on display " -+"\"%s\"." - msgstr "" - "Un altro compositing manager è già in esecuzione sullo schermo %i sul " - "display «%s»." -@@ -584,12 +582,12 @@ - msgid "Workspace %d" - msgstr "Spazio di lavoro %d" - --#: ../src/core/screen.c:543 -+#: ../src/core/screen.c:537 - #, 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:559 -+#: ../src/core/screen.c:553 - #, c-format - msgid "" - "Screen %d on display \"%s\" already has a window manager; try using the --" -@@ -598,7 +596,7 @@ - "Lo schermo %d sul display «%s» ha già un window manager; provare a " - "utilizzare l'opzione --replace per sostituirlo.\n" - --#: ../src/core/screen.c:652 -+#: ../src/core/screen.c:646 - #, 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" -@@ -610,7 +608,7 @@ - - #. Translators: This represents the size of a window. The first number is - #. * the width of the window and the second is the height. --#. -+#. - #: ../src/ui/resizepopup.c:134 - #, c-format - msgid "%d x %d" -@@ -641,7 +639,8 @@ - #, 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»" -+"la geometria della cornice non specifica la dimensione «%s» per il bordo " -+"«%s»" - - #: ../src/ui/theme.c:323 - #, c-format -@@ -816,7 +815,8 @@ - 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" -+"L'espressione delle coordinate ha un operatore «%s» dove è atteso un " -+"operando" - - #: ../src/ui/theme.c:2227 - #, c-format -@@ -844,7 +844,8 @@ - #, c-format - msgid "Coordinate expression had unknown variable or constant \"%s\"" - msgstr "" --"L'espressione delle coordinate ha la variabile o la costante «%s» sconosciuta" -+"L'espressione delle coordinate ha la variabile o la costante «%s» " -+"sconosciuta" - - #: ../src/ui/theme.c:2495 - #, c-format -@@ -862,7 +863,8 @@ - - #: ../src/ui/theme.c:2588 - #, c-format --msgid "Coordinate expression had an open parenthesis with no close parenthesis" -+msgid "" -+"Coordinate expression had an open parenthesis with no close parenthesis" - msgstr "" - "L'espressione delle coordinate ha una parentesi di apertura senza la " - "relativa di chiusura" -@@ -889,8 +891,7 @@ - - #: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995 - #, c-format --msgid "" --"Missing " -+msgid "Missing " - msgstr "" - "Risulta mancante " -@@ -917,8 +918,7 @@ - - #: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745 - #, c-format --msgid "" --"User-defined constants must begin with a capital letter; \"%s\" does not" -+msgid "User-defined constants must begin with a capital letter; \"%s\" does not" - msgstr "" - "Le costanti definite dall'utente devono iniziare con una lettera maiuscola, " - "«%s» non lo fa" -@@ -930,7 +930,7 @@ - - #. Translators: This means that an attribute which should have been found - #. * on an XML element was not in fact found. --#. -+#. - #: ../src/ui/theme-parser.c:234 - #, c-format - msgid "No \"%s\" attribute on element <%s>" -@@ -997,8 +997,8 @@ - #: ../src/ui/theme-parser.c:865 - #, c-format - msgid "" --"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium," --"large,x-large,xx-large)\n" -+"Invalid title scale \"%s\" (must be one of xx-small,x-" -+"small,small,medium,large,x-large,xx-large)\n" - msgstr "" - "Taglia del titolo «%s» non valida (deve essere xx-small, x-small, small, " - "medium,large, x-large, o xx-large)\n" -@@ -1026,7 +1026,8 @@ - #: ../src/ui/theme-parser.c:1156 - #, c-format - msgid "<%s> must specify either a geometry or a parent that has a geometry" --msgstr "<%s> deve specificare una geometria o un genitore che ha una geometria" -+msgstr "" -+"<%s> deve specificare una geometria o un genitore che ha una geometria" - - #: ../src/ui/theme-parser.c:1198 - msgid "You must specify a background for an alpha value to be meaningful" -@@ -1282,7 +1283,8 @@ - #: ../src/ui/theme-parser.c:3586 - #, c-format - msgid "Element <%s> is not allowed inside a element" --msgstr "L'elemento <%s> non è consentito all'interno di un elemento " -+msgstr "" -+"L'elemento <%s> non è consentito all'interno di un elemento " - - #: ../src/ui/theme-parser.c:3598 - #, c-format -@@ -1343,266 +1345,3 @@ - #, c-format - msgid "%s (on %s)" - msgstr "%s (su %s)" -- --#~ msgid "background texture could not be created from file" --#~ msgstr "La texture dello sfondo non può essere creata dal file" -- --# notare l'abilità con cui nella traduzione non si capisce --# se sconosciuta è la finestra o la richiesta :-) --Luca --#~ msgid "Unknown window information request: %d" --#~ msgstr "Richiesta informazioni finestra sconosciuta: %d" -- --#~ msgid "Missing %s extension required for compositing" --#~ msgstr "Estensione %s richiesta per il compositing mancante" -- --#~ msgid "" --#~ "Some other program is already using the key %s with modifiers %x as a " --#~ "binding\n" --#~ msgstr "" --#~ "Qualche altro programma sta già usando il tasto %s con i modificatori %x " --#~ "come una associazione di tasti\n" -- --#~ msgid "\"%s\" is not a valid accelerator\n" --#~ msgstr "«%s» non è una scorciatoia valida\n" -- --#~ msgid "" --#~ "Workarounds for broken applications disabled. Some applications may not " --#~ "behave properly.\n" --#~ msgstr "" --#~ "Disabilitate le funzionalità palliative per la applicazioni difettose. " --#~ "Alcune applicazioni potrebbero avere comportamenti errati.\n" -- --#~ msgid "Could not parse font description \"%s\" from GSettings key %s\n" --#~ msgstr "" --#~ "Impossibile analizzare la descrizione del tipo di carattere «%s» dalla " --#~ "chiave GSettings %s\n" -- --#~ msgid "" --#~ "\"%s\" found in configuration database is not a valid value for mouse " --#~ "button modifier\n" --#~ msgstr "" --#~ "Il valore «%s» trovato nel database di configurazione non è valido per il " --#~ "modificatore del tasto del mouse\n" -- --#~ 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" -- --#~ msgid "" --#~ "Could not acquire window manager selection on screen %d display \"%s\"\n" --#~ msgstr "" --#~ "Impossibile acquisire la selezione del window manager per lo schermo %d " --#~ "nel display «%s»\n" -- --#~ msgid "Could not release screen %d on display \"%s\"\n" --#~ msgstr "Impossibile rilasciare lo schermo %d sul display «%s»\n" -- --#~ msgid "Could not create directory '%s': %s\n" --#~ msgstr "Impossibile creare la directory «%s»: %s\n" -- --#~ msgid "Could not open session file '%s' for writing: %s\n" --#~ msgstr "Impossibile aprire il file di sessione «%s» in scrittura: %s\n" -- --#~ msgid "Error writing session file '%s': %s\n" --#~ msgstr "Errore nello scrivere il file di sessione «%s»: %s\n" -- --#~ msgid "Error closing session file '%s': %s\n" --#~ msgstr "Errore nel chiudere il file di sessione «%s»: %s\n" -- --#~ msgid "Failed to parse saved session file: %s\n" --#~ msgstr "Analisi del file della sessione salvato non riuscita: %s\n" -- --#~ msgid " attribute seen but we already have the session ID" --#~ msgstr "" --#~ "Attributo individuato, ma è già presente un ID della " --#~ "sessione" -- --#~ msgid "Unknown attribute %s on <%s> element" --#~ msgstr "Attributo %s sconosciuto per l'elemento <%s>" -- --#~ msgid "nested tag" --#~ msgstr "tag annidato" -- --#~ msgid "Unknown element %s" --#~ msgstr "Elemento %s sconosciuto" -- --#~ msgid "Failed to open debug log: %s\n" --#~ msgstr "Apertura nel file di registro di debug non riuscita: %s\n" -- --#~ msgid "Failed to fdopen() log file %s: %s\n" --#~ msgstr "Esecuzione di fdopen() sul file di registro %s non riuscita: %s\n" -- --#~ msgid "Opened log file %s\n" --#~ msgstr "File di registro %s aperto\n" -- --#~ msgid "Window manager: " --#~ msgstr "Window manager: " -- --#~ msgid "Bug in window manager: " --#~ msgstr "Bug nel window manager: " -- --#~ msgid "Window manager warning: " --#~ msgstr "Avviso del window manager: " -- --#~ msgid "Window manager error: " --#~ msgstr "Errore del window manager: " -- --#~ msgid "" --#~ "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER " --#~ "window as specified in the ICCCM.\n" --#~ msgstr "" --#~ "La finestra %s ha impostato SM_CLIENT_ID su se stessa, invece che sulla " --#~ "finestra WM_CLIENT_LEADER come da specifiche ICCCM.\n" -- --#~ msgid "" --#~ "Window %s sets an MWM hint indicating it isn't resizable, but sets min " --#~ "size %d x %d and max size %d x %d; this doesn't make much sense.\n" --#~ msgstr "" --#~ "La finestra %s ha impostato un hint MWM indicando che non è " --#~ "ridimensionabile, ma ha impostato la dimensione minima %d x %d e la " --#~ "dimensione massima %d x %d; ciò non ha senso.\n" -- --#~ msgid "Application set a bogus _NET_WM_PID %lu\n" --#~ msgstr "L'applicazione ha impostato un _NET_WM_PID errato %lu\n" -- --# Sì, direi che è oscuro -Luca --# --#~ 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 --# --#~ 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" -- --#~ msgid "" --#~ "Window 0x%lx has property %s\n" --#~ "that was expected to have type %s format %d\n" --#~ "and actually has type %s format %d n_items %d.\n" --#~ "This is most likely an application bug, not a window manager bug.\n" --#~ "The window has title=\"%s\" class=\"%s\" name=\"%s\"\n" --#~ msgstr "" --#~ "La finestra 0x%lx ha la proprietà %s\n" --#~ "che era attesa avere tipo %s formato %d\n" --#~ "e in realtà ha tipo %s formato %d n_items %d.\n" --#~ "Molto probabilmente è un bug dell'applicazione, non del window manager.\n" --#~ "La finestra presenta titolo=\"%s\" classe=\"%s\" nome=\"%s\"\n" -- --#~ msgid "Property %s on window 0x%lx contained invalid UTF-8\n" --#~ msgstr "La proprietà %s sulla finestra 0x%lx contiene UTF-8 non valido\n" -- --#~ msgid "" --#~ "Property %s on window 0x%lx contained invalid UTF-8 for item %d in the " --#~ "list\n" --#~ msgstr "" --#~ "La proprietà %s sulla finestra 0x%lx contiene UTF-8 non valido per " --#~ "l'elemento %d nella lista\n" -- --# mantenere in sync con libwnck --#~ msgid "Mi_nimize" --#~ msgstr "_Minimizza" -- --# mantenere in sync con libwnck --#~ msgid "Ma_ximize" --#~ msgstr "Ma_ssimizza" -- --# mantenere in sync con libwnck --#~ msgid "Unma_ximize" --#~ msgstr "Dema_ssimizza" -- --#~ msgid "Roll _Up" --#~ msgstr "Arr_otola" -- --#~ msgid "_Unroll" --#~ msgstr "Sr_otola" -- --# mantenere in sync con libwnck --#~ msgid "_Move" --#~ msgstr "M_uovi" -- --# mantenere in sync con libwnck --#~ msgid "_Resize" --#~ msgstr "_Ridimensiona" -- --#~ msgid "Move Titlebar On_screen" --#~ msgstr "Muovi barra del titolo su _schermo" -- --# mantenere in sync con libwnck --#~ msgid "Always on _Top" --#~ msgstr "Sempre in _primo piano" -- --# mantenere in sync con libwnck --#~ msgid "_Always on Visible Workspace" --#~ msgstr "Sempre su spazio di lavoro _visibile" -- --# mantenere in sync con libwnck --#~ msgid "_Only on This Workspace" --#~ msgstr "Solo su _questo spazio di lavoro" -- --# mantenere in sync con libwnck --#~ msgid "Move to Workspace _Left" --#~ msgstr "Sposta su spazio di lavoro a s_inistra" -- --# mantenere in sync con libwnck --#~ msgid "Move to Workspace R_ight" --#~ msgstr "Sposta su spazio di lavoro a d_estra" -- --# mantenere in sync con libwnck --#~ msgid "Move to Workspace _Up" --#~ msgstr "Sposta su spazio di lavoro in alt_o" -- --# mantenere in sync con libwnck --#~ msgid "Move to Workspace _Down" --#~ msgstr "Sposta su spazio di lavoro in _basso" -- --# mantenere in sync con libwnck --#~ msgid "_Close" --#~ msgstr "_Chiudi" -- --# mantenere in sync con libwnck --#~ msgid "Workspace %d%n" --#~ msgstr "Spazio di lavoro %d%n" -- --# mantenere in sync con libwnck --#~ msgid "Workspace 1_0" --#~ msgstr "Spazio di lavoro 1_0" -- --# mantenere in sync con libwnck --#~ msgid "Workspace %s%d" --#~ msgstr "Spazio di lavoro %s%d" -- --#~ msgid "Move to Another _Workspace" --#~ msgstr "Sposta su _altro spazio di lavoro" -- --#~ msgid "Shift" --#~ msgstr "Maiusc" -- --#~ msgid "Ctrl" --#~ msgstr "Ctrl" -- --#~ msgid "Alt" --#~ msgstr "Alt" -- --#~ msgid "Meta" --#~ msgstr "Meta" -- --#~ msgid "Super" --#~ msgstr "Super" -- --#~ msgid "Hyper" --#~ msgstr "Hyper" -- --#~ msgid "Mod2" --#~ msgstr "Mod2" -- --#~ msgid "Mod3" --#~ msgstr "Mod3" -- --#~ msgid "Mod4" --#~ msgstr "Mod4" -- --#~ msgid "Mod5" --#~ msgstr "Mod5" -diff -urN mutter-3.14.4/po/ja.po mutter-3.14.4_localized/po/ja.po ---- mutter-3.14.4/po/ja.po 2014-10-02 19:59:20.000000000 +0530 -+++ mutter-3.14.4_localized/po/ja.po 2016-06-25 07:51:12.485149323 +0530 -@@ -7,1804 +7,1234 @@ - # Satoru SATOH , 2006. - # Jiro Matsuzawa , 2012, 2013. - # Noriko Mizumoto , 2012. --# -+# tnagamot , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: mutter master\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&keywords=I18N+L10N&component=general\n" --"POT-Creation-Date: 2013-07-30 12:29+0000\n" --"PO-Revision-Date: 2013-07-30 23:01+0900\n" --"Last-Translator: Jiro Matsuzawa \n" --"Language-Team: Japanese \n" --"Language: ja\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-04-19 09:49+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2016-05-18 05:20+0000\n" -+"Last-Translator: tnagamot \n" -+"Language-Team: Japanese \n" -+"Language: ja\n" - "Plural-Forms: nplurals=1; plural=0;\n" -+"X-Generator: Zanata 3.8.2\n" - --#: ../src/50-mutter-navigation.xml.in.h:1 -+#: ../data/50-mutter-navigation.xml.in.h:1 - msgid "Navigation" - msgstr "ナビゲーション" - --#: ../src/50-mutter-navigation.xml.in.h:2 -+#: ../data/50-mutter-navigation.xml.in.h:2 - msgid "Move window to workspace 1" - msgstr "ウィンドウをワークスペース 1 へ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:3 -+#: ../data/50-mutter-navigation.xml.in.h:3 - msgid "Move window to workspace 2" - msgstr "ウィンドウをワークスペース 2 へ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:4 -+#: ../data/50-mutter-navigation.xml.in.h:4 - msgid "Move window to workspace 3" - msgstr "ウィンドウをワークスペース 3 へ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:5 -+#: ../data/50-mutter-navigation.xml.in.h:5 - msgid "Move window to workspace 4" - msgstr "ウィンドウをワークスペース 4 へ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:6 -+#: ../data/50-mutter-navigation.xml.in.h:6 -+msgid "Move window to last workspace" -+msgstr "ウィンドウを最後のワークスペースへ移動する" -+ -+#: ../data/50-mutter-navigation.xml.in.h:7 - msgid "Move window one workspace to the left" - msgstr "ウィンドウを左側のワークスペースへ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:7 -+#: ../data/50-mutter-navigation.xml.in.h:8 - msgid "Move window one workspace to the right" - msgstr "ウィンドウを右側のワークスペースへ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:8 -+#: ../data/50-mutter-navigation.xml.in.h:9 - msgid "Move window one workspace up" - msgstr "ウィンドウを上側のワークスペースへ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:9 -+#: ../data/50-mutter-navigation.xml.in.h:10 - msgid "Move window one workspace down" - msgstr "ウィンドウを下側のワークスペースへ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:10 -+#: ../data/50-mutter-navigation.xml.in.h:11 -+msgid "Move window one monitor to the left" -+msgstr "ウィンドウを 1 つのモニター分左側に移動する" -+ -+#: ../data/50-mutter-navigation.xml.in.h:12 -+msgid "Move window one monitor to the right" -+msgstr "ウィンドウを 1 つのモニター分右側に移動する" -+ -+#: ../data/50-mutter-navigation.xml.in.h:13 -+msgid "Move window one monitor up" -+msgstr "ウィンドウを 1 つのモニター分上側に移動する" -+ -+#: ../data/50-mutter-navigation.xml.in.h:14 -+msgid "Move window one monitor down" -+msgstr "ウィンドウを 1 つのモニター分下側に移動する" -+ -+#: ../data/50-mutter-navigation.xml.in.h:15 - msgid "Switch applications" - msgstr "アプリケーションを切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:11 -+#: ../data/50-mutter-navigation.xml.in.h:16 -+msgid "Switch to previous application" -+msgstr "以前のアプリケーションに切り替える" -+ -+#: ../data/50-mutter-navigation.xml.in.h:17 - msgid "Switch windows" - msgstr "ウィンドウを切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:12 -+#: ../data/50-mutter-navigation.xml.in.h:18 -+msgid "Switch to previous window" -+msgstr "以前のウィンドウに切り替える" -+ -+#: ../data/50-mutter-navigation.xml.in.h:19 - msgid "Switch windows of an application" - msgstr "ひとつのアプリケーション内のウィンドウを切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:13 -+#: ../data/50-mutter-navigation.xml.in.h:20 -+msgid "Switch to previous window of an application" -+msgstr "アプリケーションの以前のウィンドウに切り替える" -+ -+#: ../data/50-mutter-navigation.xml.in.h:21 - msgid "Switch system controls" - msgstr "システムのコントロールを切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:14 -+#: ../data/50-mutter-navigation.xml.in.h:22 -+msgid "Switch to previous system control" -+msgstr "以前のシステムコントロールに切り替える" -+ -+#: ../data/50-mutter-navigation.xml.in.h:23 - msgid "Switch windows directly" - msgstr "ウィンドウを直接切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:15 -+#: ../data/50-mutter-navigation.xml.in.h:24 -+msgid "Switch directly to previous window" -+msgstr "以前のウィンドウに直接切り替える" -+ -+#: ../data/50-mutter-navigation.xml.in.h:25 - msgid "Switch windows of an app directly" - msgstr "ひとつのアプリケーション内のウィンドウを直接切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:16 -+#: ../data/50-mutter-navigation.xml.in.h:26 -+msgid "Switch directly to previous window of an app" -+msgstr "アプリケーションの以前のウィンドウに直接切り替える" -+ -+#: ../data/50-mutter-navigation.xml.in.h:27 - msgid "Switch system controls directly" - msgstr "システムのコントロールを直接切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:17 -+#: ../data/50-mutter-navigation.xml.in.h:28 -+msgid "Switch directly to previous system control" -+msgstr "以前のシステムコントロールに直接切り替える" -+ -+#: ../data/50-mutter-navigation.xml.in.h:29 - msgid "Hide all normal windows" - msgstr "すべての通常のウィンドウを隠す" - - # 「キーボードショートカット」のアプレット (gnome-control-center) で表示するメッセージ --#: ../src/50-mutter-navigation.xml.in.h:18 -+#: ../data/50-mutter-navigation.xml.in.h:30 - msgid "Switch to workspace 1" - msgstr "ワークスペース 1 へ切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:19 -+#: ../data/50-mutter-navigation.xml.in.h:31 - msgid "Switch to workspace 2" - msgstr "ワークスペース 2 へ切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:20 -+#: ../data/50-mutter-navigation.xml.in.h:32 - msgid "Switch to workspace 3" - msgstr "ワークスペース 3 へ切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:21 -+#: ../data/50-mutter-navigation.xml.in.h:33 - msgid "Switch to workspace 4" - msgstr "ワークスペース 4 へ切り替える" - --#: ../src/50-mutter-navigation.xml.in.h:22 -+# 「キーボードショートカット」のアプレット (gnome-control-center) で表示するメッセージ -+#: ../data/50-mutter-navigation.xml.in.h:34 -+msgid "Switch to last workspace" -+msgstr "最後のワークスペースに切り替える" -+ -+#: ../data/50-mutter-navigation.xml.in.h:35 - msgid "Move to workspace left" - msgstr "左側のワークスペースへ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:23 -+#: ../data/50-mutter-navigation.xml.in.h:36 - msgid "Move to workspace right" - msgstr "右側のワークスペースへ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:24 -+#: ../data/50-mutter-navigation.xml.in.h:37 - msgid "Move to workspace above" - msgstr "上側のワークスペースへ移動する" - --#: ../src/50-mutter-navigation.xml.in.h:25 -+#: ../data/50-mutter-navigation.xml.in.h:38 - msgid "Move to workspace below" - msgstr "下側のワークスペースへ移動する" - --#: ../src/50-mutter-system.xml.in.h:1 -+#: ../data/50-mutter-system.xml.in.h:1 - msgid "System" - msgstr "システム" - --#: ../src/50-mutter-system.xml.in.h:2 -+#: ../data/50-mutter-system.xml.in.h:2 - msgid "Show the run command prompt" - msgstr "コマンド実行プロンプトを表示する" - --#: ../src/50-mutter-system.xml.in.h:3 -+#: ../data/50-mutter-system.xml.in.h:3 - msgid "Show the activities overview" - msgstr "アクティビティ画面を表示する" - --#: ../src/50-mutter-windows.xml.in.h:1 -+#: ../data/50-mutter-windows.xml.in.h:1 - msgid "Windows" - msgstr "ウィンドウ" - --#: ../src/50-mutter-windows.xml.in.h:2 -+#: ../data/50-mutter-windows.xml.in.h:2 - msgid "Activate the window menu" - msgstr "ウィンドウメニューを開く" - --#: ../src/50-mutter-windows.xml.in.h:3 -+#: ../data/50-mutter-windows.xml.in.h:3 - msgid "Toggle fullscreen mode" - msgstr "フルスクリーンモードを切り替える" - --#: ../src/50-mutter-windows.xml.in.h:4 -+#: ../data/50-mutter-windows.xml.in.h:4 - msgid "Toggle maximization state" - msgstr "最大化/最小化の状態を切り替える" - --#: ../src/50-mutter-windows.xml.in.h:5 -+#: ../data/50-mutter-windows.xml.in.h:5 - msgid "Maximize window" - msgstr "ウィンドウを最大化する" - --#: ../src/50-mutter-windows.xml.in.h:6 -+#: ../data/50-mutter-windows.xml.in.h:6 - msgid "Restore window" - msgstr "ウィンドウを戻す" - --#: ../src/50-mutter-windows.xml.in.h:7 -+#: ../data/50-mutter-windows.xml.in.h:7 - msgid "Toggle shaded state" - msgstr "シェードの状態を切り替える" - --#: ../src/50-mutter-windows.xml.in.h:8 -+#: ../data/50-mutter-windows.xml.in.h:8 - msgid "Close window" - msgstr "ウィンドウを閉じる" - --#: ../src/50-mutter-windows.xml.in.h:9 -+#: ../data/50-mutter-windows.xml.in.h:9 - msgid "Hide window" - msgstr "ウィンドウを非表示にする" - --#: ../src/50-mutter-windows.xml.in.h:10 -+#: ../data/50-mutter-windows.xml.in.h:10 - msgid "Move window" - msgstr "ウィンドウを移動する" - --#: ../src/50-mutter-windows.xml.in.h:11 -+#: ../data/50-mutter-windows.xml.in.h:11 - msgid "Resize window" - msgstr "ウィンドウサイズを変更する" - --#: ../src/50-mutter-windows.xml.in.h:12 -+#: ../data/50-mutter-windows.xml.in.h:12 - msgid "Toggle window on all workspaces or one" - msgstr "ウィンドウをすべてのワークスペースに固定するかどうかを切り替える" - --#: ../src/50-mutter-windows.xml.in.h:13 -+#: ../data/50-mutter-windows.xml.in.h:13 - msgid "Raise window if covered, otherwise lower it" - msgstr "ウィンドウが覆われていれば最前面に、そうでなければ最背面に移動する" - --#: ../src/50-mutter-windows.xml.in.h:14 -+#: ../data/50-mutter-windows.xml.in.h:14 - msgid "Raise window above other windows" - msgstr "ウィンドウを最前面に移動する" - --#: ../src/50-mutter-windows.xml.in.h:15 -+#: ../data/50-mutter-windows.xml.in.h:15 - msgid "Lower window below other windows" - msgstr "ウィンドウを最背面に移動する" - --#: ../src/50-mutter-windows.xml.in.h:16 -+#: ../data/50-mutter-windows.xml.in.h:16 - msgid "Maximize window vertically" - msgstr "ウィンドウを垂直方向に最大化する" - --#: ../src/50-mutter-windows.xml.in.h:17 -+#: ../data/50-mutter-windows.xml.in.h:17 - msgid "Maximize window horizontally" - msgstr "ウィンドウを水平方向に最大化する" - --#: ../src/50-mutter-windows.xml.in.h:18 -+#: ../data/50-mutter-windows.xml.in.h:18 - msgid "View split on left" - msgstr "画面左半分に表示する" - --#: ../src/50-mutter-windows.xml.in.h:19 -+#: ../data/50-mutter-windows.xml.in.h:19 - msgid "View split on right" - msgstr "画面右半分に表示する" - -+#: ../data/mutter.desktop.in.h:1 -+msgid "Mutter" -+msgstr "Mutter" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:1 -+msgid "Modifier to use for extended window management operations" -+msgstr "ウィンドウの拡張管理の操作で使用する修飾キー" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:2 -+msgid "" -+"This key will initiate the \"overlay\", which is a combination window " -+"overview and application launching system. The default is intended to be the " -+"\"Windows key\" on PC hardware. It's expected that this binding either the " -+"default or set to the empty string." -+msgstr "" -+"ここに指定したキーで「オーバーレイの機能」を起動します。この機能は GNOME Shell " -+"などが提供するウィンドウの全体表示やアプリの起動システムと連携します。デフォルトのキーは PC のキーボードにある [Windows キー] " -+"です。指定可能な値: デフォルトのキー、または空の文字列" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:3 -+msgid "Attach modal dialogs" -+msgstr "モーダルなダイアログを統合するかどうか" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:4 -+msgid "" -+"When true, instead of having independent titlebars, modal dialogs appear " -+"attached to the titlebar of the parent window and are moved together with " -+"the parent window." -+msgstr "" -+"TRUE にすると、タイトルバーを持つ通常のモーダルなダイアログを表示する代わりに、親ウィンドウのタイトルバーに統合したダイアログを表示します " -+"(親ウィンドウを移動すると一緒にモーダルなダイアログも移動します)。" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:5 -+msgid "Enable edge tiling when dropping windows on screen edges" -+msgstr "ウィンドウを画面の端に移動させたときにタイル状に配置する" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:6 -+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 "" -+"有効にした場合、ウィンドウを画面の右端または左端に移動させるとエリアの半分に広がるよう各ウィンドウは縦方向に拡大、横方向にサイズ調整が行なわれます。ウィンドウを画面の上辺または下辺に移動させると各ウィンドウは最大化されます。" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:7 -+msgid "Workspaces are managed dynamically" -+msgstr "ワークスペースを動的に管理する" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:8 -+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 "" -+"ワークスペースを動的に管理するか、固定のワークスペース数にするか (org.gnome.desktop.wm.preferences の num-" -+"workspaces キーで指定 ) を指定します。" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:9 -+msgid "Workspaces only on primary" -+msgstr "プライマリモニターのみワークスペースを切り替えるかどうか" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:10 -+msgid "" -+"Determines whether workspace switching should happen for windows on all " -+"monitors or only for windows on the primary monitor." -+msgstr "" -+"全てのモニターにあるウィンドウに対してワークスペースの切り替えを可能にするか、またはプライマリモニターにあるウィンドウに対してのみワークスペースの切り替えを提供するかどうかです。" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:11 -+msgid "No tab popup" -+msgstr "タブのポップアップなし" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:12 -+msgid "" -+"Determines whether the use of popup and highlight frame should be disabled " -+"for window cycling." -+msgstr "ウィンドウ循環に対してフレームのポップアップと強調表示の使用を無効にするかどうかを指定します。" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:13 -+msgid "Delay focus changes until the pointer stops moving" -+msgstr "ポインターの動きが止まるまで焦点の変更を遅延させる" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:14 -+msgid "" -+"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then " -+"the focus will not be changed immediately when entering a window, but only " -+"after the pointer stops moving." -+msgstr "" -+"true に設定され、フォーカスモードが \"sloppy\" または \"mouse\" " -+"になっている場合は、ウィンドウに入ってもポインターの動きが止まるまでフォーカスの変更は行なわれなくなります。" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:15 -+msgid "Draggable border width" -+msgstr "ドラッグが可能になる境界線の幅" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:16 -+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 "" -+"ドラッグができるようになる境界線の幅です。テーマで表示している境界線がこの値よりも小さい場合は、表示できない境界線がこの値になるように追加されます。" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:17 -+msgid "Auto maximize nearly monitor sized windows" -+msgstr "モニターと同サイズのウィンドウを自動的に最大化する" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:18 -+msgid "" -+"If enabled, new windows that are initially the size of the monitor " -+"automatically get maximized." -+msgstr "有効にすると、初期サイズがモニターと同じ大きさの新規ウィンドウは自動的に最大化されます。" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:19 -+msgid "Place new windows in the center" -+msgstr "新規ウィンドウを中央に配置する" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:20 -+msgid "" -+"When true, the new windows will always be put in the center of the active " -+"screen of the monitor." -+msgstr "true の場合は、新規ウィンドウがモニターのアクティブな画面の中央に常に配置されます。" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:21 -+msgid "Select window from tab popup" -+msgstr "タブのポップアップでウィンドウを選択します" -+ -+#: ../data/org.gnome.mutter.gschema.xml.in.h:22 -+msgid "Cancel tab popup" -+msgstr "タブのポップアップを取り消し" -+ -+# 「キーボードショートカット」のアプレット (gnome-control-center) で表示するメッセージ -+#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1 -+msgid "Switch to VT 1" -+msgstr "VT 1 へ切り替える" -+ -+#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2 -+msgid "Switch to VT 2" -+msgstr "VT 2 へ切り替える" -+ -+#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3 -+msgid "Switch to VT 3" -+msgstr "VT 3 へ切り替える" -+ -+#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4 -+msgid "Switch to VT 4" -+msgstr "VT 4 へ切り替える" -+ -+#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5 -+msgid "Switch to VT 5" -+msgstr "VT 5 へ切り替える" -+ -+#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6 -+msgid "Switch to VT 6" -+msgstr "VT 6 へ切り替える" -+ -+#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7 -+msgid "Switch to VT 7" -+msgstr "VT 7 へ切り替える" -+ -+#: ../src/backends/meta-monitor-manager.c:375 -+msgid "Built-in display" -+msgstr "組み込みディスプレイ" -+ -+#: ../src/backends/meta-monitor-manager.c:400 -+msgid "Unknown" -+msgstr "不明" -+ -+#: ../src/backends/meta-monitor-manager.c:402 -+msgid "Unknown Display" -+msgstr "不明なディスプレイ" -+ -+#. TRANSLATORS: this is a monitor vendor name, followed by a -+#. * size in inches, like 'Dell 15"' -+#. -+#: ../src/backends/meta-monitor-manager.c:410 -+#, c-format -+msgid "%s %s" -+msgstr "%s %s" -+ - #. 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:589 -+#: ../src/compositor/compositor.c:461 - #, c-format --msgid "Another compositing manager is already running on screen %i on display \"%s\"." -+msgid "" -+"Another compositing manager is already running on screen %i on display " -+"\"%s\"." - msgstr "既に別の合成マネージャーがディスプレイ \"%2$s\" 上のスクリーン %1$i で起動中です" - --#: ../src/compositor/meta-background.c:1076 --msgid "background texture could not be created from file" --msgstr "" -- --#: ../src/core/bell.c:322 -+#: ../src/core/bell.c:185 - msgid "Bell event" - msgstr "ベルイベント" - --#: ../src/core/core.c:157 -+#: ../src/core/delete.c:127 - #, c-format --msgid "Unknown window information request: %d" --msgstr "ウィンドウ情報の要求が不明です: %d" -- --#: ../src/core/delete.c:111 --#, fuzzy, c-format - msgid "“%s” is not responding." --msgstr "%s から応答がありません" -+msgstr "“%s” から応答がありません" - --#: ../src/core/delete.c:113 -+#: ../src/core/delete.c:129 - msgid "Application is not responding." - msgstr "アプリケーションから応答がありません" - --#: ../src/core/delete.c:118 --msgid "You may choose to wait a short while for it to continue or force the application to quit entirely." -+#: ../src/core/delete.c:134 -+msgid "" -+"You may choose to wait a short while for it to continue or force the " -+"application to quit entirely." - msgstr "応答があるまで少し待つか、または強制的にアプリケーションを終了するか選択してください。" - --#: ../src/core/delete.c:125 -+#: ../src/core/delete.c:141 - msgid "_Wait" - msgstr "待機する(_W)" - --#: ../src/core/delete.c:125 -+#: ../src/core/delete.c:141 - msgid "_Force Quit" - msgstr "強制終了する(_F)" - --#: ../src/core/display.c:421 --#, c-format --msgid "Missing %s extension required for compositing" --msgstr "ウィンドウの合成に必要な %s という拡張モジュールが存在しません" -- --#: ../src/core/display.c:513 -+#: ../src/core/display.c:550 - #, c-format - msgid "Failed to open X Window System display '%s'\n" - msgstr "X Window System のディスプレイ '%s' のオープンに失敗しました\n" - --#: ../src/core/keybindings.c:1138 --#, c-format --msgid "Some other program is already using the key %s with modifiers %x as a binding\n" --msgstr "既にバインディングとして別のプログラムでキー %s (修飾キー %x) を使っています\n" -- --#: ../src/core/keybindings.c:1335 --#, fuzzy, c-format --msgid "\"%s\" is not a valid accelerator\n" --msgstr "\"%s\" はフォーカス属性のためには有効な値ではありません" -- --#: ../src/core/main.c:197 -+#: ../src/core/main.c:176 - msgid "Disable connection to session manager" - msgstr "セッションマネージャーに接続しない" - --#: ../src/core/main.c:203 -+#: ../src/core/main.c:182 - msgid "Replace the running window manager" - msgstr "実行中のウィンドウマネージャーを置き換える" - --#: ../src/core/main.c:209 -+#: ../src/core/main.c:188 - msgid "Specify session management ID" - msgstr "セッション管理 ID を指定する" - --#: ../src/core/main.c:214 -+#: ../src/core/main.c:193 - msgid "X Display to use" - msgstr "使用する X ディスプレイを指定する" - --#: ../src/core/main.c:220 -+#: ../src/core/main.c:199 - msgid "Initialize session from savefile" - msgstr "保存ファイルからセッションを初期化する" - - # 'X' という1文字は固有名詞のため大文字にする --#: ../src/core/main.c:226 -+#: ../src/core/main.c:205 - msgid "Make X calls synchronous" - msgstr "X の呼び出しを同期する" - --#: ../src/core/main.c:534 -+#: ../src/core/main.c:212 -+msgid "Run as a wayland compositor" -+msgstr "Wayland コンポジターとして実行" -+ -+#: ../src/core/main.c:220 -+msgid "Run as a full display server, rather than nested" -+msgstr "ネストではなく完全なディスプレイサーバーとして実行" -+ -+#: ../src/core/main.c:451 - #, c-format - msgid "Failed to scan themes directory: %s\n" - msgstr "テーマフォルダーのスキャンに失敗しました: %s\n" - --#: ../src/core/main.c:550 -+#: ../src/core/main.c:467 - #, c-format --msgid "Could not find a theme! Be sure %s exists and contains the usual themes.\n" -+msgid "" -+"Could not find a theme! Be sure %s exists and contains the usual themes.\n" - msgstr "テーマが見つかりませんでした! %s の存在と通常のテーマが含まれていることを確認してください。\n" - --#: ../src/core/mutter.c:40 -+#: ../src/core/mutter.c:39 - #, c-format - msgid "" - "mutter %s\n" - "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" - "This is free software; see the source for copying conditions.\n" --"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" -+"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A " -+"PARTICULAR PURPOSE.\n" - msgstr "" - "mutter %s\n" - "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" - "This is free software; see the source for copying conditions.\n" --"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" -+"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A " -+"PARTICULAR PURPOSE.\n" - --#: ../src/core/mutter.c:54 -+#: ../src/core/mutter.c:53 - msgid "Print version" - msgstr "バージョンを表示する" - --#: ../src/core/mutter.c:60 -+#: ../src/core/mutter.c:59 - msgid "Mutter plugin to use" - msgstr "使用する Mutter のプラグイン" - --#: ../src/core/prefs.c:1202 --msgid "Workarounds for broken applications disabled. Some applications may not behave properly.\n" --msgstr "仕様に準拠していないアプリケーションに対する次善策は無効になっています。一部のアプリケーションは正常に動作しない可能性があります\n" -- --#: ../src/core/prefs.c:1277 --#, c-format --msgid "Could not parse font description \"%s\" from GSettings key %s\n" --msgstr "GSettings の %2$s キーからフォント名 \"%1$s\" を解析できませんでした\n" -- --#: ../src/core/prefs.c:1343 --#, c-format --msgid "\"%s\" found in configuration database is not a valid value for mouse button modifier\n" --msgstr "設定データベース中の \"%s\" はマウスボタンの修飾キーとして妥当な値ではありません\n" -- --#: ../src/core/prefs.c:1909 --#, c-format --msgid "\"%s\" found in configuration database is not a valid value for keybinding \"%s\"\n" --msgstr "設定データベース中の \"%s\" はキーバインド \"%s\" に有効な値ではありません\n" -- --#: ../src/core/prefs.c:1999 -+#: ../src/core/prefs.c:2064 - #, c-format - msgid "Workspace %d" - msgstr "ワークスペース %d" - --#: ../src/core/screen.c:691 -+#: ../src/core/screen.c:537 - #, c-format - msgid "Screen %d on display '%s' is invalid\n" - msgstr "ディスプレイ '%2$s' 上のスクリーン %1$d は無効です\n" - --#: ../src/core/screen.c:707 --#, 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" -- --#: ../src/core/screen.c:734 -+#: ../src/core/screen.c:553 - #, c-format --msgid "Could not acquire window manager selection on screen %d display \"%s\"\n" --msgstr "ディスプレイ \"%2$s\" 上のスクリーン %1$d でウィンドウマネージャーの選択を取得できませんでした\n" -+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" - --#: ../src/core/screen.c:812 -+#: ../src/core/screen.c:646 - #, c-format - msgid "Screen %d on display \"%s\" already has a window manager\n" - msgstr "ディスプレイ \"%2$s\" 上のスクリーン %1$d はすでにウィンドウマネージャーを持っています\n" - --#: ../src/core/screen.c:998 --#, c-format --msgid "Could not release screen %d on display \"%s\"\n" --msgstr "ディスプレイ \"%2$s\" 上のスクリーン %1$d を解放できませんでした\n" -- --#: ../src/core/session.c:843 ../src/core/session.c:850 --#, c-format --msgid "Could not create directory '%s': %s\n" --msgstr "ディレクトリ '%s' を作成できませんでした : %s\n" -- --#: ../src/core/session.c:860 --#, c-format --msgid "Could not open session file '%s' for writing: %s\n" --msgstr "セッションファイル '%s' に書きこもうとオープンしましたが失敗しました: %s\n" -- --#: ../src/core/session.c:1001 --#, c-format --msgid "Error writing session file '%s': %s\n" --msgstr "セッションファイル '%s' を書き込み中にエラーが発生しました: %s\n" -- --#: ../src/core/session.c:1006 --#, c-format --msgid "Error closing session file '%s': %s\n" --msgstr "セッションファイル '%s' のクローズ中にエラーが発生しました: %s\n" -- --#: ../src/core/session.c:1136 --#, c-format --msgid "Failed to parse saved session file: %s\n" --msgstr "保存されたセッションファイルの解析に失敗しました: %s\n" -- --#: ../src/core/session.c:1185 --#, c-format --msgid " attribute seen but we already have the session ID" --msgstr " 属性はありますが、既にセッション ID を所有しています" -- --#: ../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 "<%2$s> エレメントに不明な属性 %1$s があります" -- --#: ../src/core/session.c:1215 --#, c-format --msgid "nested tag" --msgstr " タグがネストされています" -- --#: ../src/core/session.c:1457 --#, c-format --msgid "Unknown element %s" --msgstr "不明なエレメント %s があります" -- --#: ../src/core/session.c:1809 --msgid "These windows do not support "save current setup" and will have to be restarted manually next time you log in." --msgstr "これらのウィンドウは \"現在の設定を保存する\" 機能をサポートしません。次回ログインする時に手動で再起動してください。" -- --#: ../src/core/util.c:84 --#, c-format --msgid "Failed to open debug log: %s\n" --msgstr "デバッグログのオープンに失敗しました: %s\n" -- --#: ../src/core/util.c:94 --#, c-format --msgid "Failed to fdopen() log file %s: %s\n" --msgstr "ログファイル %s の fdopen() に失敗しました: %s\n" -- --#: ../src/core/util.c:100 --#, c-format --msgid "Opened log file %s\n" --msgstr "ログファイル %s をオープンしました\n" -- --#: ../src/core/util.c:119 ../src/tools/mutter-message.c:149 --#, c-format -+#: ../src/core/util.c:118 - msgid "Mutter was compiled without support for verbose mode\n" - msgstr "この mutter は詳細ログモードをサポートしていません\n" - --#: ../src/core/util.c:264 --msgid "Window manager: " --msgstr "ウィンドウマネージャー: " -- --#: ../src/core/util.c:412 --msgid "Bug in window manager: " --msgstr "ウィンドウマネージャーのバグ: " -- --#: ../src/core/util.c:443 --msgid "Window manager warning: " --msgstr "ウィンドウマネージャーの警告: " -- --#: ../src/core/util.c:471 --msgid "Window manager error: " --msgstr "ウィンドウマネージャーのエラー: " -- --#. first time through --#: ../src/core/window.c:7513 --#, c-format --msgid "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER window as specified in the ICCCM.\n" --msgstr "ウィンドウ %s は ICCCM で指定されていたような WM_CLIENT_LEADER ウィンドウの代わりに自分自身で SM_CLIENT_ID を設定しています\n" -- --#. We ignore mwm_has_resize_func because WM_NORMAL_HINTS is the --#. * authoritative source for that info. Some apps such as mplayer or --#. * xine disable resize via MWM but not WM_NORMAL_HINTS, but that --#. * leads to e.g. us not fullscreening their windows. Apps that set --#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain --#. * about these apps but make them work. --#. --#: ../src/core/window.c:8237 --#, c-format --msgid "Window %s sets an MWM hint indicating it isn't resizable, but sets min size %d x %d and max size %d x %d; this doesn't make much sense.\n" --msgstr "ウィンドウ %s はリサイズ可能ではない MWM ヒント指示を設定していますが、最小サイズ %d x %d と最大サイズ %d x %dも設定しています。これはあまり意味がありません\n" -- --#: ../src/core/window-props.c:318 --#, c-format --msgid "Application set a bogus _NET_WM_PID %lu\n" --msgstr "アプリケーションが間違った _NET_WM_PID %lu を設定しました\n" -- --#: ../src/core/window-props.c:434 --#, c-format --msgid "%s (on %s)" --msgstr "%s (%s)" -- --#: ../src/core/window-props.c:1517 --#, 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:1528 --#, 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 "" --"Window 0x%lx has property %s\n" --"that was expected to have type %s format %d\n" --"and actually has type %s format %d n_items %d.\n" --"This is most likely an application bug, not a window manager bug.\n" --"The window has title=\"%s\" class=\"%s\" name=\"%s\"\n" --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" --"ウィンドウの属性は title=\"%8$s\" class=\"%9$s\" name=\"%10$s\"です。\n" -- --#: ../src/core/xprops.c:411 --#, c-format --msgid "Property %s on window 0x%lx contained invalid UTF-8\n" --msgstr "ウィンドウ 0x%2$lx 上のプロパティ %1$s は無効なUTF-8を含んでいました\n" -- --#: ../src/core/xprops.c:494 --#, c-format --msgid "Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n" --msgstr "ウィンドウ 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/org.gnome.mutter.gschema.xml.in.h:1 --msgid "Modifier to use for extended window management operations" --msgstr "ウィンドウの拡張管理の操作で使用する修飾キー" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:2 --msgid "This key will initiate the \"overlay\", which is a combination window overview and application launching system. The default is intended to be the \"Windows key\" on PC hardware. It's expected that this binding either the default or set to the empty string." --msgstr "ここに指定したキーで「オーバーレイの機能」を起動します。この機能は GNOME Shell などが提供するウィンドウの全体表示やアプリの起動システムと連携します。デフォルトのキーは PC のキーボードにある [Windows キー] です。指定可能な値: デフォルトのキー、または空の文字列" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:3 --msgid "Attach modal dialogs" --msgstr "モーダルなダイアログを統合するかどうか" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:4 --msgid "When true, instead of having independent titlebars, modal dialogs appear attached to the titlebar of the parent window and are moved together with the parent window." --msgstr "TRUE にすると、タイトルバーを持つ通常のモーダルなダイアログを表示する代わりに、親ウィンドウのタイトルバーに統合したダイアログを表示します (親ウィンドウを移動すると一緒にモーダルなダイアログも移動します)。" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:5 --msgid "Enable edge tiling when dropping windows on screen edges" --msgstr "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:6 --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 "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:7 --msgid "Workspaces are managed dynamically" --msgstr "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:8 --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 "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:9 --msgid "Workspaces only on primary" --msgstr "プライマリモニターのみワークスペースを切り替えるかどうか" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:10 --msgid "Determines whether workspace switching should happen for windows on all monitors or only for windows on the primary monitor." --msgstr "全てのモニターにあるウィンドウに対してワークスペースの切り替えを可能にするか、またはプライマリモニターにあるウィンドウに対してのみワークスペースの切り替えを提供するかどうかです。" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:11 --msgid "No tab popup" --msgstr "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:12 --msgid "Determines whether the use of popup and highlight frame should be disabled for window cycling." --msgstr "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:13 --msgid "Delay focus changes until the pointer stops moving" --msgstr "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:14 --msgid "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then the focus will not be changed immediately when entering a window, but only after the pointer stops moving." --msgstr "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:15 --msgid "Draggable border width" --msgstr "ドラッグが可能になる境界線の幅" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:16 --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/org.gnome.mutter.gschema.xml.in.h:17 --msgid "Auto maximize nearly monitor sized windows" --msgstr "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:18 --msgid "If enabled, new windows that are initially the size of the monitor automatically get maximized." --msgstr "" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:19 --msgid "Select window from tab popup" --msgstr "タブのポップアップでウィンドウを選択します" -- --#: ../src/org.gnome.mutter.gschema.xml.in.h:20 --msgid "Cancel tab popup" --msgstr "" -- --#: ../src/tools/mutter-message.c:123 --#, c-format --msgid "Usage: %s\n" --msgstr "用法: %s\n" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:69 --msgid "Mi_nimize" --msgstr "最小化(_N)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:71 --msgid "Ma_ximize" --msgstr "最大化(_X)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:73 --msgid "Unma_ximize" --msgstr "元のサイズに戻す(_X)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:75 --msgid "Roll _Up" --msgstr "巻き上げる(_U)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:77 --msgid "_Unroll" --msgstr "展開する(_U)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:79 --msgid "_Move" --msgstr "移動(_M)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:81 --msgid "_Resize" --msgstr "サイズの変更(_R)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:83 --msgid "Move Titlebar On_screen" --msgstr "画面上でタイトルバーを移動する(_S)" -- --#. separator --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:86 ../src/ui/menu.c:88 --msgid "Always on _Top" --msgstr "最前面へ(_T)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:90 --msgid "_Always on Visible Workspace" --msgstr "すべてのワークスペースに配置する(_A)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:92 --msgid "_Only on This Workspace" --msgstr "現在のワークスペースのみ(_O)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:94 --msgid "Move to Workspace _Left" --msgstr "左側のワークスペースへ移動する(_L)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:96 --msgid "Move to Workspace R_ight" --msgstr "右側のワークスペースへ移動する(_I)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:98 --msgid "Move to Workspace _Up" --msgstr "上側のワークスペースへ移動する(_U)" -- --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:100 --msgid "Move to Workspace _Down" --msgstr "下側のワークスペースへ移動する(_D)" -- --#. separator --#. Translators: Translate this string the same way as you do in libwnck! --#: ../src/ui/menu.c:104 --msgid "_Close" --msgstr "閉じる(_C)" -- --#: ../src/ui/menu.c:204 --#, c-format --msgid "Workspace %d%n" --msgstr "ワークスペース %d%n" -- --#: ../src/ui/menu.c:214 --#, c-format --msgid "Workspace 1_0" --msgstr "ワークスペース 1_0" -- --#: ../src/ui/menu.c:216 --#, c-format --msgid "Workspace %s%d" --msgstr "ワークスペース %s%d" -- --#: ../src/ui/menu.c:397 --msgid "Move to Another _Workspace" --msgstr "別のワークスペースへ移動する(_W)" -- --#. This is the text that should appear next to menu accelerators --#. * that use the shift key. If the text on this key isn't typically --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:77 --msgid "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 --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:83 --msgid "Ctrl" --msgstr "Ctrl" -- --#. This is the text that should appear next to menu accelerators --#. * that use the alt key. If the text on this key isn't typically --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:89 --msgid "Alt" --msgstr "Alt" -- --#. This is the text that should appear next to menu accelerators --#. * that use the meta key. If the text on this key isn't typically --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:95 --msgid "Meta" --msgstr "Meta" -- --#. This is the text that should appear next to menu accelerators --#. * that use the super key. If the text on this key isn't typically --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:101 --msgid "Super" --msgstr "Super" -- --#. This is the text that should appear next to menu accelerators --#. * that use the hyper key. If the text on this key isn't typically --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:107 --msgid "Hyper" --msgstr "Hyper" -- --#. This is the text that should appear next to menu accelerators --#. * that use the mod2 key. If the text on this key isn't typically --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:113 --msgid "Mod2" --msgstr "Mod2" -- --#. This is the text that should appear next to menu accelerators --#. * that use the mod3 key. If the text on this key isn't typically --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:119 --msgid "Mod3" --msgstr "Mod3" -- --#. This is the text that should appear next to menu accelerators --#. * that use the mod4 key. If the text on this key isn't typically --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:125 --msgid "Mod4" --msgstr "Mod4" -- --#. This is the text that should appear next to menu accelerators --#. * that use the mod5 key. If the text on this key isn't typically --#. * translated on keyboards used for your language, don't translate --#. * this. --#. --#: ../src/ui/metaaccellabel.c:131 --msgid "Mod5" --msgstr "Mod5" -- - #. Translators: This represents the size of a window. The first number is - #. * the width of the window and the second is the height. --#. --#: ../src/ui/resizepopup.c:136 -+#. -+#: ../src/ui/resizepopup.c:134 - #, c-format - msgid "%d x %d" - msgstr "%d x %d" - --#: ../src/ui/theme.c:236 -+#: ../src/ui/theme.c:233 - msgid "top" - msgstr "上" - --#: ../src/ui/theme.c:238 -+#: ../src/ui/theme.c:235 - msgid "bottom" - msgstr "下" - --#: ../src/ui/theme.c:240 -+#: ../src/ui/theme.c:237 - msgid "left" - msgstr "左" - --#: ../src/ui/theme.c:242 -+#: ../src/ui/theme.c:239 - msgid "right" - msgstr "右" - --#: ../src/ui/theme.c:270 -+#: ../src/ui/theme.c:267 - #, c-format - msgid "frame geometry does not specify \"%s\" dimension" - msgstr "フレームジオメトリは \"%s\" のサイズを指定しません" - --#: ../src/ui/theme.c:289 -+#: ../src/ui/theme.c:286 - #, c-format - msgid "frame geometry does not specify dimension \"%s\" for border \"%s\"" - msgstr "境界 \"%2$s\" 用のフレームジオメトリは大きさ \"%1$s\" を指定しません" - --#: ../src/ui/theme.c:326 -+#: ../src/ui/theme.c:323 - #, c-format - msgid "Button aspect ratio %g is not reasonable" - msgstr "ボタンのアスペクト比 %g は妥当ではありません" - --#: ../src/ui/theme.c:338 -+#: ../src/ui/theme.c:335 - #, c-format - msgid "Frame geometry does not specify size of buttons" - msgstr "フレームジオメトリはボタンのサイズを指定しません" - --#: ../src/ui/theme.c:1051 -+#: ../src/ui/theme.c:1061 - #, c-format - msgid "Gradients should have at least two colors" - msgstr "階調度は少なくとも2つの色をもつべきです" - --#: ../src/ui/theme.c:1203 -+#: ../src/ui/theme.c:1211 - #, 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); のように括弧の中に色の名前とそれと代替えになる色の名前を指定してください" -+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:1219 -+#: ../src/ui/theme.c:1227 - #, c-format --msgid "Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-_ are valid" -+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:1233 -+#: ../src/ui/theme.c:1241 - #, 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\" はこの書式に合っていません)" -+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:1278 -+#: ../src/ui/theme.c:1286 - #, c-format --msgid "GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\"" --msgstr "\"%s\" を解析できませんでした; GTK の色指定では gtk:fg[NORMAL] のように状態を大括弧で囲み指定する必要があります (NORMAL は状態を示す)" -+msgid "" -+"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] " -+"where NORMAL is the state; could not parse \"%s\"" -+msgstr "" -+"\"%s\" を解析できませんでした; GTK の色指定では gtk:fg[NORMAL] のように状態を大括弧で囲み指定する必要があります " -+"(NORMAL は状態を示す)" - --#: ../src/ui/theme.c:1292 -+#: ../src/ui/theme.c:1300 - #, c-format --msgid "GTK color specification must have a close bracket after the state, e.g. gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\"" --msgstr "\"%s\" を解析できませんでした; GTK の色指定では gtk:fg[NORMAL] のように状態の後に右大括弧をつける必要があります (NORMAL は状態を示す)" -+msgid "" -+"GTK color specification must have a close bracket after the state, e.g. gtk:" -+"fg[NORMAL] where NORMAL is the state; could not parse \"%s\"" -+msgstr "" -+"\"%s\" を解析できませんでした; GTK の色指定では gtk:fg[NORMAL] のように状態の後に右大括弧をつける必要があります " -+"(NORMAL は状態を示す)" - --#: ../src/ui/theme.c:1303 -+#: ../src/ui/theme.c:1311 - #, c-format - msgid "Did not understand state \"%s\" in color specification" - msgstr "色指定で状態 \"%s\" は理解しませんでした" - --#: ../src/ui/theme.c:1316 -+#: ../src/ui/theme.c:1324 - #, c-format - msgid "Did not understand color component \"%s\" in color specification" - msgstr "色指定でカラーコンポーネント \"%s\" は理解しませんでした" - --#: ../src/ui/theme.c:1345 -+#: ../src/ui/theme.c:1352 - #, c-format --msgid "Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the format" -+msgid "" -+"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the " -+"format" - msgstr "混合色のフォーマットは \"blend/bg_color/fg_color/alpha\" で、\"%s\" はこのフォーマットに適合していません" - --#: ../src/ui/theme.c:1356 -+#: ../src/ui/theme.c:1363 - #, c-format - msgid "Could not parse alpha value \"%s\" in blended color" - msgstr "混合色のアルファ値 \"%s\" を解析できませんでした" - --#: ../src/ui/theme.c:1366 -+#: ../src/ui/theme.c:1373 - #, 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:1413 -+#: ../src/ui/theme.c:1419 - #, c-format --msgid "Shade format is \"shade/base_color/factor\", \"%s\" does not fit the 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:1424 -+#: ../src/ui/theme.c:1430 - #, c-format - msgid "Could not parse shade factor \"%s\" in shaded color" - msgstr "シェードカラーのシェード係数 \"%s\" を解析できませんでした" - --#: ../src/ui/theme.c:1434 -+#: ../src/ui/theme.c:1440 - #, c-format - msgid "Shade factor \"%s\" in shaded color is negative" - msgstr "シェードカラーのシェード係数 \"%s\" が負の値です" - --#: ../src/ui/theme.c:1463 -+#: ../src/ui/theme.c:1469 - #, c-format - msgid "Could not parse color \"%s\"" - msgstr "色 \"%s\" を解析できませんでした" - --#: ../src/ui/theme.c:1780 -+#: ../src/ui/theme.c:1778 - #, c-format - msgid "Coordinate expression contains character '%s' which is not allowed" - msgstr "許可されていない文字 '%s' が座標式に含まれています" - --#: ../src/ui/theme.c:1807 -+#: ../src/ui/theme.c:1805 - #, c-format --msgid "Coordinate expression contains floating point number '%s' which could not be parsed" -+msgid "" -+"Coordinate expression contains floating point number '%s' which could not be " -+"parsed" - msgstr "解析できない浮動小数点数 '%s' が座標式に含まれています" - --#: ../src/ui/theme.c:1821 -+#: ../src/ui/theme.c:1819 - #, c-format - msgid "Coordinate expression contains integer '%s' which could not be parsed" - msgstr "解析できない整数 '%s' が座標式に含まれています" - --#: ../src/ui/theme.c:1942 -+#: ../src/ui/theme.c:1940 - #, c-format --msgid "Coordinate expression contained unknown operator at the start of this text: \"%s\"" -+msgid "" -+"Coordinate expression contained unknown operator at the start of this text: " -+"\"%s\"" - msgstr "座標式は次のテキストの先頭に無効な演算子を含んでいました: \"%s\"" - --#: ../src/ui/theme.c:1999 -+#: ../src/ui/theme.c:1997 - #, c-format - msgid "Coordinate expression was empty or not understood" - msgstr "座標式が空か解析不能です" - --#: ../src/ui/theme.c:2112 ../src/ui/theme.c:2122 ../src/ui/theme.c:2156 -+#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154 - #, c-format - msgid "Coordinate expression results in division by zero" - msgstr "座標式はゼロで除算しました" - --#: ../src/ui/theme.c:2164 -+#: ../src/ui/theme.c:2162 - #, c-format --msgid "Coordinate expression tries to use mod operator on a floating-point number" -+msgid "" -+"Coordinate expression tries to use mod operator on a floating-point number" - msgstr "座標式は浮動小数点で mod 演算子を使用しようとしています" - --#: ../src/ui/theme.c:2220 -+#: ../src/ui/theme.c:2218 - #, c-format --msgid "Coordinate expression has an operator \"%s\" where an operand was expected" -+msgid "" -+"Coordinate expression has an operator \"%s\" where an operand was expected" - msgstr "座標式はオペランドが必要な場所に演算子 \"%s\" を使用しています" - --#: ../src/ui/theme.c:2229 -+#: ../src/ui/theme.c:2227 - #, c-format - msgid "Coordinate expression had an operand where an operator was expected" - msgstr "座標式は演算子が必要な場所でオペランドを使用しています" - --#: ../src/ui/theme.c:2237 -+#: ../src/ui/theme.c:2235 - #, c-format - msgid "Coordinate expression ended with an operator instead of an operand" - msgstr "座標式はオペランドの代わりに演算子で終わっています" - --#: ../src/ui/theme.c:2247 -+#: ../src/ui/theme.c:2245 - #, c-format --msgid "Coordinate expression has operator \"%c\" following operator \"%c\" with no operand in between" -+msgid "" -+"Coordinate expression has operator \"%c\" following operator \"%c\" with no " -+"operand in between" - msgstr "座標式は演算子 \"%2$c\" の後に演算子 \"%1$c\" が続いており、これらの間にオペランドがありません" - --#: ../src/ui/theme.c:2398 ../src/ui/theme.c:2443 -+#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441 - #, c-format - msgid "Coordinate expression had unknown variable or constant \"%s\"" - msgstr "座標式は無効な値または定数 \"%s\" が使用されていました" - --#: ../src/ui/theme.c:2497 -+#: ../src/ui/theme.c:2495 - #, c-format - msgid "Coordinate expression parser overflowed its buffer." - msgstr "座標式を解析する際にオーバーフローが発生しました" - --#: ../src/ui/theme.c:2526 -+#: ../src/ui/theme.c:2524 - #, c-format - msgid "Coordinate expression had a close parenthesis with no open parenthesis" - msgstr "座標式は左括弧がなしに右括弧が指定されています" - --#: ../src/ui/theme.c:2590 -+#: ../src/ui/theme.c:2588 - #, c-format --msgid "Coordinate expression had an open parenthesis with no close parenthesis" -+msgid "" -+"Coordinate expression had an open parenthesis with no close parenthesis" - msgstr "座標式は左括弧が指定されていますが、右括弧がありません" - --#: ../src/ui/theme.c:2601 -+#: ../src/ui/theme.c:2599 - #, c-format - msgid "Coordinate expression doesn't seem to have any operators or operands" - msgstr "座標式は演算子もオペランドも使用していないようです" - --#: ../src/ui/theme.c:2814 ../src/ui/theme.c:2834 ../src/ui/theme.c:2854 -+#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852 - #, c-format - msgid "Theme contained an expression that resulted in an error: %s\n" - msgstr "テーマにエラーを引き起こす式が含まれていました: %s\n" - --#: ../src/ui/theme.c:4500 -+#: ../src/ui/theme.c:4455 - #, c-format --msgid "