Compare commits

..

11 Commits

Author SHA1 Message Date
Carlos Garnacho
8d75ea69e3 wayland: Use weak ref to keep track of buffers
Instead of using a one-shot signal meant to happen then the buffer
is being destroyed.

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:10 +02:00
Carlos Garnacho
a7ee7559e4 compositor: Use redraw clip region to cull out children
This will avoid repainting too much of the background if the
bounding box turned out to be too large.

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:10 +02:00
Carlos Garnacho
af3475f65f ClutterStage: Store clip area as a region
This will allow drawing optimizations as a region is more concrete
than the bounding rectangle.

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:10 +02:00
Carlos Garnacho
77fd682c8b ClutterActor: Preserve valid paint volumes till the next relayout/repaint
Cuts down approximately 55% of paint volumes calculation when there's
windows that redraw frequently, but don't move.

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:10 +02:00
Carlos Garnacho
fa8e4f60f6 compositor: Ensure to clip partial shadow redraws
Otherwise we end up drawing too far outside the clip area, which
brings in artifacts now that we have tighter regions instead of
an overlapping rect.

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:10 +02:00
Carlos Garnacho
b98a8d9932 clutter: Avoid rounding compensation when invalidating 2D actors
This allows the redraw clip to be more constrained, so MetaCullable doesn't
end up rendering portions of window shadows, frame and background when a
window invalidates (part of) its contents.

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:10 +02:00
Carlos Garnacho
864bc793aa cogl: Ensure to only clear the depth buffer if depth testing is enabled
The depth buffer is marked as invalid when 1) the framebuffer is just created,
and 2) whenever GL_DEPTH_TEST is enabled on it. This will ensure the
framebuffers attached depth buffer (if any) is properly cleared before it's
actually used, while saving needless clears while depth testing is disabled
(the default).

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:10 +02:00
Carlos Garnacho
e5b06754e0 compositor: Remove MetaSurfaceActor::repaint-scheduled signal
It's unused now.

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:09 +02:00
Carlos Garnacho
3402c50625 compositor: Use queue_redraw vmethod over repaint-scheduled signal
https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:09 +02:00
Carlos Garnacho
060543466c compositor: Avoid changing pipeline/source if shadow is not being painted
Avoids some context invalidations in cogl.

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:09 +02:00
Carlos Garnacho
65e816908a clutter: Add ClutterPaintVolume argument to ClutterActor::queue_redraw
This is an ABI break, hopefully an unimportant one since this signal/vmethod
is barely overridden.

The signal has been added an extra ClutterPaintVolume argument, and has been
given a boolean return value. The recursion to the parents has been taken
out of the default implementation and into the caller, using the returned
boolean parameter to control further propagation.

Passing the ClutterPaintVolume is easier on performance, as we don't need
setting this pointer as gobject data just to retrieve/unset it further
in propagation.

https://bugzilla.gnome.org/show_bug.cgi?id=782344
2017-05-22 17:43:09 +02:00
247 changed files with 18939 additions and 25521 deletions

103
NEWS
View File

@@ -1,106 +1,3 @@
3.25.91
=======
* Reduce memory use of suspended instances [Jonas; #786299]
* Make supported scales determination saner [Rui; #786474]
* Fix crash on inhibit-shortcuts dialog reponse [Jonas; #786385]
* Support libinput's tag-and-drag setting [freeroot; #775755]
* Avoid overlapping keybindings with multiple layouts [Jonas; #786408]
* Fix non-transformed cursor on rotated monitors [Jonas; #786023]
* Avoid unnecessary work during background painting [Alessandro; #783512]
* Misc. bug fixes [Alberts, Jonas, Mario; #691611, #786300, #777732, #786568]
Contributors:
freeroot, Jonas Ådahl, Alessandro Bono, Carlos Garnacho, Rui Matos,
Alberts Muktupāvels, Mario Sanchez Prada
Translations:
Muhammet Kara [tr], Claude Paroz [fr], Мирослав Николић [sr, sr@latin],
Pawan Chitrakar [ne], Kukuh Syafaat [id]
3.25.90
=======
* Add zwp_linux_dmabuf_v1 support [Daniel; #785262]
* Add (x)wayland shortcut inhibitor support [Olivier; #783342]
* Misc. bug fixes [Daniel, Carlos, Cosimo; #785263, #785347, #767805]
Contributors:
Jonas Ådahl, Cosimo Cecchi, Olivier Fourdan, Carlos Garnacho, Daniel Stone
Translations:
Fabio Tomat [fur], Kukuh Syafaat [id], Aurimas Černius [lt],
Daniel Mustieles [es], Baurzhan Muftakhidinov [kk], Jordi Mas [ca],
Matej Urbančič [sl], Marek Cernocky [cs], gogo [hr], Fran Dieguez [gl],
Balázs Meskó [hu]
3.25.4
======
* Do not throttle motion events on tablet tools [Carlos; #783535]
* Handle left-handed mode on pen/eraser devices [Carlos; #782027]
* Add wl_surface.damage_buffer() support [Jonas; #784080]
* Fix crash when moving across on-adjacent monitors [Jonas; #783630]
* Fix window moving/resizing via tablet tools [Jason; #777333]
* Support fractional monitor scaling [Jonas, Marco; #765011]
* Keep override-redirect windows stacked on top [Rui; #780485]
* Implement tablet rings/strips configuration [Carlos; #782033]
* Support tablet wheel events on wayland [Jason; #783716]
* Move g-s-d xrandr functionality into mutter [Rui; #781906]
* Misc. bug fixes [Florian, Jason, Miguel, Carlos, Jonas; #783502, #784009,
#784223, #784272, #784402, #784881, #762083, #784867, #781723]
Contributors:
Jonas Ådahl, Miguel A. Vico, Emmanuele Bassi, Carlos Garnacho, Jason Gerecke,
Rui Matos, Florian Müllner, Marco Trevisan (Treviño)
3.25.3
======
* Ignore hotplug-mode-update value on startup [Marco; #783073]
* Implement configurable monitor scales on X11 [Jonas; #777732]
* Fix handling of tiled monitors [Jonas; #781723]
* Handle multiple keycodes for keysym [Christian; #781223]
* Consider subsurfaces when grabbing [mindtree; #781811]
* Fix logic for HiPDPI scaling of TV outputs [Christian; #777347]
* Fix handling of left-handed mode on pen/eraser devices [Carlos; #782027]
* Fix output cycling in non-display-attached tablets [Carlos; #782032]
* Fix wacom cursor offset on wayland [Jason; #784009]
* Handle EXIF orientation of backgrounds [Silvère; #783125]
* Misc. bug fixes [Piotr, Tim, Bastien, Jonas, Florian, Benoit, Carlos; #772218,
#783161, #780407, #783113, #783293, #783505, #781703]
Contributors:
mitchmindtree, Jonas Ådahl, Ikey Doherty, Piotr Drąg, Carlos Garnacho,
Jason Gerecke, Benoit Gschwind, Christian Kellner, Silvère Latchurié,
Tim Lunn, Florian Müllner, Bastien Nocera, Marco Trevisan (Treviño)
Translations:
Fabio Tomat [fur], Kukuh Syafaat [id], Khaled Hosny [ar],
Daniel Mustieles [es]
3.25.2
======
* Fix frame updates on hide-titlebar-when-maximized changes [Florian; #781862]
* Fix accessible screen coordinates on X11 [Florian; #781902]
* Use less CPU when rendering fast-updating windows [Carlos, Emmanuele; #782344]
* Compute geometry of clients that don't set one explicitly [Olivier; #782213]
* Fix copy+paste of UTF8 strings between X11 and wayland [Carlos; #782472]
* Fix non-wayland builds [Chris; #780533]
* Add plugin vfunc to implement a custom force-quit dialog [Carlos; #711619]
* Fix swapped red and blue channels in CoglTexture data [Carlos; #779234
* Fix build where libtool's link_all_deplibs defaults to 'no' [Marco; #782821]
* Fix glitches when opening a window maximized [Olivier; #781353, #782183]
* Fix wrong cursor after window underneath the pointer changed [Carlos; #755164]
* Implement support for disable-while-typing option [Evan; #764852]
* Emit size-change signal when tiling [Alessandro; #782968]
* Misc. bug fixes [Nigel, Matthias, Jonas; #759085, #780215, #782156, #782152]
Contributors:
Jonas Ådahl, Emmanuele Bassi, Alessandro Bono, Olivier Fourdan,
Carlos Garnacho, Matthias Liertzer, Florian Müllner, Nigel Taylor,
Marco Trevisan (Treviño), Chris Vine, Evan Welsh
Translations:
Fabio Tomat [fur], Jordi Mas [ca], Mario Blättermann [de],
Emin Tufan Çetin [tr], Balázs Úr [hu]
3.25.1 3.25.1
====== ======
* Always sync window geometry on state changes [Jonas; #780292] * Always sync window geometry on state changes [Jonas; #780292]

View File

@@ -34,7 +34,6 @@ stamp-marshal: $(marshal_list)
$(AM_V_GEN)$(GLIB_GENMARSHAL) \ $(AM_V_GEN)$(GLIB_GENMARSHAL) \
--prefix=$(glib_marshal_prefix) \ --prefix=$(glib_marshal_prefix) \
--header \ --header \
--valist-marshallers \
$(marshal_list) > xgen-mh \ $(marshal_list) > xgen-mh \
&& (cmp -s xgen-mh $(marshal_h) || cp -f xgen-mh $(marshal_h)) \ && (cmp -s xgen-mh $(marshal_h) || cp -f xgen-mh $(marshal_h)) \
&& rm -f xgen-mh \ && rm -f xgen-mh \
@@ -47,8 +46,6 @@ $(marshal_c): $(marshal_h)
$(AM_V_GEN)$(GLIB_GENMARSHAL) \ $(AM_V_GEN)$(GLIB_GENMARSHAL) \
--prefix=$(glib_marshal_prefix) \ --prefix=$(glib_marshal_prefix) \
--body \ --body \
--valist-marshallers \
--prototypes \
$(marshal_list) > xgen-mc \ $(marshal_list) > xgen-mc \
&& (cmp -s xgen-mc $(marshal_c) || cp -f xgen-mc $(marshal_c)) \ && (cmp -s xgen-mc $(marshal_c) || cp -f xgen-mc $(marshal_c)) \
&& rm -f xgen-mc && rm -f xgen-mc

View File

@@ -283,9 +283,6 @@ void _clutter_actor_queue_redraw_full
ClutterPaintVolume *volume, ClutterPaintVolume *volume,
ClutterEffect *effect); ClutterEffect *effect);
ClutterPaintVolume * _clutter_actor_get_queue_redraw_clip (ClutterActor *self);
void _clutter_actor_set_queue_redraw_clip (ClutterActor *self,
ClutterPaintVolume *clip_volume);
void _clutter_actor_finish_queue_redraw (ClutterActor *self, void _clutter_actor_finish_queue_redraw (ClutterActor *self,
ClutterPaintVolume *clip); ClutterPaintVolume *clip);

View File

@@ -840,6 +840,7 @@ struct _ClutterActorPrivate
guint needs_compute_expand : 1; guint needs_compute_expand : 1;
guint needs_x_expand : 1; guint needs_x_expand : 1;
guint needs_y_expand : 1; guint needs_y_expand : 1;
guint needs_paint_volume_update : 1;
}; };
enum enum
@@ -2619,6 +2620,7 @@ clutter_actor_real_allocate (ClutterActor *self,
g_object_freeze_notify (G_OBJECT (self)); g_object_freeze_notify (G_OBJECT (self));
changed = clutter_actor_set_allocation_internal (self, box, flags); changed = clutter_actor_set_allocation_internal (self, box, flags);
priv->needs_paint_volume_update = changed;
/* we allocate our children before we notify changes in our geometry, /* we allocate our children before we notify changes in our geometry,
* so that people connecting to properties will be able to get valid * so that people connecting to properties will be able to get valid
@@ -2641,9 +2643,12 @@ clutter_actor_real_allocate (ClutterActor *self,
} }
static void static void
_clutter_actor_signal_queue_redraw (ClutterActor *self, _clutter_actor_propagate_queue_redraw (ClutterActor *self,
ClutterActor *origin) ClutterActor *origin,
ClutterPaintVolume *pv)
{ {
gboolean stop = FALSE;
/* no point in queuing a redraw on a destroyed actor */ /* no point in queuing a redraw on a destroyed actor */
if (CLUTTER_ACTOR_IN_DESTRUCTION (self)) if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
return; return;
@@ -2652,27 +2657,33 @@ _clutter_actor_signal_queue_redraw (ClutterActor *self,
* the actor bas been cloned. In this case the clone will need to * the actor bas been cloned. In this case the clone will need to
* receive the signal so it can queue its own redraw. * receive the signal so it can queue its own redraw.
*/ */
while (self)
{
_clutter_actor_queue_redraw_on_clones (self);
_clutter_actor_queue_redraw_on_clones (self); /* calls klass->queue_redraw in default handler */
if (g_signal_has_handler_pending (self, actor_signals[QUEUE_REDRAW],
/* calls klass->queue_redraw in default handler */
if (g_signal_has_handler_pending (self, actor_signals[QUEUE_REDRAW],
0, TRUE)) 0, TRUE))
{ {
g_signal_emit (self, actor_signals[QUEUE_REDRAW], 0, origin); g_signal_emit (self, actor_signals[QUEUE_REDRAW], 0, origin, pv, &stop);
} }
else else
{ {
CLUTTER_ACTOR_GET_CLASS (self)->queue_redraw (self, origin); stop = CLUTTER_ACTOR_GET_CLASS (self)->queue_redraw (self, origin, pv);
}
if (stop)
break;
self = clutter_actor_get_parent (self);
} }
} }
static void static gboolean
clutter_actor_real_queue_redraw (ClutterActor *self, clutter_actor_real_queue_redraw (ClutterActor *self,
ClutterActor *origin) ClutterActor *origin,
ClutterPaintVolume *paint_volume)
{ {
ClutterActor *parent;
CLUTTER_NOTE (PAINT, "Redraw queued on '%s' (from: '%s')", CLUTTER_NOTE (PAINT, "Redraw queued on '%s' (from: '%s')",
_clutter_actor_get_debug_name (self), _clutter_actor_get_debug_name (self),
origin != NULL ? _clutter_actor_get_debug_name (origin) origin != NULL ? _clutter_actor_get_debug_name (origin)
@@ -2680,13 +2691,14 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
/* no point in queuing a redraw on a destroyed actor */ /* no point in queuing a redraw on a destroyed actor */
if (CLUTTER_ACTOR_IN_DESTRUCTION (self)) if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
return; return TRUE;
/* If the queue redraw is coming from a child then the actor has /* If the queue redraw is coming from a child then the actor has
become dirty and any queued effect is no longer valid */ become dirty and any queued effect is no longer valid */
if (self != origin) if (self != origin)
{ {
self->priv->is_dirty = TRUE; self->priv->is_dirty = TRUE;
self->priv->needs_paint_volume_update = TRUE;
self->priv->effect_to_redraw = NULL; self->priv->effect_to_redraw = NULL;
} }
@@ -2695,7 +2707,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
* won't change so we don't have to propagate up the hierarchy. * won't change so we don't have to propagate up the hierarchy.
*/ */
if (!CLUTTER_ACTOR_IS_VISIBLE (self)) if (!CLUTTER_ACTOR_IS_VISIBLE (self))
return; return TRUE;
/* Although we could determine here that a full stage redraw /* Although we could determine here that a full stage redraw
* has already been queued and immediately bail out, we actually * has already been queued and immediately bail out, we actually
@@ -2709,7 +2721,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
ClutterActor *stage = _clutter_actor_get_stage_internal (self); ClutterActor *stage = _clutter_actor_get_stage_internal (self);
if (stage != NULL && if (stage != NULL &&
_clutter_stage_has_full_redraw_queued (CLUTTER_STAGE (stage))) _clutter_stage_has_full_redraw_queued (CLUTTER_STAGE (stage)))
return; return TRUE;
} }
self->priv->propagated_one_redraw = TRUE; self->priv->propagated_one_redraw = TRUE;
@@ -2717,12 +2729,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
/* notify parents, if they are all visible eventually we'll /* notify parents, if they are all visible eventually we'll
* queue redraw on the stage, which queues the redraw idle. * queue redraw on the stage, which queues the redraw idle.
*/ */
parent = clutter_actor_get_parent (self); return FALSE;
if (parent != NULL)
{
/* this will go up recursively */
_clutter_actor_signal_queue_redraw (parent, origin);
}
} }
static void static void
@@ -8011,10 +8018,12 @@ clutter_actor_class_init (ClutterActorClass *klass)
G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_LAST |
G_SIGNAL_NO_HOOKS, G_SIGNAL_NO_HOOKS,
G_STRUCT_OFFSET (ClutterActorClass, queue_redraw), G_STRUCT_OFFSET (ClutterActorClass, queue_redraw),
NULL, NULL, g_signal_accumulator_true_handled,
_clutter_marshal_VOID__OBJECT, NULL,
G_TYPE_NONE, 1, _clutter_marshal_BOOLEAN__OBJECT_BOXED,
CLUTTER_TYPE_ACTOR); G_TYPE_BOOLEAN, 2,
CLUTTER_TYPE_ACTOR,
CLUTTER_TYPE_PAINT_VOLUME);
/** /**
* ClutterActor::queue-relayout: * ClutterActor::queue-relayout:
@@ -8519,6 +8528,7 @@ clutter_actor_init (ClutterActor *self)
priv->needs_width_request = TRUE; priv->needs_width_request = TRUE;
priv->needs_height_request = TRUE; priv->needs_height_request = TRUE;
priv->needs_allocation = TRUE; priv->needs_allocation = TRUE;
priv->needs_paint_volume_update = TRUE;
priv->cached_width_age = 1; priv->cached_width_age = 1;
priv->cached_height_age = 1; priv->cached_height_age = 1;
@@ -8612,8 +8622,7 @@ _clutter_actor_finish_queue_redraw (ClutterActor *self,
ClutterPaintVolume *clip) ClutterPaintVolume *clip)
{ {
ClutterActorPrivate *priv = self->priv; ClutterActorPrivate *priv = self->priv;
ClutterPaintVolume *pv; ClutterPaintVolume *pv = NULL;
gboolean clipped;
/* Remove queue entry early in the process, otherwise a new /* Remove queue entry early in the process, otherwise a new
queue_redraw() during signal handling could put back this queue_redraw() during signal handling could put back this
@@ -8640,8 +8649,7 @@ _clutter_actor_finish_queue_redraw (ClutterActor *self,
*/ */
if (clip) if (clip)
{ {
_clutter_actor_set_queue_redraw_clip (self, clip); pv = clip;
clipped = TRUE;
} }
else if (G_LIKELY (priv->last_paint_volume_valid)) else if (G_LIKELY (priv->last_paint_volume_valid))
{ {
@@ -8651,36 +8659,12 @@ _clutter_actor_finish_queue_redraw (ClutterActor *self,
ClutterActor *stage = _clutter_actor_get_stage_internal (self); ClutterActor *stage = _clutter_actor_get_stage_internal (self);
/* make sure we redraw the actors old position... */ /* make sure we redraw the actors old position... */
_clutter_actor_set_queue_redraw_clip (stage, _clutter_actor_propagate_queue_redraw (stage, stage,
&priv->last_paint_volume); &priv->last_paint_volume);
_clutter_actor_signal_queue_redraw (stage, stage);
_clutter_actor_set_queue_redraw_clip (stage, NULL);
/* XXX: Ideally the redraw signal would take a clip volume
* argument, but that would be an ABI break. Until we can
* break the ABI we pass the argument out-of-band
*/
/* setup the clip for the actors new position... */
_clutter_actor_set_queue_redraw_clip (self, pv);
clipped = TRUE;
} }
else
clipped = FALSE;
} }
else
clipped = FALSE;
_clutter_actor_signal_queue_redraw (self, self); _clutter_actor_propagate_queue_redraw (self, self, pv);
/* Just in case anyone is manually firing redraw signals without
* using the public queue_redraw() API we are careful to ensure that
* our out-of-band clip member is cleared before returning...
*
* Note: A NULL clip denotes a full-stage, un-clipped redraw
*/
if (G_LIKELY (clipped))
_clutter_actor_set_queue_redraw_clip (self, NULL);
} }
static void static void
@@ -8841,8 +8825,7 @@ _clutter_actor_queue_redraw_full (ClutterActor *self,
{ {
/* NB: NULL denotes an undefined clip which will result in a /* NB: NULL denotes an undefined clip which will result in a
* full redraw... */ * full redraw... */
_clutter_actor_set_queue_redraw_clip (self, NULL); _clutter_actor_propagate_queue_redraw (self, self, NULL);
_clutter_actor_signal_queue_redraw (self, self);
return; return;
} }
@@ -8916,6 +8899,7 @@ _clutter_actor_queue_redraw_full (ClutterActor *self,
} }
priv->is_dirty = TRUE; priv->is_dirty = TRUE;
priv->needs_paint_volume_update = TRUE;
} }
/** /**
@@ -12973,6 +12957,7 @@ clutter_actor_add_child_internal (ClutterActor *self,
child->priv->needs_width_request = TRUE; child->priv->needs_width_request = TRUE;
child->priv->needs_height_request = TRUE; child->priv->needs_height_request = TRUE;
child->priv->needs_allocation = TRUE; child->priv->needs_allocation = TRUE;
child->priv->needs_paint_volume_update = TRUE;
/* we only queue a relayout here, because any possible /* we only queue a relayout here, because any possible
* redraw has already been queued either by show() or * redraw has already been queued either by show() or
@@ -16650,26 +16635,6 @@ clutter_actor_has_pointer (ClutterActor *self)
return self->priv->has_pointer; return self->priv->has_pointer;
} }
/* XXX: This is a workaround for not being able to break the ABI of
* the QUEUE_REDRAW signal. It is an out-of-band argument. See
* clutter_actor_queue_clipped_redraw() for details.
*/
ClutterPaintVolume *
_clutter_actor_get_queue_redraw_clip (ClutterActor *self)
{
return g_object_get_data (G_OBJECT (self),
"-clutter-actor-queue-redraw-clip");
}
void
_clutter_actor_set_queue_redraw_clip (ClutterActor *self,
ClutterPaintVolume *clip)
{
g_object_set_data (G_OBJECT (self),
"-clutter-actor-queue-redraw-clip",
clip);
}
/** /**
* clutter_actor_has_allocation: * clutter_actor_has_allocation:
* @self: a #ClutterActor * @self: a #ClutterActor
@@ -17516,16 +17481,22 @@ _clutter_actor_get_paint_volume_mutable (ClutterActor *self)
priv = self->priv; priv = self->priv;
if (priv->paint_volume_valid) if (priv->paint_volume_valid)
clutter_paint_volume_free (&priv->paint_volume); {
if (!priv->needs_paint_volume_update)
return &priv->paint_volume;
clutter_paint_volume_free (&priv->paint_volume);
}
if (_clutter_actor_get_paint_volume_real (self, &priv->paint_volume)) if (_clutter_actor_get_paint_volume_real (self, &priv->paint_volume))
{ {
priv->paint_volume_valid = TRUE; priv->paint_volume_valid = TRUE;
priv->needs_paint_volume_update = FALSE;
return &priv->paint_volume; return &priv->paint_volume;
} }
else else
{ {
priv->paint_volume_valid = FALSE; priv->paint_volume_valid = FALSE;
priv->needs_paint_volume_update = FALSE;
return NULL; return NULL;
} }
} }

View File

@@ -236,8 +236,9 @@ struct _ClutterActorClass
void (* pick) (ClutterActor *actor, void (* pick) (ClutterActor *actor,
const ClutterColor *color); const ClutterColor *color);
void (* queue_redraw) (ClutterActor *actor, gboolean (* queue_redraw) (ClutterActor *actor,
ClutterActor *leaf_that_queued); ClutterActor *leaf_that_queued,
ClutterPaintVolume *paint_volume);
/* size negotiation */ /* size negotiation */
void (* get_preferred_width) (ClutterActor *self, void (* get_preferred_width) (ClutterActor *self,

View File

@@ -2179,61 +2179,3 @@ clutter_event_get_mode_group (const ClutterEvent *event)
return 0; return 0;
} }
} }
/**
* clutter_event_get_pad_event_details:
* @event: a pad event
* @number: (out) (optional): ring/strip/button number
* @mode: (out) (optional): pad mode as per the event
* @value: (out) (optional): event axis value
*
* Returns the details of a pad event.
*
* Returns: #TRUE if event details could be obtained
**/
gboolean
clutter_event_get_pad_event_details (const ClutterEvent *event,
guint *number,
guint *mode,
gdouble *value)
{
guint n, m;
gdouble v;
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (event->type == CLUTTER_PAD_BUTTON_PRESS ||
event->type == CLUTTER_PAD_BUTTON_RELEASE ||
event->type == CLUTTER_PAD_RING ||
event->type == CLUTTER_PAD_STRIP, FALSE);
switch (event->type)
{
case CLUTTER_PAD_BUTTON_PRESS:
case CLUTTER_PAD_BUTTON_RELEASE:
n = event->pad_button.button;
m = event->pad_button.mode;
v = 0.0;
break;
case CLUTTER_PAD_RING:
n = event->pad_ring.ring_number;
m = event->pad_ring.mode;
v = event->pad_ring.angle;
break;
case CLUTTER_PAD_STRIP:
n = event->pad_strip.strip_number;
m = event->pad_strip.mode;
v = event->pad_strip.value;
break;
default:
return FALSE;
}
if (number)
*number = n;
if (mode)
*mode = m;
if (value)
*value = v;
return TRUE;
}

View File

@@ -778,12 +778,6 @@ ClutterScrollFinishFlags clutter_event_get_scroll_finish_flags (const Clut
CLUTTER_AVAILABLE_IN_ALL CLUTTER_AVAILABLE_IN_ALL
guint clutter_event_get_mode_group (const ClutterEvent *event); guint clutter_event_get_mode_group (const ClutterEvent *event);
CLUTTER_AVAILABLE_IN_MUTTER
gboolean clutter_event_get_pad_event_details (const ClutterEvent *event,
guint *number,
guint *mode,
gdouble *value);
G_END_DECLS G_END_DECLS

View File

@@ -2243,15 +2243,10 @@ clutter_input_device_get_device_node (ClutterInputDevice *device)
ClutterInputDeviceMapping ClutterInputDeviceMapping
clutter_input_device_get_mapping_mode (ClutterInputDevice *device) clutter_input_device_get_mapping_mode (ClutterInputDevice *device)
{ {
ClutterInputDeviceType device_type;
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device),
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE); CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
device_type = clutter_input_device_get_device_type (device); CLUTTER_TABLET_DEVICE,
g_return_val_if_fail (device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE ||
device_type == CLUTTER_ERASER_DEVICE,
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE); CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
return device->mapping_mode; return device->mapping_mode;
@@ -2261,14 +2256,9 @@ void
clutter_input_device_set_mapping_mode (ClutterInputDevice *device, clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
ClutterInputDeviceMapping mapping) ClutterInputDeviceMapping mapping)
{ {
ClutterInputDeviceType device_type;
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device)); g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
g_return_if_fail (clutter_input_device_get_device_type (device) ==
device_type = clutter_input_device_get_device_type (device); CLUTTER_TABLET_DEVICE);
g_return_if_fail (device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE ||
device_type == CLUTTER_ERASER_DEVICE);
if (device->mapping_mode == mapping) if (device->mapping_mode == mapping)
return; return;

View File

@@ -1,6 +1,7 @@
BOOLEAN:BOXED BOOLEAN:BOXED
BOOLEAN:BOXED,INT,INT BOOLEAN:BOXED,INT,INT
BOOLEAN:OBJECT,BOOLEAN BOOLEAN:OBJECT,BOOLEAN
BOOLEAN:OBJECT,BOXED
BOOLEAN:OBJECT,BOXED,DOUBLE BOOLEAN:OBJECT,BOXED,DOUBLE
BOOLEAN:OBJECT,DOUBLE BOOLEAN:OBJECT,DOUBLE
BOOLEAN:OBJECT,ENUM BOOLEAN:OBJECT,ENUM

View File

@@ -1166,6 +1166,21 @@ _clutter_paint_volume_get_stage_paint_box (ClutterPaintVolume *pv,
_clutter_paint_volume_get_bounding_box (&projected_pv, box); _clutter_paint_volume_get_bounding_box (&projected_pv, box);
if (pv->is_2d && pv->actor &&
clutter_actor_get_z_position (pv->actor) == 0)
{
/* If the volume/actor are perfectly 2D, take the bounding box as
* good. We won't need to add any extra room for sub-pixel positioning
* in this case.
*/
clutter_paint_volume_free (&projected_pv);
box->x1 = CLUTTER_NEARBYINT (box->x1);
box->y1 = CLUTTER_NEARBYINT (box->y1);
box->x2 = CLUTTER_NEARBYINT (box->x2);
box->y2 = CLUTTER_NEARBYINT (box->y2);
return;
}
/* The aim here is that for a given rectangle defined with floating point /* The aim here is that for a given rectangle defined with floating point
* coordinates we want to determine a stable quantized size in pixels * coordinates we want to determine a stable quantized size in pixels
* that doesn't vary due to the original box's sub-pixel position. * that doesn't vary due to the original box's sub-pixel position.

View File

@@ -20,7 +20,6 @@
#include "clutter/clutter-stage-view.h" #include "clutter/clutter-stage-view.h"
#include <cairo-gobject.h> #include <cairo-gobject.h>
#include <math.h>
enum enum
{ {
@@ -39,7 +38,7 @@ static GParamSpec *obj_props[PROP_LAST];
typedef struct _ClutterStageViewPrivate typedef struct _ClutterStageViewPrivate
{ {
cairo_rectangle_int_t layout; cairo_rectangle_int_t layout;
float scale; int scale;
CoglFramebuffer *framebuffer; CoglFramebuffer *framebuffer;
CoglOffscreen *offscreen; CoglOffscreen *offscreen;
@@ -144,7 +143,7 @@ clutter_stage_view_blit_offscreen (ClutterStageView *view,
cogl_framebuffer_pop_matrix (priv->framebuffer); cogl_framebuffer_pop_matrix (priv->framebuffer);
} }
float int
clutter_stage_view_get_scale (ClutterStageView *view) clutter_stage_view_get_scale (ClutterStageView *view)
{ {
ClutterStageViewPrivate *priv = ClutterStageViewPrivate *priv =
@@ -242,7 +241,7 @@ clutter_stage_view_get_property (GObject *object,
g_value_set_boxed (value, priv->offscreen); g_value_set_boxed (value, priv->offscreen);
break; break;
case PROP_SCALE: case PROP_SCALE:
g_value_set_float (value, priv->scale); g_value_set_int (value, priv->scale);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -267,29 +266,13 @@ clutter_stage_view_set_property (GObject *object,
priv->layout = *layout; priv->layout = *layout;
break; break;
case PROP_FRAMEBUFFER: case PROP_FRAMEBUFFER:
g_clear_pointer (&priv->framebuffer, cogl_object_unref);
priv->framebuffer = g_value_dup_boxed (value); priv->framebuffer = g_value_dup_boxed (value);
#ifndef G_DISABLE_CHECKS
if (priv->framebuffer)
{
int fb_width, fb_height;
fb_width = cogl_framebuffer_get_width (priv->framebuffer);
fb_height = cogl_framebuffer_get_height (priv->framebuffer);
g_warn_if_fail (fabsf (roundf (fb_width / priv->scale) -
fb_width / priv->scale) < FLT_EPSILON);
g_warn_if_fail (fabsf (roundf (fb_height / priv->scale) -
fb_height / priv->scale) < FLT_EPSILON);
}
#endif
break; break;
case PROP_OFFSCREEN: case PROP_OFFSCREEN:
g_clear_pointer (&priv->offscreen, cogl_object_unref);
priv->offscreen = g_value_dup_boxed (value); priv->offscreen = g_value_dup_boxed (value);
break; break;
case PROP_SCALE: case PROP_SCALE:
priv->scale = g_value_get_float (value); priv->scale = g_value_get_int (value);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -318,7 +301,7 @@ clutter_stage_view_init (ClutterStageView *view)
priv->dirty_viewport = TRUE; priv->dirty_viewport = TRUE;
priv->dirty_projection = TRUE; priv->dirty_projection = TRUE;
priv->scale = 1.0; priv->scale = 1;
} }
static void static void
@@ -339,7 +322,6 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
"The view layout on the screen", "The view layout on the screen",
CAIRO_GOBJECT_TYPE_RECTANGLE_INT, CAIRO_GOBJECT_TYPE_RECTANGLE_INT,
G_PARAM_READWRITE | G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS); G_PARAM_STATIC_STRINGS);
obj_props[PROP_FRAMEBUFFER] = obj_props[PROP_FRAMEBUFFER] =
@@ -348,7 +330,6 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
"The front buffer of the view", "The front buffer of the view",
COGL_TYPE_HANDLE, COGL_TYPE_HANDLE,
G_PARAM_READWRITE | G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS); G_PARAM_STATIC_STRINGS);
obj_props[PROP_OFFSCREEN] = obj_props[PROP_OFFSCREEN] =
@@ -357,17 +338,16 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
"Framebuffer used as intermediate buffer", "Framebuffer used as intermediate buffer",
COGL_TYPE_HANDLE, COGL_TYPE_HANDLE,
G_PARAM_READWRITE | G_PARAM_READWRITE |
G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS); G_PARAM_STATIC_STRINGS);
obj_props[PROP_SCALE] = obj_props[PROP_SCALE] =
g_param_spec_float ("scale", g_param_spec_int ("scale",
"View scale", "View scale",
"The view scale", "The view scale",
0.5, G_MAXFLOAT, 1.0, 1, G_MAXINT, 1,
G_PARAM_READWRITE | G_PARAM_READWRITE |
G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, PROP_LAST, obj_props); g_object_class_install_properties (object_class, PROP_LAST, obj_props);
} }

View File

@@ -61,7 +61,7 @@ void clutter_stage_view_blit_offscreen (ClutterStageView *view,
const cairo_rectangle_int_t *clip); const cairo_rectangle_int_t *clip);
CLUTTER_AVAILABLE_IN_MUTTER CLUTTER_AVAILABLE_IN_MUTTER
float clutter_stage_view_get_scale (ClutterStageView *view); int clutter_stage_view_get_scale (ClutterStageView *view);
gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view); gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view);

View File

@@ -231,19 +231,35 @@ _clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window)
return TRUE; return TRUE;
} }
gboolean cairo_region_t *
_clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow *window, _clutter_stage_window_get_redraw_clip (ClutterStageWindow *window)
cairo_rectangle_int_t *stage_clip)
{ {
ClutterStageWindowIface *iface; ClutterStageWindowIface *iface;
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE); g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window); iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
if (iface->get_redraw_clip_bounds != NULL) if (iface->get_redraw_clip != NULL)
return iface->get_redraw_clip_bounds (window, stage_clip); return iface->get_redraw_clip (window);
return FALSE; return NULL;
}
gboolean
_clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow *window,
cairo_rectangle_int_t *stage_clip)
{
cairo_region_t *redraw_clip;
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
redraw_clip = _clutter_stage_window_get_redraw_clip (window);
if (!redraw_clip)
return FALSE;
cairo_region_get_extents (redraw_clip, stage_clip);
cairo_region_destroy (redraw_clip);
return TRUE;
} }
void void

View File

@@ -68,9 +68,7 @@ struct _ClutterStageWindowIface
cairo_rectangle_int_t *stage_rectangle); cairo_rectangle_int_t *stage_rectangle);
gboolean (* has_redraw_clips) (ClutterStageWindow *stage_window); gboolean (* has_redraw_clips) (ClutterStageWindow *stage_window);
gboolean (* ignoring_redraw_clips) (ClutterStageWindow *stage_window); gboolean (* ignoring_redraw_clips) (ClutterStageWindow *stage_window);
gboolean (* get_redraw_clip_bounds) (ClutterStageWindow *stage_window, cairo_region_t * (* get_redraw_clip) (ClutterStageWindow *stage_window);
cairo_rectangle_int_t *clip);
void (* set_accept_focus) (ClutterStageWindow *stage_window, void (* set_accept_focus) (ClutterStageWindow *stage_window,
gboolean accept_focus); gboolean accept_focus);
@@ -125,6 +123,7 @@ gboolean _clutter_stage_window_has_redraw_clips (ClutterStageWin
gboolean _clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window); gboolean _clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window);
gboolean _clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow *window, gboolean _clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow *window,
cairo_rectangle_int_t *clip); cairo_rectangle_int_t *clip);
cairo_region_t * _clutter_stage_window_get_redraw_clip (ClutterStageWindow *window);
void _clutter_stage_window_set_accept_focus (ClutterStageWindow *window, void _clutter_stage_window_set_accept_focus (ClutterStageWindow *window,
gboolean accept_focus); gboolean accept_focus);

View File

@@ -161,7 +161,6 @@ struct _ClutterStagePrivate
guint accept_focus : 1; guint accept_focus : 1;
guint motion_events_enabled : 1; guint motion_events_enabled : 1;
guint has_custom_perspective : 1; guint has_custom_perspective : 1;
guint stage_was_relayout : 1;
}; };
enum enum
@@ -962,7 +961,6 @@ _clutter_stage_process_queued_events (ClutterStage *stage)
ClutterEvent *next_event; ClutterEvent *next_event;
ClutterInputDevice *device; ClutterInputDevice *device;
ClutterInputDevice *next_device; ClutterInputDevice *next_device;
ClutterInputDeviceType device_type;
gboolean check_device = FALSE; gboolean check_device = FALSE;
event = l->data; event = l->data;
@@ -978,16 +976,8 @@ _clutter_stage_process_queued_events (ClutterStage *stage)
if (device != NULL && next_device != NULL) if (device != NULL && next_device != NULL)
check_device = TRUE; check_device = TRUE;
device_type = clutter_input_device_get_device_type (device); /* Skip consecutive motion events coming from the same device */
if (priv->throttle_motion_events && next_event != NULL)
/* Skip consecutive motion events coming from the same device,
* except those of tablet tools, since users of these events
* want no precision loss.
*/
if (priv->throttle_motion_events && next_event != NULL &&
device_type != CLUTTER_TABLET_DEVICE &&
device_type != CLUTTER_PEN_DEVICE &&
device_type != CLUTTER_ERASER_DEVICE)
{ {
if (event->type == CLUTTER_MOTION && if (event->type == CLUTTER_MOTION &&
(next_event->type == CLUTTER_MOTION || (next_event->type == CLUTTER_MOTION ||
@@ -1069,7 +1059,6 @@ _clutter_stage_maybe_relayout (ClutterActor *actor)
if (!CLUTTER_ACTOR_IN_RELAYOUT (stage)) if (!CLUTTER_ACTOR_IN_RELAYOUT (stage))
{ {
priv->relayout_pending = FALSE; priv->relayout_pending = FALSE;
priv->stage_was_relayout = TRUE;
CLUTTER_NOTE (ACTOR, "Recomputing layout"); CLUTTER_NOTE (ACTOR, "Recomputing layout");
@@ -1140,58 +1129,6 @@ clutter_stage_do_redraw (ClutterStage *stage)
stage); stage);
} }
static GSList *
_clutter_stage_check_updated_pointers (ClutterStage *stage)
{
ClutterStagePrivate *priv = stage->priv;
ClutterDeviceManager *device_manager;
GSList *updating = NULL;
const GSList *devices;
cairo_rectangle_int_t clip;
ClutterPoint point;
gboolean has_clip;
has_clip = _clutter_stage_window_get_redraw_clip_bounds (priv->impl, &clip);
device_manager = clutter_device_manager_get_default ();
devices = clutter_device_manager_peek_devices (device_manager);
for (; devices != NULL; devices = devices->next)
{
ClutterInputDevice *dev = devices->data;
if (clutter_input_device_get_device_mode (dev) !=
CLUTTER_INPUT_MODE_MASTER)
continue;
switch (clutter_input_device_get_device_type (dev))
{
case CLUTTER_POINTER_DEVICE:
case CLUTTER_TABLET_DEVICE:
case CLUTTER_PEN_DEVICE:
case CLUTTER_ERASER_DEVICE:
case CLUTTER_CURSOR_DEVICE:
if (!clutter_input_device_get_coords (dev, NULL, &point))
continue;
if (!has_clip ||
(point.x >= clip.x && point.x < clip.x + clip.width &&
point.y >= clip.y && point.y < clip.y + clip.height))
updating = g_slist_prepend (updating, dev);
break;
default:
/* Any other devices don't need checking, either because they
* don't have x/y coordinates, or because they're implicitly
* grabbed on an actor by default as it's the case of
* touch(screens).
*/
break;
}
}
return updating;
}
/** /**
* _clutter_stage_do_update: * _clutter_stage_do_update:
* @stage: A #ClutterStage * @stage: A #ClutterStage
@@ -1204,10 +1141,6 @@ gboolean
_clutter_stage_do_update (ClutterStage *stage) _clutter_stage_do_update (ClutterStage *stage)
{ {
ClutterStagePrivate *priv = stage->priv; ClutterStagePrivate *priv = stage->priv;
gboolean stage_was_relayout = priv->stage_was_relayout;
GSList *pointers = NULL;
priv->stage_was_relayout = FALSE;
/* if the stage is being destroyed, or if the destruction already /* if the stage is being destroyed, or if the destruction already
* happened and we don't have an StageWindow any more, then we * happened and we don't have an StageWindow any more, then we
@@ -1228,9 +1161,6 @@ _clutter_stage_do_update (ClutterStage *stage)
if (!priv->redraw_pending) if (!priv->redraw_pending)
return FALSE; return FALSE;
if (stage_was_relayout)
pointers = _clutter_stage_check_updated_pointers (stage);
clutter_stage_maybe_finish_queue_redraws (stage); clutter_stage_maybe_finish_queue_redraws (stage);
clutter_stage_do_redraw (stage); clutter_stage_do_redraw (stage);
@@ -1248,12 +1178,6 @@ _clutter_stage_do_update (ClutterStage *stage)
} }
#endif /* CLUTTER_ENABLE_DEBUG */ #endif /* CLUTTER_ENABLE_DEBUG */
while (pointers)
{
_clutter_input_device_update (pointers->data, NULL, TRUE);
pointers = g_slist_delete_link (pointers, pointers);
}
return TRUE; return TRUE;
} }
@@ -1275,45 +1199,44 @@ clutter_stage_real_queue_relayout (ClutterActor *self)
parent_class->queue_relayout (self); parent_class->queue_relayout (self);
} }
static void static gboolean
clutter_stage_real_queue_redraw (ClutterActor *actor, clutter_stage_real_queue_redraw (ClutterActor *actor,
ClutterActor *leaf) ClutterActor *leaf,
ClutterPaintVolume *redraw_clip)
{ {
ClutterStage *stage = CLUTTER_STAGE (actor); ClutterStage *stage = CLUTTER_STAGE (actor);
ClutterStageWindow *stage_window; ClutterStageWindow *stage_window;
ClutterPaintVolume *redraw_clip;
ClutterActorBox bounding_box; ClutterActorBox bounding_box;
ClutterActorBox intersection_box; ClutterActorBox intersection_box;
cairo_rectangle_int_t geom, stage_clip; cairo_rectangle_int_t geom, stage_clip;
if (CLUTTER_ACTOR_IN_DESTRUCTION (actor)) if (CLUTTER_ACTOR_IN_DESTRUCTION (actor))
return; return TRUE;
/* If the backend can't do anything with redraw clips (e.g. it already knows /* If the backend can't do anything with redraw clips (e.g. it already knows
* it needs to redraw everything anyway) then don't spend time transforming * it needs to redraw everything anyway) then don't spend time transforming
* any clip volume into stage coordinates... */ * any clip volume into stage coordinates... */
stage_window = _clutter_stage_get_window (stage); stage_window = _clutter_stage_get_window (stage);
if (stage_window == NULL) if (stage_window == NULL)
return; return TRUE;
if (_clutter_stage_window_ignoring_redraw_clips (stage_window)) if (_clutter_stage_window_ignoring_redraw_clips (stage_window))
{ {
_clutter_stage_window_add_redraw_clip (stage_window, NULL); _clutter_stage_window_add_redraw_clip (stage_window, NULL);
return; return FALSE;
} }
/* Convert the clip volume into stage coordinates and then into an /* Convert the clip volume into stage coordinates and then into an
* axis aligned stage coordinates bounding box... * axis aligned stage coordinates bounding box...
*/ */
redraw_clip = _clutter_actor_get_queue_redraw_clip (leaf);
if (redraw_clip == NULL) if (redraw_clip == NULL)
{ {
_clutter_stage_window_add_redraw_clip (stage_window, NULL); _clutter_stage_window_add_redraw_clip (stage_window, NULL);
return; return FALSE;
} }
if (redraw_clip->is_empty) if (redraw_clip->is_empty)
return; return TRUE;
_clutter_paint_volume_get_stage_paint_box (redraw_clip, _clutter_paint_volume_get_stage_paint_box (redraw_clip,
stage, stage,
@@ -1329,7 +1252,7 @@ clutter_stage_real_queue_redraw (ClutterActor *actor,
/* There is no need to track degenerate/empty redraw clips */ /* There is no need to track degenerate/empty redraw clips */
if (intersection_box.x2 <= intersection_box.x1 || if (intersection_box.x2 <= intersection_box.x1 ||
intersection_box.y2 <= intersection_box.y1) intersection_box.y2 <= intersection_box.y1)
return; return TRUE;
/* when converting to integer coordinates make sure we round the edges of the /* when converting to integer coordinates make sure we round the edges of the
* clip rectangle outwards... */ * clip rectangle outwards... */
@@ -1339,6 +1262,7 @@ clutter_stage_real_queue_redraw (ClutterActor *actor,
stage_clip.height = intersection_box.y2 - stage_clip.y; stage_clip.height = intersection_box.y2 - stage_clip.y;
_clutter_stage_window_add_redraw_clip (stage_window, &stage_clip); _clutter_stage_window_add_redraw_clip (stage_window, &stage_clip);
return FALSE;
} }
gboolean gboolean
@@ -1391,6 +1315,31 @@ clutter_stage_get_redraw_clip_bounds (ClutterStage *stage,
} }
} }
cairo_region_t *
clutter_stage_get_redraw_clip (ClutterStage *stage)
{
ClutterStagePrivate *priv;
cairo_rectangle_int_t clip;
cairo_region_t *region;
g_return_val_if_fail (CLUTTER_IS_STAGE (stage), NULL);
priv = stage->priv;
region = _clutter_stage_window_get_redraw_clip (priv->impl);
if (region)
return region;
if (!region)
{
/* Set clip to the full extents of the stage */
_clutter_stage_window_get_geometry (priv->impl, &clip);
region = cairo_region_create_rectangle (&clip);
}
return region;
}
static void static void
read_pixels_to_file (char *filename_stem, read_pixels_to_file (char *filename_stem,
int x, int x,
@@ -1445,9 +1394,9 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
gint read_x; gint read_x;
gint read_y; gint read_y;
float fb_width, fb_height; float fb_width, fb_height;
float fb_scale; int fb_scale;
float viewport_offset_x; int viewport_offset_x;
float viewport_offset_y; int viewport_offset_y;
priv = stage->priv; priv = stage->priv;
@@ -1474,8 +1423,8 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS))) if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS)))
{ {
CLUTTER_NOTE (PICK, "Pushing pick scissor clip x: %d, y: %d, 1x1", CLUTTER_NOTE (PICK, "Pushing pick scissor clip x: %d, y: %d, 1x1",
(int) dirty_x * fb_scale, dirty_x * fb_scale,
(int) dirty_y * fb_scale); dirty_y * fb_scale);
cogl_framebuffer_push_scissor_clip (fb, dirty_x * fb_scale, dirty_y * fb_scale, 1, 1); cogl_framebuffer_push_scissor_clip (fb, dirty_x * fb_scale, dirty_y * fb_scale, 1, 1);
} }
@@ -3622,9 +3571,9 @@ _clutter_stage_maybe_setup_viewport (ClutterStage *stage,
{ {
cairo_rectangle_int_t view_layout; cairo_rectangle_int_t view_layout;
ClutterPerspective perspective; ClutterPerspective perspective;
float fb_scale; int fb_scale;
float viewport_offset_x; int viewport_offset_x;
float viewport_offset_y; int viewport_offset_y;
float z_2d; float z_2d;
CLUTTER_NOTE (PAINT, CLUTTER_NOTE (PAINT,
@@ -4720,7 +4669,6 @@ capture_view (ClutterStage *stage,
int stride; int stride;
CoglBitmap *bitmap; CoglBitmap *bitmap;
cairo_rectangle_int_t view_layout; cairo_rectangle_int_t view_layout;
float view_scale;
framebuffer = clutter_stage_view_get_framebuffer (view); framebuffer = clutter_stage_view_get_framebuffer (view);
@@ -4731,11 +4679,8 @@ capture_view (ClutterStage *stage,
clutter_stage_do_paint_view (stage, view, rect); clutter_stage_do_paint_view (stage, view, rect);
} }
view_scale = clutter_stage_view_get_scale (view);
image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
rect->width * view_scale, rect->width, rect->height);
rect->height * view_scale);
cairo_surface_set_device_scale (image, view_scale, view_scale);
data = cairo_image_surface_get_data (image); data = cairo_image_surface_get_data (image);
stride = cairo_image_surface_get_stride (image); stride = cairo_image_surface_get_stride (image);
@@ -4743,8 +4688,7 @@ capture_view (ClutterStage *stage,
backend = clutter_get_default_backend (); backend = clutter_get_default_backend ();
context = clutter_backend_get_cogl_context (backend); context = clutter_backend_get_cogl_context (backend);
bitmap = cogl_bitmap_new_for_data (context, bitmap = cogl_bitmap_new_for_data (context,
rect->width * view_scale, rect->width, rect->height,
rect->height * view_scale,
CLUTTER_CAIRO_FORMAT_ARGB32, CLUTTER_CAIRO_FORMAT_ARGB32,
stride, stride,
data); data);
@@ -4752,8 +4696,8 @@ capture_view (ClutterStage *stage,
clutter_stage_view_get_layout (view, &view_layout); clutter_stage_view_get_layout (view, &view_layout);
cogl_framebuffer_read_pixels_into_bitmap (framebuffer, cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
(rect->x - view_layout.x) * view_scale, rect->x - view_layout.x,
(rect->y - view_layout.y) * view_scale, rect->y - view_layout.y,
COGL_READ_PIXELS_COLOR_BUFFER, COGL_READ_PIXELS_COLOR_BUFFER,
bitmap); bitmap);

View File

@@ -245,6 +245,9 @@ guchar * clutter_stage_read_pixels (ClutterStage
CLUTTER_AVAILABLE_IN_ALL CLUTTER_AVAILABLE_IN_ALL
void clutter_stage_get_redraw_clip_bounds (ClutterStage *stage, void clutter_stage_get_redraw_clip_bounds (ClutterStage *stage,
cairo_rectangle_int_t *clip); cairo_rectangle_int_t *clip);
CLUTTER_AVAILABLE_IN_MUTTER
cairo_region_t * clutter_stage_get_redraw_clip (ClutterStage *stage);
CLUTTER_AVAILABLE_IN_ALL CLUTTER_AVAILABLE_IN_ALL
void clutter_stage_ensure_viewport (ClutterStage *stage); void clutter_stage_ensure_viewport (ClutterStage *stage);
CLUTTER_AVAILABLE_IN_ALL CLUTTER_AVAILABLE_IN_ALL

View File

@@ -51,12 +51,10 @@
typedef struct _ClutterStageViewCoglPrivate typedef struct _ClutterStageViewCoglPrivate
{ {
/* /* Stores a list of previous damaged areas in the stage coordinate space */
* List of previous damaged areas in stage view framebuffer coordinate space.
*/
#define DAMAGE_HISTORY_MAX 16 #define DAMAGE_HISTORY_MAX 16
#define DAMAGE_HISTORY(x) ((x) & (DAMAGE_HISTORY_MAX - 1)) #define DAMAGE_HISTORY(x) ((x) & (DAMAGE_HISTORY_MAX - 1))
cairo_rectangle_int_t damage_history[DAMAGE_HISTORY_MAX]; cairo_region_t * damage_history[DAMAGE_HISTORY_MAX];
unsigned int damage_index; unsigned int damage_index;
} ClutterStageViewCoglPrivate; } ClutterStageViewCoglPrivate;
@@ -248,13 +246,10 @@ clutter_stage_cogl_has_redraw_clips (ClutterStageWindow *stage_window)
/* NB: at the start of each new frame there is an implied clip that /* NB: at the start of each new frame there is an implied clip that
* clips everything (i.e. nothing would be drawn) so we need to make * clips everything (i.e. nothing would be drawn) so we need to make
* sure we return True in the un-initialized case here. * sure we return True in the un-initialized case here.
*
* NB: a clip width of 0 means a full stage redraw has been queued
* so we effectively don't have any redraw clips in that case.
*/ */
if (!stage_cogl->initialized_redraw_clip || if (!stage_cogl->initialized_redraw_clip ||
(stage_cogl->initialized_redraw_clip && (stage_cogl->initialized_redraw_clip &&
stage_cogl->bounding_redraw_clip.width != 0)) stage_cogl->redraw_clip))
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
@@ -265,9 +260,9 @@ clutter_stage_cogl_ignoring_redraw_clips (ClutterStageWindow *stage_window)
{ {
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window); ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
/* NB: a clip width of 0 means a full stage redraw is required */ /* NB: a NULL clip means a full stage redraw is required */
if (stage_cogl->initialized_redraw_clip && if (stage_cogl->initialized_redraw_clip &&
stage_cogl->bounding_redraw_clip.width == 0) !stage_cogl->redraw_clip)
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
@@ -298,11 +293,11 @@ clutter_stage_cogl_add_redraw_clip (ClutterStageWindow *stage_window,
return; return;
/* A NULL stage clip means a full stage redraw has been queued and /* A NULL stage clip means a full stage redraw has been queued and
* we keep track of this by setting a zero width * we keep track of this by setting a NULL redraw_clip.
* stage_cogl->bounding_redraw_clip */ */
if (stage_clip == NULL) if (stage_clip == NULL)
{ {
stage_cogl->bounding_redraw_clip.width = 0; g_clear_pointer (&stage_cogl->redraw_clip, cairo_region_destroy);
stage_cogl->initialized_redraw_clip = TRUE; stage_cogl->initialized_redraw_clip = TRUE;
return; return;
} }
@@ -311,34 +306,27 @@ clutter_stage_cogl_add_redraw_clip (ClutterStageWindow *stage_window,
if (stage_clip->width == 0 || stage_clip->height == 0) if (stage_clip->width == 0 || stage_clip->height == 0)
return; return;
if (!stage_cogl->initialized_redraw_clip) if (!stage_cogl->redraw_clip)
{ {
stage_cogl->bounding_redraw_clip = *stage_clip; stage_cogl->redraw_clip = cairo_region_create_rectangle (stage_clip);
} }
else if (stage_cogl->bounding_redraw_clip.width > 0) else
{ {
_clutter_util_rectangle_union (&stage_cogl->bounding_redraw_clip, cairo_region_union_rectangle (stage_cogl->redraw_clip, stage_clip);
stage_clip,
&stage_cogl->bounding_redraw_clip);
} }
stage_cogl->initialized_redraw_clip = TRUE; stage_cogl->initialized_redraw_clip = TRUE;
} }
static gboolean static cairo_region_t *
clutter_stage_cogl_get_redraw_clip_bounds (ClutterStageWindow *stage_window, clutter_stage_cogl_get_redraw_clip (ClutterStageWindow *stage_window)
cairo_rectangle_int_t *stage_clip)
{ {
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window); ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window);
if (stage_cogl->using_clipped_redraw) if (stage_cogl->using_clipped_redraw && stage_cogl->redraw_clip)
{ return cairo_region_copy (stage_cogl->redraw_clip);
*stage_clip = stage_cogl->bounding_redraw_clip;
return TRUE; return NULL;
}
return FALSE;
} }
static inline gboolean static inline gboolean
@@ -416,44 +404,51 @@ swap_framebuffer (ClutterStageWindow *stage_window,
static void static void
paint_stage (ClutterStageCogl *stage_cogl, paint_stage (ClutterStageCogl *stage_cogl,
ClutterStageView *view, ClutterStageView *view,
const cairo_rectangle_int_t *clip) cairo_region_t *clip)
{ {
ClutterStage *stage = stage_cogl->wrapper; ClutterStage *stage = stage_cogl->wrapper;
cairo_rectangle_int_t clip_rect;
cairo_region_get_extents (clip, &clip_rect);
_clutter_stage_maybe_setup_viewport (stage, view); _clutter_stage_maybe_setup_viewport (stage, view);
_clutter_stage_paint_view (stage, view, clip); _clutter_stage_paint_view (stage, view, &clip_rect);
if (clutter_stage_view_get_onscreen (view) != if (clutter_stage_view_get_onscreen (view) !=
clutter_stage_view_get_framebuffer (view)) clutter_stage_view_get_framebuffer (view))
{ {
clutter_stage_view_blit_offscreen (view, clip); clutter_stage_view_blit_offscreen (view, &clip_rect);
} }
} }
static void static void
fill_current_damage_history_and_step (ClutterStageView *view) fill_current_damage_history (ClutterStageView *view,
cairo_region_t *damage)
{ {
ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (view); ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (view);
ClutterStageViewCoglPrivate *view_priv = ClutterStageViewCoglPrivate *view_priv =
clutter_stage_view_cogl_get_instance_private (view_cogl); clutter_stage_view_cogl_get_instance_private (view_cogl);
cairo_rectangle_int_t view_rect; cairo_region_t **current_damage;
float fb_scale;
cairo_rectangle_int_t *current_fb_damage;
current_fb_damage = current_damage =
&view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index)]; &view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index)];
clutter_stage_view_get_layout (view, &view_rect);
fb_scale = clutter_stage_view_get_scale (view);
*current_fb_damage = (cairo_rectangle_int_t) { g_clear_pointer (current_damage, cairo_region_destroy);
.x = 0, *current_damage = cairo_region_copy (damage);
.y = 0,
.width = view_rect.width * fb_scale,
.height = view_rect.height * fb_scale
};
view_priv->damage_index++; view_priv->damage_index++;
} }
static void
fill_current_damage_history_rectangle (ClutterStageView *view,
const cairo_rectangle_int_t *rect)
{
cairo_region_t *damage;
damage = cairo_region_create_rectangle (rect);
fill_current_damage_history (view, damage);
cairo_region_destroy (damage);
}
static void static void
transform_swap_region_to_onscreen (ClutterStageView *view, transform_swap_region_to_onscreen (ClutterStageView *view,
cairo_rectangle_int_t *swap_region) cairo_rectangle_int_t *swap_region)
@@ -490,40 +485,6 @@ transform_swap_region_to_onscreen (ClutterStageView *view,
}; };
} }
static void
calculate_scissor_region (cairo_rectangle_int_t *fb_clip_region,
int subpixel_compensation,
int fb_width,
int fb_height,
cairo_rectangle_int_t *out_scissor_rect)
{
int scissor_x;
int scissor_y;
int scissor_width;
int scissor_height;
scissor_x = fb_clip_region->x;
scissor_y = fb_clip_region->y;
scissor_width = fb_clip_region->width;
scissor_height = fb_clip_region->height;
if (fb_clip_region->x > 0)
scissor_x += subpixel_compensation;
if (fb_clip_region->y > 0)
scissor_y += subpixel_compensation;
if (fb_clip_region->x + fb_clip_region->width < fb_width)
scissor_width -= 2 * subpixel_compensation;
if (fb_clip_region->y + fb_clip_region->height < fb_height)
scissor_height -= 2 * subpixel_compensation;
*out_scissor_rect = (cairo_rectangle_int_t) {
.x = scissor_x,
.y = scissor_y,
.width = scissor_width,
.height = scissor_height
};
}
static gboolean static gboolean
clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window, clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
ClutterStageView *view) ClutterStageView *view)
@@ -542,20 +503,17 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
gboolean do_swap_buffer; gboolean do_swap_buffer;
gboolean swap_with_damage; gboolean swap_with_damage;
ClutterActor *wrapper; ClutterActor *wrapper;
cairo_rectangle_int_t redraw_clip; cairo_region_t *redraw_clip;
cairo_region_t *clip_region;
cairo_rectangle_int_t swap_region; cairo_rectangle_int_t swap_region;
cairo_rectangle_int_t fb_clip_region; cairo_rectangle_int_t clip_rect;
cairo_rectangle_int_t redraw_rect;
gboolean clip_region_empty; gboolean clip_region_empty;
float fb_scale; int fb_scale;
int subpixel_compensation = 0;
int fb_width, fb_height;
wrapper = CLUTTER_ACTOR (stage_cogl->wrapper); wrapper = CLUTTER_ACTOR (stage_cogl->wrapper);
clutter_stage_view_get_layout (view, &view_rect); clutter_stage_view_get_layout (view, &view_rect);
fb_scale = clutter_stage_view_get_scale (view);
fb_width = cogl_framebuffer_get_width (fb);
fb_height = cogl_framebuffer_get_height (fb);
can_blit_sub_buffer = can_blit_sub_buffer =
cogl_is_onscreen (fb) && cogl_is_onscreen (fb) &&
@@ -565,20 +523,19 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
cogl_is_onscreen (fb) && cogl_is_onscreen (fb) &&
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE); cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
/* NB: a zero width redraw clip == full stage redraw */ /* NB: a NULL redraw clip == full stage redraw */
if (stage_cogl->bounding_redraw_clip.width == 0) if (!stage_cogl->redraw_clip)
have_clip = FALSE; have_clip = FALSE;
else else
{ {
redraw_clip = stage_cogl->bounding_redraw_clip; cairo_region_t *view_region;
_clutter_util_rectangle_intersection (&redraw_clip, redraw_clip = cairo_region_copy (stage_cogl->redraw_clip);
&view_rect,
&redraw_clip);
have_clip = !(redraw_clip.x == view_rect.x && view_region = cairo_region_create_rectangle (&view_rect);
redraw_clip.y == view_rect.y && cairo_region_intersect (redraw_clip, view_region);
redraw_clip.width == view_rect.width &&
redraw_clip.height == view_rect.height); have_clip = !cairo_region_equal (redraw_clip, view_region);
cairo_region_destroy (view_region);
} }
may_use_clipped_redraw = FALSE; may_use_clipped_redraw = FALSE;
@@ -590,24 +547,12 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
cogl_onscreen_get_frame_counter (COGL_ONSCREEN (fb)) > 3) cogl_onscreen_get_frame_counter (COGL_ONSCREEN (fb)) > 3)
{ {
may_use_clipped_redraw = TRUE; may_use_clipped_redraw = TRUE;
clip_region = cairo_region_reference (redraw_clip);
if (fb_scale != floorf (fb_scale))
subpixel_compensation = ceilf (fb_scale);
fb_clip_region = (cairo_rectangle_int_t) {
.x = (floorf ((redraw_clip.x - view_rect.x) * fb_scale) -
subpixel_compensation),
.y = (floorf ((redraw_clip.y - view_rect.y) * fb_scale) -
subpixel_compensation),
.width = (ceilf (redraw_clip.width * fb_scale) +
(2 * subpixel_compensation)),
.height = (ceilf (redraw_clip.height * fb_scale) +
(2 * subpixel_compensation))
};
} }
else else
{ {
fb_clip_region = (cairo_rectangle_int_t) { 0 }; clip_region = cairo_region_create ();
redraw_clip = cairo_region_reference (clip_region);
} }
if (may_use_clipped_redraw && if (may_use_clipped_redraw &&
@@ -616,7 +561,9 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
else else
use_clipped_redraw = FALSE; use_clipped_redraw = FALSE;
clip_region_empty = may_use_clipped_redraw && fb_clip_region.width == 0; clip_region_empty = may_use_clipped_redraw && cairo_region_is_empty (clip_region);
fb_scale = clutter_stage_view_get_scale (view);
swap_with_damage = FALSE; swap_with_damage = FALSE;
if (has_buffer_age) if (has_buffer_age)
@@ -624,44 +571,26 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
if (use_clipped_redraw && !clip_region_empty) if (use_clipped_redraw && !clip_region_empty)
{ {
int age, i; int age, i;
cairo_rectangle_int_t *current_fb_damage =
&view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index++)];
age = cogl_onscreen_get_buffer_age (COGL_ONSCREEN (fb)); age = cogl_onscreen_get_buffer_age (COGL_ONSCREEN (fb));
if (valid_buffer_age (view_cogl, age)) if (valid_buffer_age (view_cogl, age))
{ {
cairo_rectangle_int_t damage_region; fill_current_damage_history (view, clip_region);
*current_fb_damage = fb_clip_region;
for (i = 1; i <= age; i++) for (i = 1; i <= age; i++)
{ {
cairo_rectangle_int_t *fb_damage = cairo_region_t *damage =
&view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - i - 1)]; view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - i - 1)];
cairo_region_union (clip_region, damage);
_clutter_util_rectangle_union (&fb_clip_region,
fb_damage,
&fb_clip_region);
} }
/* Update the bounding redraw clip state with the extra damage. */ /* Update the redraw clip state with the extra damage. */
damage_region = (cairo_rectangle_int_t) { cairo_region_union (stage_cogl->redraw_clip, clip_region);
.x = view_rect.x + floorf (fb_clip_region.x / fb_scale),
.y = view_rect.y + floorf (fb_clip_region.y / fb_scale),
.width = ceilf (fb_clip_region.width / fb_scale),
.height = ceilf (fb_clip_region.height / fb_scale)
};
_clutter_util_rectangle_union (&stage_cogl->bounding_redraw_clip,
&damage_region,
&stage_cogl->bounding_redraw_clip);
CLUTTER_NOTE (CLIPPING, "Reusing back buffer(age=%d) - repairing region: x=%d, y=%d, width=%d, height=%d\n", CLUTTER_NOTE (CLIPPING, "Reusing back buffer(age=%d) - repairing region: num rects: %d\n",
age, age,
fb_clip_region.x, cairo_region_num_rectangles (clip_region));
fb_clip_region.y,
fb_clip_region.width,
fb_clip_region.height);
swap_with_damage = TRUE; swap_with_damage = TRUE;
} }
@@ -669,20 +598,17 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
{ {
CLUTTER_NOTE (CLIPPING, "Invalid back buffer(age=%d): forcing full redraw\n", age); CLUTTER_NOTE (CLIPPING, "Invalid back buffer(age=%d): forcing full redraw\n", age);
use_clipped_redraw = FALSE; use_clipped_redraw = FALSE;
*current_fb_damage = (cairo_rectangle_int_t) { fill_current_damage_history_rectangle (view, &view_rect);
.x = 0,
.y = 0,
.width = view_rect.width * fb_scale,
.height = view_rect.height * fb_scale
};
} }
} }
else if (!use_clipped_redraw) else if (!use_clipped_redraw)
{ {
fill_current_damage_history_and_step (view); fill_current_damage_history_rectangle (view, &view_rect);
} }
} }
cairo_region_get_extents (clip_region, &clip_rect);
cogl_push_framebuffer (fb); cogl_push_framebuffer (fb);
if (use_clipped_redraw && clip_region_empty) if (use_clipped_redraw && clip_region_empty)
{ {
@@ -690,34 +616,26 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
} }
else if (use_clipped_redraw) else if (use_clipped_redraw)
{ {
cairo_rectangle_int_t scissor_rect; int scissor_x;
int scissor_y;
calculate_scissor_region (&fb_clip_region,
subpixel_compensation,
fb_width, fb_height,
&scissor_rect);
CLUTTER_NOTE (CLIPPING, CLUTTER_NOTE (CLIPPING,
"Stage clip pushed: x=%d, y=%d, width=%d, height=%d\n", "Stage clip pushed: x=%d, y=%d, width=%d, height=%d\n",
scissor_rect.x, clip_rect.x,
scissor_rect.y, clip_rect.y,
scissor_rect.width, clip_rect.width,
scissor_rect.height); clip_rect.height);
stage_cogl->using_clipped_redraw = TRUE; stage_cogl->using_clipped_redraw = TRUE;
scissor_x = (clip_rect.x - view_rect.x) * fb_scale;
scissor_y = (clip_rect.y - view_rect.y) * fb_scale;
cogl_framebuffer_push_scissor_clip (fb, cogl_framebuffer_push_scissor_clip (fb,
scissor_rect.x, scissor_x,
scissor_rect.y, scissor_y,
scissor_rect.width, clip_rect.width * fb_scale,
scissor_rect.height); clip_rect.height * fb_scale);
paint_stage (stage_cogl, view, paint_stage (stage_cogl, view, clip_region);
&(cairo_rectangle_int_t) {
.x = view_rect.x + floorf ((fb_clip_region.x - 0) / fb_scale),
.y = view_rect.y + floorf ((fb_clip_region.y - 0) / fb_scale),
.width = ceilf ((fb_clip_region.width + 0) / fb_scale),
.height = ceilf ((fb_clip_region.height + 0) / fb_scale)
});
cogl_framebuffer_pop_clip (fb); cogl_framebuffer_pop_clip (fb);
stage_cogl->using_clipped_redraw = FALSE; stage_cogl->using_clipped_redraw = FALSE;
@@ -727,47 +645,47 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
CLUTTER_NOTE (CLIPPING, "Unclipped stage paint\n"); CLUTTER_NOTE (CLIPPING, "Unclipped stage paint\n");
/* If we are trying to debug redraw issues then we want to pass /* If we are trying to debug redraw issues then we want to pass
* the bounding_redraw_clip so it can be visualized */ * the redraw_clip so it can be visualized */
if (G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS) && if (G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS) &&
may_use_clipped_redraw && may_use_clipped_redraw &&
!clip_region_empty) !clip_region_empty)
{ {
cairo_rectangle_int_t scissor_rect; int scissor_x;
int scissor_y;
calculate_scissor_region (&fb_clip_region,
subpixel_compensation,
fb_width, fb_height,
&scissor_rect);
scissor_x = (clip_rect.x - view_rect.x) * fb_scale;;
scissor_y = (clip_rect.y - view_rect.y) * fb_scale;
cogl_framebuffer_push_scissor_clip (fb, cogl_framebuffer_push_scissor_clip (fb,
scissor_rect.x, scissor_x,
scissor_rect.y, scissor_y,
scissor_rect.width, clip_rect.width * fb_scale,
scissor_rect.height); clip_rect.height * fb_scale);
paint_stage (stage_cogl, view, paint_stage (stage_cogl, view, clip_region);
&(cairo_rectangle_int_t) {
.x = view_rect.x + floorf (fb_clip_region.x / fb_scale),
.y = view_rect.y + floorf (fb_clip_region.y / fb_scale),
.width = ceilf (fb_clip_region.width / fb_scale),
.height = ceilf (fb_clip_region.height / fb_scale)
});
cogl_framebuffer_pop_clip (fb); cogl_framebuffer_pop_clip (fb);
} }
else else
paint_stage (stage_cogl, view, &view_rect); {
cairo_region_t *view_region;
view_region = cairo_region_create_rectangle (&view_rect);
paint_stage (stage_cogl, view, view_region);
cairo_region_destroy (view_region);
}
} }
cogl_pop_framebuffer (); cogl_pop_framebuffer ();
cairo_region_get_extents (redraw_clip, &redraw_rect);
if (may_use_clipped_redraw && if (may_use_clipped_redraw &&
G_UNLIKELY ((clutter_paint_debug_flags & CLUTTER_DEBUG_REDRAWS))) G_UNLIKELY ((clutter_paint_debug_flags & CLUTTER_DEBUG_REDRAWS)))
{ {
CoglContext *ctx = cogl_framebuffer_get_context (fb); CoglContext *ctx = cogl_framebuffer_get_context (fb);
static CoglPipeline *outline = NULL; static CoglPipeline *outline = NULL;
ClutterActor *actor = CLUTTER_ACTOR (wrapper); ClutterActor *actor = CLUTTER_ACTOR (wrapper);
float x_1 = redraw_clip.x; float x_1 = redraw_rect.x;
float x_2 = redraw_clip.x + redraw_clip.width; float x_2 = redraw_rect.x + redraw_rect.width;
float y_1 = redraw_clip.y; float y_1 = redraw_rect.y;
float y_2 = redraw_clip.y + redraw_clip.height; float y_2 = redraw_rect.y + redraw_rect.height;
CoglVertexP2 quad[4] = { CoglVertexP2 quad[4] = {
{ x_1, y_1 }, { x_1, y_1 },
{ x_2, y_1 }, { x_2, y_1 },
@@ -813,7 +731,12 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
} }
else if (use_clipped_redraw) else if (use_clipped_redraw)
{ {
swap_region = fb_clip_region; swap_region = (cairo_rectangle_int_t) {
.x = (clip_rect.x - view_rect.x) * fb_scale,
.y = (clip_rect.y - view_rect.y) * fb_scale,
.width = clip_rect.width * fb_scale,
.height = clip_rect.height * fb_scale,
};
g_assert (swap_region.width > 0); g_assert (swap_region.width > 0);
do_swap_buffer = TRUE; do_swap_buffer = TRUE;
} }
@@ -834,6 +757,11 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
do_swap_buffer = TRUE; do_swap_buffer = TRUE;
} }
if (redraw_clip)
cairo_region_destroy (redraw_clip);
if (clip_region)
cairo_region_destroy (clip_region);
if (do_swap_buffer) if (do_swap_buffer)
{ {
if (clutter_stage_view_get_onscreen (view) != if (clutter_stage_view_get_onscreen (view) !=
@@ -881,6 +809,7 @@ clutter_stage_cogl_redraw (ClutterStageWindow *stage_window)
/* reset the redraw clipping for the next paint... */ /* reset the redraw clipping for the next paint... */
stage_cogl->initialized_redraw_clip = FALSE; stage_cogl->initialized_redraw_clip = FALSE;
g_clear_pointer (&stage_cogl->redraw_clip, cairo_region_destroy);
stage_cogl->frame_count++; stage_cogl->frame_count++;
} }
@@ -895,25 +824,9 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
gboolean has_buffer_age = gboolean has_buffer_age =
cogl_is_onscreen (framebuffer) && cogl_is_onscreen (framebuffer) &&
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE); cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
float fb_scale; cairo_rectangle_int_t rect;
gboolean scale_is_fractional;
fb_scale = clutter_stage_view_get_scale (view); if (!has_buffer_age)
if (fb_scale != floorf (fb_scale))
scale_is_fractional = TRUE;
else
scale_is_fractional = FALSE;
/*
* Buffer damage is tracked in the framebuffer coordinate space
* using the damage history. When fractional scaling is used, a
* coordinate on the stage might not correspond to the exact position of any
* physical pixel, which causes issues when painting using the pick mode.
*
* For now, always use the (0, 0) pixel for picking when using fractional
* framebuffer scaling.
*/
if (!has_buffer_age || scale_is_fractional)
{ {
*x = 0; *x = 0;
*y = 0; *y = 0;
@@ -924,13 +837,18 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
ClutterStageViewCoglPrivate *view_priv = ClutterStageViewCoglPrivate *view_priv =
clutter_stage_view_cogl_get_instance_private (view_cogl); clutter_stage_view_cogl_get_instance_private (view_cogl);
cairo_rectangle_int_t view_layout; cairo_rectangle_int_t view_layout;
cairo_rectangle_int_t *fb_damage; cairo_region_t *damage;
clutter_stage_view_get_layout (view, &view_layout); clutter_stage_view_get_layout (view, &view_layout);
fb_damage = &view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - 1)]; damage = view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - 1)];
*x = fb_damage->x / fb_scale; if (damage)
*y = fb_damage->y / fb_scale; cairo_region_get_rectangle (damage, 0, &rect);
else
rect.x = rect.y = 0;
*x = rect.x - view_layout.x;
*y = rect.y - view_layout.y;
} }
} }
@@ -949,7 +867,7 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
iface->add_redraw_clip = clutter_stage_cogl_add_redraw_clip; iface->add_redraw_clip = clutter_stage_cogl_add_redraw_clip;
iface->has_redraw_clips = clutter_stage_cogl_has_redraw_clips; iface->has_redraw_clips = clutter_stage_cogl_has_redraw_clips;
iface->ignoring_redraw_clips = clutter_stage_cogl_ignoring_redraw_clips; iface->ignoring_redraw_clips = clutter_stage_cogl_ignoring_redraw_clips;
iface->get_redraw_clip_bounds = clutter_stage_cogl_get_redraw_clip_bounds; iface->get_redraw_clip = clutter_stage_cogl_get_redraw_clip;
iface->redraw = clutter_stage_cogl_redraw; iface->redraw = clutter_stage_cogl_redraw;
iface->get_dirty_pixel = clutter_stage_cogl_get_dirty_pixel; iface->get_dirty_pixel = clutter_stage_cogl_get_dirty_pixel;
} }

View File

@@ -59,7 +59,7 @@ struct _ClutterStageCogl
* junk frames to start with. */ * junk frames to start with. */
unsigned int frame_count; unsigned int frame_count;
cairo_rectangle_int_t bounding_redraw_clip; cairo_region_t *redraw_clip;
guint initialized_redraw_clip : 1; guint initialized_redraw_clip : 1;

View File

@@ -2602,21 +2602,6 @@ clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
xkb_state_update_mask (state, depressed_mods, latched_mods, locked_mods, 0, 0, idx); xkb_state_update_mask (state, depressed_mods, latched_mods, locked_mods, 0, 0, idx);
} }
/**
* clutter_evdev_get_keyboard_layout_index: (skip)
*/
xkb_layout_index_t
clutter_evdev_get_keyboard_layout_index (ClutterDeviceManager *evdev)
{
ClutterDeviceManagerEvdev *manager_evdev;
struct xkb_state *state;
manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev);
state = manager_evdev->priv->main_seat->xkb;
return xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_LOCKED);
}
/** /**
* clutter_evdev_set_keyboard_numlock: (skip) * clutter_evdev_set_keyboard_numlock: (skip)
* @evdev: the #ClutterDeviceManager created by the evdev backend * @evdev: the #ClutterDeviceManager created by the evdev backend

View File

@@ -120,9 +120,6 @@ CLUTTER_AVAILABLE_IN_1_20
void clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev, void clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
xkb_layout_index_t idx); xkb_layout_index_t idx);
CLUTTER_AVAILABLE_IN_MUTTER
xkb_layout_index_t clutter_evdev_get_keyboard_layout_index (ClutterDeviceManager *evdev);
CLUTTER_AVAILABLE_IN_1_26 CLUTTER_AVAILABLE_IN_1_26
void clutter_evdev_set_keyboard_numlock (ClutterDeviceManager *evdev, void clutter_evdev_set_keyboard_numlock (ClutterDeviceManager *evdev,
gboolean numlock_state); gboolean numlock_state);

View File

@@ -163,9 +163,6 @@ clutter_input_device_evdev_update_from_tool (ClutterInputDevice *device,
if (libinput_tablet_tool_has_slider (evdev_tool->tool)) if (libinput_tablet_tool_has_slider (evdev_tool->tool))
_clutter_input_device_add_axis (device, CLUTTER_INPUT_AXIS_SLIDER, -1, 1, 0); _clutter_input_device_add_axis (device, CLUTTER_INPUT_AXIS_SLIDER, -1, 1, 0);
if (libinput_tablet_tool_has_wheel (evdev_tool->tool))
_clutter_input_device_add_axis (device, CLUTTER_INPUT_AXIS_WHEEL, -180, 180, 0);
g_object_thaw_notify (G_OBJECT (device)); g_object_thaw_notify (G_OBJECT (device));
} }

View File

@@ -66,14 +66,6 @@ static const char *clutter_input_axis_atom_names[] = {
#define N_AXIS_ATOMS G_N_ELEMENTS (clutter_input_axis_atom_names) #define N_AXIS_ATOMS G_N_ELEMENTS (clutter_input_axis_atom_names)
enum {
PAD_AXIS_FIRST = 3, /* First axes are always x/y/pressure, ignored in pads */
PAD_AXIS_STRIP1 = PAD_AXIS_FIRST,
PAD_AXIS_STRIP2,
PAD_AXIS_RING1,
PAD_AXIS_RING2,
};
static Atom clutter_input_axis_atoms[N_AXIS_ATOMS] = { 0, }; static Atom clutter_input_axis_atoms[N_AXIS_ATOMS] = { 0, };
static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface); static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
@@ -367,36 +359,6 @@ get_device_node_path (ClutterBackendX11 *backend_x11,
return node_path; return node_path;
} }
static void
get_pad_features (XIDeviceInfo *info,
guint *n_rings,
guint *n_strips)
{
gint i, rings = 0, strips = 0;
for (i = PAD_AXIS_FIRST; i < info->num_classes; i++)
{
XIValuatorClassInfo *valuator = (XIValuatorClassInfo*) info->classes[i];
int axis = valuator->number;
if (valuator->type != XIValuatorClass)
continue;
if (valuator->max <= 1)
continue;
/* Ring/strip axes are fixed in pad devices as handled by the
* wacom driver. Match those to detect pad features.
*/
if (axis == PAD_AXIS_STRIP1 || axis == PAD_AXIS_STRIP2)
strips++;
else if (axis == PAD_AXIS_RING1 || axis == PAD_AXIS_RING2)
rings++;
}
*n_rings = rings;
*n_strips = strips;
}
static ClutterInputDevice * static ClutterInputDevice *
create_device (ClutterDeviceManagerXI2 *manager_xi2, create_device (ClutterDeviceManagerXI2 *manager_xi2,
ClutterBackendX11 *backend_x11, ClutterBackendX11 *backend_x11,
@@ -406,7 +368,7 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
ClutterInputDevice *retval; ClutterInputDevice *retval;
ClutterInputMode mode; ClutterInputMode mode;
gboolean is_enabled; gboolean is_enabled;
guint num_touches = 0, num_rings = 0, num_strips = 0; guint num_touches = 0;
gchar *vendor_id = NULL, *product_id = NULL, *node_path = NULL; gchar *vendor_id = NULL, *product_id = NULL, *node_path = NULL;
if (info->use == XIMasterKeyboard || info->use == XISlaveKeyboard) if (info->use == XIMasterKeyboard || info->use == XISlaveKeyboard)
@@ -474,12 +436,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
node_path = get_device_node_path (backend_x11, info); node_path = get_device_node_path (backend_x11, info);
} }
if (source == CLUTTER_PAD_DEVICE)
{
is_enabled = TRUE;
get_pad_features (info, &num_rings, &num_strips);
}
retval = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_XI2, retval = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_XI2,
"name", info->name, "name", info->name,
"id", info->deviceid, "id", info->deviceid,
@@ -492,8 +448,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
"vendor-id", vendor_id, "vendor-id", vendor_id,
"product-id", product_id, "product-id", product_id,
"device-node", node_path, "device-node", node_path,
"n-rings", num_rings,
"n-strips", num_strips,
NULL); NULL);
translate_device_classes (backend_x11->xdpy, retval, translate_device_classes (backend_x11->xdpy, retval,
@@ -893,54 +847,6 @@ translate_axes (ClutterInputDevice *device,
return retval; return retval;
} }
static gboolean
translate_pad_axis (ClutterInputDevice *device,
XIValuatorState *valuators,
ClutterEventType *evtype,
guint *number,
gdouble *value)
{
double *values;
gint i;
values = valuators->values;
for (i = PAD_AXIS_FIRST; i < valuators->mask_len * 8; i++)
{
gdouble val;
guint axis_number = 0;
if (!XIMaskIsSet (valuators->mask, i))
continue;
val = *values++;
if (val <= 0)
continue;
_clutter_input_device_translate_axis (device, i, val, value);
if (i == PAD_AXIS_RING1 || i == PAD_AXIS_RING2)
{
*evtype = CLUTTER_PAD_RING;
(*value) *= 360.0;
}
else if (i == PAD_AXIS_STRIP1 || i == PAD_AXIS_STRIP2)
{
*evtype = CLUTTER_PAD_STRIP;
}
else
continue;
if (i == PAD_AXIS_STRIP2 || i == PAD_AXIS_RING2)
axis_number++;
*number = axis_number;
return TRUE;
}
return FALSE;
}
static void static void
translate_coords (ClutterStageX11 *stage_x11, translate_coords (ClutterStageX11 *stage_x11,
gdouble event_x, gdouble event_x,
@@ -1119,54 +1025,6 @@ handle_property_event (ClutterDeviceManagerXI2 *manager_xi2,
} }
} }
static gboolean
translate_pad_event (ClutterEvent *event,
XIDeviceEvent *xev,
ClutterInputDevice *device)
{
gdouble value;
guint number;
if (!translate_pad_axis (device, &xev->valuators,
&event->any.type,
&number, &value))
return FALSE;
/* When touching a ring/strip a first XI_Motion event
* is generated. Use it to reset the pad state, so
* later events actually have a directionality.
*/
if (xev->evtype == XI_Motion)
value = -1;
if (event->any.type == CLUTTER_PAD_RING)
{
event->pad_ring.ring_number = number;
event->pad_ring.angle = value;
}
else
{
event->pad_strip.strip_number = number;
event->pad_strip.value = value;
}
event->any.time = xev->time;
clutter_event_set_device (event, device);
clutter_event_set_source_device (event, device);
CLUTTER_NOTE (EVENT,
"%s: win:0x%x, device:%d '%s', time:%d "
"(value:%f)",
event->any.type == CLUTTER_PAD_RING
? "pad ring "
: "pad strip",
(unsigned int) xev->event,
device->id,
device->device_name,
event->any.time, value);
return TRUE;
}
static ClutterTranslateReturn static ClutterTranslateReturn
clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator, clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
gpointer native, gpointer native,
@@ -1348,23 +1206,15 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
XIAsyncDevice, XIAsyncDevice,
xev->time); xev->time);
event->any.stage = stage; /* Ignore 4-7 buttons */
if (xev->detail >= 4 && xev->detail <= 7) if (xev->detail >= 4 && xev->detail <= 7)
{ return CLUTTER_TRANSLATE_REMOVE;
retval = CLUTTER_TRANSLATE_REMOVE;
if (xi_event->evtype == XI_ButtonPress && event->pad_button.type =
translate_pad_event (event, xev, source_device))
retval = CLUTTER_TRANSLATE_QUEUE;
break;
}
event->any.type =
(xi_event->evtype == XI_ButtonPress) ? CLUTTER_PAD_BUTTON_PRESS (xi_event->evtype == XI_ButtonPress) ? CLUTTER_PAD_BUTTON_PRESS
: CLUTTER_PAD_BUTTON_RELEASE; : CLUTTER_PAD_BUTTON_RELEASE;
event->any.time = xev->time; event->pad_button.time = xev->time;
event->pad_button.stage = stage;
/* The 4-7 button range is taken as non-existent on pad devices, /* The 4-7 button range is taken as non-existent on pad devices,
* let the buttons above that take over this range. * let the buttons above that take over this range.
@@ -1374,7 +1224,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
/* Pad buttons are 0-indexed */ /* Pad buttons are 0-indexed */
event->pad_button.button = xev->detail - 1; event->pad_button.button = xev->detail - 1;
clutter_event_set_device (event, device);
clutter_event_set_source_device (event, source_device); clutter_event_set_source_device (event, source_device);
CLUTTER_NOTE (EVENT, CLUTTER_NOTE (EVENT,
@@ -1531,15 +1380,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
device = g_hash_table_lookup (manager_xi2->devices_by_id, device = g_hash_table_lookup (manager_xi2->devices_by_id,
GINT_TO_POINTER (xev->deviceid)); GINT_TO_POINTER (xev->deviceid));
if (clutter_input_device_get_device_type (source_device) == CLUTTER_PAD_DEVICE)
{
event->any.stage = stage;
if (translate_pad_event (event, xev, source_device))
retval = CLUTTER_TRANSLATE_QUEUE;
break;
}
/* Set the stage for core events coming out of nowhere (see bug #684509) */ /* Set the stage for core events coming out of nowhere (see bug #684509) */
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER && if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER &&
clutter_input_device_get_pointer_stage (device) == NULL && clutter_input_device_get_pointer_stage (device) == NULL &&

View File

@@ -10,6 +10,7 @@ static const struct {
{ "Net/DndDragThreshold", "dnd-drag-threshold" }, { "Net/DndDragThreshold", "dnd-drag-threshold" },
{ "Gtk/FontName", "font-name" }, { "Gtk/FontName", "font-name" },
{ "Xft/Antialias", "font-antialias" }, { "Xft/Antialias", "font-antialias" },
{ "Xft/DPI", "font-dpi" },
{ "Xft/Hinting", "font-hinting" }, { "Xft/Hinting", "font-hinting" },
{ "Xft/HintStyle", "font-hint-style" }, { "Xft/HintStyle", "font-hint-style" },
{ "Xft/RGBA", "font-subpixel-order" }, { "Xft/RGBA", "font-subpixel-order" },

View File

@@ -110,7 +110,7 @@ LT_LIB_M
AC_HEADER_STDC AC_HEADER_STDC
# required versions for dependencies # required versions for dependencies
m4_define([glib_req_version], [2.53.2]) m4_define([glib_req_version], [2.44.0])
m4_define([cogl_req_version], [1.21.2]) m4_define([cogl_req_version], [1.21.2])
m4_define([json_glib_req_version], [0.12.0]) m4_define([json_glib_req_version], [0.12.0])
m4_define([atk_req_version], [2.5.3]) m4_define([atk_req_version], [2.5.3])

View File

@@ -407,7 +407,8 @@ test_scale_center (TestState *state)
g_assert (scale_x == 4.0); g_assert (scale_x == 4.0);
g_assert (scale_y == 2.0); g_assert (scale_y == 2.0);
g_assert (gravity == CLUTTER_GRAVITY_NONE); g_assert (gravity == CLUTTER_GRAVITY_NONE);
assert_notifications (NOTIFY_SCALE_CENTER_X | NOTIFY_SCALE_CENTER_Y assert_notifications (NOTIFY_SCALE_X | NOTIFY_SCALE_Y
| NOTIFY_SCALE_CENTER_X | NOTIFY_SCALE_CENTER_Y
| NOTIFY_SCALE_GRAVITY); | NOTIFY_SCALE_GRAVITY);
assert_coords (state, 100 + 10 - 10 * 4, 200 + 20 - 20 * 2, assert_coords (state, 100 + 10 - 10 * 4, 200 + 20 - 20 * 2,
100 + 10 + (RECT_WIDTH - 10) * 4, 100 + 10 + (RECT_WIDTH - 10) * 4,

View File

@@ -193,6 +193,11 @@ struct _CoglFramebuffer
CoglFramebufferBits bits; CoglFramebufferBits bits;
int samples_per_pixel; int samples_per_pixel;
/* Whether the depth buffer was enabled for this framebuffer,
* usually means it needs to be cleared before being reused next.
*/
CoglBool depth_buffer_clear_needed;
}; };
typedef enum { typedef enum {

View File

@@ -117,6 +117,7 @@ _cogl_framebuffer_init (CoglFramebuffer *framebuffer,
framebuffer->viewport_age_for_scissor_workaround = -1; framebuffer->viewport_age_for_scissor_workaround = -1;
framebuffer->dither_enabled = TRUE; framebuffer->dither_enabled = TRUE;
framebuffer->depth_writing_enabled = TRUE; framebuffer->depth_writing_enabled = TRUE;
framebuffer->depth_buffer_clear_needed = TRUE;
framebuffer->modelview_stack = cogl_matrix_stack_new (ctx); framebuffer->modelview_stack = cogl_matrix_stack_new (ctx);
framebuffer->projection_stack = cogl_matrix_stack_new (ctx); framebuffer->projection_stack = cogl_matrix_stack_new (ctx);
@@ -268,6 +269,13 @@ cogl_framebuffer_clear4f (CoglFramebuffer *framebuffer,
int scissor_y1; int scissor_y1;
CoglBool saved_viewport_scissor_workaround; CoglBool saved_viewport_scissor_workaround;
if (!framebuffer->depth_buffer_clear_needed &&
(buffers & COGL_BUFFER_BIT_DEPTH))
buffers &= ~(COGL_BUFFER_BIT_DEPTH);
if (buffers == 0)
return;
_cogl_clip_stack_get_bounds (clip_stack, _cogl_clip_stack_get_bounds (clip_stack,
&scissor_x0, &scissor_y0, &scissor_x0, &scissor_y0,
&scissor_x1, &scissor_y1); &scissor_x1, &scissor_y1);
@@ -415,6 +423,9 @@ cleared:
_cogl_framebuffer_mark_mid_scene (framebuffer); _cogl_framebuffer_mark_mid_scene (framebuffer);
_cogl_framebuffer_mark_clear_clip_dirty (framebuffer); _cogl_framebuffer_mark_clear_clip_dirty (framebuffer);
if (buffers & COGL_BUFFER_BIT_DEPTH)
framebuffer->depth_buffer_clear_needed = FALSE;
if (buffers & COGL_BUFFER_BIT_COLOR && buffers & COGL_BUFFER_BIT_DEPTH) if (buffers & COGL_BUFFER_BIT_COLOR && buffers & COGL_BUFFER_BIT_DEPTH)
{ {
/* For our fast-path for reading back a single pixel of simple /* For our fast-path for reading back a single pixel of simple

View File

@@ -1417,17 +1417,15 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
&gl_intformat, &gl_intformat,
&gl_format, &gl_format,
&gl_type); &gl_type);
#if HAVE_COGL_GL
/* As we are reading pixels, we want to consider the bitmap according to /* 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 * its real pixel format, not the swizzled channels we pretend face to the
* pipeline. * pipeline.
*/ */
if ((ctx->driver == COGL_DRIVER_GL || ctx->driver == COGL_DRIVER_GL3) && if ((format == COGL_PIXEL_FORMAT_BGRA_8888 ||
(format == COGL_PIXEL_FORMAT_BGRA_8888 ||
format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) && format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) &&
_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE)) _cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
gl_format = GL_BGRA; gl_format = GL_BGRA;
#endif
/* NB: All offscreen rendering is done upside down so there is no need /* NB: All offscreen rendering is done upside down so there is no need
* to flip in this case... */ * to flip in this case... */

View File

@@ -418,7 +418,11 @@ flush_depth_state (CoglContext *ctx,
if (ctx->depth_test_enabled_cache != depth_state->test_enabled) if (ctx->depth_test_enabled_cache != depth_state->test_enabled)
{ {
if (depth_state->test_enabled == TRUE) if (depth_state->test_enabled == TRUE)
GE (ctx, glEnable (GL_DEPTH_TEST)); {
GE (ctx, glEnable (GL_DEPTH_TEST));
if (ctx->current_draw_buffer)
ctx->current_draw_buffer->depth_buffer_clear_needed = TRUE;
}
else else
GE (ctx, glDisable (GL_DEPTH_TEST)); GE (ctx, glDisable (GL_DEPTH_TEST));
ctx->depth_test_enabled_cache = depth_state->test_enabled; ctx->depth_test_enabled_cache = depth_state->test_enabled;

View File

@@ -2,14 +2,14 @@ AC_PREREQ(2.62)
m4_define([mutter_major_version], [3]) m4_define([mutter_major_version], [3])
m4_define([mutter_minor_version], [25]) m4_define([mutter_minor_version], [25])
m4_define([mutter_micro_version], [91]) m4_define([mutter_micro_version], [1])
m4_define([mutter_version], m4_define([mutter_version],
[mutter_major_version.mutter_minor_version.mutter_micro_version]) [mutter_major_version.mutter_minor_version.mutter_micro_version])
m4_define([mutter_plugin_api_version], [3]) m4_define([mutter_plugin_api_version], [3])
m4_define([libmutter_api_version], [1]) m4_define([libmutter_api_version], [0])
AC_INIT([mutter], [mutter_version], AC_INIT([mutter], [mutter_version],
[http://bugzilla.gnome.org/enter_bug.cgi?product=mutter]) [http://bugzilla.gnome.org/enter_bug.cgi?product=mutter])
@@ -72,7 +72,7 @@ AC_HEADER_STDC
PKG_PROG_PKG_CONFIG([0.21]) PKG_PROG_PKG_CONFIG([0.21])
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS # Sets GLIB_GENMARSHAL and GLIB_MKENUMS
AM_PATH_GLIB_2_0([2.53.2]) AM_PATH_GLIB_2_0([2.49.0])
CANBERRA_GTK=libcanberra-gtk3 CANBERRA_GTK=libcanberra-gtk3
CANBERRA_GTK_VERSION=0.26 CANBERRA_GTK_VERSION=0.26
@@ -275,7 +275,7 @@ AS_IF([test "$enable_egl_device" = "yes"], [
AC_DEFINE([HAVE_EGL_DEVICE],[1], [Defined if EGLDevice support is enabled]) AC_DEFINE([HAVE_EGL_DEVICE],[1], [Defined if EGLDevice support is enabled])
]) ])
MUTTER_WAYLAND_MODULES="wayland-server >= 1.13.0" MUTTER_WAYLAND_MODULES="wayland-server >= 1.6.90"
AC_ARG_ENABLE(wayland, AC_ARG_ENABLE(wayland,
AS_HELP_STRING([--disable-wayland], [disable mutter on wayland support]),, AS_HELP_STRING([--disable-wayland], [disable mutter on wayland support]),,
@@ -292,7 +292,7 @@ AS_IF([test "$have_wayland" = "yes"], [
AC_SUBST([WAYLAND_SCANNER]) AC_SUBST([WAYLAND_SCANNER])
AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support]) AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support])
PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.9], PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.7],
[ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`]) [ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`])
AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir) AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir)
]) ])

View File

@@ -18,7 +18,7 @@ gschema_in_files = \
gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml) gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml)
%.gschema.xml: %.gschema.xml.in Makefile %.gschema.xml: %.gschema.xml.in Makefile
$(AM_V_GEN) sed -e 's|@GETTEXT_DOMAIN[@]|$(GETTEXT_PACKAGE)|g' \ $(AM_V_GEN) sed -e 's|@GETTEXT_DOMAIN[@]|$(GETTEXT_DOMAIN)|g' \
$< > $@ || rm $@ $< > $@ || rm $@
@GSETTINGS_RULES@ @GSETTINGS_RULES@

View File

@@ -1,6 +1,6 @@
<schemalist> <schemalist>
<schema id="org.gnome.mutter" path="/org/gnome/mutter/" <schema id="org.gnome.mutter" path="/org/gnome/mutter/"
gettext-domain="@GETTEXT_DOMAIN@"> gettext-domain="@GETTEXT_DOMAIN">
<key name="overlay-key" type="s"> <key name="overlay-key" type="s">
<default>'Super_L'</default> <default>'Super_L'</default>
@@ -146,15 +146,5 @@
<summary>Cancel tab popup</summary> <summary>Cancel tab popup</summary>
</key> </key>
<key name="switch-monitor" type="as">
<default><![CDATA[['<Super>p','XF86Display']]]></default>
<summary>Switch monitor configurations</summary>
</key>
<key name="rotate-monitor" type="as">
<default><![CDATA[['XF86RotateWindows']]]></default>
<summary>Rotates the built-in monitor configuration</summary>
</key>
</schema> </schema>
</schemalist> </schemalist>

View File

@@ -49,9 +49,5 @@
<default><![CDATA[['<Primary><Alt>F12']]]></default> <default><![CDATA[['<Primary><Alt>F12']]]></default>
<summary>Switch to VT 12</summary> <summary>Switch to VT 12</summary>
</key> </key>
<key name="restore-shortcuts" type="as">
<default><![CDATA[['<Shift><Control>Escape']]]></default>
<summary>Re-enable shortcuts</summary>
</key>
</schema> </schema>
</schemalist> </schemalist>

View File

@@ -13,18 +13,18 @@ src/compositor/meta-background.c
src/core/bell.c src/core/bell.c
src/core/core.c src/core/core.c
src/core/display.c src/core/display.c
src/core/errors.c
src/core/keybindings.c src/core/keybindings.c
src/core/main.c src/core/main.c
src/core/meta-close-dialog-default.c src/core/meta-close-dialog-default.c
src/core/mutter.c src/core/mutter.c
src/core/prefs.c src/core/prefs.c
src/core/screen.c
src/core/util.c src/core/util.c
src/core/window.c src/core/window.c
src/ui/frames.c src/ui/frames.c
src/ui/theme.c src/ui/theme.c
src/wayland/meta-wayland-tablet-pad.c src/wayland/meta-wayland-tablet-pad.c
src/x11/meta-x11-display.c
src/x11/meta-x11-errors.c
src/x11/session.c src/x11/session.c
src/x11/window-props.c src/x11/window-props.c
src/x11/xprops.c src/x11/xprops.c

413
po/ar.po
View File

@@ -4,15 +4,14 @@
# Arafat Medini <lumina@silverpen.de>, 2003. # Arafat Medini <lumina@silverpen.de>, 2003.
# Abdulaziz Al-Arfaj <alarfaj0@yahoo.com>, 2004. # Abdulaziz Al-Arfaj <alarfaj0@yahoo.com>, 2004.
# Djihed Afifi <djihed@gmail.com>, 2006. # Djihed Afifi <djihed@gmail.com>, 2006.
# Khaled Hosny <khaledhosny@eglug.org>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017. # Khaled Hosny <khaledhosny@eglug.org>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015.
# Anas Afif Emad <anas.e87@gmail.com>, 2008. # Anas Afif Emad <anas.e87@gmail.com>, 2008.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: metacity.HEAD\n" "Project-Id-Version: metacity.HEAD\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&" "Report-Msgid-Bugs-To: \n"
"keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-03-23 21:38+0200\n"
"POT-Creation-Date: 2017-06-18 21:26+0200\n" "PO-Revision-Date: 2015-03-23 21:45+0200\n"
"PO-Revision-Date: 2017-06-18 21:27+0200\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n" "Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n" "Language-Team: Arabic <doc@arabeyes.org>\n"
"Language: ar\n" "Language: ar\n"
@@ -21,568 +20,524 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Virtaal 1.0.0-beta1\n" "X-Generator: Virtaal 0.7.1\n"
"X-Project-Style: gnome\n"
#: data/50-mutter-navigation.xml:6 #: ../data/50-mutter-navigation.xml.in.h:1
msgid "Navigation" msgid "Navigation"
msgstr "الإبحار" msgstr "الإبحار"
#: data/50-mutter-navigation.xml:9 #: ../data/50-mutter-navigation.xml.in.h:2
msgid "Move window to workspace 1" msgid "Move window to workspace 1"
msgstr "انقل النافذة إلى مساحة العمل 1" msgstr "انقل النافذة إلى مساحة العمل 1"
#: data/50-mutter-navigation.xml:12 #: ../data/50-mutter-navigation.xml.in.h:3
msgid "Move window to workspace 2" msgid "Move window to workspace 2"
msgstr "انقل النافذة إلى مساحة العمل 2" msgstr "انقل النافذة إلى مساحة العمل 2"
#: data/50-mutter-navigation.xml:15 #: ../data/50-mutter-navigation.xml.in.h:4
msgid "Move window to workspace 3" msgid "Move window to workspace 3"
msgstr "انقل النافذة إلى مساحة العمل 3" msgstr "انقل النافذة إلى مساحة العمل 3"
#: data/50-mutter-navigation.xml:18 #: ../data/50-mutter-navigation.xml.in.h:5
msgid "Move window to workspace 4" msgid "Move window to workspace 4"
msgstr "انقل النافذة إلى مساحة العمل 4" msgstr "انقل النافذة إلى مساحة العمل 4"
#: data/50-mutter-navigation.xml:21 #: ../data/50-mutter-navigation.xml.in.h:6
msgid "Move window to last workspace" msgid "Move window to last workspace"
msgstr "انقل النافذة إلى مساحة العمل الأخيرة" msgstr "انقل النافذة إلى مساحة العمل الأخيرة"
#: data/50-mutter-navigation.xml:24 #: ../data/50-mutter-navigation.xml.in.h:7
msgid "Move window one workspace to the left" msgid "Move window one workspace to the left"
msgstr "انقل النافذة مساحة عمل واحدة إلى اليسار" msgstr "انقل النافذة مساحة عمل واحدة إلى اليسار"
#: data/50-mutter-navigation.xml:27 #: ../data/50-mutter-navigation.xml.in.h:8
msgid "Move window one workspace to the right" msgid "Move window one workspace to the right"
msgstr "انقل النافذة مساحة عمل واحدة إلى اليمين" msgstr "انقل النافذة مساحة عمل واحدة إلى اليمين"
#: data/50-mutter-navigation.xml:30 #: ../data/50-mutter-navigation.xml.in.h:9
msgid "Move window one workspace up" msgid "Move window one workspace up"
msgstr "انقل النافذة مساحة عمل واحدة إلى الأعلى" msgstr "انقل النافذة مساحة عمل واحدة إلى الأعلى"
#: data/50-mutter-navigation.xml:33 #: ../data/50-mutter-navigation.xml.in.h:10
msgid "Move window one workspace down" msgid "Move window one workspace down"
msgstr "انقل النافذة مساحة عمل واحدة إلى الأسفل" msgstr "انقل النافذة مساحة عمل واحدة إلى الأسفل"
#: data/50-mutter-navigation.xml:36 #: ../data/50-mutter-navigation.xml.in.h:11
msgid "Move window one monitor to the left" msgid "Move window one monitor to the left"
msgstr "انقل النافذة شاشة واحدة إلى اليسار" msgstr "انقل النافذة شاشة واحدة إلى اليسار"
#: data/50-mutter-navigation.xml:39 #: ../data/50-mutter-navigation.xml.in.h:12
msgid "Move window one monitor to the right" msgid "Move window one monitor to the right"
msgstr "انقل النافذة شاشة واحدة إلى اليمين" msgstr "انقل النافذة شاشة واحدة إلى اليمين"
#: data/50-mutter-navigation.xml:42 #: ../data/50-mutter-navigation.xml.in.h:13
msgid "Move window one monitor up" msgid "Move window one monitor up"
msgstr "انقل النافذة شاشة واحدة إلى الأعلى" msgstr "انقل النافذة شاشة واحدة إلى الأعلى"
#: data/50-mutter-navigation.xml:45 #: ../data/50-mutter-navigation.xml.in.h:14
msgid "Move window one monitor down" msgid "Move window one monitor down"
msgstr "انقل النافذة شاشة واحدة إلى الأسفل" msgstr "انقل النافذة شاشة واحدة إلى الأسفل"
#: data/50-mutter-navigation.xml:49 #: ../data/50-mutter-navigation.xml.in.h:15
msgid "Switch applications" msgid "Switch applications"
msgstr "تنقل بين التطبيقات" msgstr "تنقل بين التطبيقات"
#: data/50-mutter-navigation.xml:54 #: ../data/50-mutter-navigation.xml.in.h:16
msgid "Switch to previous application" msgid "Switch to previous application"
msgstr "انتقل إلى التطبيق السابق" msgstr "انتقل إلى التطبيق السابق"
#: data/50-mutter-navigation.xml:58 #: ../data/50-mutter-navigation.xml.in.h:17
msgid "Switch windows" msgid "Switch windows"
msgstr "تنقل بين النوافذ" msgstr "تنقل بين النوافذ"
#: data/50-mutter-navigation.xml:63 #: ../data/50-mutter-navigation.xml.in.h:18
msgid "Switch to previous window" msgid "Switch to previous window"
msgstr "انتقل إلى النافذة السابقة" msgstr "انتقل إلى النافذة السابقة"
#: data/50-mutter-navigation.xml:67 #: ../data/50-mutter-navigation.xml.in.h:19
msgid "Switch windows of an application" msgid "Switch windows of an application"
msgstr "تنقل بين نوافذ التطبيق" msgstr "تنقل بين نوافذ التطبيق"
#: data/50-mutter-navigation.xml:72 #: ../data/50-mutter-navigation.xml.in.h:20
msgid "Switch to previous window of an application" msgid "Switch to previous window of an application"
msgstr "انتقل إلى نافذة التطبيق السابقة" msgstr "انتقل إلى نافذة التطبيق السابقة"
#: data/50-mutter-navigation.xml:76 #: ../data/50-mutter-navigation.xml.in.h:21
msgid "Switch system controls" msgid "Switch system controls"
msgstr "تنقل بين تحكمات النظام" msgstr "تنقل بين تحكمات النظام"
#: data/50-mutter-navigation.xml:81 #: ../data/50-mutter-navigation.xml.in.h:22
msgid "Switch to previous system control" msgid "Switch to previous system control"
msgstr "انتقل إلى تحكم النظام السابق" msgstr "انتقل إلى تحكم النظام السابق"
#: data/50-mutter-navigation.xml:85 #: ../data/50-mutter-navigation.xml.in.h:23
msgid "Switch windows directly" msgid "Switch windows directly"
msgstr "تنقل مباشرة بين النوافذ" msgstr "تنقل مباشرة بين النوافذ"
#: data/50-mutter-navigation.xml:90 #: ../data/50-mutter-navigation.xml.in.h:24
msgid "Switch directly to previous window" msgid "Switch directly to previous window"
msgstr "انتقل مباشرة إلى النافذة السابقة" msgstr "انتقل مباشرة إلى النافذة السابقة"
#: data/50-mutter-navigation.xml:94 #: ../data/50-mutter-navigation.xml.in.h:25
msgid "Switch windows of an app directly" msgid "Switch windows of an app directly"
msgstr "تنقل مباشرة بين نوافذ التطبيق" msgstr "تنقل مباشرة بين نوافذ التطبيق"
#: data/50-mutter-navigation.xml:99 #: ../data/50-mutter-navigation.xml.in.h:26
msgid "Switch directly to previous window of an app" msgid "Switch directly to previous window of an app"
msgstr "انتقل مباشرة إلى نافذة التطبيق السابقة" msgstr "انتقل مباشرة إلى نافذة التطبيق السابقة"
#: data/50-mutter-navigation.xml:103 #: ../data/50-mutter-navigation.xml.in.h:27
msgid "Switch system controls directly" msgid "Switch system controls directly"
msgstr "تنقل مباشرة بين تحكمات النظام" msgstr "تنقل مباشرة بين تحكمات النظام"
#: data/50-mutter-navigation.xml:108 #: ../data/50-mutter-navigation.xml.in.h:28
msgid "Switch directly to previous system control" msgid "Switch directly to previous system control"
msgstr "انتقل مباشرة إلى تحكم النظام السابق" msgstr "انتقل مباشرة إلى تحكم النظام السابق"
#: data/50-mutter-navigation.xml:111 #: ../data/50-mutter-navigation.xml.in.h:29
msgid "Hide all normal windows" msgid "Hide all normal windows"
msgstr "أخفِ كل النوافذ العادية" msgstr "أخفِ كل النوافذ العادية"
#: data/50-mutter-navigation.xml:114 #: ../data/50-mutter-navigation.xml.in.h:30
msgid "Switch to workspace 1" msgid "Switch to workspace 1"
msgstr "انتقل إلى مساحة العمل 1" msgstr "انتقل إلى مساحة العمل 1"
#: data/50-mutter-navigation.xml:117 #: ../data/50-mutter-navigation.xml.in.h:31
msgid "Switch to workspace 2" msgid "Switch to workspace 2"
msgstr "انتقل إلى مساحة العمل 2" msgstr "انتقل إلى مساحة العمل 2"
#: data/50-mutter-navigation.xml:120 #: ../data/50-mutter-navigation.xml.in.h:32
msgid "Switch to workspace 3" msgid "Switch to workspace 3"
msgstr "انتقل إلى مساحة العمل 3" msgstr "انتقل إلى مساحة العمل 3"
#: data/50-mutter-navigation.xml:123 #: ../data/50-mutter-navigation.xml.in.h:33
msgid "Switch to workspace 4" msgid "Switch to workspace 4"
msgstr "انتقل إلى مساحة العمل 4" msgstr "انتقل إلى مساحة العمل 4"
#: data/50-mutter-navigation.xml:126 #: ../data/50-mutter-navigation.xml.in.h:34
msgid "Switch to last workspace" msgid "Switch to last workspace"
msgstr "انتقل إلى مساحة العمل الأخيرة" msgstr "انتقل إلى مساحة العمل الأخيرة"
#: data/50-mutter-navigation.xml:129 #: ../data/50-mutter-navigation.xml.in.h:35
msgid "Move to workspace left" msgid "Move to workspace left"
msgstr "انقل لمساحة العمل على اليسار" msgstr "انقل لمساحة العمل على اليسار"
#: data/50-mutter-navigation.xml:132 #: ../data/50-mutter-navigation.xml.in.h:36
msgid "Move to workspace right" msgid "Move to workspace right"
msgstr "انقل لمساحة العمل على اليمين" msgstr "انقل لمساحة العمل على اليمين"
#: data/50-mutter-navigation.xml:135 #: ../data/50-mutter-navigation.xml.in.h:37
msgid "Move to workspace above" msgid "Move to workspace above"
msgstr "انقل لمساحة العمل أعلى" msgstr "انقل لمساحة العمل أعلى"
#: data/50-mutter-navigation.xml:138 #: ../data/50-mutter-navigation.xml.in.h:38
msgid "Move to workspace below" msgid "Move to workspace below"
msgstr "انقل لمساحة العمل أسفل" msgstr "انقل لمساحة العمل أسفل"
#: data/50-mutter-system.xml:6 #: ../data/50-mutter-system.xml.in.h:1
msgid "System" msgid "System"
msgstr "النظام" msgstr "النظام"
#: data/50-mutter-system.xml:8 #: ../data/50-mutter-system.xml.in.h:2
msgid "Show the run command prompt" msgid "Show the run command prompt"
msgstr "أظهر محث تشغيل أمر" msgstr "أظهر محث تشغيل أمر"
#: data/50-mutter-system.xml:10 #: ../data/50-mutter-system.xml.in.h:3
msgid "Show the activities overview" msgid "Show the activities overview"
msgstr "أظهر نظرة عامة على الأنشطة" msgstr "أظهر نظرة عامة على الأنشطة"
#: data/50-mutter-windows.xml:6 #: ../data/50-mutter-windows.xml.in.h:1
msgid "Windows" msgid "Windows"
msgstr "النوافذ" msgstr "النوافذ"
#: data/50-mutter-windows.xml:8 #: ../data/50-mutter-windows.xml.in.h:2
msgid "Activate the window menu" msgid "Activate the window menu"
msgstr "فعّل قائمة النافذة" msgstr "فعّل قائمة النافذة"
#: data/50-mutter-windows.xml:10 #: ../data/50-mutter-windows.xml.in.h:3
msgid "Toggle fullscreen mode" msgid "Toggle fullscreen mode"
msgstr "بدّل نمط ملء الشاشة" msgstr "بدّل نمط ملء الشاشة"
#: data/50-mutter-windows.xml:12 #: ../data/50-mutter-windows.xml.in.h:4
msgid "Toggle maximization state" msgid "Toggle maximization state"
msgstr "بدّل حالة التكبير" msgstr "بدّل حالة التكبير"
#: data/50-mutter-windows.xml:14 #: ../data/50-mutter-windows.xml.in.h:5
msgid "Maximize window" msgid "Maximize window"
msgstr "كبّر النّافذة" msgstr "كبّر النّافذة"
#: data/50-mutter-windows.xml:16 #: ../data/50-mutter-windows.xml.in.h:6
msgid "Restore window" msgid "Restore window"
msgstr "استعد النّافذة" msgstr "استعد النّافذة"
#: data/50-mutter-windows.xml:18 #: ../data/50-mutter-windows.xml.in.h:7
msgid "Toggle shaded state" msgid "Toggle shaded state"
msgstr "بدّل حالة الإخفاء" msgstr "بدّل حالة الإخفاء"
#: data/50-mutter-windows.xml:20 #: ../data/50-mutter-windows.xml.in.h:8
msgid "Close window" msgid "Close window"
msgstr "أغلق النّافذة" msgstr "أغلق النّافذة"
#: data/50-mutter-windows.xml:22 #: ../data/50-mutter-windows.xml.in.h:9
msgid "Hide window" msgid "Hide window"
msgstr "أخفِ النّافذة" msgstr "أخفِ النّافذة"
#: data/50-mutter-windows.xml:24 #: ../data/50-mutter-windows.xml.in.h:10
msgid "Move window" msgid "Move window"
msgstr "انقل النّافذة" msgstr "انقل النّافذة"
#: data/50-mutter-windows.xml:26 #: ../data/50-mutter-windows.xml.in.h:11
msgid "Resize window" msgid "Resize window"
msgstr "حجّم النّافذة" msgstr "حجّم النّافذة"
#: data/50-mutter-windows.xml:29 #: ../data/50-mutter-windows.xml.in.h:12
msgid "Toggle window on all workspaces or one" msgid "Toggle window on all workspaces or one"
msgstr "بدّل حالة ظهور النافذة على جميع مساحات العمل أو واحدة منها" msgstr "بدّل حالة ظهور النافذة على جميع مساحات العمل أو واحدة منها"
#: data/50-mutter-windows.xml:31 #: ../data/50-mutter-windows.xml.in.h:13
msgid "Raise window if covered, otherwise lower it" msgid "Raise window if covered, otherwise lower it"
msgstr "ارفع النافذة إذا كانت أخرى تغطيها، أو أخفضها في ما عدا ذلك" msgstr "ارفع النافذة إذا كانت أخرى تغطيها، أو أخفضها في ما عدا ذلك"
#: data/50-mutter-windows.xml:33 #: ../data/50-mutter-windows.xml.in.h:14
msgid "Raise window above other windows" msgid "Raise window above other windows"
msgstr "ارفع النافذة فوق النوافذ الأخرى" msgstr "ارفع النافذة فوق النوافذ الأخرى"
#: data/50-mutter-windows.xml:35 #: ../data/50-mutter-windows.xml.in.h:15
msgid "Lower window below other windows" msgid "Lower window below other windows"
msgstr "اخفض النافذة تحت النوافذ الأخرى" msgstr "اخفض النافذة تحت النوافذ الأخرى"
#: data/50-mutter-windows.xml:37 #: ../data/50-mutter-windows.xml.in.h:16
msgid "Maximize window vertically" msgid "Maximize window vertically"
msgstr "كبّر النافذة رأسيا" msgstr "كبّر النافذة رأسيا"
#: data/50-mutter-windows.xml:39 #: ../data/50-mutter-windows.xml.in.h:17
msgid "Maximize window horizontally" msgid "Maximize window horizontally"
msgstr "كبّر النافذة أفقيا" msgstr "كبّر النافذة أفقيا"
#: data/50-mutter-windows.xml:43 #: ../data/50-mutter-windows.xml.in.h:18
msgid "View split on left" msgid "View split on left"
msgstr "المنظور مقسوم على اليمين" msgstr "المنظور مقسوم على اليمين"
#: data/50-mutter-windows.xml:47 #: ../data/50-mutter-windows.xml.in.h:19
msgid "View split on right" msgid "View split on right"
msgstr "المنظور مقسوم على اليسار" msgstr "المنظور مقسوم على اليسار"
#: data/mutter.desktop.in:4 #: ../data/mutter.desktop.in.h:1
msgid "Mutter" msgid "Mutter"
msgstr "مَتَر" msgstr "مَتَر"
#: data/org.gnome.mutter.gschema.xml.in:7 #: ../data/org.gnome.mutter.gschema.xml.in.h:1
msgid "Modifier to use for extended window management operations" msgid "Modifier to use for extended window management operations"
msgstr "المغير الذي سيُستعمل لتمديد عمليات إدارة النوافذ " msgstr "المغير الذي سيُستعمل لتمديد عمليات إدارة النوافذ "
#: data/org.gnome.mutter.gschema.xml.in:8 #: ../data/org.gnome.mutter.gschema.xml.in.h:2
msgid "" msgid ""
"This key will initiate the overlay, which is a combination window overview " "This key will initiate the \"overlay\", which is a combination window "
"and application launching system. The default is intended to be the “Windows " "overview and application launching system. The default is intended to be the "
"key on PC hardware. Its expected that this binding either the default or " "\"Windows key\" on PC hardware. It's expected that this binding either the "
"set to the empty string." "default or set to the empty string."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:20 #: ../data/org.gnome.mutter.gschema.xml.in.h:3
msgid "Attach modal dialogs" msgid "Attach modal dialogs"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:21 #: ../data/org.gnome.mutter.gschema.xml.in.h:4
msgid "" msgid ""
"When true, instead of having independent titlebars, modal dialogs appear " "When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with " "attached to the titlebar of the parent window and are moved together with "
"the parent window." "the parent window."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:30 #: ../data/org.gnome.mutter.gschema.xml.in.h:5
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:31 #: ../data/org.gnome.mutter.gschema.xml.in.h:6
msgid "" msgid ""
"If enabled, dropping windows on vertical screen edges maximizes them " "If enabled, dropping windows on vertical screen edges maximizes them "
"vertically and resizes them horizontally to cover half of the available " "vertically and resizes them horizontally to cover half of the available "
"area. Dropping windows on the top screen edge maximizes them completely." "area. Dropping windows on the top screen edge maximizes them completely."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:40 #: ../data/org.gnome.mutter.gschema.xml.in.h:7
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:41 #: ../data/org.gnome.mutter.gschema.xml.in.h:8
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether there's a "
"static number of workspaces (determined by the num-workspaces key in org." "static number of workspaces (determined by the num-workspaces key in org."
"gnome.desktop.wm.preferences)." "gnome.desktop.wm.preferences)."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:50 #: ../data/org.gnome.mutter.gschema.xml.in.h:9
msgid "Workspaces only on primary" msgid "Workspaces only on primary"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:51 #: ../data/org.gnome.mutter.gschema.xml.in.h:10
msgid "" msgid ""
"Determines whether workspace switching should happen for windows on all " "Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor." "monitors or only for windows on the primary monitor."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:59 #: ../data/org.gnome.mutter.gschema.xml.in.h:11
msgid "No tab popup" msgid "No tab popup"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:60 #: ../data/org.gnome.mutter.gschema.xml.in.h:12
msgid "" msgid ""
"Determines whether the use of popup and highlight frame should be disabled " "Determines whether the use of popup and highlight frame should be disabled "
"for window cycling." "for window cycling."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:68 #: ../data/org.gnome.mutter.gschema.xml.in.h:13
msgid "Delay focus changes until the pointer stops moving" msgid "Delay focus changes until the pointer stops moving"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:69 #: ../data/org.gnome.mutter.gschema.xml.in.h:14
msgid "" msgid ""
"If set to true, and the focus mode is either sloppy or mouse then the " "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
"focus will not be changed immediately when entering a window, but only after " "the focus will not be changed immediately when entering a window, but only "
"the pointer stops moving." "after the pointer stops moving."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:79 #: ../data/org.gnome.mutter.gschema.xml.in.h:15
msgid "Draggable border width" msgid "Draggable border width"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:80 #: ../data/org.gnome.mutter.gschema.xml.in.h:16
msgid "" msgid ""
"The amount of total draggable borders. If the themes visible borders are " "The amount of total draggable borders. If the theme's visible borders are "
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:89 #: ../data/org.gnome.mutter.gschema.xml.in.h:17
msgid "Auto maximize nearly monitor sized windows" msgid "Auto maximize nearly monitor sized windows"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:90 #: ../data/org.gnome.mutter.gschema.xml.in.h:18
msgid "" msgid ""
"If enabled, new windows that are initially the size of the monitor " "If enabled, new windows that are initially the size of the monitor "
"automatically get maximized." "automatically get maximized."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:98 #: ../data/org.gnome.mutter.gschema.xml.in.h:19
msgid "Place new windows in the center" msgid "Place new windows in the center"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:99 #: ../data/org.gnome.mutter.gschema.xml.in.h:20
msgid "" msgid ""
"When true, the new windows will always be put in the center of the active " "When true, the new windows will always be put in the center of the active "
"screen of the monitor." "screen of the monitor."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:107 #: ../data/org.gnome.mutter.gschema.xml.in.h:21
msgid "Enable experimental features"
msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new "
"monitor configuration system, aimed to replace the old one. This enables a "
"higher level configuration API to be used by configuration applications, as "
"well as the ability to configure per logical monitor scale. • “scale-monitor-"
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:156 #: ../data/org.gnome.mutter.gschema.xml.in.h:22
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "" msgstr ""
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
#, fuzzy #, fuzzy
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "انتقل إلى مساحة العمل 1" msgstr "انتقل إلى مساحة العمل 1"
#: data/org.gnome.mutter.wayland.gschema.xml.in:10 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
#, fuzzy #, fuzzy
msgid "Switch to VT 2" msgid "Switch to VT 2"
msgstr "انتقل إلى مساحة العمل 2" msgstr "انتقل إلى مساحة العمل 2"
#: data/org.gnome.mutter.wayland.gschema.xml.in:14 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
#, fuzzy #, fuzzy
msgid "Switch to VT 3" msgid "Switch to VT 3"
msgstr "انتقل إلى مساحة العمل 3" msgstr "انتقل إلى مساحة العمل 3"
#: data/org.gnome.mutter.wayland.gschema.xml.in:18 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
#, fuzzy #, fuzzy
msgid "Switch to VT 4" msgid "Switch to VT 4"
msgstr "انتقل إلى مساحة العمل 4" msgstr "انتقل إلى مساحة العمل 4"
#: data/org.gnome.mutter.wayland.gschema.xml.in:22 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
#, fuzzy #, fuzzy
msgid "Switch to VT 5" msgid "Switch to VT 5"
msgstr "انتقل إلى مساحة العمل 5" msgstr "انتقل إلى مساحة العمل 5"
#: data/org.gnome.mutter.wayland.gschema.xml.in:26 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
#, fuzzy #, fuzzy
msgid "Switch to VT 6" msgid "Switch to VT 6"
msgstr "انتقل إلى مساحة العمل 6" msgstr "انتقل إلى مساحة العمل 6"
#: data/org.gnome.mutter.wayland.gschema.xml.in:30 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
#, fuzzy #, fuzzy
msgid "Switch to VT 7" msgid "Switch to VT 7"
msgstr "انتقل إلى مساحة العمل 7" msgstr "انتقل إلى مساحة العمل 7"
#: data/org.gnome.mutter.wayland.gschema.xml.in:34 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
#, fuzzy #, fuzzy
msgid "Switch to VT 8" msgid "Switch to VT 8"
msgstr "انتقل إلى مساحة العمل 8" msgstr "انتقل إلى مساحة العمل 8"
#: data/org.gnome.mutter.wayland.gschema.xml.in:38 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
#, fuzzy #, fuzzy
msgid "Switch to VT 9" msgid "Switch to VT 9"
msgstr "انتقل إلى مساحة العمل 9" msgstr "انتقل إلى مساحة العمل 9"
#: data/org.gnome.mutter.wayland.gschema.xml.in:42 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
#, fuzzy #, fuzzy
msgid "Switch to VT 10" msgid "Switch to VT 10"
msgstr "انتقل إلى مساحة العمل 10" msgstr "انتقل إلى مساحة العمل 10"
#: data/org.gnome.mutter.wayland.gschema.xml.in:46 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
#, fuzzy #, fuzzy
msgid "Switch to VT 11" msgid "Switch to VT 11"
msgstr "انتقل إلى مساحة العمل 11" msgstr "انتقل إلى مساحة العمل 11"
#: data/org.gnome.mutter.wayland.gschema.xml.in:50 #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
#, fuzzy #, fuzzy
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "انتقل إلى مساحة العمل 12" msgstr "انتقل إلى مساحة العمل 12"
#. TRANSLATORS: This string refers to a button that switches between #: ../src/backends/meta-monitor-manager.c:364
#. * different modes.
#.
#: src/backends/meta-input-settings.c:1866
#, c-format
msgid "Mode Switch (Group %d)"
msgstr ""
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs.
#.
#: src/backends/meta-input-settings.c:1888
msgid "Switch monitor"
msgstr "غيّر الشاشة"
#: src/backends/meta-input-settings.c:1890
msgid "Show on-screen help"
msgstr ""
#: src/backends/meta-monitor-manager.c:879
msgid "Built-in display" msgid "Built-in display"
msgstr "شاشة مدمجة" msgstr "شاشة مدمجة"
#: src/backends/meta-monitor-manager.c:902 #: ../src/backends/meta-monitor-manager.c:391
msgid "Unknown" msgid "Unknown"
msgstr "غير معروفة" msgstr "غير معروفة"
#: src/backends/meta-monitor-manager.c:904 #: ../src/backends/meta-monitor-manager.c:393
msgid "Unknown Display" msgid "Unknown Display"
msgstr "شاشة غير معروفة" msgstr "شاشة غير معروفة"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:912 #: ../src/backends/meta-monitor-manager.c:401
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: ../src/compositor/compositor.c:456
#, fuzzy, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr "يعمل مدير مزج آخر على الشاشة %i والعرض \"%s\"." msgstr "يعمل مدير مزج آخر على الشاشة %i والعرض \"%s\"."
#: src/core/bell.c:194 #: ../src/core/bell.c:185
msgid "Bell event" msgid "Bell event"
msgstr "حدث جرس" msgstr "حدث جرس"
#: src/core/display.c:608 #: ../src/core/delete.c:127
#, fuzzy, c-format
msgid "Failed to open X Window System display “%s”\n"
msgstr "فشل فتح عرض نظام نوافذ إكس '%s'\n"
#: src/core/main.c:189
msgid "Disable connection to session manager"
msgstr "عطّل الاتصال بمدير الجلسة"
#: src/core/main.c:195
msgid "Replace the running window manager"
msgstr "استبدل بمدير النوافذ الذي يعمل"
#: src/core/main.c:201
msgid "Specify session management ID"
msgstr "حدّد رقم هويّة إدارة الجلسة"
#: src/core/main.c:206
msgid "X Display to use"
msgstr "معراض س الذي سيستعمل"
#: src/core/main.c:212
msgid "Initialize session from savefile"
msgstr "ابدأ الجلسة من ملف محفوظ"
#: src/core/main.c:218
msgid "Make X calls synchronous"
msgstr "اجعل نداءات س متزامنة"
#: src/core/main.c:225
msgid "Run as a wayland compositor"
msgstr ""
#: src/core/main.c:231
msgid "Run as a nested compositor"
msgstr ""
#: src/core/main.c:239
msgid "Run as a full display server, rather than nested"
msgstr ""
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format #, c-format
msgid "“%s” is not responding." msgid "“%s” is not responding."
msgstr "”‏%s“ لا يستجيب." msgstr "”‏%s“ لا يستجيب."
#: src/core/meta-close-dialog-default.c:149 #: ../src/core/delete.c:129
msgid "Application is not responding." msgid "Application is not responding."
msgstr "لا يستجيب التطبيق" msgstr "لا يستجيب التطبيق"
#: src/core/meta-close-dialog-default.c:154 #: ../src/core/delete.c:134
msgid "" msgid ""
"You may choose to wait a short while for it to continue or force the " "You may choose to wait a short while for it to continue or force the "
"application to quit entirely." "application to quit entirely."
msgstr "ربما ترغب في الانتظار قليلا ليُكمِل أو إجبار التطبيق على الإنهاء كُلّية." msgstr "ربما ترغب في الانتظار قليلا ليُكمِل أو إجبار التطبيق على الإنهاء كُلّية."
#: src/core/meta-close-dialog-default.c:161 #: ../src/core/delete.c:141
msgid "_Force Quit"
msgstr "أ_جبر الإنهاء"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait" msgid "_Wait"
msgstr "ا_نتظر" msgstr "ا_نتظر"
#: src/core/mutter.c:39 #: ../src/core/delete.c:141
#, fuzzy, c-format msgid "_Force Quit"
msgstr "أ_جبر الإنهاء"
#: ../src/core/display.c:562
#, c-format
msgid "Failed to open X Window System display '%s'\n"
msgstr "فشل فتح عرض نظام نوافذ إكس '%s'\n"
#: ../src/core/main.c:176
msgid "Disable connection to session manager"
msgstr "عطّل الاتصال بمدير الجلسة"
#: ../src/core/main.c:182
msgid "Replace the running window manager"
msgstr "استبدل بمدير النوافذ الذي يعمل"
#: ../src/core/main.c:188
msgid "Specify session management ID"
msgstr "حدّد رقم هويّة إدارة الجلسة"
#: ../src/core/main.c:193
msgid "X Display to use"
msgstr "معراض س الذي سيستعمل"
#: ../src/core/main.c:199
msgid "Initialize session from savefile"
msgstr "ابدأ الجلسة من ملف محفوظ"
#: ../src/core/main.c:205
msgid "Make X calls synchronous"
msgstr "اجعل نداءات س متزامنة"
#: ../src/core/main.c:212
msgid "Run as a wayland compositor"
msgstr ""
#: ../src/core/main.c:220
msgid "Run as a full display server, rather than nested"
msgstr ""
#: ../src/core/mutter.c:39
#, c-format
msgid "" msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
"This is free software; see the source for copying conditions.\n" "This is free software; see the source for copying conditions.\n"
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A " "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
"PARTICULAR PURPOSE.\n" "PARTICULAR PURPOSE.\n"
@@ -592,52 +547,46 @@ msgstr ""
"هذا برنامج حر، راجع المصدر لشروط النسخ.\n" "هذا برنامج حر، راجع المصدر لشروط النسخ.\n"
"لا يوجد أي ضمان: و لا حتى ضمان قابلية التسويق أو المناسبة لأي هدف.\n" "لا يوجد أي ضمان: و لا حتى ضمان قابلية التسويق أو المناسبة لأي هدف.\n"
#: src/core/mutter.c:53 #: ../src/core/mutter.c:53
msgid "Print version" msgid "Print version"
msgstr "اطبع الإصدارة" msgstr "اطبع الإصدارة"
#: src/core/mutter.c:59 #: ../src/core/mutter.c:59
msgid "Mutter plugin to use" msgid "Mutter plugin to use"
msgstr "ملحق مَتَر الذي سيُستخدم" msgstr "ملحق مَتَر الذي سيُستخدم"
#: src/core/prefs.c:1997 #: ../src/core/prefs.c:2004
#, c-format #, c-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "مساحة العمل %d" msgstr "مساحة العمل %d"
#: src/core/screen.c:580 #: ../src/core/screen.c:525
#, fuzzy, c-format #, c-format
msgid "" msgid ""
"Display “%s” already has a window manager; try using the --replace option to " "Display \"%s\" already has a window manager; try using the --replace option "
"replace the current window manager." "to replace the current window manager."
msgstr "" msgstr ""
"الشاشة \"%s\" لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل --replace " "الشاشة \"%s\" لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل --replace "
"لتحُلّ محلّ مدير النوافذ الحالي." "لتحُلّ محلّ مدير النوافذ الحالي."
#: src/core/screen.c:665 #: ../src/core/screen.c:607
#, fuzzy, c-format #, c-format
msgid "Screen %d on display %s is invalid\n" msgid "Screen %d on display '%s' is invalid\n"
msgstr "الشاشة %d على العرض '%s' غير صحيحة\n" msgstr "الشاشة %d على العرض '%s' غير صحيحة\n"
#: src/core/util.c:120 #: ../src/core/util.c:118
msgid "Mutter was compiled without support for verbose mode\n" msgid "Mutter was compiled without support for verbose mode\n"
msgstr "جُمِّع مَتَر دون دعم للنمط المطنب\n" msgstr "جُمِّع مَتَر دون دعم للنمط المطنب\n"
#: src/wayland/meta-wayland-tablet-pad.c:563 #: ../src/x11/session.c:1815
#, c-format
msgid "Mode Switch: Mode %d"
msgstr ""
#: src/x11/session.c:1815
#, fuzzy
msgid "" msgid ""
"These windows do not support save current setup and will have to be " "These windows do not support &quot;save current setup&quot; and will have to "
"restarted manually next time you log in." "be restarted manually next time you log in."
msgstr "" msgstr ""
"هذه النوافذ لا تدعم &quot;احفظ الضبط الحالي&quot; يجب إعادة تشغيلها يدويا " "هذه النوافذ لا تدعم &quot;احفظ الضبط الحالي&quot; يجب إعادة تشغيلها يدويا "
"عند الولوج المرة القادمة." "عند الولوج المرة القادمة."
#: src/x11/window-props.c:559 #: ../src/x11/window-props.c:549
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (على %s)" msgstr "%s (على %s)"

116
po/ca.po
View File

@@ -13,16 +13,16 @@ msgstr ""
"Project-Id-Version: metacity 2.24\n" "Project-Id-Version: metacity 2.24\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-21 04:46+0000\n" "POT-Creation-Date: 2017-04-21 21:33+0000\n"
"PO-Revision-Date: 2017-08-25 13:23+0200\n" "PO-Revision-Date: 2016-03-13 14:45+0100\n"
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n" "Last-Translator: Gil Forcada <gilforcada@guifi.net>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n" "Language-Team: Catalan <tradgnome@softcatala.org>\n"
"Language: ca\n" "Language: ca\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bits\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 2.0.1\n" "X-Generator: Gtranslator 2.91.6\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
msgid "Navigation" msgid "Navigation"
@@ -105,8 +105,10 @@ msgid "Switch to previous window of an application"
msgstr "Canvia a la finestra anterior d'una aplicació" msgstr "Canvia a la finestra anterior d'una aplicació"
#: data/50-mutter-navigation.xml:76 #: data/50-mutter-navigation.xml:76
#, fuzzy
#| msgid "Switch system controls directly"
msgid "Switch system controls" msgid "Switch system controls"
msgstr "Canvia els controls del sistema" msgstr "Canvia immediatament entre els controls del sistema"
#: data/50-mutter-navigation.xml:81 #: data/50-mutter-navigation.xml:81
msgid "Switch to previous system control" msgid "Switch to previous system control"
@@ -277,6 +279,12 @@ msgstr ""
"finestres" "finestres"
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
#, fuzzy
#| 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."
msgid "" msgid ""
"This key will initiate the “overlay”, which is a combination window overview " "This key will initiate the “overlay”, which is a combination window overview "
"and application launching system. The default is intended to be the “Windows " "and application launching system. The default is intended to be the “Windows "
@@ -325,6 +333,11 @@ msgid "Workspaces are managed dynamically"
msgstr "Els espais de treball es gestionen dinàmicament" msgstr "Els espais de treball es gestionen dinàmicament"
#: data/org.gnome.mutter.gschema.xml.in:41 #: data/org.gnome.mutter.gschema.xml.in:41
#, fuzzy
#| 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)."
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether theres a "
"static number of workspaces (determined by the num-workspaces key in org." "static number of workspaces (determined by the num-workspaces key in org."
@@ -363,6 +376,11 @@ msgid "Delay focus changes until the pointer stops moving"
msgstr "Retarda el canvi del focus fins que s'aturi el punter" msgstr "Retarda el canvi del focus fins que s'aturi el punter"
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
#, fuzzy
#| 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."
msgid "" msgid ""
"If set to true, and the focus mode is either “sloppy” or “mouse” then the " "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 " "focus will not be changed immediately when entering a window, but only after "
@@ -377,6 +395,10 @@ msgid "Draggable border width"
msgstr "Amplada del contorn arrossegable" msgstr "Amplada del contorn arrossegable"
#: data/org.gnome.mutter.gschema.xml.in:80 #: data/org.gnome.mutter.gschema.xml.in:80
#, fuzzy
#| 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."
msgid "" msgid ""
"The amount of total draggable borders. If the themes visible borders are " "The amount of total draggable borders. If the themes visible borders are "
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
@@ -413,7 +435,7 @@ msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:107
msgid "Enable experimental features" msgid "Enable experimental features"
msgstr "Habilita les funcionalitats experimentals" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:108 #: data/org.gnome.mutter.gschema.xml.in:108
msgid "" msgid ""
@@ -435,14 +457,6 @@ msgstr "Selecció de finestra entre les emergents d'una pestanya"
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Cancel·lació de les finestres emergents a les pestanyes" msgstr "Cancel·lació de les finestres emergents a les pestanyes"
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Switch monitor configurations"
msgstr "Canvia configuracions de monitor"
#: data/org.gnome.mutter.gschema.xml.in:156
msgid "Rotates the built-in monitor configuration"
msgstr "Gira la configuració del monitor integrada"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Canvia al terminal virtual 1" msgstr "Canvia al terminal virtual 1"
@@ -491,14 +505,10 @@ msgstr "Canvia al terminal virtual 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Canvia al terminal virtual 12" msgstr "Canvia al terminal virtual 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Torna a habilitar les dreceres"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2151 #: src/backends/meta-input-settings.c:1848
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Mode de commutació (grup %d)" msgstr "Mode de commutació (grup %d)"
@@ -506,37 +516,37 @@ msgstr "Mode de commutació (grup %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2174 #: src/backends/meta-input-settings.c:1870
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Commuta el monitor" msgstr "Commuta el monitor"
#: src/backends/meta-input-settings.c:2176 #: src/backends/meta-input-settings.c:1872
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Mostra l'ajuda en pantalla" msgstr "Mostra l'ajuda en pantalla"
#: src/backends/meta-monitor-manager.c:903 #: src/backends/meta-monitor-manager.c:783
msgid "Built-in display" msgid "Built-in display"
msgstr "Pantalla integrada" msgstr "Pantalla integrada"
#: src/backends/meta-monitor-manager.c:926 #: src/backends/meta-monitor-manager.c:806
msgid "Unknown" msgid "Unknown"
msgstr "Desconeguda" msgstr "Desconeguda"
#: src/backends/meta-monitor-manager.c:928 #: src/backends/meta-monitor-manager.c:808
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Pantalla desconeguda" msgstr "Pantalla desconeguda"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:936 #: src/backends/meta-monitor-manager.c:816
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:474
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -548,6 +558,32 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Esdeveniment de campana" msgstr "Esdeveniment de campana"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "«%s» no està responent."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "L'aplicació no està responent."
#: 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 ""
"Podeu esperar un moment perquè continuï o podeu forçar-ne la sortida "
"completa."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Força'n la sortida"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Espera"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -595,32 +631,6 @@ msgstr "Funciona com a compositor imbricat"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Funciona com a servidor de pantalla completa, en comptes d'imbricat" msgstr "Funciona com a servidor de pantalla completa, en comptes d'imbricat"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "«%s» no està responent."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "L'aplicació no està responent."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Podeu esperar un moment perquè continuï o podeu forçar-ne la sortida "
"completa."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Força'n la sortida"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Espera"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""

126
po/cs.po
View File

@@ -13,10 +13,10 @@ msgstr ""
"Project-Id-Version: mutter\n" "Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-21 04:46+0000\n" "POT-Creation-Date: 2017-03-07 12:40+0000\n"
"PO-Revision-Date: 2017-08-22 18:29+0200\n" "PO-Revision-Date: 2017-03-09 07:51+0100\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n" "Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>>\n" "Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\n" "Language: cs\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -361,8 +361,9 @@ msgid ""
"focus will not be changed immediately when entering a window, but only after " "focus will not be changed immediately when entering a window, but only after "
"the pointer stops moving." "the pointer stops moving."
msgstr "" msgstr ""
"Je-li zapnuto a režim zaměření je buď „sloppy“ nebo „mouse“, pak se zaměření " "Je-li zapnuto a režim zaměření je buď „sloppy“ nebo „mouse“, pak se "
"nezmění hned, když vstoupíte do kona, ale až se přestane pohybovat ukazatel." "zaměření nezmění hned, když vstoupíte do kona, ale až se přestane pohybovat "
"ukazatel."
#: data/org.gnome.mutter.gschema.xml.in:79 #: data/org.gnome.mutter.gschema.xml.in:79
msgid "Draggable border width" msgid "Draggable border width"
@@ -400,48 +401,14 @@ msgstr ""
"Je-li zapnuto, nová okna budou vždy umístěna ve středu aktivní obrazovky " "Je-li zapnuto, nová okna budou vždy umístěna ve středu aktivní obrazovky "
"monitoru." "monitoru."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Povolit experimentální funkce"
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
"mutter default to layout logical monitors in a logical pixel coordinate "
"space, while scaling monitor framebuffers instead of window content, to "
"manage HiDPI monitors. Does not require a restart."
msgstr ""
"Chcete-li povolit experimentální funkce, přidejte klíčové slovo funkce do "
"seznamu. Zda funkce vyžaduje restartování kompozitoru, závisí na dané "
"funkci. Ne u každé experimentální funkce je vyžadováno, aby byla stále "
"dostupná nebo konfigurovatelná. Neočekávejte, že by bylo v tomto nastavení "
"přidáno něco, co by do budoucna přineslo vylepšení. V současné době jsou "
"možná tato klíčová slova: • „scale-monitor-framebuffer“ zajistí, "
"aby byl mutter výchozí pro logické uspořádání monitorů v logickém "
"souřadnicovém prostoru pixelů, zatímco škáluje přímo v grafické vyrovnávací "
"paměti, namísto v obsahu oken, aby se postaral o správu montorů s HiDPI. "
"Nevyžaduje restart."
#: data/org.gnome.mutter.gschema.xml.in:141
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Vybrat okno z překryvné nabídky tabulátoru" msgstr "Vybrat okno z překryvné nabídky tabulátoru"
#: data/org.gnome.mutter.gschema.xml.in:146 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Zrušit překryvné okno tabulátoru" msgstr "Zrušit překryvné okno tabulátoru"
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Switch monitor configurations"
msgstr "Přepnout nastavení monitoru"
#: data/org.gnome.mutter.gschema.xml.in:156
msgid "Rotates the built-in monitor configuration"
msgstr "Postupně mění vestavěná nastavení monitoru"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Přepnout na VT 1" msgstr "Přepnout na VT 1"
@@ -490,14 +457,10 @@ msgstr "Přepnout na VT 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Přepnout na VT 12" msgstr "Přepnout na VT 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Znovu povolit klávesové zkratky"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2151 #: src/backends/meta-input-settings.c:1800
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Přepínač režimu (skupina %d)" msgstr "Přepínač režimu (skupina %d)"
@@ -505,37 +468,37 @@ msgstr "Přepínač režimu (skupina %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2174 #: src/backends/meta-input-settings.c:1822
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Přepnout monitor" msgstr "Přepnout monitor"
#: src/backends/meta-input-settings.c:2176 #: src/backends/meta-input-settings.c:1824
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Zobrazit nápovědu na obrazovce" msgstr "Zobrazit nápovědu na obrazovce"
#: src/backends/meta-monitor-manager.c:903 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Vestavěný displej" msgstr "Vestavěný displej"
#: src/backends/meta-monitor-manager.c:926 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Neznámý" msgstr "Neznámý"
#: src/backends/meta-monitor-manager.c:928 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Neznámý displej" msgstr "Neznámý displej"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:936 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:474
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -545,6 +508,32 @@ msgstr "Jiný kompozitní správce již běží na obrazovce %i displeje „%s
msgid "Bell event" msgid "Bell event"
msgstr "Událost zvonku" msgstr "Událost zvonku"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ nereaguje."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Aplikace nereaguje."
#: 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 ""
"Je možné chvíli počkat, aby aplikace mohla pokračovat, nebo si vynutit úplné "
"ukončení aplikace."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Vynutit ukončení"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Počkat"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -586,32 +575,6 @@ msgstr "Spustit jako podkladový kompozitor"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Spustit jako plnohodnotný server displeje, nikoliv vnořeně" msgstr "Spustit jako plnohodnotný server displeje, nikoliv vnořeně"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ nereaguje."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "Aplikace nereaguje."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Je možné chvíli počkat, aby aplikace mohla pokračovat, nebo si vynutit úplné "
"ukončení aplikace."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Vynutit ukončení"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Počkat"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""
@@ -669,10 +632,11 @@ msgid ""
"These windows do not support “save current setup” and will have to be " "These windows do not support “save current setup” and will have to be "
"restarted manually next time you log in." "restarted manually next time you log in."
msgstr "" msgstr ""
"Tato okna nepodporují „uložení aktuálního nastavení“ a po svém příštím " "Tato okna nepodporují „uložení aktuálního nastavení“ a po svém "
"přihlášení je budete muset spustit ručně." "příštím přihlášení je budete muset spustit ručně."
#: src/x11/window-props.c:559 #: src/x11/window-props.c:559
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (na %s)" msgstr "%s (na %s)"

159
po/es.po
View File

@@ -12,10 +12,10 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter.master\n" "Project-Id-Version: mutter.master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-02 10:05+0000\n" "POT-Creation-Date: 2017-02-16 01:44+0000\n"
"PO-Revision-Date: 2017-08-03 09:59+0200\n" "PO-Revision-Date: 2017-02-17 11:38+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: es <gnome-es-list@gnome.org>\n" "Language-Team: es <gnome-es-list@gnome.org>\n"
"Language: es\n" "Language: es\n"
@@ -275,6 +275,11 @@ msgstr ""
"Modificador que usar para extender las operaciones de gestión sobre ventanas" "Modificador que usar para extender las operaciones de gestión sobre ventanas"
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
#| msgid ""
#| "This key will initiate the \"overlay\", which is a combination window "
#| "overview and application launching system. The default is intended to be "
#| "the \"Windows key\" on PC hardware. It's expected that this binding "
#| "either the default or set to the empty string."
msgid "" msgid ""
"This key will initiate the “overlay”, which is a combination window overview " "This key will initiate the “overlay”, which is a combination window overview "
"and application launching system. The default is intended to be the “Windows " "and application launching system. The default is intended to be the “Windows "
@@ -323,6 +328,10 @@ msgid "Workspaces are managed dynamically"
msgstr "Las áreas de trabajo se gestionan dinámicamente" msgstr "Las áreas de trabajo se gestionan dinámicamente"
#: data/org.gnome.mutter.gschema.xml.in:41 #: data/org.gnome.mutter.gschema.xml.in:41
#| 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)."
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether theres a "
"static number of workspaces (determined by the num-workspaces key in org." "static number of workspaces (determined by the num-workspaces key in org."
@@ -361,6 +370,10 @@ msgid "Delay focus changes until the pointer stops moving"
msgstr "Retrasar el cambio de foco hasta detener el puntero" msgstr "Retrasar el cambio de foco hasta detener el puntero"
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
#| 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."
msgid "" msgid ""
"If set to true, and the focus mode is either “sloppy” or “mouse” then the " "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 " "focus will not be changed immediately when entering a window, but only after "
@@ -375,6 +388,9 @@ msgid "Draggable border width"
msgstr "Anchura arrastrable del borde" msgstr "Anchura arrastrable del borde"
#: data/org.gnome.mutter.gschema.xml.in:80 #: data/org.gnome.mutter.gschema.xml.in:80
#| 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."
msgid "" msgid ""
"The amount of total draggable borders. If the themes visible borders are " "The amount of total draggable borders. If the themes visible borders are "
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
@@ -409,57 +425,14 @@ msgstr ""
"Cuando es cierto, las ventanas nuevas se colocarán siempre en el centro de " "Cuando es cierto, las ventanas nuevas se colocarán siempre en el centro de "
"la pantalla activa del monitor." "la pantalla activa del monitor."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Activar las características experimentales"
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new "
"monitor configuration system, aimed to replace the old one. This enables a "
"higher level configuration API to be used by configuration applications, as "
"well as the ability to configure per logical monitor scale. • “scale-monitor-"
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr ""
"Para activar las características experimentales, añada la palabra clave de "
"la característica a la lista. Depende de la característica que se deba "
"reiniciar o no el compositor. Cualquier característica experimental puede no "
"estar disponible o ser configurable. No espere que lo que se añada en este "
"escenario sirva como prueba futura. Las palabras clave actualmente "
"disponibles son: • \"monitor-config-manager\" - utiliza el nuevo sistema de "
"configuración del monitor, destinado a sustituir el antiguo. Esto permite "
"que las aplicaciones de configuración usen una API de configuración de nivel "
"superior, así como la capacidad de configurar el escalado de monitores "
"lógicos. • \"scale-monitor-framebuffer\" - convierte a mutter en ña manera "
"predeterminada de disponer monitores lógicos en un espacio lógico de "
"coordenadas de píxeles, al escalar framebuffers de monitores framebuffers en "
"lugar del contenido de ventana, para administrar monitores HiDPI. No "
"requiere un reinicio. También es necesario activar \"monitor-config-manager"
"\" para activar esta función."
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Seleccionar ventana de la pestaña emergente" msgstr "Seleccionar ventana de la pestaña emergente"
#: data/org.gnome.mutter.gschema.xml.in:156 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Cancelar pestaña emergente" msgstr "Cancelar pestaña emergente"
#: data/org.gnome.mutter.gschema.xml.in:161
msgid "Switch monitor configurations"
msgstr "Cambiar la configuración del monitor"
#: data/org.gnome.mutter.gschema.xml.in:166
msgid "Rotates the built-in monitor configuration"
msgstr "Rota la configuración del monitor empotrado"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Cambiar al VT 1" msgstr "Cambiar al VT 1"
@@ -508,53 +481,53 @@ msgstr "Cambiar al VT 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Cambiar al VT 12" msgstr "Cambiar al VT 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Volver a activar los atajos"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2118 #: src/backends/meta-input-settings.c:1759
#, c-format #, c-format
#| msgid "Mode Switch: Mode %d"
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Cambiar modo (grupo %d)" msgstr "Cambiar modo (grupo %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2141 #: src/backends/meta-input-settings.c:1781
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Cambiar monitor" msgstr "Cambiar monitor"
#: src/backends/meta-input-settings.c:2143 #: src/backends/meta-input-settings.c:1783
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Mostrar la ayuda en pantalla" msgstr "Mostrar la ayuda en pantalla"
#: src/backends/meta-monitor-manager.c:927 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Pantalla integrada" msgstr "Pantalla integrada"
#: src/backends/meta-monitor-manager.c:950 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Desconocida" msgstr "Desconocida"
#: src/backends/meta-monitor-manager.c:952 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Pantalla desconocida" msgstr "Pantalla desconocida"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:960 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:471
#, c-format #, c-format
#| msgid ""
#| "Another compositing manager is already running on screen %i on display "
#| "\"%s\"."
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
msgstr "" msgstr ""
@@ -565,8 +538,35 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Evento de campana" msgstr "Evento de campana"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "«%s» no está respondiendo."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "La aplicación no está respondiendo."
#: 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 ""
"Puede elegir esperar un rato para ver si continua o forzar la aplicación "
"para cerrarla completamente."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Forzar la salida"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Esperar"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
#| msgid "Failed to open X Window System display '%s'\n"
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
msgstr "Ocurrió un error al abrir la pantalla de X Window System «%s»\n" msgstr "Ocurrió un error al abrir la pantalla de X Window System «%s»\n"
@@ -606,34 +606,14 @@ msgstr "Ejecutar como compositor anidado"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Ejecutar como servidor completo, en lugar de anidado" msgstr "Ejecutar como servidor completo, en lugar de anidado"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "«%s» no está respondiendo."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "La aplicación no está respondiendo."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Puede elegir esperar un rato para ver si continua o forzar la aplicación "
"para cerrarla completamente."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Forzar la salida"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Esperar"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, 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"
msgid "" msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
@@ -663,6 +643,9 @@ msgstr "Área de trabajo %d"
#: src/core/screen.c:580 #: src/core/screen.c:580
#, c-format #, c-format
#| msgid ""
#| "Display \"%s\" already has a window manager; try using the --replace "
#| "option to replace the current window manager."
msgid "" msgid ""
"Display “%s” already has a window manager; try using the --replace option to " "Display “%s” already has a window manager; try using the --replace option to "
"replace the current window manager." "replace the current window manager."
@@ -672,6 +655,7 @@ msgstr ""
#: src/core/screen.c:665 #: src/core/screen.c:665
#, c-format #, c-format
#| msgid "Screen %d on display '%s' is invalid\n"
msgid "Screen %d on display “%s” is invalid\n" msgid "Screen %d on display “%s” is invalid\n"
msgstr "La ventana %d en la pantalla «%s» no es válida\n" msgstr "La ventana %d en la pantalla «%s» no es válida\n"
@@ -685,6 +669,9 @@ msgid "Mode Switch: Mode %d"
msgstr "Cambiar modo: modo %d" msgstr "Cambiar modo: modo %d"
#: src/x11/session.c:1815 #: src/x11/session.c:1815
#| msgid ""
#| "These windows do not support &quot;save current setup&quot; and will have "
#| "to be restarted manually next time you log in."
msgid "" msgid ""
"These windows do not support “save current setup” and will have to be " "These windows do not support “save current setup” and will have to be "
"restarted manually next time you log in." "restarted manually next time you log in."

125
po/fr.po
View File

@@ -17,10 +17,10 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter master\n" "Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-13 15:47+0000\n" "POT-Creation-Date: 2017-02-16 01:44+0000\n"
"PO-Revision-Date: 2017-08-15 09:16+0200\n" "PO-Revision-Date: 2017-02-17 21:09+0100\n"
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n" "Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n" "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
"Language: fr\n" "Language: fr\n"
@@ -410,59 +410,16 @@ msgstr ""
"Si true (vrai), les nouvelles fenêtres seront toujours placées au centre de " "Si true (vrai), les nouvelles fenêtres seront toujours placées au centre de "
"l'écran actif du moniteur." "l'écran actif du moniteur."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Activer les fonctionnalités expérimentales"
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new "
"monitor configuration system, aimed to replace the old one. This enables a "
"higher level configuration API to be used by configuration applications, as "
"well as the ability to configure per logical monitor scale. • “scale-monitor-"
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr ""
"Pour activer les fonctionnalités expérimentales, ajoutez le mot-clé de la "
"fonctionnalité dans la liste. Selon la fonctionnalité, il peut être nécessaire "
"de redémarrer le compositeur. Chaque fonctionnalité expérimentale peut "
"disparaître ou ne plus être configurable. N'attendez pas à ce que le contenu de "
"ce réglage soit stable dans le temps. Les mots-clés actuellement possibles "
"sont : • « monitor-config-manager » — utiliser le nouveau système de "
"configuration de moniteur qui remplacera l'ancien à terme. Cela active une "
"API de configuration de plus haut niveau exploitable par les applications de "
"configuration. Il permet aussi de configurer par échelle de moniteur logique. "
"• « scale-monitor-framebuffer » — demande à mutter d'utiliser par défaut une "
"disposition par moniteur logique dans un espace de coordonnées de pixels logique, "
"tout en mettant à l'échelle les « framebuffers » de moniteur au lieu des contenus "
"de fenêtre pour pouvoir gérer les moniteurs à haute densité. Cela ne nécessite "
"pas de redémarrage. L'activation de « monitor-config-manager » est requis pour "
"que cette fonctionnalité soit activée."
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "" msgstr ""
"Sélectionner la fenêtre dans la vue qui apparaît suite à un appui sur la " "Sélectionner la fenêtre dans la vue qui apparaît suite à un appui sur la "
"touche tab" "touche tab"
#: data/org.gnome.mutter.gschema.xml.in:156 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Fermer la vue qui apparaît suite à un appui sur la touche tab" msgstr "Fermer la vue qui apparaît suite à un appui sur la touche tab"
#: data/org.gnome.mutter.gschema.xml.in:161
msgid "Switch monitor configurations"
msgstr "Changer de configuration de moniteur"
#: data/org.gnome.mutter.gschema.xml.in:166
msgid "Rotates the built-in monitor configuration"
msgstr "Passe à la prochaine configuration intégrée de moniteur"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Passer à l'émulateur de terminal 1" msgstr "Passer à l'émulateur de terminal 1"
@@ -511,14 +468,10 @@ msgstr "Passer à l'émulateur de terminal 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Passer à l'émulateur de terminal 12" msgstr "Passer à l'émulateur de terminal 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Réactiver les raccourcis"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2118 #: src/backends/meta-input-settings.c:1759
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Changement de mode (groupe %d)" msgstr "Changement de mode (groupe %d)"
@@ -526,37 +479,37 @@ msgstr "Changement de mode (groupe %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2141 #: src/backends/meta-input-settings.c:1781
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Changer de moniteur" msgstr "Changer de moniteur"
#: src/backends/meta-input-settings.c:2143 #: src/backends/meta-input-settings.c:1783
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Afficher l'aide à l'écran" msgstr "Afficher l'aide à l'écran"
#: src/backends/meta-monitor-manager.c:927 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Affichage intégré" msgstr "Affichage intégré"
#: src/backends/meta-monitor-manager.c:950 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Inconnu" msgstr "Inconnu"
#: src/backends/meta-monitor-manager.c:952 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Affichage inconnu" msgstr "Affichage inconnu"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:960 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:471
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -568,6 +521,32 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Évènement sonore" msgstr "Évènement sonore"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "« %s » ne répond pas."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "L'application ne répond pas."
#: 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 ""
"Vous pouvez patienter un instant pour continuer ou forcer l'application à "
"quitter définitivement."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Forcer à quitter"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Attendre"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -609,32 +588,6 @@ msgstr "Lancer comme un compositeur imbriqué"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Lancer comme un serveur d'affichage complet, plutôt qu'imbriqué" msgstr "Lancer comme un serveur d'affichage complet, plutôt qu'imbriqué"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "« %s » ne répond pas."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "L'application ne répond pas."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Vous pouvez patienter un instant pour continuer ou forcer l'application à "
"quitter définitivement."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Forcer à quitter"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Attendre"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""

112
po/fur.po
View File

@@ -8,15 +8,15 @@ msgstr ""
"Project-Id-Version: mutter master\n" "Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-07-22 09:45+0000\n" "POT-Creation-Date: 2017-04-21 21:33+0000\n"
"PO-Revision-Date: 2017-07-22 22:53+0200\n" "PO-Revision-Date: 2017-04-30 15:41+0200\n"
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n" "Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
"Language-Team: Friulian <fur@li.org>\n" "Language-Team: Friulian <fur@li.org>\n"
"Language: fur\n" "Language: fur\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.2\n" "X-Generator: Poedit 1.8.12\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
msgid "Navigation" msgid "Navigation"
@@ -405,14 +405,10 @@ msgid ""
"Whether the feature requires restarting the compositor depends on the given " "Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or " "feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future " "configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new " "proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
"monitor configuration system, aimed to replace the old one. This enables a " "mutter default to layout logical monitors in a logical pixel coordinate "
"higher level configuration API to be used by configuration applications, as " "space, while scaling monitor framebuffers instead of window content, to "
"well as the ability to configure per logical monitor scale. • “scale-monitor-" "manage HiDPI monitors. Does not require a restart."
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr "" msgstr ""
"Par abilitâ lis funzionalitâts sperimentâls, zonte la peraule clâf de " "Par abilitâ lis funzionalitâts sperimentâls, zonte la peraule clâf de "
"funzionalitât ae liste. Il fat che la funzionalitât e vedi bisugne di tornâ " "funzionalitât ae liste. Il fat che la funzionalitât e vedi bisugne di tornâ "
@@ -420,33 +416,19 @@ msgstr ""
"funzionalitât sperimentâl no je necessarie che e sedi disponibile o " "funzionalitât sperimentâl no je necessarie che e sedi disponibile o "
"configurabile. No sta spietâti di zontâ alc in cheste impostazion e pensâ " "configurabile. No sta spietâti di zontâ alc in cheste impostazion e pensâ "
"che e duredi tal timp. Atualmentri lis peraulis clâf pussibilis a son: • " "che e duredi tal timp. Atualmentri lis peraulis clâf pussibilis a son: • "
"“monitor-config-manager” — al dopre il gnûf sisteme di configurazion dal " "“scale-monitor-framebuffer” — al rint come predefinît par mutter la "
"visôr, fat par sostituî chel vecjo. Chest al abilite une API di nivel " "disposizion dai visôrs logjics intun spazi logjic di coordenadis dai pixel, "
"superiôr che e pues jessi doprade di aplicazions di configurazion, cussì " "intant i framebuffer dai visôrs par scjalâ, invezit dal contignût dal "
"come la capacitât di configurâ par scjale di monitor logjic. • “scale-" "barcon, a gjestissin i visôrs HiDPI. Nol covente tornâ a inviâ."
"monitor-framebuffer” — al rint come predefinît par mutter la disposizion dai "
"visôrs logjics intun spazi logjic di coordenadis dai pixel, intant i "
"framebuffer dai visôrs par scjalâ, invezit dal contignût dal barcon, a "
"gjestissin i visôrs HiDPI. Nol covente tornâ a inviâ. In plui al è necessari "
"abilitâ “monitor-config-manager” par fâ in mût che cheste funzionalitât e "
"sedi abilitade."
#: data/org.gnome.mutter.gschema.xml.in:151 #: data/org.gnome.mutter.gschema.xml.in:141
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Selezione barcon dal tab popup" msgstr "Selezione barcon dal tab popup"
#: data/org.gnome.mutter.gschema.xml.in:156 #: data/org.gnome.mutter.gschema.xml.in:146
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Anule tab popup" msgstr "Anule tab popup"
#: data/org.gnome.mutter.gschema.xml.in:161
msgid "Switch monitor configurations"
msgstr "Cambie configurazions visôr"
#: data/org.gnome.mutter.gschema.xml.in:166
msgid "Rotates the built-in monitor configuration"
msgstr "Al volte la configurazion dal visôr integrât"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Passe al VT 1" msgstr "Passe al VT 1"
@@ -498,7 +480,7 @@ msgstr "Passe al VT 12"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2118 #: src/backends/meta-input-settings.c:1848
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Cambie mût (Grup %d)" msgstr "Cambie mût (Grup %d)"
@@ -506,37 +488,37 @@ msgstr "Cambie mût (Grup %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2141 #: src/backends/meta-input-settings.c:1870
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Cambie visôr" msgstr "Cambie visôr"
#: src/backends/meta-input-settings.c:2143 #: src/backends/meta-input-settings.c:1872
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Mostre jutori a schermi" msgstr "Mostre jutori a schermi"
#: src/backends/meta-monitor-manager.c:925 #: src/backends/meta-monitor-manager.c:783
msgid "Built-in display" msgid "Built-in display"
msgstr "Display integrât" msgstr "Display integrât"
#: src/backends/meta-monitor-manager.c:948 #: src/backends/meta-monitor-manager.c:806
msgid "Unknown" msgid "Unknown"
msgstr "No cognossût" msgstr "No cognossût"
#: src/backends/meta-monitor-manager.c:950 #: src/backends/meta-monitor-manager.c:808
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Display no cognossût" msgstr "Display no cognossût"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:958 #: src/backends/meta-monitor-manager.c:816
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:474
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -548,6 +530,32 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Event cjampane" msgstr "Event cjampane"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "“%s” nol rispuint."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "La aplicazion no rispuint."
#: 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 ""
"Al è pussibil sielzi di spietâ un pôc lassant che la aplicazion e continui o "
"sfuarçâ la aplicazion par sierâle dal dut."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "Sfuarce _Jessude"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Spiete"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -589,32 +597,6 @@ msgstr "Eseguìs come compositor nidiât"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Eseguìs come servidôr display complet, invezit che nidiât" msgstr "Eseguìs come servidôr display complet, invezit che nidiât"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "“%s” nol rispuint."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "La aplicazion no rispuint."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Al è pussibil sielzi di spietâ un pôc lassant che la aplicazion e continui o "
"sfuarçâ la aplicazion par sierâle dal dut."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "Sfuarce _Jessude"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Spiete"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""

170
po/gl.po
View File

@@ -10,21 +10,22 @@
# Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012. # Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012.
# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012. # Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015, 2016, 2017. # Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015, 2016, 2017.
#
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gl\n" "Project-Id-Version: gl\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=mutter" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
"&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-21 04:46+0000\n" "POT-Creation-Date: 2017-02-28 06:20+0000\n"
"PO-Revision-Date: 2017-08-23 12:21+0200\n" "PO-Revision-Date: 2017-03-11 03:02+0100\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n" "Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: Galician\n" "Language-Team: Galician <gnome-l10n-gl@gnome.org>\n"
"Language: gl\n" "Language: gl\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Virtaal 0.7.1\n" "X-Generator: Gtranslator 2.91.7\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
@@ -277,6 +278,11 @@ msgstr ""
"Modificador que se vai usar para as accións modificadas de xestión de xanela" "Modificador que se vai usar para as accións modificadas de xestión de xanela"
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
#| msgid ""
#| "This key will initiate the \"overlay\", which is a combination window "
#| "overview and application launching system. The default is intended to be "
#| "the \"Windows key\" on PC hardware. It's expected that this binding "
#| "either the default or set to the empty string."
msgid "" msgid ""
"This key will initiate the “overlay”, which is a combination window overview " "This key will initiate the “overlay”, which is a combination window overview "
"and application launching system. The default is intended to be the “Windows " "and application launching system. The default is intended to be the “Windows "
@@ -322,6 +328,10 @@ msgid "Workspaces are managed dynamically"
msgstr "Os espazos de traballo xestiónanse dinamicamente" msgstr "Os espazos de traballo xestiónanse dinamicamente"
#: data/org.gnome.mutter.gschema.xml.in:41 #: data/org.gnome.mutter.gschema.xml.in:41
#| 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)."
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether theres a "
"static number of workspaces (determined by the num-workspaces key in org." "static number of workspaces (determined by the num-workspaces key in org."
@@ -360,6 +370,10 @@ msgid "Delay focus changes until the pointer stops moving"
msgstr "Retrasar o cambio de enfoque até que o punteiro se deteña ao moverse" msgstr "Retrasar o cambio de enfoque até que o punteiro se deteña ao moverse"
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
#| 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."
msgid "" msgid ""
"If set to true, and the focus mode is either “sloppy” or “mouse” then the " "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 " "focus will not be changed immediately when entering a window, but only after "
@@ -374,6 +388,9 @@ msgid "Draggable border width"
msgstr "Anchura arrastrábel do bordo" msgstr "Anchura arrastrábel do bordo"
#: data/org.gnome.mutter.gschema.xml.in:80 #: data/org.gnome.mutter.gschema.xml.in:80
#| 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."
msgid "" msgid ""
"The amount of total draggable borders. If the themes visible borders are " "The amount of total draggable borders. If the themes visible borders are "
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
@@ -406,61 +423,14 @@ msgstr ""
"Cando está verdadeiro, as novas xanelas sempre se porán no centro da " "Cando está verdadeiro, as novas xanelas sempre se porán no centro da "
"pantalla activa." "pantalla activa."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Activar as características experimentais"
#: data/org.gnome.mutter.gschema.xml.in:108
#| msgid ""
#| "To enable experimental features, add the feature keyword to the list. "
#| "Whether the feature requires restarting the compositor depends on the "
#| "given feature. Any experimental feature is not required to still be "
#| "available, or configurable. Dont expect adding anything in this setting "
#| "to be future proof. Currently possible keywords: • “monitor-config-"
#| "manager” — use the new monitor configuration system, aimed to replace the "
#| "old one. This enables a higher level configuration API to be used by "
#| "configuration applications, as well as the ability to configure per "
#| "logical monitor scale. • “scale-monitor-framebuffer” — makes mutter "
#| "default to layout logical monitors in a logical pixel coordinate space, "
#| "while scaling monitor framebuffers instead of window content, to manage "
#| "HiDPI monitors. Does not require a restart. Also enabling “monitor-config-"
#| "manager” is required for this feature to be enabled."
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
"mutter default to layout logical monitors in a logical pixel coordinate "
"space, while scaling monitor framebuffers instead of window content, to "
"manage HiDPI monitors. Does not require a restart."
msgstr ""
"Para activar as características experimentais, engada a palabra chave da "
"característica á lista. Depende da característica que se deba reiniciar ou "
"non o compositor. Calquera característica experimental pode non estar "
"dispoñíbel ou ser configurábel. Non agarde que o que se engada neste "
"escenario sirva como proba futura. As palabras chave actualmente dispoñíbeis "
"son: “scale-monitor-framebuffer” — convirte a mutter na maneira "
"predeterminada de dispor monitores lóxicos nun espacio lóxico de coordenadas "
"de íxeles, a escalar framebuffers de monitores framebuffers no lugar do "
"contido de xnalea, para administrar monitores HiDPI. Non require un reinicio."
#: data/org.gnome.mutter.gschema.xml.in:141
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Seleccionar xanela da lapela emerxente" msgstr "Seleccionar xanela da lapela emerxente"
#: data/org.gnome.mutter.gschema.xml.in:146 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Cancelar lapela emerxente" msgstr "Cancelar lapela emerxente"
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Switch monitor configurations"
msgstr "Cambiar preferencias do monitor"
#: data/org.gnome.mutter.gschema.xml.in:156
msgid "Rotates the built-in monitor configuration"
msgstr "Rota a configuración do monitor embebido"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Cambiar á VT 1" msgstr "Cambiar á VT 1"
@@ -509,53 +479,53 @@ msgstr "Cambiar á VT 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Cambiar á VT 12" msgstr "Cambiar á VT 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Reactivar os atallos"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2151 #: src/backends/meta-input-settings.c:1800
#, c-format #, c-format
#| msgid "Mode Switch: Mode %d"
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Modo conmutador (Grupo %d)" msgstr "Modo conmutador (Grupo %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2174 #: src/backends/meta-input-settings.c:1822
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Cambiar monitor" msgstr "Cambiar monitor"
#: src/backends/meta-input-settings.c:2176 #: src/backends/meta-input-settings.c:1824
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Mostrar axuda en pantalla" msgstr "Mostrar axuda en pantalla"
#: src/backends/meta-monitor-manager.c:903 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Pantalla embebida" msgstr "Pantalla embebida"
#: src/backends/meta-monitor-manager.c:926 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Descoñecido" msgstr "Descoñecido"
#: src/backends/meta-monitor-manager.c:928 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Pantalla descoñecida" msgstr "Pantalla descoñecida"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:936 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:471
#, c-format #, c-format
#| msgid ""
#| "Another compositing manager is already running on screen %i on display "
#| "\"%s\"."
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
msgstr "" msgstr ""
@@ -566,8 +536,35 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Evento de campá" msgstr "Evento de campá"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "«%s» non está respondendo."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "O Aplicativo non está respondendo."
#: 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 ""
"Pode elixir esperar un momento para ver se continúa ou forzar ao aplicativo "
"a pechar completamente."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Forzar a saída"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "Espe_rar"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
#| msgid "Failed to open X Window System display '%s'\n"
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
msgstr "Produciuse un erro ao abrir a visualización do X Window System «%s»\n" msgstr "Produciuse un erro ao abrir a visualización do X Window System «%s»\n"
@@ -607,34 +604,14 @@ msgstr "Executar como compositor anidado"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Executar como un servidor de pantalla completo, fronte a un aniñado" msgstr "Executar como un servidor de pantalla completo, fronte a un aniñado"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "«%s» non está respondendo."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "O Aplicativo non está respondendo."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Pode elixir esperar un momento para ver se continúa ou forzar ao aplicativo "
"a pechar completamente."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Forzar a saída"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "Espe_rar"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, 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"
msgid "" msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
@@ -663,6 +640,9 @@ msgstr "Espazo de traballo %d"
#: src/core/screen.c:580 #: src/core/screen.c:580
#, c-format #, c-format
#| msgid ""
#| "Display \"%s\" already has a window manager; try using the --replace "
#| "option to replace the current window manager."
msgid "" msgid ""
"Display “%s” already has a window manager; try using the --replace option to " "Display “%s” already has a window manager; try using the --replace option to "
"replace the current window manager." "replace the current window manager."
@@ -672,6 +652,7 @@ msgstr ""
#: src/core/screen.c:665 #: src/core/screen.c:665
#, c-format #, c-format
#| msgid "Screen %d on display '%s' is invalid\n"
msgid "Screen %d on display “%s” is invalid\n" msgid "Screen %d on display “%s” is invalid\n"
msgstr "A pantalla %d na visualización «%s» non é válida\n" msgstr "A pantalla %d na visualización «%s» non é válida\n"
@@ -685,6 +666,9 @@ msgid "Mode Switch: Mode %d"
msgstr "Modo conmutador: Modo %d" msgstr "Modo conmutador: Modo %d"
#: src/x11/session.c:1815 #: src/x11/session.c:1815
#| msgid ""
#| "These windows do not support &quot;save current setup&quot; and will have "
#| "to be restarted manually next time you log in."
msgid "" msgid ""
"These windows do not support “save current setup” and will have to be " "These windows do not support “save current setup” and will have to be "
"restarted manually next time you log in." "restarted manually next time you log in."

6710
po/hr.po

File diff suppressed because it is too large Load Diff

125
po/hu.po
View File

@@ -12,15 +12,15 @@ msgstr ""
"Project-Id-Version: mutter master\n" "Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-02 10:05+0000\n" "POT-Creation-Date: 2017-05-14 09:49+0000\n"
"PO-Revision-Date: 2017-08-09 08:51+0200\n" "PO-Revision-Date: 2017-05-14 21:36+0200\n"
"Last-Translator: Meskó Balázs <meskobalazs@fedoraproject.org>\n" "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n" "Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
"Language: hu\n" "Language: hu\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.3\n" "X-Generator: Lokalize 1.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
@@ -409,46 +409,30 @@ msgid ""
"Whether the feature requires restarting the compositor depends on the given " "Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or " "feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future " "configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new " "proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
"monitor configuration system, aimed to replace the old one. This enables a " "mutter default to layout logical monitors in a logical pixel coordinate "
"higher level configuration API to be used by configuration applications, as " "space, while scaling monitor framebuffers instead of window content, to "
"well as the ability to configure per logical monitor scale. • “scale-monitor-" "manage HiDPI monitors. Does not require a restart."
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr "" msgstr ""
"A kísérleti funkciók engedélyezéséhez adja hozzá a funkció kulcsszavát a " "A kísérleti funkciók engedélyezéséhez adja hozzá a funkció kulcsszavát a "
"listához. A funkció a betűszedő újraindítását igényelheti az adott " "listához. A funkció a betűszedő újraindítását igényelheti az adott funkciótól "
"funkciótól függően. Egyik kísérleti funkciónál sem szükséges, hogy továbbra " "függően. Egyik kísérleti funkciónál sem szükséges, hogy továbbra is elérhető "
"is elérhető vagy beállítható legyen. Ne várja el azt, hogy ha bármit hozzáad " "vagy beállítható legyen. Ne várja el azt, hogy ha bármit hozzáad ehhez a "
"ehhez a beállításhoz, akkor az a jövőben is elérhető lesz. Jelenleg " "beállításhoz, akkor az a jövőben is elérhető lesz. Jelenleg lehetséges "
"lehetséges kulcsszavak: • „monitor-config-manager” az új monitor " "kulcsszavak: • „scale-monitor-framebuffer” alapértelmezetté teszi a mutter "
"konfigurációs rendszer használata, amely a régi leváltására készül. Ez egy " "programot a logikai monitorok elrendezéséhez egy logikai "
"magasabb szintű konfigurációs API-t biztosít a beállító alkalmazásoknak, " "képpontkoordináta-térben, miközben átméretezi a monitor keretpufferét az "
"valamint lehetővé teszi a logikai monitorok különálló méretezését. • „scale-" "ablaktartalom helyett azért, hogy kezelje a HiDPI monitorokat. Nem igényel "
"monitor-framebuffer” — alapértelmezetté teszi a mutter programot a logikai " "újraindítást."
"monitorok elrendezéséhez egy logikai képpontkoordináta-térben, miközben "
"átméretezi a monitor keretpufferét az ablaktartalom helyett azért, hogy "
"kezelje a HiDPI monitorokat. Nem igényel újraindítást. Ezen funkció "
"bekapcsolásához a „monitor-config-manager” engedélyezése is szükséges."
#: data/org.gnome.mutter.gschema.xml.in:151 #: data/org.gnome.mutter.gschema.xml.in:141
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Ablakok kiválasztása tab billentyűre felugró ablakból" msgstr "Ablakok kiválasztása tab billentyűre felugró ablakból"
#: data/org.gnome.mutter.gschema.xml.in:156 #: data/org.gnome.mutter.gschema.xml.in:146
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Tab felugró kikapcsolása" msgstr "Tab felugró kikapcsolása"
#: data/org.gnome.mutter.gschema.xml.in:161
msgid "Switch monitor configurations"
msgstr "Monitorkonfiguráció átváltása"
#: data/org.gnome.mutter.gschema.xml.in:166
msgid "Rotates the built-in monitor configuration"
msgstr "Cserélgeti a beépített monitorkonfigurációkat"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Váltás az 1. VT-re" msgstr "Váltás az 1. VT-re"
@@ -497,14 +481,10 @@ msgstr "Váltás a 11. VT-re"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Váltás a 12. VT-re" msgstr "Váltás a 12. VT-re"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Gyorsbillentyűk újraengedélyezése"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2118 #: src/backends/meta-input-settings.c:1848
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Módkapcsoló (%d. csoport)" msgstr "Módkapcsoló (%d. csoport)"
@@ -512,30 +492,30 @@ msgstr "Módkapcsoló (%d. csoport)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2141 #: src/backends/meta-input-settings.c:1870
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Monitorváltás" msgstr "Monitorváltás"
#: src/backends/meta-input-settings.c:2143 #: src/backends/meta-input-settings.c:1872
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Képernyősúgó megjelenítése" msgstr "Képernyősúgó megjelenítése"
#: src/backends/meta-monitor-manager.c:927 #: src/backends/meta-monitor-manager.c:783
msgid "Built-in display" msgid "Built-in display"
msgstr "Beépített kijelző" msgstr "Beépített kijelző"
#: src/backends/meta-monitor-manager.c:950 #: src/backends/meta-monitor-manager.c:806
msgid "Unknown" msgid "Unknown"
msgstr "Ismeretlen" msgstr "Ismeretlen"
#: src/backends/meta-monitor-manager.c:952 #: src/backends/meta-monitor-manager.c:808
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Ismeretlen kijelző" msgstr "Ismeretlen kijelző"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:960 #: src/backends/meta-monitor-manager.c:816
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
@@ -554,6 +534,32 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Csengetés esemény" msgstr "Csengetés esemény"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "„%s” nem válaszol."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Az alkalmazás nem válaszol."
#: 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 ""
"Várhat egy kicsit a folytatódására, vagy kikényszerítheti az alkalmazás "
"teljes kilépését."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Erőltetett kilépés"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "Vá_rakozás"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -596,32 +602,6 @@ msgid "Run as a full display server, rather than nested"
msgstr "" msgstr ""
"Futtatás teljes megjelenítő kiszolgálóként az egymásba ágyazott helyett" "Futtatás teljes megjelenítő kiszolgálóként az egymásba ágyazott helyett"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "„%s” nem válaszol."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "Az alkalmazás nem válaszol."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Várhat egy kicsit a folytatódására, vagy kikényszerítheti az alkalmazás "
"teljes kilépését."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Erőltetett kilépés"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "Vá_rakozás"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""
@@ -685,3 +665,4 @@ msgstr ""
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (ezen: %s)" msgstr "%s (ezen: %s)"

View File

@@ -11,15 +11,15 @@ msgstr ""
"Project-Id-Version: mutter master\n" "Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-21 04:46+0000\n" "POT-Creation-Date: 2017-04-21 21:33+0000\n"
"PO-Revision-Date: 2017-08-21 13:42+0700\n" "PO-Revision-Date: 2017-04-23 14:39+0700\n"
"Last-Translator: Kukuh Syafaat <syafaatkukuh@gmail.com>\n" "Last-Translator: Kukuh Syafaat <syafaatkukuh@gmail.com>\n"
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n" "Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
"Language: id\n" "Language: id\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.3\n" "X-Generator: Poedit 1.8.11\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
@@ -417,11 +417,11 @@ msgstr ""
"daftar. Apakah fitur memerlukan nyala ulang kompositor tergantung pada fitur " "daftar. Apakah fitur memerlukan nyala ulang kompositor tergantung pada fitur "
"yang diberikan. Setiap fitur eksperimental tidak diharuskan tetap tersedia, " "yang diberikan. Setiap fitur eksperimental tidak diharuskan tetap tersedia, "
"atau dapat dikonfigurasi. Jangan berharap menambahkan apapun dalam " "atau dapat dikonfigurasi. Jangan berharap menambahkan apapun dalam "
"pengaturan ini kebal perubahan di masa depan. Saat ini kata kunci yang " "pengaturan ini sebagai bukti di masa depan. Saat ini kata kunci yang "
"mungkin: • scale-monitor-framebuffer — membuat bawaan mutter untuk tata " "mungkin: • \"scale-monitor-framebuffer\" — membuat mutter bawaan ke tata "
"letak monitor logikal dalam ruang koordinat pixel logikal, sambil " "letak monitor logikal dalam ruang koordinat pixel logikal, sementara skala "
"menskalakan framebuffer monitor alih-alih konten jendela, untuk mengelola " "monitor framebuffer bukan konten jendela, untuk mengatur monitor HiDPI. "
"monitor HiDPI. Tidak perlu mulai ulang." "Tidak perlu nyala ulang."
#: data/org.gnome.mutter.gschema.xml.in:141 #: data/org.gnome.mutter.gschema.xml.in:141
msgid "Select window from tab popup" msgid "Select window from tab popup"
@@ -431,14 +431,6 @@ msgstr "Pilih jendela dari popup tab"
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Batalkan popup tab" msgstr "Batalkan popup tab"
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Switch monitor configurations"
msgstr "Tukar konfigurasi monitor bawaan"
#: data/org.gnome.mutter.gschema.xml.in:156
msgid "Rotates the built-in monitor configuration"
msgstr "Memutar konfigurasi monitor bawaan"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Bertukar ke VT 1" msgstr "Bertukar ke VT 1"
@@ -487,14 +479,10 @@ msgstr "Bertukar ke VT 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Bertukar ke VT 12" msgstr "Bertukar ke VT 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Aktifkan kembali pintasan"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2151 #: src/backends/meta-input-settings.c:1848
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Tukar Mode: (Grup %d)" msgstr "Tukar Mode: (Grup %d)"
@@ -502,37 +490,37 @@ msgstr "Tukar Mode: (Grup %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2174 #: src/backends/meta-input-settings.c:1870
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Berpindah monitor" msgstr "Berpindah monitor"
#: src/backends/meta-input-settings.c:2176 #: src/backends/meta-input-settings.c:1872
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Tampilkan bantuan pada layar" msgstr "Tampilkan bantuan pada layar"
#: src/backends/meta-monitor-manager.c:903 #: src/backends/meta-monitor-manager.c:783
msgid "Built-in display" msgid "Built-in display"
msgstr "Tampilan bawaan" msgstr "Tampilan bawaan"
#: src/backends/meta-monitor-manager.c:926 #: src/backends/meta-monitor-manager.c:806
msgid "Unknown" msgid "Unknown"
msgstr "Tak Dikenal" msgstr "Tak Dikenal"
#: src/backends/meta-monitor-manager.c:928 #: src/backends/meta-monitor-manager.c:808
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Tampilan Tak Dikenal" msgstr "Tampilan Tak Dikenal"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:936 #: src/backends/meta-monitor-manager.c:816
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:474
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -543,6 +531,31 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Bel peristiwa" msgstr "Bel peristiwa"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "\"%s\" tak merespon."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Aplikasi tak merespon."
#: 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 ""
"Anda bisa memilih untuk menunggu sebentar atau memaksa aplikasi keluar."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Matikan Paksa"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Tunggu"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -584,31 +597,6 @@ msgstr "Jalankan sebagai kompositor bersarang"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Jalankan sebagai server tampilan penuh, ketimbang tampilan bersarang" msgstr "Jalankan sebagai server tampilan penuh, ketimbang tampilan bersarang"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "\"%s\" tak merespon."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "Aplikasi tak merespon."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Anda bisa memilih untuk menunggu sebentar atau memaksa aplikasi keluar."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Matikan Paksa"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Tunggu"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""

118
po/it.po
View File

@@ -10,10 +10,10 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter\n" "Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-21 04:46+0000\n" "POT-Creation-Date: 2017-02-16 15:52+0000\n"
"PO-Revision-Date: 2017-08-24 09:45+0200\n" "PO-Revision-Date: 2017-02-17 22:11+0100\n"
"Last-Translator: Milo Casagrande <milo@milo.name>\n" "Last-Translator: Milo Casagrande <milo@milo.name>\n"
"Language-Team: Italian <tp@lists.linux.it>\n" "Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n" "Language: it\n"
@@ -21,7 +21,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n"
"X-Generator: Poedit 1.8.12\n" "X-Generator: Poedit 2.0beta3\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
msgid "Navigation" msgid "Navigation"
@@ -410,48 +410,14 @@ msgstr ""
"Se impostata a VERO, le nuove finestre verranno sempre posizionate al centro " "Se impostata a VERO, le nuove finestre verranno sempre posizionate al centro "
"dello schermo attivo." "dello schermo attivo."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Abilita funzionalità sperimentali"
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
"mutter default to layout logical monitors in a logical pixel coordinate "
"space, while scaling monitor framebuffers instead of window content, to "
"manage HiDPI monitors. Does not require a restart."
msgstr ""
"Per abilitare le funzionalità sperimentali, aggiungere la parola chiave di "
"tale funzionalità nella lista. Se la funzionalità desiderata richiede il "
"riavvio del compositor, dipende dalla funzionalità stessa. Una qualsiasi "
"funzionalità sperimentale non è richiesta, ma può essere disponibile e "
"configurabile. Le funzionalità offerte potrebbero rendere il sistema "
"instabile. I possibili valori sono: • \"scale-monitor-framebuffer\" — Fa in "
"modo che mutter disponga gli schermi logici secondo uno spazio logico di "
"coordinate pixel, applicando il ridimensionamento ai framebuffer invece che "
"al contenuto della finestra, per gestire schermi HiDPI (non richiede il "
"riavvio)."
#: data/org.gnome.mutter.gschema.xml.in:141
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Seleziona finestra dal tab popup" msgstr "Seleziona finestra dal tab popup"
#: data/org.gnome.mutter.gschema.xml.in:146 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Annulla tab popup" msgstr "Annulla tab popup"
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Switch monitor configurations"
msgstr "Cambia le configurazioni del monitor"
#: data/org.gnome.mutter.gschema.xml.in:156
msgid "Rotates the built-in monitor configuration"
msgstr "Passa da una configurazione integrata all'altra del monitor"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Passa al VT 1" msgstr "Passa al VT 1"
@@ -500,14 +466,10 @@ msgstr "Passa al VT 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Passa al VT 12" msgstr "Passa al VT 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Riabilita scorciatoie"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2151 #: src/backends/meta-input-settings.c:1800
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Cambio modalità (gruppo %d)" msgstr "Cambio modalità (gruppo %d)"
@@ -515,37 +477,37 @@ msgstr "Cambio modalità (gruppo %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2174 #: src/backends/meta-input-settings.c:1822
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Cambia monitor" msgstr "Cambia monitor"
#: src/backends/meta-input-settings.c:2176 #: src/backends/meta-input-settings.c:1824
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Mostra aiuto sullo schermo" msgstr "Mostra aiuto sullo schermo"
#: src/backends/meta-monitor-manager.c:903 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Display integrato" msgstr "Display integrato"
#: src/backends/meta-monitor-manager.c:926 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Sconosciuto" msgstr "Sconosciuto"
#: src/backends/meta-monitor-manager.c:928 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Display sconosciuto" msgstr "Display sconosciuto"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:936 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:471
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -557,6 +519,32 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Evento campanella" msgstr "Evento campanella"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "Nessuna risposta da %s."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "L'applicazione non risponde."
#: 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 ""
"È possibile scegliere di attendere un po' lasciando che l'applicazione "
"continui, oppure forzare la terminazione dell'applicazione."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Forza uscita"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Attendi"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -598,32 +586,6 @@ msgstr "Esegui come compositor annidato"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Esegui come display server invece che annidato" msgstr "Esegui come display server invece che annidato"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "Nessuna risposta da %s."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "L'applicazione non risponde."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"È possibile scegliere di attendere un po' lasciando che l'applicazione "
"continui, oppure forzare la terminazione dell'applicazione."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Forza uscita"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Attendi"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""

203
po/kk.po
View File

@@ -6,17 +6,17 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter master\n" "Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-07-19 09:20+0000\n" "POT-Creation-Date: 2016-09-07 09:27+0000\n"
"PO-Revision-Date: 2017-07-27 17:28+0500\n" "PO-Revision-Date: 2016-09-09 21:12+0500\n"
"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n" "Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
"Language-Team: Kazakh <kk@li.org>\n" "Language-Team: Kazakh <kk@li.org>\n"
"Language: kk\n" "Language: kk\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.12\n" "X-Generator: Poedit 1.8.9\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
msgid "Navigation" msgid "Navigation"
@@ -270,10 +270,10 @@ msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
msgid "" msgid ""
"This key will initiate the overlay, which is a combination window overview " "This key will initiate the \"overlay\", which is a combination window "
"and application launching system. The default is intended to be the “Windows " "overview and application launching system. The default is intended to be the "
"key on PC hardware. Its expected that this binding either the default or " "\"Windows key\" on PC hardware. It's expected that this binding either the "
"set to the empty string." "default or set to the empty string."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:20 #: data/org.gnome.mutter.gschema.xml.in:20
@@ -306,7 +306,7 @@ msgstr "Жұмыс орындары динамикалы түрде басқар
#: data/org.gnome.mutter.gschema.xml.in:41 #: data/org.gnome.mutter.gschema.xml.in:41
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether there's a "
"static number of workspaces (determined by the num-workspaces key in org." "static number of workspaces (determined by the num-workspaces key in org."
"gnome.desktop.wm.preferences)." "gnome.desktop.wm.preferences)."
msgstr "" msgstr ""
@@ -337,9 +337,9 @@ msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
msgid "" msgid ""
"If set to true, and the focus mode is either sloppy or mouse then the " "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
"focus will not be changed immediately when entering a window, but only after " "the focus will not be changed immediately when entering a window, but only "
"the pointer stops moving." "after the pointer stops moving."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:79 #: data/org.gnome.mutter.gschema.xml.in:79
@@ -348,7 +348,7 @@ msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:80 #: data/org.gnome.mutter.gschema.xml.in:80
msgid "" msgid ""
"The amount of total draggable borders. If the themes visible borders are " "The amount of total draggable borders. If the theme's visible borders are "
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
msgstr "" msgstr ""
@@ -372,42 +372,14 @@ msgid ""
"screen of the monitor." "screen of the monitor."
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new "
"monitor configuration system, aimed to replace the old one. This enables a "
"higher level configuration API to be used by configuration applications, as "
"well as the ability to configure per logical monitor scale. • “scale-monitor-"
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:156 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "" msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:161
msgid "Switch monitor configurations"
msgstr "Монитор баптауларын ауыстыру"
#: data/org.gnome.mutter.gschema.xml.in:166
msgid "Rotates the built-in monitor configuration"
msgstr ""
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Бірінші виртуалды терминалына ауысу" msgstr "Бірінші виртуалды терминалына ауысу"
@@ -456,109 +428,57 @@ msgstr "Он бірінші виртуалды терминалына ауысу
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Он екінші виртуалды терминалына ауысу" msgstr "Он екінші виртуалды терминалына ауысу"
#. TRANSLATORS: This string refers to a button that switches between #: src/backends/meta-input-settings.c:1707
#. * different modes.
#.
#: src/backends/meta-input-settings.c:2118
#, c-format
msgid "Mode Switch (Group %d)"
msgstr ""
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs.
#.
#: src/backends/meta-input-settings.c:2141
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Мониторды ауыстыру" msgstr "Мониторды ауыстыру"
#: src/backends/meta-input-settings.c:2143 #: src/backends/meta-input-settings.c:1709
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Экрандағы көмекті көрсету" msgstr "Экрандағы көмекті көрсету"
#: src/backends/meta-monitor-manager.c:925 #: src/backends/meta-monitor-manager.c:514
msgid "Built-in display" msgid "Built-in display"
msgstr "Құрамындағы экран" msgstr "Құрамындағы экран"
#: src/backends/meta-monitor-manager.c:948 #: src/backends/meta-monitor-manager.c:537
msgid "Unknown" msgid "Unknown"
msgstr "Белгісіз" msgstr "Белгісіз"
#: src/backends/meta-monitor-manager.c:950 #: src/backends/meta-monitor-manager.c:539
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Белгісіз дисплей" msgstr "Белгісіз дисплей"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:958 #: src/backends/meta-monitor-manager.c:547
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:463
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr "" msgstr ""
#: src/core/bell.c:194 #: src/core/bell.c:194
msgid "Bell event" msgid "Bell event"
msgstr "" msgstr ""
#: src/core/display.c:608 #: src/core/delete.c:127
#, c-format
msgid "Failed to open X Window System display “%s”\n"
msgstr ""
#: src/core/main.c:189
msgid "Disable connection to session manager"
msgstr "Сессиялар менеджеріне байланыстарды сөндіру"
#: src/core/main.c:195
msgid "Replace the running window manager"
msgstr ""
#: src/core/main.c:201
msgid "Specify session management ID"
msgstr "Сессия менеджментінің ID-ін көрсету"
#: src/core/main.c:206
msgid "X Display to use"
msgstr "Қолданылатын X дисплейі"
#: src/core/main.c:212
msgid "Initialize session from savefile"
msgstr ""
#: src/core/main.c:218
msgid "Make X calls synchronous"
msgstr "X сервер шақыруларын синхронды қылу"
#: src/core/main.c:225
msgid "Run as a wayland compositor"
msgstr ""
#: src/core/main.c:231
msgid "Run as a nested compositor"
msgstr ""
#: src/core/main.c:239
msgid "Run as a full display server, rather than nested"
msgstr ""
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format #, c-format
msgid "“%s” is not responding." msgid "“%s” is not responding."
msgstr "“%s” жауап бермейді." msgstr "“%s” жауап бермейді."
#: src/core/meta-close-dialog-default.c:149 #: src/core/delete.c:129
msgid "Application is not responding." msgid "Application is not responding."
msgstr "Қолданба жауап бермейді." msgstr "Қолданба жауап бермейді."
#: src/core/meta-close-dialog-default.c:154 #: src/core/delete.c:134
msgid "" msgid ""
"You may choose to wait a short while for it to continue or force the " "You may choose to wait a short while for it to continue or force the "
"application to quit entirely." "application to quit entirely."
@@ -566,19 +486,60 @@ msgstr ""
"Сіз қолданба өз жұмысын жалғастырғанды күтіп, немесе оны мәжбүрлетіп жаба " "Сіз қолданба өз жұмысын жалғастырғанды күтіп, немесе оны мәжбүрлетіп жаба "
"аласыз." "аласыз."
#: src/core/meta-close-dialog-default.c:161 #: src/core/delete.c:141
msgid "_Wait"
msgstr "_Күту"
#: src/core/delete.c:141
msgid "_Force Quit" msgid "_Force Quit"
msgstr "_Мәжбүрлі шығу" msgstr "_Мәжбүрлі шығу"
#: src/core/meta-close-dialog-default.c:161 #: src/core/display.c:590
msgid "_Wait" #, c-format
msgstr "_Күту" msgid "Failed to open X Window System display '%s'\n"
msgstr ""
#: src/core/main.c:182
msgid "Disable connection to session manager"
msgstr "Сессиялар менеджеріне байланыстарды сөндіру"
#: src/core/main.c:188
msgid "Replace the running window manager"
msgstr ""
#: src/core/main.c:194
msgid "Specify session management ID"
msgstr "Сессия менеджментінің ID-ін көрсету"
#: src/core/main.c:199
msgid "X Display to use"
msgstr "Қолданылатын X дисплейі"
#: src/core/main.c:205
msgid "Initialize session from savefile"
msgstr ""
#: src/core/main.c:211
msgid "Make X calls synchronous"
msgstr "X сервер шақыруларын синхронды қылу"
#: src/core/main.c:218
msgid "Run as a wayland compositor"
msgstr ""
#: src/core/main.c:224
msgid "Run as a nested compositor"
msgstr ""
#: src/core/main.c:232
msgid "Run as a full display server, rather than nested"
msgstr ""
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
"This is free software; see the source for copying conditions.\n" "This is free software; see the source for copying conditions.\n"
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A " "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
"PARTICULAR PURPOSE.\n" "PARTICULAR PURPOSE.\n"
@@ -597,34 +558,34 @@ msgstr ""
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Жұмыс орны %d" msgstr "Жұмыс орны %d"
#: src/core/screen.c:580 #: src/core/screen.c:521
#, c-format #, c-format
msgid "" msgid ""
"Display “%s” already has a window manager; try using the --replace option to " "Display \"%s\" already has a window manager; try using the --replace option "
"replace the current window manager." "to replace the current window manager."
msgstr "" msgstr ""
#: src/core/screen.c:665 #: src/core/screen.c:606
#, c-format #, c-format
msgid "Screen %d on display %s is invalid\n" msgid "Screen %d on display '%s' is invalid\n"
msgstr "" msgstr ""
#: src/core/util.c:120 #: src/core/util.c:120
msgid "Mutter was compiled without support for verbose mode\n" msgid "Mutter was compiled without support for verbose mode\n"
msgstr "" msgstr ""
#: src/wayland/meta-wayland-tablet-pad.c:563 #: src/wayland/meta-wayland-tablet-pad.c:595
#, c-format #, c-format
msgid "Mode Switch: Mode %d" msgid "Mode Switch: Mode %d"
msgstr "" msgstr ""
#: src/x11/session.c:1815 #: src/x11/session.c:1815
msgid "" msgid ""
"These windows do not support save current setup and will have to be " "These windows do not support &quot;save current setup&quot; and will have to "
"restarted manually next time you log in." "be restarted manually next time you log in."
msgstr "" msgstr ""
#: src/x11/window-props.c:559 #: src/x11/window-props.c:548
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (%s жерінде)" msgstr "%s (%s жерінде)"

129
po/lt.po
View File

@@ -6,16 +6,16 @@
# Tomas Kuliavas <tokul@users.sourceforge.net>, 2003. # Tomas Kuliavas <tokul@users.sourceforge.net>, 2003.
# Žygimantas Beručka <zygis@gnome.org>, 2004-2007. # Žygimantas Beručka <zygis@gnome.org>, 2004-2007.
# Gintautas Miliauskas <gintautas@miliauskas.lt>, 2007-2009, 2010. # Gintautas Miliauskas <gintautas@miliauskas.lt>, 2007-2009, 2010.
# Aurimas Černius <aurisc4@gmail.com>, 2013, 2014, 2015, 2016, 2017. # Aurimas Černius <aurisc4@gmail.com>, 2013, 2014, 2015, 2016.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lt\n" "Project-Id-Version: lt\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-21 04:46+0000\n" "POT-Creation-Date: 2017-03-02 18:41+0000\n"
"PO-Revision-Date: 2017-08-22 23:17+0300\n" "PO-Revision-Date: 2017-03-03 20:29+0200\n"
"Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n" "Last-Translator: Moo\n"
"Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n" "Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n"
"Language: lt\n" "Language: lt\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -23,7 +23,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
"%100<10 || n%100>=20) ? 1 : 2);\n" "%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Gtranslator 2.91.7\n" "X-Generator: Poedit 1.8.11\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
msgid "Navigation" msgid "Navigation"
@@ -401,61 +401,14 @@ msgstr ""
"Kai teigiama, nauji langai bus visada patalpinti aktyvaus monitoriaus ekrano " "Kai teigiama, nauji langai bus visada patalpinti aktyvaus monitoriaus ekrano "
"viduryje." "viduryje."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Įjungti eksperimentines savybes"
#: data/org.gnome.mutter.gschema.xml.in:108
#| msgid ""
#| "To enable experimental features, add the feature keyword to the list. "
#| "Whether the feature requires restarting the compositor depends on the "
#| "given feature. Any experimental feature is not required to still be "
#| "available, or configurable. Dont expect adding anything in this setting "
#| "to be future proof. Currently possible keywords: • “monitor-config-"
#| "manager” — use the new monitor configuration system, aimed to replace the "
#| "old one. This enables a higher level configuration API to be used by "
#| "configuration applications, as well as the ability to configure per "
#| "logical monitor scale. • “scale-monitor-framebuffer” — makes mutter "
#| "default to layout logical monitors in a logical pixel coordinate space, "
#| "while scaling monitor framebuffers instead of window content, to manage "
#| "HiDPI monitors. Does not require a restart. Also enabling “monitor-config-"
#| "manager” is required for this feature to be enabled."
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
"mutter default to layout logical monitors in a logical pixel coordinate "
"space, while scaling monitor framebuffers instead of window content, to "
"manage HiDPI monitors. Does not require a restart."
msgstr ""
"Norėdami įjungti eksperimentines savybes, pridėkite į sąrašą raktinį žodį. "
"Ar savybė reikalauja kompozitoriaus paleidimo iš naujo priklauso nuo "
"konkrečios savybės. Nei viena eksperimentinė savybė privalo būti prieinama "
"ar konfigūruojama. Nesitikėkite, kad ką nors pridėjus į šį sąrašą, tai "
"išliks ir ateityje. Šiuo metu galimi raktažodžiai: • „scale-monitor-"
"framebuffer“ — mutter numatytai išdėsto loginius monitorius loginėje "
"pikselių koordinačių erdvėje, tuo pat ištempiant monitorių kadrų buferius "
"vietoje langų turinio, tokiu būdu valdant didelio tankio monitorius. "
"Nereikalauja paleisti iš naujo."
#: data/org.gnome.mutter.gschema.xml.in:141
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Pasirinkti langą iš tab iššokimo" msgstr "Pasirinkti langą iš tab iššokimo"
#: data/org.gnome.mutter.gschema.xml.in:146 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Atšaukti tab iššokimą" msgstr "Atšaukti tab iššokimą"
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Switch monitor configurations"
msgstr "Perjungti monitorių konfigūracijas"
#: data/org.gnome.mutter.gschema.xml.in:156
msgid "Rotates the built-in monitor configuration"
msgstr "Suka integruotas monitorių konfigūracijas"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Persijungti į VT 1" msgstr "Persijungti į VT 1"
@@ -504,14 +457,10 @@ msgstr "Persijungti į VT 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Persijungti į VT 12" msgstr "Persijungti į VT 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Iš naujo įjungti trumpinius"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2151 #: src/backends/meta-input-settings.c:1800
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Veiksenos perjungimas (Grupė %d)" msgstr "Veiksenos perjungimas (Grupė %d)"
@@ -519,37 +468,37 @@ msgstr "Veiksenos perjungimas (Grupė %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2174 #: src/backends/meta-input-settings.c:1822
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Perjungti monitorių" msgstr "Perjungti monitorių"
#: src/backends/meta-input-settings.c:2176 #: src/backends/meta-input-settings.c:1824
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Rodyti pagalbą ekrane" msgstr "Rodyti pagalbą ekrane"
#: src/backends/meta-monitor-manager.c:903 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Integruotas vaizduoklis" msgstr "Integruotas vaizduoklis"
#: src/backends/meta-monitor-manager.c:926 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Nežinomas" msgstr "Nežinomas"
#: src/backends/meta-monitor-manager.c:928 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Nežinomas vaizduoklis" msgstr "Nežinomas vaizduoklis"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:936 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:471
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -559,6 +508,30 @@ msgstr "Kita kompozicijos tvarkytuvė jau veikia ekrane %i vaizduoklyje „%s“
msgid "Bell event" msgid "Bell event"
msgstr "Skambučio įvykis" msgstr "Skambučio įvykis"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "%s neatsiliepia į komandas."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Programa neatsiliepia į komandas."
#: 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 "Galite šiek tiek palaukti arba priverstinai uždaryti programą."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Priverstinai išeiti"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Laukti"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -600,30 +573,6 @@ msgstr "Vykdyti kaip įdėtinį kompozitorių"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Vykdyti kaip visą vaizduoklio serverį, o ne įdėtinį" msgstr "Vykdyti kaip visą vaizduoklio serverį, o ne įdėtinį"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "%s neatsiliepia į komandas."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "Programa neatsiliepia į komandas."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr "Galite šiek tiek palaukti arba priverstinai uždaryti programą."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Priverstinai išeiti"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Laukti"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""

6199
po/ne.po

File diff suppressed because it is too large Load Diff

112
po/pl.po
View File

@@ -12,10 +12,10 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter\n" "Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-21 04:46+0000\n" "POT-Creation-Date: 2017-02-16 21:09+0000\n"
"PO-Revision-Date: 2017-08-23 04:15+0200\n" "PO-Revision-Date: 2017-02-19 21:52+0100\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <community-poland@mozilla.org>\n" "Language-Team: Polish <community-poland@mozilla.org>\n"
"Language: pl\n" "Language: pl\n"
@@ -409,46 +409,14 @@ msgstr ""
"Jeśli wynosi wartość „true”, to nowe okna będą zawsze umieszczane na środku " "Jeśli wynosi wartość „true”, to nowe okna będą zawsze umieszczane na środku "
"aktywnego ekranu monitora." "aktywnego ekranu monitora."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Funkcje eksperymentalne"
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
"mutter default to layout logical monitors in a logical pixel coordinate "
"space, while scaling monitor framebuffers instead of window content, to "
"manage HiDPI monitors. Does not require a restart."
msgstr ""
"Aby włączyć eksperymentalne funkcje, należy dodać słowo kluczowe funkcji do "
"tej listy. Niektóre funkcje wymagają ponownego uruchomienia menedżera okien. "
"Dostępność funkcji eksperymentalnych nie jest gwarantowana. W przyszłości "
"każda funkcja może zostać usunięta. Obecnie obsługiwane słowa kluczowe: • "
"„scale-monitor-framebuffer” — sprawia, że menedżer okien do zarządzania "
"monitorami o wysokiej rozdzielczości domyślnie układa logiczne monitory "
"w przestrzeni współrzędnych logicznych pikseli, jednocześnie skalując bufory "
"ramki monitorów zamiast zawartości okien. Nie wymaga ponownego uruchomienia."
#: data/org.gnome.mutter.gschema.xml.in:141
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Wybór okna z wyskakującego okna dla tabulacji" msgstr "Wybór okna z wyskakującego okna dla tabulacji"
#: data/org.gnome.mutter.gschema.xml.in:146 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Anulowanie wyskakującego okna dla tabulacji" msgstr "Anulowanie wyskakującego okna dla tabulacji"
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Switch monitor configurations"
msgstr "Przełączenie konfiguracji monitorów"
#: data/org.gnome.mutter.gschema.xml.in:156
msgid "Rotates the built-in monitor configuration"
msgstr "Obrócenie wbudowanego monitora"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Przełączenie na 1. konsolę wirtualną" msgstr "Przełączenie na 1. konsolę wirtualną"
@@ -497,14 +465,10 @@ msgstr "Przełączenie na 11. konsolę wirtualną"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Przełączenie na 12. konsolę wirtualną" msgstr "Przełączenie na 12. konsolę wirtualną"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Ponowne włączenie skrótów"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2151 #: src/backends/meta-input-settings.c:1800
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Przełącznik trybu (%d. grupa)" msgstr "Przełącznik trybu (%d. grupa)"
@@ -512,37 +476,37 @@ msgstr "Przełącznik trybu (%d. grupa)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2174 #: src/backends/meta-input-settings.c:1822
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Przełączenie monitora" msgstr "Przełączenie monitora"
#: src/backends/meta-input-settings.c:2176 #: src/backends/meta-input-settings.c:1824
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Ekran pomocy" msgstr "Wyświetlenie pomocy na ekranie"
#: src/backends/meta-monitor-manager.c:903 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Wbudowany ekran" msgstr "Wbudowany ekran"
#: src/backends/meta-monitor-manager.c:926 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Nieznany" msgstr "Nieznany"
#: src/backends/meta-monitor-manager.c:928 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Nieznany ekran" msgstr "Nieznany ekran"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:936 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:471
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -553,6 +517,30 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Zdarzenie sygnału dźwiękowego" msgstr "Zdarzenie sygnału dźwiękowego"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "Okno „%s” nie odpowiada."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Program nie odpowiada."
#: 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 "Można poczekać chwilę dłużej lub wymusić zakończenie programu."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Zakończ"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Czekaj"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -594,30 +582,6 @@ msgstr "Uruchamia jako osadzony menedżer składania"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Uruchamia jako pełny serwer wyświetlania zamiast osadzonego" msgstr "Uruchamia jako pełny serwer wyświetlania zamiast osadzonego"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "Okno „%s” nie odpowiada."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "Program nie odpowiada."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr "Można poczekać chwilę dłużej lub wymusić zakończenie programu."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Zakończ"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Czekaj"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""

108
po/sk.po
View File

@@ -14,8 +14,8 @@ msgstr ""
"Project-Id-Version: mutter\n" "Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-21 04:46+0000\n" "POT-Creation-Date: 2017-03-07 12:40+0000\n"
"PO-Revision-Date: 2017-08-23 19:50+0200\n" "PO-Revision-Date: 2017-03-12 10:28+0100\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n" "Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n" "Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n" "Language: sk\n"
@@ -23,7 +23,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
"X-Generator: Poedit 2.0.3\n" "X-Generator: Poedit 1.8.12\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
msgid "Navigation" msgid "Navigation"
@@ -477,42 +477,16 @@ msgstr ""
"Ak je nastavené na true, budú nové okná vždy umiestnené v strede aktívnej " "Ak je nastavené na true, budú nové okná vždy umiestnené v strede aktívnej "
"obrazovky monitoru." "obrazovky monitoru."
#: data/org.gnome.mutter.gschema.xml.in:107
msgid "Enable experimental features"
msgstr "Povoliť experimentálne funkcie"
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
"mutter default to layout logical monitors in a logical pixel coordinate "
"space, while scaling monitor framebuffers instead of window content, to "
"manage HiDPI monitors. Does not require a restart."
msgstr ""
# summary # summary
#: data/org.gnome.mutter.gschema.xml.in:141 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Vybrať okno z rozbaľovacej ponuky tabulátora" msgstr "Vybrať okno z rozbaľovacej ponuky tabulátora"
# summary # summary
#: data/org.gnome.mutter.gschema.xml.in:146 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Zrušit rozbaľovaciu ponuku tabulátora" msgstr "Zrušit rozbaľovaciu ponuku tabulátora"
# PK: predpokladam ze to prepisane medzi tlacidlami
# description
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Switch monitor configurations"
msgstr "Prepnúť nastavenia monitorov"
#: data/org.gnome.mutter.gschema.xml.in:156
msgid "Rotates the built-in monitor configuration"
msgstr "Otočí nastavenie vstavaného monitora"
# description # description
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
@@ -568,14 +542,10 @@ msgstr "Prepnúť na VT č. 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Prepnúť na VT č. 12" msgstr "Prepnúť na VT č. 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Znovu povoliť klávesové skratky"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2151 #: src/backends/meta-input-settings.c:1800
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Prepínač režimu (skupina č. %d)" msgstr "Prepínač režimu (skupina č. %d)"
@@ -585,37 +555,37 @@ msgstr "Prepínač režimu (skupina č. %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2174 #: src/backends/meta-input-settings.c:1822
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Prepnúť monitor" msgstr "Prepnúť monitor"
#: src/backends/meta-input-settings.c:2176 #: src/backends/meta-input-settings.c:1824
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Zobraziť pomocníka na obrazovke" msgstr "Zobraziť pomocníka na obrazovke"
#: src/backends/meta-monitor-manager.c:903 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Vstavaný displej" msgstr "Vstavaný displej"
#: src/backends/meta-monitor-manager.c:926 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Neznámy" msgstr "Neznámy"
#: src/backends/meta-monitor-manager.c:928 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Neznámy displej" msgstr "Neznámy displej"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:936 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:474
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -626,6 +596,32 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Udalosť zvončeka" msgstr "Udalosť zvončeka"
# %s is a window title
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ neodpovedá."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Aplikácia neodpovedá."
#: 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 ""
"Môžete chvíľu počkať na pokračovanie aplikácie, alebo ju môžete ukončiť."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Vynútiť ukončenie"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Počkať"
# X window system preloz, napr. system na spravu okien X # X window system preloz, napr. system na spravu okien X
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
@@ -675,32 +671,6 @@ msgstr "Spustí ako kompozitor s vnoreným režimom"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Spustí ako plnohodnotný zobrazovací server, namiesto vnoreného režimu" msgstr "Spustí ako plnohodnotný zobrazovací server, namiesto vnoreného režimu"
# %s is a window title
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ neodpovedá."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "Aplikácia neodpovedá."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Môžete chvíľu počkať na pokračovanie aplikácie, alebo ju môžete ukončiť."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Vynútiť ukončenie"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Počkať"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""

230
po/sl.po
View File

@@ -9,20 +9,19 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter master\n" "Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-07 10:01+0200\n" "POT-Creation-Date: 2017-02-14 08:48+0100\n"
"PO-Revision-Date: 2017-08-07 10:02+0200\n" "PO-Revision-Date: 2017-02-14 08:48+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: sl_SI\n" "Language: sl_SI\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"
"%100==4 ? 3 : 0);\n"
"X-Poedit-SourceCharset: utf-8\n" "X-Poedit-SourceCharset: utf-8\n"
"X-Generator: Poedit 2.0.1\n" "X-Generator: Poedit 1.8.9\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
msgid "Navigation" msgid "Navigation"
@@ -275,15 +274,15 @@ msgstr "Spremenilnik, ki naj se uporabi za upravljanje oken"
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
msgid "" msgid ""
"This key will initiate the overlay, which is a combination window overview " "This key will initiate the \"overlay\", which is a combination window "
"and application launching system. The default is intended to be the “Windows " "overview and application launching system. The default is intended to be the "
"key on PC hardware. Its expected that this binding either the default or " "\"Windows key\" on PC hardware. It's expected that this binding either the "
"set to the empty string." "default or set to the empty string."
msgstr "" msgstr ""
"Ta vrednost določa »prekrivno plast«, ki združuje predogled okna in " "Ta vrednost določa \"prevleko\", ki združuje predogled okna in zaganjalnik "
"zaganjalnik programa. Vrednost je zamišljena kot »ključ oken« na strojni " "programa. Vrednost je zamišljena kot \"ključ oken\" na strojni opremi "
"opremi računalnika. Pričakovano je, da je vrednost določena privzeto ali pa " "računalnika. Pričakovano je, da je vrednost določena privzeto ali pa ni "
"ni določena." "določena."
#: data/org.gnome.mutter.gschema.xml.in:20 #: data/org.gnome.mutter.gschema.xml.in:20
msgid "Attach modal dialogs" msgid "Attach modal dialogs"
@@ -318,7 +317,7 @@ msgstr "Število delovnih površin je spremenljivo"
#: data/org.gnome.mutter.gschema.xml.in:41 #: data/org.gnome.mutter.gschema.xml.in:41
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether there's a "
"static number of workspaces (determined by the num-workspaces key in org." "static number of workspaces (determined by the num-workspaces key in org."
"gnome.desktop.wm.preferences)." "gnome.desktop.wm.preferences)."
msgstr "" msgstr ""
@@ -356,12 +355,12 @@ msgstr "Zamakni spremembe žarišča, dokler se kazalnik še premika"
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
msgid "" msgid ""
"If set to true, and the focus mode is either sloppy or mouse then the " "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
"focus will not be changed immediately when entering a window, but only after " "the focus will not be changed immediately when entering a window, but only "
"the pointer stops moving." "after the pointer stops moving."
msgstr "" msgstr ""
"Izbrana možnost omogoča, da se žarišče, v kolikor je izbran način »sloppy« " "Izbrana možnost omogoča, da se žarišče, v kolikor je izbran način \"sloppy\" "
"ali »miška«, ne spremeni takoj ob izbiri okna. Žarišče se spremeni, ko se " "ali \"miška\", ne spremeni takoj ob izbiri okna. Žarišče se spremeni, ko se "
"kazalnik preneha premikati." "kazalnik preneha premikati."
#: data/org.gnome.mutter.gschema.xml.in:79 #: data/org.gnome.mutter.gschema.xml.in:79
@@ -370,11 +369,11 @@ msgstr "Prilagodljiva obroba pravokotnika"
#: data/org.gnome.mutter.gschema.xml.in:80 #: data/org.gnome.mutter.gschema.xml.in:80
msgid "" msgid ""
"The amount of total draggable borders. If the themes visible borders are " "The amount of total draggable borders. If the theme's visible borders are "
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
msgstr "" msgstr ""
"Delež skupne prilagodljive obrobe. V kolikor vidni robovi teme niso dovolj, " "Delež skupne prilagodljive obrobe. V kolikor vidni robovi teme niso dovolj, "
"so dodane nevidne obrobe za dodatno prilagajanje." "so dodane nevidne obrobe, za dodatno prilagajanje."
#: data/org.gnome.mutter.gschema.xml.in:89 #: data/org.gnome.mutter.gschema.xml.in:89
msgid "Auto maximize nearly monitor sized windows" msgid "Auto maximize nearly monitor sized windows"
@@ -399,53 +398,14 @@ msgid ""
msgstr "" msgstr ""
"Izbrana možnost določa, da bo novo okno vedno v središču dejavnega zaslona." "Izbrana možnost določa, da bo novo okno vedno v središču dejavnega zaslona."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Omogoči preizkusne možnosti"
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new "
"monitor configuration system, aimed to replace the old one. This enables a "
"higher level configuration API to be used by configuration applications, as "
"well as the ability to configure per logical monitor scale. • “scale-monitor-"
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr ""
"Za omogočanje preizkusnih možnosti, dodajte ključno besedo možnosti na "
"seznam. Ali zahteva možnost ponovni zagon sestavljalnika, je odvisno od "
"posamezne možnosti. Te možnosti niso zahtevane niti nastavljive. Trenutno so "
"na voljo ključne besede: • »monitor-config-manager« uporablja nov sistem "
"nastavitev, ki naj bi zamenjal obstoječega. Omogoča večjo nastavljivost API, "
"za uporabo pri prigramih za nastavitve lastnosti zaslona. • »scale-monitor-"
"framebuffer« določi privzeto rabo sistema mutter za logične zaslone v "
"logičnem točkovnem koordinatnem prostoru, pri čemer prilagaja predpomnilnik "
"in ne vsebine za upravljanje z zasloni HiDPI. Možnost ne zahteva ponovnega "
"zagona. Za omogočanje te možnosti, mora biti omogočena tudi možnost »monitor-"
"config-manager«."
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Izbor okna iz pojavnega zavihka" msgstr "Izbor okna iz pojavnega zavihka"
#: data/org.gnome.mutter.gschema.xml.in:156 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Prekliči pojavni zavihek" msgstr "Prekliči pojavni zavihek"
#: data/org.gnome.mutter.gschema.xml.in:161
msgid "Switch monitor configurations"
msgstr "Nastavitve nadzornika preklopa"
#: data/org.gnome.mutter.gschema.xml.in:166
msgid "Rotates the built-in monitor configuration"
msgstr "Zavrti vgrajene nastavitve zaslona"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Preklopi na VT 1" msgstr "Preklopi na VT 1"
@@ -494,14 +454,10 @@ msgstr "Preklopi na VT 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Preklopi na VT 12" msgstr "Preklopi na VT 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Ponovno omogoči tipkovne bližnjice"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2118 #: src/backends/meta-input-settings.c:1759
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Preklop načina (skupina %d)" msgstr "Preklop načina (skupina %d)"
@@ -509,99 +465,59 @@ msgstr "Preklop načina (skupina %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2141 #: src/backends/meta-input-settings.c:1781
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Nadzornik preklopa" msgstr "Nadzornik preklopa"
#: src/backends/meta-input-settings.c:2143 #: src/backends/meta-input-settings.c:1783
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Pokaži zaslonsko pomoč" msgstr "Pokaži zaslonsko pomoč"
#: src/backends/meta-monitor-manager.c:927 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Vgrajen zaslon" msgstr "Vgrajen zaslon"
#: src/backends/meta-monitor-manager.c:950 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Neznano" msgstr "Neznano"
#: src/backends/meta-monitor-manager.c:952 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Neznan zaslon" msgstr "Neznan zaslon"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:960 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:471
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr "" msgstr ""
"Drug upravljalnik sestavljanja je že zagnan na zaslonu %i prikaza »%s«." "Drug upravljalnik sestavljanja je že zagnan na zaslonu %i prikaza \"%s\"."
#: src/core/bell.c:194 #: src/core/bell.c:194
msgid "Bell event" msgid "Bell event"
msgstr "Dogodek zvonjenja" msgstr "Dogodek zvonjenja"
#: src/core/display.c:608
#, c-format
msgid "Failed to open X Window System display “%s”\n"
msgstr "Odpiranje zaslona »%s« okenskega sistema X je spodletelo\n"
#: src/core/main.c:189
msgid "Disable connection to session manager"
msgstr "Onemogoči povezavo z upravljalnikom sej"
#: src/core/main.c:195
msgid "Replace the running window manager"
msgstr "Zamenjaj trenutni upravljalnik oken"
#: src/core/main.c:201
msgid "Specify session management ID"
msgstr "Navedite ID upravljanja seje"
#: src/core/main.c:206
msgid "X Display to use"
msgstr "Zaslon X za uporabo"
#: src/core/main.c:212
msgid "Initialize session from savefile"
msgstr "Začni sejo iz shranjene datoteke"
#: src/core/main.c:218
msgid "Make X calls synchronous"
msgstr "Uskladi klice X"
#: src/core/main.c:225
msgid "Run as a wayland compositor"
msgstr "Zaženi izbirnik wayland"
#: src/core/main.c:231
msgid "Run as a nested compositor"
msgstr "Zaženi kot gnezden vpisovalnik"
#: src/core/main.c:239
msgid "Run as a full display server, rather than nested"
msgstr "Zaženi kot polni strežnik zaslona in ne vstavljeno"
#. Translators: %s is a window title #. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147 #: src/core/delete.c:127
#, c-format #, c-format
msgid "“%s” is not responding." msgid "“%s” is not responding."
msgstr "Okno »%s« se ne odziva." msgstr "%s se ne odziva."
#: src/core/meta-close-dialog-default.c:149 #: src/core/delete.c:129
msgid "Application is not responding." msgid "Application is not responding."
msgstr "Program se ne odziva." msgstr "Program se ne odziva."
#: src/core/meta-close-dialog-default.c:154 #: src/core/delete.c:134
msgid "" msgid ""
"You may choose to wait a short while for it to continue or force the " "You may choose to wait a short while for it to continue or force the "
"application to quit entirely." "application to quit entirely."
@@ -609,26 +525,68 @@ msgstr ""
"Lahko še malo počakate, če program morda spet začne delovati, ali pa vsilite " "Lahko še malo počakate, če program morda spet začne delovati, ali pa vsilite "
"končanje delovanja." "končanje delovanja."
#: src/core/meta-close-dialog-default.c:161 #: src/core/delete.c:141
msgid "_Force Quit" msgid "_Force Quit"
msgstr "_Vsili konec" msgstr "_Vsili konec"
#: src/core/meta-close-dialog-default.c:161 #: src/core/delete.c:141
msgid "_Wait" msgid "_Wait"
msgstr "_Počakaj" msgstr "_Počakaj"
#: src/core/display.c:608
#, c-format
msgid "Failed to open X Window System display '%s'\n"
msgstr "Ni mogoče odpreti zaslona '%s' okenskega sistema X\n"
#: src/core/main.c:187
msgid "Disable connection to session manager"
msgstr "Onemogoči povezavo z upravljalnikom sej"
#: src/core/main.c:193
msgid "Replace the running window manager"
msgstr "Zamenjaj trenutni upravljalnik oken"
#: src/core/main.c:199
msgid "Specify session management ID"
msgstr "Navedite ID upravljanja seje"
#: src/core/main.c:204
msgid "X Display to use"
msgstr "Zaslon X za uporabo"
#: src/core/main.c:210
msgid "Initialize session from savefile"
msgstr "Začni sejo iz shranjene datoteke"
#: src/core/main.c:216
msgid "Make X calls synchronous"
msgstr "Uskladi klice X"
#: src/core/main.c:223
msgid "Run as a wayland compositor"
msgstr "Zaženi izbirnik wayland"
#: src/core/main.c:229
msgid "Run as a nested compositor"
msgstr "Zaženi kot gnezden vpisovalnik"
#: src/core/main.c:237
msgid "Run as a full display server, rather than nested"
msgstr "Zaženi kot polni strežnik zaslona in ne vstavljeno"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, c-format
msgid "" msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
"This is free software; see the source for copying conditions.\n" "This is free software; see the source for copying conditions.\n"
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A " "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
"PARTICULAR PURPOSE.\n" "PARTICULAR PURPOSE.\n"
msgstr "" msgstr ""
"mutter %s\n" "mutter %s\n"
"Avtorske pravice pridržane (C) 2001-%d Havoc Pennington, Red Hat in drugi\n" "Avtorske pravice pridržane (C) 2001-%d Havoc Pennington, Red Hat in drugi\n"
"To je prosta programska oprema; za pogoje kopiranja si oglejte dovoljenje.\n" "To je prosta programska oprema; za pogoje kopiranja si poglejte izvorno "
"kodo.\n"
"Program je na voljo BREZ KAKRŠNIHKOLI ZAGOTOVIL.\n" "Program je na voljo BREZ KAKRŠNIHKOLI ZAGOTOVIL.\n"
#: src/core/mutter.c:53 #: src/core/mutter.c:53
@@ -648,16 +606,16 @@ msgstr "Delovna površina %d"
#: src/core/screen.c:580 #: src/core/screen.c:580
#, c-format #, c-format
msgid "" msgid ""
"Display “%s” already has a window manager; try using the --replace option to " "Display \"%s\" already has a window manager; try using the --replace option "
"replace the current window manager." "to replace the current window manager."
msgstr "" msgstr ""
"Zaslon »%s« že ima določen upravljalnik oken; poskušajte uporabiti možnost --" "Zaslon \"%s\" že ima določen upravljalnik oken; poskušajte uporabiti možnost "
"replace za zamenjavo trenutnega upravljalnika zaslona." "--replace za zamenjavo trenutnega upravljalnika zaslona."
#: src/core/screen.c:665 #: src/core/screen.c:665
#, c-format #, c-format
msgid "Screen %d on display %s is invalid\n" msgid "Screen %d on display '%s' is invalid\n"
msgstr "Zaslon %d na prikazu »%s« ni veljaven\n" msgstr "Zaslon %d na prikazu '%s' ni veljaven\n"
#: src/core/util.c:120 #: src/core/util.c:120
msgid "Mutter was compiled without support for verbose mode\n" msgid "Mutter was compiled without support for verbose mode\n"
@@ -672,11 +630,11 @@ msgstr "Način preklopa: način %d"
# G:2 K:6 O:0 # G:2 K:6 O:0
#: src/x11/session.c:1815 #: src/x11/session.c:1815
msgid "" msgid ""
"These windows do not support save current setup and will have to be " "These windows do not support &quot;save current setup&quot; and will have to "
"restarted manually next time you log in." "be restarted manually next time you log in."
msgstr "" msgstr ""
"Ta okna ne podpirajo možnosti »shranjevanja trenutnih nastavitev«, zato jih " "Ta okna ne podpirajo možnosti &quot;shranjevanja trenutnih nastavitev&quot;, "
"bo treba ob naslednji prijavi zagnati ročno." "zato jih bo treba ob naslednji prijavi zagnati ročno."
#: src/x11/window-props.c:559 #: src/x11/window-props.c:559
#, c-format #, c-format

170
po/sr.po
View File

@@ -9,12 +9,12 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter\n" "Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=mutter" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&"
"&keywords=I18N+L10N&component=general\n" "keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-13 15:47+0000\n" "POT-Creation-Date: 2017-02-16 01:44+0000\n"
"PO-Revision-Date: 2017-08-15 20:40+0200\n" "PO-Revision-Date: 2017-02-21 07:16+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n" "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: српски <gnome-sr@googlegroups.org>\n" "Language-Team: Serbian <(nothing)>\n"
"Language: sr\n" "Language: sr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -272,6 +272,11 @@ msgid "Modifier to use for extended window management operations"
msgstr "Тастер који се користи за проширене радње управника прозорима" msgstr "Тастер који се користи за проширене радње управника прозорима"
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
#| msgid ""
#| "This key will initiate the \"overlay\", which is a combination window "
#| "overview and application launching system. The default is intended to be "
#| "the \"Windows key\" on PC hardware. It's expected that this binding "
#| "either the default or set to the empty string."
msgid "" msgid ""
"This key will initiate the “overlay”, which is a combination window overview " "This key will initiate the “overlay”, which is a combination window overview "
"and application launching system. The default is intended to be the “Windows " "and application launching system. The default is intended to be the “Windows "
@@ -317,14 +322,18 @@ msgid "Workspaces are managed dynamically"
msgstr "Радним просторима се управља динамички" msgstr "Радним просторима се управља динамички"
#: data/org.gnome.mutter.gschema.xml.in:41 #: data/org.gnome.mutter.gschema.xml.in:41
#| 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)."
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether theres a "
"static number of workspaces (determined by the num-workspaces key in org." "static number of workspaces (determined by the num-workspaces key in org."
"gnome.desktop.wm.preferences)." "gnome.desktop.wm.preferences)."
msgstr "" msgstr ""
"Одређује да ли се радним просторима управља динамички или ће постојати " "Одређује да ли се радним просторима управља динамички или ће постојати "
"стални број радних простора (одређен бројем радних простора у „org.gnome." "стални број радних простора (одређен бројем радних простора у "
"desktop.wm.preferences“)." "„org.gnome.desktop.wm.preferences“)."
#: data/org.gnome.mutter.gschema.xml.in:50 #: data/org.gnome.mutter.gschema.xml.in:50
msgid "Workspaces only on primary" msgid "Workspaces only on primary"
@@ -355,6 +364,10 @@ msgid "Delay focus changes until the pointer stops moving"
msgstr "Застој првог плана се мења док се показивач не заустави" msgstr "Застој првог плана се мења док се показивач не заустави"
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
#| 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."
msgid "" msgid ""
"If set to true, and the focus mode is either “sloppy” or “mouse” then the " "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 " "focus will not be changed immediately when entering a window, but only after "
@@ -369,6 +382,9 @@ msgid "Draggable border width"
msgstr "Ширина ивице за превлачење" msgstr "Ширина ивице за превлачење"
#: data/org.gnome.mutter.gschema.xml.in:80 #: data/org.gnome.mutter.gschema.xml.in:80
#| 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."
msgid "" msgid ""
"The amount of total draggable borders. If the themes visible borders are " "The amount of total draggable borders. If the themes visible borders are "
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
@@ -400,56 +416,14 @@ msgstr ""
"Ако је изабрано, нови прозори ће увек бити постављени на средину радног " "Ако је изабрано, нови прозори ће увек бити постављени на средину радног "
"екрана монитора." "екрана монитора."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Укључује експерименталне функције"
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new "
"monitor configuration system, aimed to replace the old one. This enables a "
"higher level configuration API to be used by configuration applications, as "
"well as the ability to configure per logical monitor scale. • “scale-monitor-"
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr ""
"Да укључите експерименталне функције, додајте кључну реч функције на списак. "
"Да ли функција захтева поновно покретање састављача зависи од дате функције. "
"Није потребно да нека експериментална функција буде и даље доступна или "
"подесива. Немојте очекивати да додавање било чега у овом подешавању буде "
"будући доказ. Тренутно могуће кључне речи су: • „monitor-config-manager“ — "
"користи нови систем подешавања монитора, који треба да замени стари. Ово "
"омогућава да АПИ подешавања вишег нивоа буде коришћен програмима подешавања, "
"као и могућност подешавања скале монитора на нивоу логике. • „scale-monitor-"
"framebuffer“ — чини да матер пређе на распоред логичких монитора у логичком "
"координатном простору пиксела, док врши сразмеравање оквира монитора уместо "
"садржаја прозора, за управљање ХиДПИ мониторима. Не захтева поновно "
"покретање. Такође је потребно укључити „monitor-config-manager“ да би ова "
"функција била укључена."
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Бира прозор из језичка искакања" msgstr "Бира прозор из језичка искакања"
#: data/org.gnome.mutter.gschema.xml.in:156 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Отказивање језичка искакања" msgstr "Отказивање језичка искакања"
#: data/org.gnome.mutter.gschema.xml.in:161
#| msgid "Switch monitor"
msgid "Switch monitor configurations"
msgstr "Мења подешавања монитора"
#: data/org.gnome.mutter.gschema.xml.in:166
msgid "Rotates the built-in monitor configuration"
msgstr "Заокреће уграђена подешавања монитора"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Прелазак на ВТ 1" msgstr "Прелазак на ВТ 1"
@@ -498,53 +472,53 @@ msgstr "Прелазак на ВТ 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Прелазак на ВТ 12" msgstr "Прелазак на ВТ 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Поново укључивање пречица"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2118 #: src/backends/meta-input-settings.c:1759
#, c-format #, c-format
#| msgid "Mode Switch: Mode %d"
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Режим прекидача (група %d)" msgstr "Режим прекидача (група %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2141 #: src/backends/meta-input-settings.c:1781
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Промени монитор" msgstr "Промени монитор"
#: src/backends/meta-input-settings.c:2143 #: src/backends/meta-input-settings.c:1783
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Прикажи помоћ на екрану" msgstr "Прикажи помоћ на екрану"
#: src/backends/meta-monitor-manager.c:927 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Уграђени дисплеј" msgstr "Уграђени дисплеј"
#: src/backends/meta-monitor-manager.c:950 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Непознато" msgstr "Непознато"
#: src/backends/meta-monitor-manager.c:952 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Непознат дисплеј" msgstr "Непознат дисплеј"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:960 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:471
#, c-format #, c-format
#| msgid ""
#| "Another compositing manager is already running on screen %i on display "
#| "\"%s\"."
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
msgstr "" msgstr ""
@@ -554,8 +528,35 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Звонца" msgstr "Звонца"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ не даје одзив."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Програм не даје одзив."
#: 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:141
msgid "_Force Quit"
msgstr "_Приморај излаз"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Сачекај"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
#| msgid "Failed to open X Window System display '%s'\n"
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
msgstr "Нисам успео да отворим екран „%s“ Икс система прозора\n" msgstr "Нисам успео да отворим екран „%s“ Икс система прозора\n"
@@ -595,34 +596,14 @@ msgstr "Ради као угнеждени саставник"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Ради као пуни сервер приказа, уместо као угнеждени" msgstr "Ради као пуни сервер приказа, уместо као угнеждени"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ не даје одзив."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "Програм не даје одзив."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Можете мало сачекати док се програм не сабере или приморати програм да "
"комплетно прекине са радом."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Приморај излаз"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Сачекај"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, 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"
msgid "" msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
@@ -651,15 +632,19 @@ msgstr "%d. радни простор"
#: src/core/screen.c:580 #: src/core/screen.c:580
#, c-format #, c-format
#| msgid ""
#| "Display \"%s\" already has a window manager; try using the --replace "
#| "option to replace the current window manager."
msgid "" msgid ""
"Display “%s” already has a window manager; try using the --replace option to " "Display “%s” already has a window manager; try using the --replace option to "
"replace the current window manager." "replace the current window manager."
msgstr "" msgstr ""
"Приказ „%s“ већ има управника прозора; пробајте да користите опцију „--" "Приказ „%s“ већ има управника прозора; пробајте да користите опцију "
"replace“ да замените тренутног управника прозора." "„--replace“ да замените тренутног управника прозора."
#: src/core/screen.c:665 #: src/core/screen.c:665
#, c-format #, c-format
#| msgid "Screen %d on display '%s' is invalid\n"
msgid "Screen %d on display “%s” is invalid\n" msgid "Screen %d on display “%s” is invalid\n"
msgstr "Приказ „%d“ на екрану „%s“ није исправан\n" msgstr "Приказ „%d“ на екрану „%s“ није исправан\n"
@@ -673,6 +658,9 @@ msgid "Mode Switch: Mode %d"
msgstr "Режим прекидача: Режим %d" msgstr "Режим прекидача: Режим %d"
#: src/x11/session.c:1815 #: src/x11/session.c:1815
#| msgid ""
#| "These windows do not support &quot;save current setup&quot; and will have "
#| "to be restarted manually next time you log in."
msgid "" msgid ""
"These windows do not support “save current setup” and will have to be " "These windows do not support “save current setup” and will have to be "
"restarted manually next time you log in." "restarted manually next time you log in."

View File

@@ -9,12 +9,12 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter\n" "Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=mutter" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&"
"&keywords=I18N+L10N&component=general\n" "keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-13 15:47+0000\n" "POT-Creation-Date: 2017-02-16 01:44+0000\n"
"PO-Revision-Date: 2017-08-15 20:40+0200\n" "PO-Revision-Date: 2017-02-21 07:16+0200\n"
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n" "Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
"Language-Team: srpski <gnome-sr@googlegroups.org>\n" "Language-Team: Serbian <(nothing)>\n"
"Language: sr\n" "Language: sr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -272,6 +272,11 @@ msgid "Modifier to use for extended window management operations"
msgstr "Taster koji se koristi za proširene radnje upravnika prozorima" msgstr "Taster koji se koristi za proširene radnje upravnika prozorima"
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
#| msgid ""
#| "This key will initiate the \"overlay\", which is a combination window "
#| "overview and application launching system. The default is intended to be "
#| "the \"Windows key\" on PC hardware. It's expected that this binding "
#| "either the default or set to the empty string."
msgid "" msgid ""
"This key will initiate the “overlay”, which is a combination window overview " "This key will initiate the “overlay”, which is a combination window overview "
"and application launching system. The default is intended to be the “Windows " "and application launching system. The default is intended to be the “Windows "
@@ -317,14 +322,18 @@ msgid "Workspaces are managed dynamically"
msgstr "Radnim prostorima se upravlja dinamički" msgstr "Radnim prostorima se upravlja dinamički"
#: data/org.gnome.mutter.gschema.xml.in:41 #: data/org.gnome.mutter.gschema.xml.in:41
#| 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)."
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether theres a "
"static number of workspaces (determined by the num-workspaces key in org." "static number of workspaces (determined by the num-workspaces key in org."
"gnome.desktop.wm.preferences)." "gnome.desktop.wm.preferences)."
msgstr "" msgstr ""
"Određuje da li se radnim prostorima upravlja dinamički ili će postojati " "Određuje da li se radnim prostorima upravlja dinamički ili će postojati "
"stalni broj radnih prostora (određen brojem radnih prostora u „org.gnome." "stalni broj radnih prostora (određen brojem radnih prostora u "
"desktop.wm.preferences“)." "„org.gnome.desktop.wm.preferences“)."
#: data/org.gnome.mutter.gschema.xml.in:50 #: data/org.gnome.mutter.gschema.xml.in:50
msgid "Workspaces only on primary" msgid "Workspaces only on primary"
@@ -355,6 +364,10 @@ msgid "Delay focus changes until the pointer stops moving"
msgstr "Zastoj prvog plana se menja dok se pokazivač ne zaustavi" msgstr "Zastoj prvog plana se menja dok se pokazivač ne zaustavi"
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
#| 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."
msgid "" msgid ""
"If set to true, and the focus mode is either “sloppy” or “mouse” then the " "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 " "focus will not be changed immediately when entering a window, but only after "
@@ -369,6 +382,9 @@ msgid "Draggable border width"
msgstr "Širina ivice za prevlačenje" msgstr "Širina ivice za prevlačenje"
#: data/org.gnome.mutter.gschema.xml.in:80 #: data/org.gnome.mutter.gschema.xml.in:80
#| 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."
msgid "" msgid ""
"The amount of total draggable borders. If the themes visible borders are " "The amount of total draggable borders. If the themes visible borders are "
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
@@ -400,56 +416,14 @@ msgstr ""
"Ako je izabrano, novi prozori će uvek biti postavljeni na sredinu radnog " "Ako je izabrano, novi prozori će uvek biti postavljeni na sredinu radnog "
"ekrana monitora." "ekrana monitora."
#: data/org.gnome.mutter.gschema.xml.in:107 #: data/org.gnome.mutter.gschema.xml.in:120
msgid "Enable experimental features"
msgstr "Uključuje eksperimentalne funkcije"
#: data/org.gnome.mutter.gschema.xml.in:108
msgid ""
"To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new "
"monitor configuration system, aimed to replace the old one. This enables a "
"higher level configuration API to be used by configuration applications, as "
"well as the ability to configure per logical monitor scale. • “scale-monitor-"
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr ""
"Da uključite eksperimentalne funkcije, dodajte ključnu reč funkcije na spisak. "
"Da li funkcija zahteva ponovno pokretanje sastavljača zavisi od date funkcije. "
"Nije potrebno da neka eksperimentalna funkcija bude i dalje dostupna ili "
"podesiva. Nemojte očekivati da dodavanje bilo čega u ovom podešavanju bude "
"budući dokaz. Trenutno moguće ključne reči su: • „monitor-config-manager“ — "
"koristi novi sistem podešavanja monitora, koji treba da zameni stari. Ovo "
"omogućava da API podešavanja višeg nivoa bude korišćen programima podešavanja, "
"kao i mogućnost podešavanja skale monitora na nivou logike. • „scale-monitor-"
"framebuffer“ — čini da mater pređe na raspored logičkih monitora u logičkom "
"koordinatnom prostoru piksela, dok vrši srazmeravanje okvira monitora umesto "
"sadržaja prozora, za upravljanje HiDPI monitorima. Ne zahteva ponovno "
"pokretanje. Takođe je potrebno uključiti „monitor-config-manager“ da bi ova "
"funkcija bila uključena."
#: data/org.gnome.mutter.gschema.xml.in:151
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Bira prozor iz jezička iskakanja" msgstr "Bira prozor iz jezička iskakanja"
#: data/org.gnome.mutter.gschema.xml.in:156 #: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Otkazivanje jezička iskakanja" msgstr "Otkazivanje jezička iskakanja"
#: data/org.gnome.mutter.gschema.xml.in:161
#| msgid "Switch monitor"
msgid "Switch monitor configurations"
msgstr "Menja podešavanja monitora"
#: data/org.gnome.mutter.gschema.xml.in:166
msgid "Rotates the built-in monitor configuration"
msgstr "Zaokreće ugrađena podešavanja monitora"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "Prelazak na VT 1" msgstr "Prelazak na VT 1"
@@ -498,53 +472,53 @@ msgstr "Prelazak na VT 11"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "Prelazak na VT 12" msgstr "Prelazak na VT 12"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr "Ponovo uključivanje prečica"
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2118 #: src/backends/meta-input-settings.c:1759
#, c-format #, c-format
#| msgid "Mode Switch: Mode %d"
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Režim prekidača (grupa %d)" msgstr "Režim prekidača (grupa %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2141 #: src/backends/meta-input-settings.c:1781
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Promeni monitor" msgstr "Promeni monitor"
#: src/backends/meta-input-settings.c:2143 #: src/backends/meta-input-settings.c:1783
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Prikaži pomoć na ekranu" msgstr "Prikaži pomoć na ekranu"
#: src/backends/meta-monitor-manager.c:927 #: src/backends/meta-monitor-manager.c:675
msgid "Built-in display" msgid "Built-in display"
msgstr "Ugrađeni displej" msgstr "Ugrađeni displej"
#: src/backends/meta-monitor-manager.c:950 #: src/backends/meta-monitor-manager.c:698
msgid "Unknown" msgid "Unknown"
msgstr "Nepoznato" msgstr "Nepoznato"
#: src/backends/meta-monitor-manager.c:952 #: src/backends/meta-monitor-manager.c:700
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Nepoznat displej" msgstr "Nepoznat displej"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:960 #: src/backends/meta-monitor-manager.c:708
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:471
#, c-format #, c-format
#| msgid ""
#| "Another compositing manager is already running on screen %i on display "
#| "\"%s\"."
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
msgstr "" msgstr ""
@@ -554,8 +528,35 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Zvonca" msgstr "Zvonca"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ ne daje odziv."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Program ne daje odziv."
#: 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 ""
"Možete malo sačekati dok se program ne sabere ili primorati program da "
"kompletno prekine sa radom."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Primoraj izlaz"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Sačekaj"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
#| msgid "Failed to open X Window System display '%s'\n"
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
msgstr "Nisam uspeo da otvorim ekran „%s“ Iks sistema prozora\n" msgstr "Nisam uspeo da otvorim ekran „%s“ Iks sistema prozora\n"
@@ -595,34 +596,14 @@ msgstr "Radi kao ugneždeni sastavnik"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Radi kao puni server prikaza, umesto kao ugneždeni" msgstr "Radi kao puni server prikaza, umesto kao ugneždeni"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ ne daje odziv."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "Program ne daje odziv."
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Možete malo sačekati dok se program ne sabere ili primorati program da "
"kompletno prekine sa radom."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Primoraj izlaz"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Sačekaj"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, 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"
msgid "" msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
@@ -651,15 +632,19 @@ msgstr "%d. radni prostor"
#: src/core/screen.c:580 #: src/core/screen.c:580
#, c-format #, c-format
#| msgid ""
#| "Display \"%s\" already has a window manager; try using the --replace "
#| "option to replace the current window manager."
msgid "" msgid ""
"Display “%s” already has a window manager; try using the --replace option to " "Display “%s” already has a window manager; try using the --replace option to "
"replace the current window manager." "replace the current window manager."
msgstr "" msgstr ""
"Prikaz „%s“ već ima upravnika prozora; probajte da koristite opciju „--" "Prikaz „%s“ već ima upravnika prozora; probajte da koristite opciju "
"replace“ da zamenite trenutnog upravnika prozora." "„--replace“ da zamenite trenutnog upravnika prozora."
#: src/core/screen.c:665 #: src/core/screen.c:665
#, c-format #, c-format
#| msgid "Screen %d on display '%s' is invalid\n"
msgid "Screen %d on display “%s” is invalid\n" msgid "Screen %d on display “%s” is invalid\n"
msgstr "Prikaz „%d“ na ekranu „%s“ nije ispravan\n" msgstr "Prikaz „%d“ na ekranu „%s“ nije ispravan\n"
@@ -673,6 +658,9 @@ msgid "Mode Switch: Mode %d"
msgstr "Režim prekidača: Režim %d" msgstr "Režim prekidača: Režim %d"
#: src/x11/session.c:1815 #: src/x11/session.c:1815
#| msgid ""
#| "These windows do not support &quot;save current setup&quot; and will have "
#| "to be restarted manually next time you log in."
msgid "" msgid ""
"These windows do not support “save current setup” and will have to be " "These windows do not support “save current setup” and will have to be "
"restarted manually next time you log in." "restarted manually next time you log in."

142
po/tr.po
View File

@@ -6,26 +6,25 @@
# Baris Cicek <baris@teamforce.name.tr>, 2004, 2005, 2008, 2009. # Baris Cicek <baris@teamforce.name.tr>, 2004, 2005, 2008, 2009.
# İlker DAĞLI <ilker@ilkerdagli.info>, 2011. # İlker DAĞLI <ilker@ilkerdagli.info>, 2011.
# Muhammed EKEN <gnome@m-eken.com>, 2011. # Muhammed EKEN <gnome@m-eken.com>, 2011.
# Muhammet Kara <muhammetk@gmail.com>, 2011, 2012, 2014, 2015, 2016.
# Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>, 2017. # Furkan Ahmet Kara <furkanahmetkara.fk@gmail.com>, 2017.
# Emin Tufan Çetin <etcetin@gmail.com>, 2017. # Emin Tufan Çetin <etcetin@gmail.com>, 2017.
# Muhammet Kara <muhammetk@gmail.com>, 2011, 2012, 2014, 2015, 2016, 2017.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter master\n" "Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-08-13 15:47+0000\n" "POT-Creation-Date: 2017-05-11 12:29+0000\n"
"PO-Revision-Date: 2017-08-13 18:55+0300\n" "PO-Revision-Date: 2017-05-13 17:23+0300\n"
"Last-Translator: Muhammet Kara <muhammetk@gmail.com>\n" "Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"Language-Team: Turkish <gnometurk@gnome.org>\n" "Language-Team: Türkçe <>\n"
"Language: tr\n" "Language: tr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-DamnedLies-Scope: partial\n"
"X-Generator: Gtranslator 2.91.7\n" "X-Generator: Gtranslator 2.91.7\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
msgid "Navigation" msgid "Navigation"
@@ -278,6 +277,11 @@ msgid "Modifier to use for extended window management operations"
msgstr "Genişletilmiş pencere yönetimi işlemleri için kullanılacak değiştirici" msgstr "Genişletilmiş pencere yönetimi işlemleri için kullanılacak değiştirici"
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
#| msgid ""
#| "This key will initiate the \"overlay\", which is a combination window "
#| "overview and application launching system. The default is intended to be "
#| "the \"Windows key\" on PC hardware. It's expected that this binding "
#| "either the default or set to the empty string."
msgid "" msgid ""
"This key will initiate the “overlay”, which is a combination window overview " "This key will initiate the “overlay”, which is a combination window overview "
"and application launching system. The default is intended to be the “Windows " "and application launching system. The default is intended to be the “Windows "
@@ -362,6 +366,10 @@ msgid "Delay focus changes until the pointer stops moving"
msgstr "Odak değişikliklerini işaretçi hareketi durana kadar ertele" msgstr "Odak değişikliklerini işaretçi hareketi durana kadar ertele"
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
#| 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."
msgid "" msgid ""
"If set to true, and the focus mode is either “sloppy” or “mouse” then the " "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 " "focus will not be changed immediately when entering a window, but only after "
@@ -418,46 +426,29 @@ msgid ""
"Whether the feature requires restarting the compositor depends on the given " "Whether the feature requires restarting the compositor depends on the given "
"feature. Any experimental feature is not required to still be available, or " "feature. Any experimental feature is not required to still be available, or "
"configurable. Dont expect adding anything in this setting to be future " "configurable. Dont expect adding anything in this setting to be future "
"proof. Currently possible keywords: • “monitor-config-manager” — use the new " "proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
"monitor configuration system, aimed to replace the old one. This enables a " "mutter default to layout logical monitors in a logical pixel coordinate "
"higher level configuration API to be used by configuration applications, as " "space, while scaling monitor framebuffers instead of window content, to "
"well as the ability to configure per logical monitor scale. • “scale-monitor-" "manage HiDPI monitors. Does not require a restart."
"framebuffer” — makes mutter default to layout logical monitors in a logical "
"pixel coordinate space, while scaling monitor framebuffers instead of window "
"content, to manage HiDPI monitors. Does not require a restart. Also enabling "
"“monitor-config-manager” is required for this feature to be enabled."
msgstr "" msgstr ""
"Deneysel özellikleri etkinleştirmek için özelliğin anahtar sözcüğünü listeye " "Deneysel özellikleri etkinleştirmek için özelliğin anahtar sözcüğünü listeye "
"ekleyin. Özelliğin yeniden başlatmayı gerektirip gerektirmeyeceği verilen " "ekleyin. Özelliğin yeniden başlatmayı gerektirip gerektirmeyeceği verilen "
"özelliğe bağlıdır. Hiçbir deneysel özellik hala kullanılabilir veya " "özelliğe bağlıdır. Hiçbir deneysel özellik hala kullanılabilir veya "
"yapılandırılabilir olmak zorunda değildir. Bu ayara eklenecek herhangi bir " "yapılandırılabilir olmak zorunda değildir. Bu ayara eklenecek herhangi bir "
"şeyin gelecekte olabilecek değişikliklerden etkilenmeyeceğini düşünmeyin. Şu " "şeyin gelecekte olabilecek değişikliklerden etkilenmeyeceğini düşünmeyin. Şu "
"anda kullanılabilir anahtar sözcükler: • “monitor-config-manager” — " "anda kullanılabilir anahtar sözcükler: • “scale-monitor-framebuffer” — "
"eskisinin yerini alması amaçlanan yeni monitör yapılandırma sistemini " "mutterin HiDPI monitörleri yönetmesi için pencere içeriği yerine monitör "
"kullan. Bu, yapılandırma uygulamaları tarafından kullanılmak üzere daha " "çerçeve arabelleğini ölçeklendirirken, mantıksal monitörleri mantıksal "
"ksek düzeyde bir yapılandırma API'sini etkinleştirir ve ayrıca mantıksal " "piksel koordinat aralığına yerleştirmesini öntanımlı yapar."
"monitör ölçeğinde yapılandırma yapmaya olanak tanır.• “scale-monitor-"
"framebuffer” — mutterin HiDPI monitörleri yönetmesi için pencere içeriği "
"yerine monitör çerçeve arabelleğini ölçeklendirirken, mantıksal monitörleri "
"mantıksal piksel koordinat aralığına yerleştirmesini öntanımlı yapar."
#: data/org.gnome.mutter.gschema.xml.in:151 #: data/org.gnome.mutter.gschema.xml.in:141
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Pencereyi, sekme açılır penceresinden seç" msgstr "Pencereyi, sekme açılır penceresinden seç"
#: data/org.gnome.mutter.gschema.xml.in:156 #: data/org.gnome.mutter.gschema.xml.in:146
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Sekmeyi yeni pencerede açmayı iptal et" msgstr "Sekmeyi yeni pencerede açmayı iptal et"
#: data/org.gnome.mutter.gschema.xml.in:161
msgid "Switch monitor configurations"
msgstr "Monitör yapılandırmaları arasında geçiş yap"
#: data/org.gnome.mutter.gschema.xml.in:166
#| msgid "Switch monitor configurations"
msgid "Rotates the built-in monitor configuration"
msgstr "Yerleşik monitör yapılandırmaları arasında geçiş yapar"
#: data/org.gnome.mutter.wayland.gschema.xml.in:6 #: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1" msgid "Switch to VT 1"
msgstr "VT 1e geç" msgstr "VT 1e geç"
@@ -506,14 +497,10 @@ msgstr "VT 11e geç"
msgid "Switch to VT 12" msgid "Switch to VT 12"
msgstr "VT 12ye geç" msgstr "VT 12ye geç"
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
msgid "Re-enable shortcuts"
msgstr ""
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2118 #: src/backends/meta-input-settings.c:1848
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Kip anahtarı (Group %d)" msgstr "Kip anahtarı (Group %d)"
@@ -521,30 +508,30 @@ msgstr "Kip anahtarı (Group %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2141 #: src/backends/meta-input-settings.c:1870
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Monitör değiştir" msgstr "Monitör değiştir"
#: src/backends/meta-input-settings.c:2143 #: src/backends/meta-input-settings.c:1872
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Ekranda yardımı göster" msgstr "Ekranda yardımı göster"
#: src/backends/meta-monitor-manager.c:927 #: src/backends/meta-monitor-manager.c:783
msgid "Built-in display" msgid "Built-in display"
msgstr "Yerleşik ekran" msgstr "Yerleşik ekran"
#: src/backends/meta-monitor-manager.c:950 #: src/backends/meta-monitor-manager.c:806
msgid "Unknown" msgid "Unknown"
msgstr "Bilinmiyor" msgstr "Bilinmiyor"
#: src/backends/meta-monitor-manager.c:952 #: src/backends/meta-monitor-manager.c:808
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Bilinmeyen Ekran" msgstr "Bilinmeyen Ekran"
#. TRANSLATORS: this is a monitor vendor name, followed by a #. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"' #. * size in inches, like 'Dell 15"'
#. #.
#: src/backends/meta-monitor-manager.c:960 #: src/backends/meta-monitor-manager.c:816
#, c-format #, c-format
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
@@ -553,16 +540,44 @@ msgstr "%s %s"
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:476 #: src/compositor/compositor.c:476
#, c-format #, c-format
#| msgid ""
#| "Another compositing manager is already running on screen %i on display "
#| "\"%s\"."
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
msgstr "" msgstr ""
"“%2$s” monitöründeki %1$i ekranında zaten başka bir birleştirme yöneticisi " "“%2$s” monitöründeki %1$i ekranında zaten başka bir birleştirme yöneticisi çalışıyor."
"çalışıyor."
#: src/core/bell.c:194 #: src/core/bell.c:194
msgid "Bell event" msgid "Bell event"
msgstr "Etkinlik zili" msgstr "Etkinlik zili"
#. Translators: %s is a window title
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "“%s” yanıt vermiyor."
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Uygulama cevap vermiyor"
#: 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 ""
"Uygulamanın devam etmesi için bir müddet bekleyi seçebilirsiniz ya da "
"uygulamanın tamamen çıkması için onu zorlayabilirsiniz."
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Sonlandır"
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Bekle"
#: src/core/display.c:608 #: src/core/display.c:608
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
@@ -604,34 +619,14 @@ msgstr "Yuvalanmış dizgici olarak çalıştır"
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "İç içe değil tam ekran sunucusu olarak çalıştır" msgstr "İç içe değil tam ekran sunucusu olarak çalıştır"
#. Translators: %s is a window title
#: src/core/meta-close-dialog-default.c:147
#, c-format
msgid "“%s” is not responding."
msgstr "“%s” yanıt vermiyor."
#: src/core/meta-close-dialog-default.c:149
msgid "Application is not responding."
msgstr "Uygulama cevap vermiyor"
#: src/core/meta-close-dialog-default.c:154
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Uygulamanın devam etmesi için bir müddet bekleyi seçebilirsiniz ya da "
"uygulamanın tamamen çıkması için onu zorlayabilirsiniz."
#: src/core/meta-close-dialog-default.c:161
msgid "_Force Quit"
msgstr "_Sonlandır"
#: src/core/meta-close-dialog-default.c:161
msgid "_Wait"
msgstr "_Bekle"
#: src/core/mutter.c:39 #: src/core/mutter.c:39
#, c-format #, 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"
msgid "" msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
@@ -670,6 +665,7 @@ msgstr ""
#: src/core/screen.c:665 #: src/core/screen.c:665
#, c-format #, c-format
#| msgid "Screen %d on display '%s' is invalid\n"
msgid "Screen %d on display “%s” is invalid\n" msgid "Screen %d on display “%s” is invalid\n"
msgstr "“%2$s” monitöründeki %1$d ekranı geçersiz\n" msgstr "“%2$s” monitöründeki %1$d ekranı geçersiz\n"

View File

@@ -38,8 +38,6 @@ mutter_test_unit_tests_SOURCES = \
tests/meta-backend-test.h \ tests/meta-backend-test.h \
tests/meta-monitor-manager-test.c \ tests/meta-monitor-manager-test.c \
tests/meta-monitor-manager-test.h \ tests/meta-monitor-manager-test.h \
tests/monitor-config-migration-unit-tests.c \
tests/monitor-config-migration-unit-tests.h \
tests/monitor-store-unit-tests.c \ tests/monitor-store-unit-tests.c \
tests/monitor-store-unit-tests.h \ tests/monitor-store-unit-tests.h \
tests/monitor-test-utils.c \ tests/monitor-test-utils.c \

View File

@@ -71,10 +71,6 @@ mutter_built_sources += \
tablet-unstable-v2-server-protocol.h \ tablet-unstable-v2-server-protocol.h \
xdg-foreign-unstable-v1-protocol.c \ xdg-foreign-unstable-v1-protocol.c \
xdg-foreign-unstable-v1-server-protocol.h \ xdg-foreign-unstable-v1-server-protocol.h \
linux-dmabuf-unstable-v1-protocol.c \
linux-dmabuf-unstable-v1-server-protocol.h \
keyboard-shortcuts-inhibit-unstable-v1-protocol.c \
keyboard-shortcuts-inhibit-unstable-v1-server-protocol.h \
$(NULL) $(NULL)
endif endif
@@ -86,7 +82,6 @@ wayland_protocols = \
libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
backends/meta-backend.c \ backends/meta-backend.c \
meta/meta-backend.h \ meta/meta-backend.h \
meta/meta-settings.h \
backends/meta-backend-private.h \ backends/meta-backend-private.h \
backends/meta-barrier.c \ backends/meta-barrier.c \
backends/meta-barrier-private.h \ backends/meta-barrier-private.h \
@@ -109,10 +104,10 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
backends/meta-input-settings-private.h \ backends/meta-input-settings-private.h \
backends/meta-logical-monitor.c \ backends/meta-logical-monitor.c \
backends/meta-logical-monitor.h \ backends/meta-logical-monitor.h \
backends/meta-monitor-config.c \
backends/meta-monitor-config.h \
backends/meta-monitor-config-manager.c \ backends/meta-monitor-config-manager.c \
backends/meta-monitor-config-manager.h \ backends/meta-monitor-config-manager.h \
backends/meta-monitor-config-migration.c \
backends/meta-monitor-config-migration.h \
backends/meta-monitor-config-store.c \ backends/meta-monitor-config-store.c \
backends/meta-monitor-config-store.h \ backends/meta-monitor-config-store.h \
backends/meta-monitor.c \ backends/meta-monitor.c \
@@ -122,12 +117,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
backends/meta-monitor-manager-private.h \ backends/meta-monitor-manager-private.h \
backends/meta-monitor-manager-dummy.c \ backends/meta-monitor-manager-dummy.c \
backends/meta-monitor-manager-dummy.h \ backends/meta-monitor-manager-dummy.h \
backends/meta-orientation-manager.c \
backends/meta-orientation-manager.h \
backends/meta-pointer-constraint.c \ backends/meta-pointer-constraint.c \
backends/meta-pointer-constraint.h \ backends/meta-pointer-constraint.h \
backends/meta-settings.c \
backends/meta-settings-private.h \
backends/meta-stage.h \ backends/meta-stage.h \
backends/meta-stage.c \ backends/meta-stage.c \
backends/meta-renderer.c \ backends/meta-renderer.c \
@@ -235,10 +226,6 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
meta/meta-close-dialog.h \ meta/meta-close-dialog.h \
core/meta-close-dialog-default.c \ core/meta-close-dialog-default.c \
core/meta-close-dialog-default-private.h \ core/meta-close-dialog-default-private.h \
core/meta-inhibit-shortcuts-dialog.c \
meta/meta-inhibit-shortcuts-dialog.h \
core/meta-inhibit-shortcuts-dialog-default.c \
core/meta-inhibit-shortcuts-dialog-default-private.h \
core/delete.c \ core/delete.c \
core/display.c \ core/display.c \
core/display-private.h \ core/display-private.h \
@@ -247,13 +234,12 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
core/edge-resistance.h \ core/edge-resistance.h \
core/events.c \ core/events.c \
core/events.h \ core/events.h \
core/errors.c \
meta/errors.h \
core/frame.c \ core/frame.c \
core/frame.h \ core/frame.h \
core/meta-gesture-tracker.c \ core/meta-gesture-tracker.c \
core/meta-gesture-tracker-private.h \ core/meta-gesture-tracker-private.h \
core/meta-workspace-manager.c \
core/meta-workspace-manager-private.h \
meta/meta-workspace-manager.h \
core/keybindings.c \ core/keybindings.c \
core/keybindings-private.h \ core/keybindings-private.h \
core/main-private.h \ core/main-private.h \
@@ -262,6 +248,9 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
core/place.h \ core/place.h \
core/prefs.c \ core/prefs.c \
meta/prefs.h \ meta/prefs.h \
core/screen.c \
core/screen-private.h \
meta/screen.h \
core/startup-notification.c \ core/startup-notification.c \
core/startup-notification-private.h \ core/startup-notification-private.h \
meta/types.h \ meta/types.h \
@@ -288,11 +277,6 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
ui/theme-private.h \ ui/theme-private.h \
ui/ui.c \ ui/ui.c \
x11/atomnames.h \ x11/atomnames.h \
x11/meta-x11-display.c \
x11/meta-x11-display-private.h \
meta/meta-x11-display.h \
x11/meta-x11-errors.c \
meta/meta-x11-errors.h \
x11/events.c \ x11/events.c \
x11/events.h \ x11/events.h \
x11/group-private.h \ x11/group-private.h \
@@ -328,8 +312,6 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES += \
wayland/meta-xwayland-private.h \ wayland/meta-xwayland-private.h \
wayland/meta-wayland-buffer.c \ wayland/meta-wayland-buffer.c \
wayland/meta-wayland-buffer.h \ wayland/meta-wayland-buffer.h \
wayland/meta-wayland-dma-buf.c \
wayland/meta-wayland-dma-buf.h \
wayland/meta-wayland-region.c \ wayland/meta-wayland-region.c \
wayland/meta-wayland-region.h \ wayland/meta-wayland-region.h \
wayland/meta-wayland-data-device.c \ wayland/meta-wayland-data-device.c \
@@ -397,10 +379,6 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES += \
wayland/meta-wayland-wl-shell.h \ wayland/meta-wayland-wl-shell.h \
wayland/meta-wayland-gtk-shell.c \ wayland/meta-wayland-gtk-shell.c \
wayland/meta-wayland-gtk-shell.h \ wayland/meta-wayland-gtk-shell.h \
wayland/meta-wayland-inhibit-shortcuts.c \
wayland/meta-wayland-inhibit-shortcuts.h \
wayland/meta-wayland-inhibit-shortcuts-dialog.c \
wayland/meta-wayland-inhibit-shortcuts-dialog.h \
$(NULL) $(NULL)
endif endif
@@ -452,6 +430,7 @@ libmutterinclude_headers = \
meta/compositor-mutter.h \ meta/compositor-mutter.h \
meta/compositor.h \ meta/compositor.h \
meta/display.h \ meta/display.h \
meta/errors.h \
meta/group.h \ meta/group.h \
meta/keybindings.h \ meta/keybindings.h \
meta/main.h \ meta/main.h \
@@ -461,21 +440,17 @@ libmutterinclude_headers = \
meta/meta-background-image.h \ meta/meta-background-image.h \
meta/meta-background-group.h \ meta/meta-background-group.h \
meta/meta-close-dialog.h \ meta/meta-close-dialog.h \
meta/meta-inhibit-shortcuts-dialog.h \
meta/meta-cursor-tracker.h \ meta/meta-cursor-tracker.h \
meta/meta-dnd.h \ meta/meta-dnd.h \
meta/meta-idle-monitor.h \ meta/meta-idle-monitor.h \
meta/meta-plugin.h \ meta/meta-plugin.h \
meta/meta-monitor-manager.h \ meta/meta-monitor-manager.h \
meta/meta-settings.h \
meta/meta-shaped-texture.h \ meta/meta-shaped-texture.h \
meta/meta-shadow-factory.h \ meta/meta-shadow-factory.h \
meta/meta-window-actor.h \ meta/meta-window-actor.h \
meta/meta-window-shape.h \ meta/meta-window-shape.h \
meta/meta-workspace-manager.h \
meta/meta-x11-display.h \
meta/meta-x11-errors.h \
meta/prefs.h \ meta/prefs.h \
meta/screen.h \
meta/theme.h \ meta/theme.h \
meta/types.h \ meta/types.h \
meta/util.h \ meta/util.h \
@@ -599,7 +574,7 @@ stamp-meta-enum-types.h: $(libmutterinclude_headers) meta-enum-types.h.in
$(AM_V_GEN) ( cd $(srcdir) && \ $(AM_V_GEN) ( cd $(srcdir) && \
$(GLIB_MKENUMS) \ $(GLIB_MKENUMS) \
--template meta-enum-types.h.in \ --template meta-enum-types.h.in \
$(libmutterinclude_headers) ) > xgen-teth && \ $(libmutterinclude_base_headers) ) >> xgen-teth && \
(cmp -s xgen-teth meta/meta-enum-types.h || cp xgen-teth meta/meta-enum-types.h) && \ (cmp -s xgen-teth meta/meta-enum-types.h || cp xgen-teth meta/meta-enum-types.h) && \
rm -f xgen-teth && \ rm -f xgen-teth && \
echo timestamp > $(@F) echo timestamp > $(@F)
@@ -608,7 +583,7 @@ meta-enum-types.c: stamp-meta-enum-types.h meta-enum-types.c.in
$(AM_V_GEN) ( cd $(srcdir) && \ $(AM_V_GEN) ( cd $(srcdir) && \
$(GLIB_MKENUMS) \ $(GLIB_MKENUMS) \
--template meta-enum-types.c.in \ --template meta-enum-types.c.in \
$(libmutterinclude_headers) ) > xgen-tetc && \ $(libmutterinclude_base_headers) ) >> xgen-tetc && \
cp xgen-tetc meta-enum-types.c && \ cp xgen-tetc meta-enum-types.c && \
rm -f xgen-tetc rm -f xgen-tetc
@@ -665,7 +640,3 @@ endef
$(AM_V_GEN)$(WAYLAND_SCANNER) code $< $@ $(AM_V_GEN)$(WAYLAND_SCANNER) code $< $@
%-server-protocol.h : $(srcdir)/wayland/protocol/%.xml %-server-protocol.h : $(srcdir)/wayland/protocol/%.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header $< $@ $(AM_V_GEN)$(WAYLAND_SCANNER) server-header $< $@
keyboard-shortcuts-inhibit-unstable-v1-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
keyboard-shortcuts-inhibit-unstable-v1-server-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@

View File

@@ -34,12 +34,10 @@
#include <meta/meta-idle-monitor.h> #include <meta/meta-idle-monitor.h>
#include "meta-cursor-renderer.h" #include "meta-cursor-renderer.h"
#include "meta-monitor-manager-private.h" #include "meta-monitor-manager-private.h"
#include "meta-orientation-manager.h"
#include "meta-input-settings-private.h" #include "meta-input-settings-private.h"
#include "backends/meta-egl.h" #include "backends/meta-egl.h"
#include "backends/meta-pointer-constraint.h" #include "backends/meta-pointer-constraint.h"
#include "backends/meta-renderer.h" #include "backends/meta-renderer.h"
#include "backends/meta-settings-private.h"
#include "core/util-private.h" #include "core/util-private.h"
#define DEFAULT_XKB_RULES_FILE "evdev" #define DEFAULT_XKB_RULES_FILE "evdev"
@@ -61,7 +59,6 @@ struct _MetaBackendClass
MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend); MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend);
MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend); MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend);
MetaRenderer * (* create_renderer) (MetaBackend *backend); MetaRenderer * (* create_renderer) (MetaBackend *backend);
MetaInputSettings * (* create_input_settings) (MetaBackend *backend);
gboolean (* grab_device) (MetaBackend *backend, gboolean (* grab_device) (MetaBackend *backend,
int device_id, int device_id,
@@ -83,8 +80,6 @@ struct _MetaBackendClass
struct xkb_keymap * (* get_keymap) (MetaBackend *backend); struct xkb_keymap * (* get_keymap) (MetaBackend *backend);
xkb_layout_index_t (* get_keymap_layout_group) (MetaBackend *backend);
void (* lock_layout_group) (MetaBackend *backend, void (* lock_layout_group) (MetaBackend *backend,
guint idx); guint idx);
@@ -102,8 +97,17 @@ struct _MetaBackendClass
}; };
typedef enum _MetaExperimentalFeature
{
META_EXPERIMENTAL_FEATURE_NONE = 0,
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0),
META_EXPERIMENTAL_FEATURE_MONITOR_CONFIG_MANAGER = (1 << 1)
} MetaExperimentalFeature;
void meta_init_backend (GType backend_gtype); void meta_init_backend (GType backend_gtype);
void meta_backend_display_opened (MetaBackend *backend);
ClutterBackend * meta_backend_get_clutter_backend (MetaBackend *backend); ClutterBackend * meta_backend_get_clutter_backend (MetaBackend *backend);
MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend, MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend,
@@ -113,12 +117,10 @@ void meta_backend_foreach_device_monitor (MetaBackend *backend,
gpointer user_data); gpointer user_data);
MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend); MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend);
MetaOrientationManager * meta_backend_get_orientation_manager (MetaBackend *backend);
MetaCursorTracker * meta_backend_get_cursor_tracker (MetaBackend *backend); MetaCursorTracker * meta_backend_get_cursor_tracker (MetaBackend *backend);
MetaCursorRenderer * meta_backend_get_cursor_renderer (MetaBackend *backend); MetaCursorRenderer * meta_backend_get_cursor_renderer (MetaBackend *backend);
MetaRenderer * meta_backend_get_renderer (MetaBackend *backend); MetaRenderer * meta_backend_get_renderer (MetaBackend *backend);
MetaEgl * meta_backend_get_egl (MetaBackend *backend); MetaEgl * meta_backend_get_egl (MetaBackend *backend);
MetaSettings * meta_backend_get_settings (MetaBackend *backend);
gboolean meta_backend_grab_device (MetaBackend *backend, gboolean meta_backend_grab_device (MetaBackend *backend,
int device_id, int device_id,
@@ -135,8 +137,6 @@ MetaLogicalMonitor * meta_backend_get_current_logical_monitor (MetaBackend *back
struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend); struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend);
xkb_layout_index_t meta_backend_get_keymap_layout_group (MetaBackend *backend);
void meta_backend_update_last_device (MetaBackend *backend, void meta_backend_update_last_device (MetaBackend *backend,
int device_id); int device_id);
@@ -155,6 +155,16 @@ ClutterBackend * meta_backend_get_clutter_backend (MetaBackend *backend);
void meta_backend_monitors_changed (MetaBackend *backend); void meta_backend_monitors_changed (MetaBackend *backend);
gboolean meta_backend_is_experimental_feature_enabled (MetaBackend *backend,
MetaExperimentalFeature feature);
MetaExperimentalFeature meta_backend_get_experimental_features (MetaBackend *backend);
void meta_backend_override_experimental_features (MetaBackend *backend);
void meta_backend_enable_experimental_feature (MetaBackend *backend,
MetaExperimentalFeature feature);
gboolean meta_is_stage_views_enabled (void); gboolean meta_is_stage_views_enabled (void);
gboolean meta_is_stage_views_scaled (void); gboolean meta_is_stage_views_scaled (void);

View File

@@ -43,15 +43,15 @@
#include "backends/meta-idle-monitor-private.h" #include "backends/meta-idle-monitor-private.h"
#include "backends/meta-logical-monitor.h" #include "backends/meta-logical-monitor.h"
#include "backends/meta-monitor-manager-dummy.h" #include "backends/meta-monitor-manager-dummy.h"
#include "backends/meta-settings-private.h" #include "ui/theme-private.h"
#define META_IDLE_MONITOR_CORE_DEVICE 0
enum enum
{ {
KEYMAP_CHANGED, KEYMAP_CHANGED,
KEYMAP_LAYOUT_GROUP_CHANGED, KEYMAP_LAYOUT_GROUP_CHANGED,
LAST_DEVICE_CHANGED, LAST_DEVICE_CHANGED,
EXPERIMENTAL_FEATURES_CHANGED,
UI_SCALING_FACTOR_CHANGED,
N_SIGNALS N_SIGNALS
}; };
@@ -78,13 +78,15 @@ meta_get_backend (void)
struct _MetaBackendPrivate struct _MetaBackendPrivate
{ {
MetaMonitorManager *monitor_manager; MetaMonitorManager *monitor_manager;
MetaOrientationManager *orientation_manager;
MetaCursorTracker *cursor_tracker; MetaCursorTracker *cursor_tracker;
MetaCursorRenderer *cursor_renderer; MetaCursorRenderer *cursor_renderer;
MetaInputSettings *input_settings; MetaInputSettings *input_settings;
MetaRenderer *renderer; MetaRenderer *renderer;
MetaEgl *egl; MetaEgl *egl;
MetaSettings *settings;
GSettings *mutter_settings;
MetaExperimentalFeature experimental_features;
gboolean experimental_features_overridden;
ClutterBackend *clutter_backend; ClutterBackend *clutter_backend;
ClutterActor *stage; ClutterActor *stage;
@@ -97,6 +99,8 @@ struct _MetaBackendPrivate
MetaPointerConstraint *client_pointer_constraint; MetaPointerConstraint *client_pointer_constraint;
MetaDnd *dnd; MetaDnd *dnd;
int ui_scaling_factor;
}; };
typedef struct _MetaBackendPrivate MetaBackendPrivate; typedef struct _MetaBackendPrivate MetaBackendPrivate;
@@ -115,7 +119,6 @@ meta_backend_finalize (GObject *object)
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
g_clear_object (&priv->monitor_manager); g_clear_object (&priv->monitor_manager);
g_clear_object (&priv->orientation_manager);
g_clear_object (&priv->input_settings); g_clear_object (&priv->input_settings);
if (priv->device_update_idle_id) if (priv->device_update_idle_id)
@@ -123,8 +126,6 @@ meta_backend_finalize (GObject *object)
g_hash_table_destroy (priv->device_monitors); g_hash_table_destroy (priv->device_monitors);
g_clear_object (&priv->settings);
G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object); G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object);
} }
@@ -154,10 +155,28 @@ center_pointer (MetaBackend *backend)
primary->rect.y + primary->rect.height / 2); primary->rect.y + primary->rect.height / 2);
} }
static gboolean
meta_backend_update_ui_scaling_factor (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
int ui_scaling_factor;
ui_scaling_factor = meta_backend_get_ui_scaling_factor (backend);
if (ui_scaling_factor != priv->ui_scaling_factor)
{
priv->ui_scaling_factor = ui_scaling_factor;
return TRUE;
}
else
{
return FALSE;
}
}
void void
meta_backend_monitors_changed (MetaBackend *backend) meta_backend_monitors_changed (MetaBackend *backend)
{ {
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaMonitorManager *monitor_manager = MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
ClutterDeviceManager *manager = clutter_device_manager_get_default (); ClutterDeviceManager *manager = clutter_device_manager_get_default ();
@@ -175,7 +194,8 @@ meta_backend_monitors_changed (MetaBackend *backend)
center_pointer (backend); center_pointer (backend);
} }
meta_settings_update_ui_scaling_factor (priv->settings); if (meta_backend_update_ui_scaling_factor (backend))
meta_backend_notify_ui_scaling_factor_changed (backend);
} }
void void
@@ -225,16 +245,6 @@ destroy_device_monitor (MetaBackend *backend,
g_hash_table_remove (priv->device_monitors, &device_id); g_hash_table_remove (priv->device_monitors, &device_id);
} }
static void
meta_backend_monitor_device (MetaBackend *backend,
ClutterInputDevice *device)
{
int device_id;
device_id = clutter_input_device_get_device_id (device);
create_device_monitor (backend, device_id);
}
static void static void
on_device_added (ClutterDeviceManager *device_manager, on_device_added (ClutterDeviceManager *device_manager,
ClutterInputDevice *device, ClutterInputDevice *device,
@@ -342,56 +352,10 @@ create_monitor_manager (MetaBackend *backend)
return META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend); return META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend);
} }
static void
create_device_monitors (MetaBackend *backend,
ClutterDeviceManager *device_manager)
{
const GSList *devices;
const GSList *l;
create_device_monitor (backend, META_IDLE_MONITOR_CORE_DEVICE);
devices = clutter_device_manager_peek_devices (device_manager);
for (l = devices; l; l = l->next)
{
ClutterInputDevice *device = l->data;
meta_backend_monitor_device (backend, device);
}
}
static void
set_initial_pointer_visibility (MetaBackend *backend,
ClutterDeviceManager *device_manager)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
const GSList *devices;
const GSList *l;
gboolean has_touchscreen = FALSE;
devices = clutter_device_manager_peek_devices (device_manager);
for (l = devices; l; l = l->next)
{
ClutterInputDevice *device = l->data;
has_touchscreen |= device_is_slave_touchscreen (device);
}
meta_cursor_tracker_set_pointer_visible (priv->cursor_tracker,
!has_touchscreen);
}
static MetaInputSettings *
meta_backend_create_input_settings (MetaBackend *backend)
{
return META_BACKEND_GET_CLASS (backend)->create_input_settings (backend);
}
static void static void
meta_backend_real_post_init (MetaBackend *backend) meta_backend_real_post_init (MetaBackend *backend)
{ {
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
priv->stage = meta_stage_new (); priv->stage = meta_stage_new ();
clutter_actor_realize (priv->stage); clutter_actor_realize (priv->stage);
@@ -401,22 +365,45 @@ meta_backend_real_post_init (MetaBackend *backend)
meta_backend_sync_screen_size (backend); meta_backend_sync_screen_size (backend);
meta_backend_update_ui_scaling_factor (backend);
priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend); priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend);
priv->device_monitors = priv->device_monitors =
g_hash_table_new_full (g_int_hash, g_int_equal, g_hash_table_new_full (g_int_hash, g_int_equal,
NULL, (GDestroyNotify) g_object_unref); NULL, (GDestroyNotify) g_object_unref);
create_device_monitors (backend, device_manager); {
MetaCursorTracker *cursor_tracker;
ClutterDeviceManager *manager;
gboolean has_touchscreen = FALSE;
GSList *devices, *l;
g_signal_connect_object (device_manager, "device-added", /* Create the core device monitor. */
G_CALLBACK (on_device_added), backend, 0); create_device_monitor (backend, 0);
g_signal_connect_object (device_manager, "device-removed",
G_CALLBACK (on_device_removed), backend, 0);
set_initial_pointer_visibility (backend, device_manager); manager = clutter_device_manager_get_default ();
g_signal_connect_object (manager, "device-added",
G_CALLBACK (on_device_added), backend, 0);
g_signal_connect_object (manager, "device-removed",
G_CALLBACK (on_device_removed), backend, 0);
priv->input_settings = meta_backend_create_input_settings (backend); devices = clutter_device_manager_list_devices (manager);
for (l = devices; l != NULL; l = l->next)
{
ClutterInputDevice *device = l->data;
on_device_added (manager, device, backend);
has_touchscreen |= device_is_slave_touchscreen (device);
}
cursor_tracker = priv->cursor_tracker;
meta_cursor_tracker_set_pointer_visible (cursor_tracker, !has_touchscreen);
g_slist_free (devices);
}
priv->input_settings = meta_input_settings_create ();
center_pointer (backend); center_pointer (backend);
} }
@@ -462,6 +449,105 @@ meta_backend_real_get_relative_motion_deltas (MetaBackend *backend,
return FALSE; return FALSE;
} }
static gboolean
experimental_features_handler (GVariant *features_variant,
gpointer *result,
gpointer data)
{
MetaBackend *backend = data;
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
GVariantIter features_iter;
char *feature;
MetaExperimentalFeature features = META_EXPERIMENTAL_FEATURE_NONE;
if (priv->experimental_features_overridden)
{
*result = GINT_TO_POINTER (FALSE);
return TRUE;
}
g_variant_iter_init (&features_iter, features_variant);
while (g_variant_iter_loop (&features_iter, "s", &feature))
{
/* So far no experimental features defined. */
if (g_str_equal (feature, "scale-monitor-framebuffer"))
features |= META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER;
else if (g_str_equal (feature, "monitor-config-manager"))
features |= META_EXPERIMENTAL_FEATURE_MONITOR_CONFIG_MANAGER;
else
g_info ("Unknown experimental feature '%s'\n", feature);
}
if (features != priv->experimental_features)
{
priv->experimental_features = features;
*result = GINT_TO_POINTER (TRUE);
}
else
{
*result = GINT_TO_POINTER (FALSE);
}
return TRUE;
}
static gboolean
update_experimental_features (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
return GPOINTER_TO_INT (g_settings_get_mapped (priv->mutter_settings,
"experimental-features",
experimental_features_handler,
backend));
}
static void
mutter_settings_changed (GSettings *settings,
gchar *key,
MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaExperimentalFeature old_experimental_features;
gboolean changed;
if (!g_str_equal (key, "experimental-features"))
return;
old_experimental_features = priv->experimental_features;
changed = update_experimental_features (backend);
if (changed)
g_signal_emit (backend, signals[EXPERIMENTAL_FEATURES_CHANGED], 0,
(unsigned int) old_experimental_features);
}
gboolean
meta_backend_is_experimental_feature_enabled (MetaBackend *backend,
MetaExperimentalFeature feature)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
return !!(priv->experimental_features & feature);
}
void
meta_backend_override_experimental_features (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
priv->experimental_features = META_EXPERIMENTAL_FEATURE_NONE;
priv->experimental_features_overridden = TRUE;
}
void
meta_backend_enable_experimental_feature (MetaBackend *backend,
MetaExperimentalFeature feature)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
priv->experimental_features |= feature;
}
static void static void
meta_backend_class_init (MetaBackendClass *klass) meta_backend_class_init (MetaBackendClass *klass)
{ {
@@ -498,6 +584,20 @@ meta_backend_class_init (MetaBackendClass *klass)
0, 0,
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_INT); G_TYPE_NONE, 1, G_TYPE_INT);
signals[EXPERIMENTAL_FEATURES_CHANGED] =
g_signal_new ("experimental-features-changed",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
signals[UI_SCALING_FACTOR_CHANGED] =
g_signal_new ("ui-scaling-factor-changed",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
mutter_stage_views = g_getenv ("MUTTER_STAGE_VIEWS"); mutter_stage_views = g_getenv ("MUTTER_STAGE_VIEWS");
stage_views_disabled = g_strcmp0 (mutter_stage_views, "0") == 0; stage_views_disabled = g_strcmp0 (mutter_stage_views, "0") == 0;
@@ -511,7 +611,11 @@ meta_backend_initable_init (GInitable *initable,
MetaBackend *backend = META_BACKEND (initable); MetaBackend *backend = META_BACKEND (initable);
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
priv->settings = meta_settings_new (backend); priv->mutter_settings = g_settings_new ("org.gnome.mutter");
g_signal_connect (priv->mutter_settings, "changed",
G_CALLBACK (mutter_settings_changed),
backend);
update_experimental_features (backend);
priv->egl = g_object_new (META_TYPE_EGL, NULL); priv->egl = g_object_new (META_TYPE_EGL, NULL);
@@ -528,8 +632,6 @@ meta_backend_initable_init (GInitable *initable,
priv->dnd = g_object_new (META_TYPE_DND, NULL); priv->dnd = g_object_new (META_TYPE_DND, NULL);
priv->orientation_manager = g_object_new (META_TYPE_ORIENTATION_MANAGER, NULL);
return TRUE; return TRUE;
} }
@@ -548,11 +650,7 @@ meta_backend_init (MetaBackend *backend)
static void static void
meta_backend_post_init (MetaBackend *backend) meta_backend_post_init (MetaBackend *backend)
{ {
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
META_BACKEND_GET_CLASS (backend)->post_init (backend); META_BACKEND_GET_CLASS (backend)->post_init (backend);
meta_settings_post_init (priv->settings);
} }
/** /**
@@ -578,17 +676,6 @@ meta_backend_get_monitor_manager (MetaBackend *backend)
return priv->monitor_manager; return priv->monitor_manager;
} }
/**
* meta_backend_get_orientation_manager: (skip)
*/
MetaOrientationManager *
meta_backend_get_orientation_manager (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
return priv->orientation_manager;
}
MetaCursorTracker * MetaCursorTracker *
meta_backend_get_cursor_tracker (MetaBackend *backend) meta_backend_get_cursor_tracker (MetaBackend *backend)
{ {
@@ -611,8 +698,7 @@ meta_backend_get_cursor_renderer (MetaBackend *backend)
/** /**
* meta_backend_get_renderer: (skip) * meta_backend_get_renderer: (skip)
*/ */
MetaRenderer * MetaRenderer * meta_backend_get_renderer (MetaBackend *backend)
meta_backend_get_renderer (MetaBackend *backend)
{ {
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
@@ -622,25 +708,13 @@ meta_backend_get_renderer (MetaBackend *backend)
/** /**
* meta_backend_get_egl: (skip) * meta_backend_get_egl: (skip)
*/ */
MetaEgl * MetaEgl * meta_backend_get_egl (MetaBackend *backend)
meta_backend_get_egl (MetaBackend *backend)
{ {
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
return priv->egl; return priv->egl;
} }
/**
* meta_backend_get_settings: (skip)
*/
MetaSettings *
meta_backend_get_settings (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
return priv->settings;
}
/** /**
* meta_backend_grab_device: (skip) * meta_backend_grab_device: (skip)
*/ */
@@ -699,12 +773,6 @@ meta_backend_get_keymap (MetaBackend *backend)
return META_BACKEND_GET_CLASS (backend)->get_keymap (backend); return META_BACKEND_GET_CLASS (backend)->get_keymap (backend);
} }
xkb_layout_index_t
meta_backend_get_keymap_layout_group (MetaBackend *backend)
{
return META_BACKEND_GET_CLASS (backend)->get_keymap_layout_group (backend);
}
void void
meta_backend_lock_layout_group (MetaBackend *backend, meta_backend_lock_layout_group (MetaBackend *backend,
guint idx) guint idx)
@@ -942,6 +1010,29 @@ meta_clutter_init (void)
meta_backend_post_init (_backend); meta_backend_post_init (_backend);
} }
static void
xft_dpi_changed (GtkSettings *settings,
GParamSpec *pspec,
MetaBackend *backend)
{
meta_backend_update_ui_scaling_factor (backend);
meta_backend_notify_ui_scaling_factor_changed (backend);
}
void
meta_backend_display_opened (MetaBackend *backend)
{
/*
* gdk-window-scaling-factor is not exported to gtk-settings
* because it is handled inside gdk, so we use gtk-xft-dpi instead
* which also changes when the scale factor changes.
*
* TODO: Don't rely on GtkSettings for this
*/
g_signal_connect (gtk_settings_get_default (), "notify::gtk-xft-dpi",
G_CALLBACK (xft_dpi_changed), backend);
}
gboolean gboolean
meta_is_stage_views_enabled (void) meta_is_stage_views_enabled (void)
{ {
@@ -1004,3 +1095,46 @@ meta_backend_notify_keymap_layout_group_changed (MetaBackend *backend,
g_signal_emit (backend, signals[KEYMAP_LAYOUT_GROUP_CHANGED], 0, g_signal_emit (backend, signals[KEYMAP_LAYOUT_GROUP_CHANGED], 0,
locked_group); locked_group);
} }
static int
calculate_ui_scaling_factor (MetaBackend *backend)
{
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
GList *logical_monitors;
GList *l;
int max_scale = 1;
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager);
for (l = logical_monitors; l; l = l->next)
{
MetaLogicalMonitor *logical_monitor = l->data;
max_scale = MAX (logical_monitor->scale, max_scale);
}
return max_scale;
}
int
meta_backend_get_ui_scaling_factor (MetaBackend *backend)
{
if (meta_is_stage_views_scaled ())
{
return 1;
}
else
{
if (meta_is_monitor_config_manager_enabled ())
return calculate_ui_scaling_factor (backend);
else
return meta_theme_get_window_scaling_factor ();
}
}
void
meta_backend_notify_ui_scaling_factor_changed (MetaBackend *backend)
{
g_signal_emit (backend, signals[UI_SCALING_FACTOR_CHANGED], 0);
}

View File

@@ -37,8 +37,7 @@
struct _MetaCursorRendererPrivate struct _MetaCursorRendererPrivate
{ {
float current_x; int current_x, current_y;
float current_y;
MetaCursorSprite *displayed_cursor; MetaCursorSprite *displayed_cursor;
MetaOverlay *stage_overlay; MetaOverlay *stage_overlay;
@@ -70,7 +69,7 @@ queue_redraw (MetaCursorRenderer *renderer,
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
ClutterActor *stage = meta_backend_get_stage (backend); ClutterActor *stage = meta_backend_get_stage (backend);
CoglTexture *texture; CoglTexture *texture;
ClutterRect rect = { 0 }; MetaRectangle rect = { 0 };
if (cursor_sprite) if (cursor_sprite)
rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite); rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
@@ -160,7 +159,7 @@ meta_cursor_renderer_init (MetaCursorRenderer *renderer)
NULL); NULL);
} }
ClutterRect MetaRectangle
meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer, meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
@@ -173,22 +172,18 @@ meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite); texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
if (!texture) if (!texture)
return (ClutterRect) { 0 }; return (MetaRectangle) { 0 };
meta_cursor_sprite_get_hotspot (cursor_sprite, &hot_x, &hot_y); meta_cursor_sprite_get_hotspot (cursor_sprite, &hot_x, &hot_y);
texture_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite); texture_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite);
width = cogl_texture_get_width (texture); width = cogl_texture_get_width (texture);
height = cogl_texture_get_height (texture); height = cogl_texture_get_height (texture);
return (ClutterRect) { return (MetaRectangle) {
.origin = { .x = (int)roundf (priv->current_x - (hot_x * texture_scale)),
.x = priv->current_x - (hot_x * texture_scale), .y = (int)roundf (priv->current_y - (hot_y * texture_scale)),
.y = priv->current_y - (hot_y * texture_scale) .width = (int)roundf (width * texture_scale),
}, .height = (int)roundf (height * texture_scale),
.size = {
.width = width * texture_scale,
.height = height * texture_scale
}
}; };
} }
@@ -202,8 +197,8 @@ update_cursor (MetaCursorRenderer *renderer,
if (cursor_sprite) if (cursor_sprite)
meta_cursor_sprite_prepare_at (cursor_sprite, meta_cursor_sprite_prepare_at (cursor_sprite,
(int) priv->current_x, priv->current_x,
(int) priv->current_y); priv->current_y);
handled_by_backend = handled_by_backend =
META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer, META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer,
@@ -251,8 +246,7 @@ meta_cursor_renderer_force_update (MetaCursorRenderer *renderer)
void void
meta_cursor_renderer_set_position (MetaCursorRenderer *renderer, meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
float x, int x, int y)
float y)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);

View File

@@ -31,6 +31,7 @@
#include <wayland-server.h> #include <wayland-server.h>
#endif #endif
#include <meta/screen.h>
#include "meta-cursor.h" #include "meta-cursor.h"
#define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ()) #define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ())
@@ -59,14 +60,13 @@ void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite); MetaCursorSprite *cursor_sprite);
void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer, void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
float x, int x, int y);
float y);
void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer); void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer);
MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer); MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
ClutterRect meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer, MetaRectangle meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite); MetaCursorSprite *cursor_sprite);
#ifdef HAVE_WAYLAND #ifdef HAVE_WAYLAND
void meta_cursor_renderer_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer, void meta_cursor_renderer_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer,

View File

@@ -62,8 +62,8 @@ void meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
MetaCursorSprite *cursor_sprite); MetaCursorSprite *cursor_sprite);
void meta_cursor_tracker_update_position (MetaCursorTracker *tracker, void meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
float new_x, int new_x,
float new_y); int new_y);
MetaCursorSprite * meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker); MetaCursorSprite * meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker);

View File

@@ -31,10 +31,9 @@
#include "meta-cursor-tracker-private.h" #include "meta-cursor-tracker-private.h"
#include <string.h> #include <string.h>
#include <meta/meta-x11-display.h>
#include <meta/main.h> #include <meta/main.h>
#include <meta/util.h> #include <meta/util.h>
#include <meta/meta-x11-errors.h> #include <meta/errors.h>
#include <cogl/cogl.h> #include <cogl/cogl.h>
#include <clutter/clutter.h> #include <clutter/clutter.h>
@@ -44,7 +43,6 @@
#include <X11/extensions/Xfixes.h> #include <X11/extensions/Xfixes.h>
#include "meta-backend-private.h" #include "meta-backend-private.h"
#include "x11/meta-x11-display-private.h"
G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT); G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
@@ -133,15 +131,15 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
} }
/** /**
* meta_cursor_tracker_get_for_display: * meta_cursor_tracker_get_for_screen:
* @display: the #MetaDisplay * @screen: the #MetaScreen
* *
* Retrieves the cursor tracker object for @display. * Retrieves the cursor tracker object for @screen.
* *
* Returns: (transfer none): * Returns: (transfer none):
*/ */
MetaCursorTracker * MetaCursorTracker *
meta_cursor_tracker_get_for_display (MetaDisplay *display) meta_cursor_tracker_get_for_screen (MetaScreen *screen)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaCursorTracker *tracker = meta_backend_get_cursor_tracker (backend); MetaCursorTracker *tracker = meta_backend_get_cursor_tracker (backend);
@@ -167,13 +165,13 @@ gboolean
meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker, meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
XEvent *xevent) XEvent *xevent)
{ {
MetaX11Display *x11_display = meta_get_display ()->x11_display; MetaDisplay *display = meta_get_display ();
XFixesCursorNotifyEvent *notify_event; XFixesCursorNotifyEvent *notify_event;
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
return FALSE; return FALSE;
if (xevent->xany.type != x11_display->xfixes_event_base + XFixesCursorNotify) if (xevent->xany.type != display->xfixes_event_base + XFixesCursorNotify)
return FALSE; return FALSE;
notify_event = (XFixesCursorNotifyEvent *)xevent; notify_event = (XFixesCursorNotifyEvent *)xevent;
@@ -190,7 +188,6 @@ static void
ensure_xfixes_cursor (MetaCursorTracker *tracker) ensure_xfixes_cursor (MetaCursorTracker *tracker)
{ {
MetaDisplay *display = meta_get_display (); MetaDisplay *display = meta_get_display ();
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
XFixesCursorImage *cursor_image; XFixesCursorImage *cursor_image;
CoglTexture2D *sprite; CoglTexture2D *sprite;
guint8 *cursor_data; guint8 *cursor_data;
@@ -201,7 +198,7 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker)
if (tracker->xfixes_cursor) if (tracker->xfixes_cursor)
return; return;
cursor_image = XFixesGetCursorImage (xdisplay); cursor_image = XFixesGetCursorImage (display->xdisplay);
if (!cursor_image) if (!cursor_image)
return; return;
@@ -353,8 +350,8 @@ meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
void void
meta_cursor_tracker_update_position (MetaCursorTracker *tracker, meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
float new_x, int new_x,
float new_y) int new_y)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaCursorRenderer *cursor_renderer = MetaCursorRenderer *cursor_renderer =

View File

@@ -23,9 +23,10 @@
#include "meta-cursor.h" #include "meta-cursor.h"
#include <meta/meta-x11-errors.h> #include <meta/errors.h>
#include "display-private.h" #include "display-private.h"
#include "screen-private.h"
#include "meta-backend-private.h" #include "meta-backend-private.h"
#include <string.h> #include <string.h>

View File

@@ -24,7 +24,7 @@
gboolean meta_dnd_handle_xdnd_event (MetaBackend *backend, gboolean meta_dnd_handle_xdnd_event (MetaBackend *backend,
MetaCompositor *compositor, MetaCompositor *compositor,
Display *xdisplay, MetaDisplay *display,
XEvent *xev); XEvent *xev);
#ifdef HAVE_WAYLAND #ifdef HAVE_WAYLAND

View File

@@ -66,9 +66,6 @@ struct _MetaEgl
PFNEGLSTREAMCONSUMERACQUIREKHRPROC eglStreamConsumerAcquireKHR; PFNEGLSTREAMCONSUMERACQUIREKHRPROC eglStreamConsumerAcquireKHR;
PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC eglStreamConsumerAcquireAttribNV; PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC eglStreamConsumerAcquireAttribNV;
PFNEGLQUERYDMABUFFORMATSEXTPROC eglQueryDmaBufFormatsEXT;
PFNEGLQUERYDMABUFMODIFIERSEXTPROC eglQueryDmaBufModifiersEXT;
}; };
G_DEFINE_TYPE (MetaEgl, meta_egl, G_TYPE_OBJECT) G_DEFINE_TYPE (MetaEgl, meta_egl, G_TYPE_OBJECT)
@@ -714,60 +711,22 @@ meta_egl_stream_consumer_acquire (MetaEgl *egl,
return TRUE; return TRUE;
} }
gboolean
meta_egl_query_dma_buf_formats (MetaEgl *egl,
EGLDisplay display,
EGLint max_formats,
EGLint *formats,
EGLint *num_formats,
GError **error)
{
if (!is_egl_proc_valid (egl->eglQueryDmaBufFormatsEXT, error))
return FALSE;
if (!egl->eglQueryDmaBufFormatsEXT (display, max_formats, formats,
num_formats))
{
set_egl_error (error);
return FALSE;
}
return TRUE;
}
gboolean
meta_egl_query_dma_buf_modifiers (MetaEgl *egl,
EGLDisplay display,
EGLint format,
EGLint max_modifiers,
EGLuint64KHR *modifiers,
EGLBoolean *external_only,
EGLint *num_modifiers,
GError **error)
{
if (!is_egl_proc_valid (egl->eglQueryDmaBufModifiersEXT, error))
return FALSE;
if (!egl->eglQueryDmaBufModifiersEXT (display, format, max_modifiers,
modifiers, external_only,
num_modifiers))
{
set_egl_error (error);
return FALSE;
}
return TRUE;
}
#define GET_EGL_PROC_ADDR(proc) \ #define GET_EGL_PROC_ADDR(proc) \
egl->proc = (void *) eglGetProcAddress (#proc); egl->proc = (void *) eglGetProcAddress (#proc);
#define GET_EGL_PROC_ADDR_REQUIRED(proc) \
GET_EGL_PROC_ADDR(proc) \
if (!egl->proc) \
{ \
meta_fatal ("Failed to get proc address for '%s'\n", #proc); \
}
static void static void
meta_egl_constructed (GObject *object) meta_egl_constructed (GObject *object)
{ {
MetaEgl *egl = META_EGL (object); MetaEgl *egl = META_EGL (object);
GET_EGL_PROC_ADDR (eglGetPlatformDisplayEXT); GET_EGL_PROC_ADDR_REQUIRED (eglGetPlatformDisplayEXT);
GET_EGL_PROC_ADDR (eglCreateImageKHR); GET_EGL_PROC_ADDR (eglCreateImageKHR);
GET_EGL_PROC_ADDR (eglDestroyImageKHR); GET_EGL_PROC_ADDR (eglDestroyImageKHR);
@@ -794,9 +753,6 @@ meta_egl_constructed (GObject *object)
GET_EGL_PROC_ADDR (eglStreamConsumerAcquireKHR); GET_EGL_PROC_ADDR (eglStreamConsumerAcquireKHR);
GET_EGL_PROC_ADDR (eglStreamConsumerAcquireAttribNV); GET_EGL_PROC_ADDR (eglStreamConsumerAcquireAttribNV);
GET_EGL_PROC_ADDR (eglQueryDmaBufFormatsEXT);
GET_EGL_PROC_ADDR (eglQueryDmaBufModifiersEXT);
} }
#undef GET_EGL_PROC_ADDR #undef GET_EGL_PROC_ADDR

View File

@@ -167,20 +167,4 @@ gboolean meta_egl_stream_consumer_gl_texture_external (MetaEgl *egl,
EGLStreamKHR stream, EGLStreamKHR stream,
GError **error); GError **error);
gboolean meta_egl_query_dma_buf_formats (MetaEgl *egl,
EGLDisplay display,
EGLint max_formats,
EGLint *formats,
EGLint *num_formats,
GError **error);
gboolean meta_egl_query_dma_buf_modifiers (MetaEgl *egl,
EGLDisplay display,
EGLint format,
EGLint max_modifiers,
EGLuint64KHR *modifiers,
EGLBoolean *external_only,
EGLint *num_formats,
GError **error);
#endif /* META_EGL_H */ #endif /* META_EGL_H */

View File

@@ -31,9 +31,20 @@
#include <libwacom/libwacom.h> #include <libwacom/libwacom.h>
#endif #endif
#define META_TYPE_INPUT_SETTINGS (meta_input_settings_get_type ()) #define META_TYPE_INPUT_SETTINGS (meta_input_settings_get_type ())
G_DECLARE_DERIVABLE_TYPE (MetaInputSettings, meta_input_settings, #define META_INPUT_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_INPUT_SETTINGS, MetaInputSettings))
META, INPUT_SETTINGS, GObject) #define META_INPUT_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_INPUT_SETTINGS, MetaInputSettingsClass))
#define META_IS_INPUT_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_INPUT_SETTINGS))
#define META_IS_INPUT_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_INPUT_SETTINGS))
#define META_INPUT_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_INPUT_SETTINGS, MetaInputSettingsClass))
typedef struct _MetaInputSettings MetaInputSettings;
typedef struct _MetaInputSettingsClass MetaInputSettingsClass;
struct _MetaInputSettings
{
GObject parent_instance;
};
struct _MetaInputSettingsClass struct _MetaInputSettingsClass
{ {
@@ -54,12 +65,6 @@ struct _MetaInputSettingsClass
void (* set_tap_enabled) (MetaInputSettings *settings, void (* set_tap_enabled) (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
gboolean enabled); gboolean enabled);
void (* set_tap_and_drag_enabled) (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean enabled);
void (* set_disable_while_typing) (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean enabled);
void (* set_invert_scroll) (MetaInputSettings *settings, void (* set_invert_scroll) (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
gboolean inverted); gboolean inverted);
@@ -112,10 +117,15 @@ struct _MetaInputSettingsClass
ClutterInputDeviceTool *tool, ClutterInputDeviceTool *tool,
GDesktopStylusButtonAction primary, GDesktopStylusButtonAction primary,
GDesktopStylusButtonAction secondary); GDesktopStylusButtonAction secondary);
gboolean (* has_two_finger_scroll) (MetaInputSettings *settings, gboolean (* has_two_finger_scroll) (MetaInputSettings *settings,
ClutterInputDevice *device); ClutterInputDevice *device);
}; };
GType meta_input_settings_get_type (void) G_GNUC_CONST;
MetaInputSettings * meta_input_settings_create (void);
GSettings * meta_input_settings_get_tablet_settings (MetaInputSettings *settings, GSettings * meta_input_settings_get_tablet_settings (MetaInputSettings *settings,
ClutterInputDevice *device); ClutterInputDevice *device);
MetaLogicalMonitor * meta_input_settings_get_tablet_logical_monitor (MetaInputSettings *settings, MetaLogicalMonitor * meta_input_settings_get_tablet_logical_monitor (MetaInputSettings *settings,
@@ -128,12 +138,11 @@ gboolean meta_input_settings_is_pad_button_grabbed (MetaIn
ClutterInputDevice *pad, ClutterInputDevice *pad,
guint button); guint button);
gboolean meta_input_settings_handle_pad_event (MetaInputSettings *input_settings, gboolean meta_input_settings_handle_pad_button (MetaInputSettings *input_settings,
const ClutterEvent *event); const ClutterPadButtonEvent *event);
gchar * meta_input_settings_get_pad_action_label (MetaInputSettings *input_settings, gchar * meta_input_settings_get_pad_button_action_label (MetaInputSettings *input_settings,
ClutterInputDevice *pad, ClutterInputDevice *pad,
MetaPadActionType action, guint button);
guint number);
#ifdef HAVE_LIBWACOM #ifdef HAVE_LIBWACOM
WacomDevice * meta_input_settings_get_tablet_wacom_device (MetaInputSettings *settings, WacomDevice * meta_input_settings_get_tablet_wacom_device (MetaInputSettings *settings,

View File

@@ -33,6 +33,12 @@
#include "meta-input-settings-private.h" #include "meta-input-settings-private.h"
#include "backends/meta-logical-monitor.h" #include "backends/meta-logical-monitor.h"
#include "backends/meta-monitor.h" #include "backends/meta-monitor.h"
#include "x11/meta-input-settings-x11.h"
#ifdef HAVE_NATIVE_BACKEND
#include "native/meta-backend-native.h"
#include "native/meta-input-settings-native.h"
#endif
#include <glib/gi18n-lib.h> #include <glib/gi18n-lib.h>
#include <meta/util.h> #include <meta/util.h>
@@ -47,11 +53,9 @@ struct _DeviceMappingInfo
MetaInputSettings *input_settings; MetaInputSettings *input_settings;
ClutterInputDevice *device; ClutterInputDevice *device;
GSettings *settings; GSettings *settings;
guint changed_id;
#ifdef HAVE_LIBWACOM #ifdef HAVE_LIBWACOM
WacomDevice *wacom_device; WacomDevice *wacom_device;
#endif #endif
guint *group_modes;
}; };
struct _MetaInputSettingsPrivate struct _MetaInputSettingsPrivate
@@ -75,14 +79,6 @@ struct _MetaInputSettingsPrivate
#endif #endif
GHashTable *two_finger_devices; GHashTable *two_finger_devices;
/* Pad ring/strip emission */
struct {
ClutterInputDevice *pad;
MetaPadActionType action;
guint number;
gdouble value;
} last_pad_action_info;
}; };
typedef void (*ConfigBoolFunc) (MetaInputSettings *input_settings, typedef void (*ConfigBoolFunc) (MetaInputSettings *input_settings,
@@ -95,14 +91,6 @@ typedef void (*ConfigUintFunc) (MetaInputSettings *input_settings,
ClutterInputDevice *device, ClutterInputDevice *device,
guint value); guint value);
typedef enum {
META_PAD_DIRECTION_NONE = -1,
META_PAD_DIRECTION_UP = 0,
META_PAD_DIRECTION_DOWN,
META_PAD_DIRECTION_CW,
META_PAD_DIRECTION_CCW,
} MetaPadDirection;
G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettings, meta_input_settings, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettings, meta_input_settings, G_TYPE_OBJECT)
static GSList * static GSList *
@@ -460,44 +448,6 @@ update_device_natural_scroll (MetaInputSettings *input_settings,
} }
} }
static void
update_touchpad_disable_while_typing (MetaInputSettings *input_settings,
ClutterInputDevice *device)
{
GSettings *settings;
MetaInputSettingsClass *input_settings_class;
MetaInputSettingsPrivate *priv;
gboolean enabled;
const gchar *key = "disable-while-typing";
if (device &&
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
return;
priv = meta_input_settings_get_instance_private (input_settings);
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
enabled = g_settings_get_boolean (priv->touchpad_settings, key);
if (device)
{
settings = get_settings_for_device_type (input_settings,
clutter_input_device_get_device_type (device));
if (!settings)
return;
settings_device_set_bool_setting (input_settings, device,
input_settings_class->set_disable_while_typing,
enabled);
}
else
{
settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
input_settings_class->set_disable_while_typing,
enabled);
}
}
static void static void
update_touchpad_tap_enabled (MetaInputSettings *input_settings, update_touchpad_tap_enabled (MetaInputSettings *input_settings,
ClutterInputDevice *device) ClutterInputDevice *device)
@@ -528,36 +478,6 @@ update_touchpad_tap_enabled (MetaInputSettings *input_settings,
} }
} }
static void
update_touchpad_tap_and_drag_enabled (MetaInputSettings *input_settings,
ClutterInputDevice *device)
{
MetaInputSettingsClass *input_settings_class;
MetaInputSettingsPrivate *priv;
gboolean enabled;
if (device &&
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
return;
priv = meta_input_settings_get_instance_private (input_settings);
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-and-drag");
if (device)
{
settings_device_set_bool_setting (input_settings, device,
input_settings_class->set_tap_and_drag_enabled,
enabled);
}
else
{
settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
input_settings_class->set_tap_and_drag_enabled,
enabled);
}
}
static void static void
update_touchpad_edge_scroll (MetaInputSettings *input_settings, update_touchpad_edge_scroll (MetaInputSettings *input_settings,
ClutterInputDevice *device) ClutterInputDevice *device)
@@ -780,7 +700,7 @@ logical_monitor_has_monitor (MetaMonitorManager *monitor_manager,
GList *monitors; GList *monitors;
GList *l; GList *l;
monitors = meta_logical_monitor_get_monitors (logical_monitor); monitors = meta_monitor_manager_get_monitors (monitor_manager);
for (l = monitors; l; l = l->next) for (l = monitors; l; l = l->next)
{ {
MetaMonitor *monitor = l->data; MetaMonitor *monitor = l->data;
@@ -905,7 +825,7 @@ update_device_display (MetaInputSettings *input_settings,
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
/* If mapping is relative, the device can move on all displays */ /* If mapping is relative, the device can move on all displays */
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE || if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE ||
clutter_input_device_get_mapping_mode (device) == clutter_input_device_get_mapping_mode (device) ==
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE) CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE)
logical_monitor = meta_input_settings_find_logical_monitor (input_settings, logical_monitor = meta_input_settings_find_logical_monitor (input_settings,
@@ -1069,10 +989,6 @@ meta_input_settings_changed_cb (GSettings *settings,
update_device_natural_scroll (input_settings, NULL); update_device_natural_scroll (input_settings, NULL);
else if (strcmp (key, "tap-to-click") == 0) else if (strcmp (key, "tap-to-click") == 0)
update_touchpad_tap_enabled (input_settings, NULL); update_touchpad_tap_enabled (input_settings, NULL);
else if (strcmp (key, "tap-and_drag") == 0)
update_touchpad_tap_and_drag_enabled (input_settings, NULL);
else if (strcmp(key, "disable-while-typing") == 0)
update_touchpad_disable_while_typing (input_settings, NULL);
else if (strcmp (key, "send-events") == 0) else if (strcmp (key, "send-events") == 0)
update_touchpad_send_events (input_settings, NULL); update_touchpad_send_events (input_settings, NULL);
else if (strcmp (key, "edge-scrolling-enabled") == 0) else if (strcmp (key, "edge-scrolling-enabled") == 0)
@@ -1119,15 +1035,10 @@ static void
apply_mappable_device_settings (MetaInputSettings *input_settings, apply_mappable_device_settings (MetaInputSettings *input_settings,
DeviceMappingInfo *info) DeviceMappingInfo *info)
{ {
ClutterInputDeviceType device_type;
update_device_display (input_settings, info->settings, info->device); update_device_display (input_settings, info->settings, info->device);
device_type = clutter_input_device_get_device_type (info->device);
if (device_type == CLUTTER_TABLET_DEVICE || if (clutter_input_device_get_device_type (info->device) == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE || clutter_input_device_get_device_type (info->device) == CLUTTER_PAD_DEVICE)
device_type == CLUTTER_ERASER_DEVICE ||
device_type == CLUTTER_PAD_DEVICE)
{ {
update_tablet_mapping (input_settings, info->settings, info->device); update_tablet_mapping (input_settings, info->settings, info->device);
update_tablet_area (input_settings, info->settings, info->device); update_tablet_area (input_settings, info->settings, info->device);
@@ -1210,58 +1121,20 @@ lookup_tool_settings (ClutterInputDeviceTool *tool,
} }
static GSettings * static GSettings *
lookup_pad_action_settings (ClutterInputDevice *device, lookup_pad_button_settings (ClutterInputDevice *device,
MetaPadActionType action, guint button)
guint number,
MetaPadDirection direction,
gint mode)
{ {
const gchar *vendor, *product, *action_type, *detail_type = NULL; const gchar *vendor, *product;
GSettings *settings; GSettings *settings;
GString *path; gchar *path;
gchar action_label;
vendor = clutter_input_device_get_vendor_id (device); vendor = clutter_input_device_get_vendor_id (device);
product = clutter_input_device_get_product_id (device); product = clutter_input_device_get_product_id (device);
path = g_strdup_printf ("/org/gnome/desktop/peripherals/tablets/%s:%s/button%c/",
action_label = 'A' + number; vendor, product, 'A' + button);
switch (action)
{
case META_PAD_ACTION_BUTTON:
action_type = "button";
break;
case META_PAD_ACTION_RING:
g_assert (direction == META_PAD_DIRECTION_CW ||
direction == META_PAD_DIRECTION_CCW);
action_type = "ring";
detail_type = (direction == META_PAD_DIRECTION_CW) ? "cw" : "ccw";
break;
case META_PAD_ACTION_STRIP:
g_assert (direction == META_PAD_DIRECTION_UP ||
direction == META_PAD_DIRECTION_DOWN);
action_type = "strip";
detail_type = (direction == META_PAD_DIRECTION_UP) ? "up" : "down";
break;
default:
return NULL;
}
path = g_string_new (NULL);
g_string_append_printf (path, "/org/gnome/desktop/peripherals/tablets/%s:%s/%s%c",
vendor, product, action_type, action_label);
if (detail_type)
g_string_append_printf (path, "-%s", detail_type);
if (mode >= 0)
g_string_append_printf (path, "-mode-%d", mode);
g_string_append_c (path, '/');
settings = g_settings_new_with_path ("org.gnome.desktop.peripherals.tablet.pad-button", settings = g_settings_new_with_path ("org.gnome.desktop.peripherals.tablet.pad-button",
path->str); path);
g_string_free (path, TRUE); g_free (path);
return settings; return settings;
} }
@@ -1290,9 +1163,7 @@ device_mapping_info_free (DeviceMappingInfo *info)
if (info->wacom_device) if (info->wacom_device)
libwacom_destroy (info->wacom_device); libwacom_destroy (info->wacom_device);
#endif #endif
g_signal_handler_disconnect (info->settings, info->changed_id);
g_object_unref (info->settings); g_object_unref (info->settings);
g_free (info->group_modes);
g_slice_free (DeviceMappingInfo, info); g_slice_free (DeviceMappingInfo, info);
} }
@@ -1336,15 +1207,8 @@ check_add_mappable_device (MetaInputSettings *input_settings,
} }
#endif #endif
if (clutter_input_device_get_device_type (device) == CLUTTER_PAD_DEVICE) g_signal_connect (settings, "changed",
{ G_CALLBACK (mapped_device_changed_cb), info);
info->group_modes =
g_new0 (guint, clutter_input_device_get_n_mode_groups (device));
}
info->changed_id = g_signal_connect (settings, "changed",
G_CALLBACK (mapped_device_changed_cb),
info);
g_hash_table_insert (priv->mappable_devices, device, info); g_hash_table_insert (priv->mappable_devices, device, info);
@@ -1370,8 +1234,6 @@ apply_device_settings (MetaInputSettings *input_settings,
update_touchpad_left_handed (input_settings, device); update_touchpad_left_handed (input_settings, device);
update_touchpad_tap_enabled (input_settings, device); update_touchpad_tap_enabled (input_settings, device);
update_touchpad_tap_and_drag_enabled (input_settings, device);
update_touchpad_disable_while_typing (input_settings, device);
update_touchpad_send_events (input_settings, device); update_touchpad_send_events (input_settings, device);
update_touchpad_two_finger_scroll (input_settings, device); update_touchpad_two_finger_scroll (input_settings, device);
update_touchpad_edge_scroll (input_settings, device); update_touchpad_edge_scroll (input_settings, device);
@@ -1616,6 +1478,23 @@ meta_input_settings_init (MetaInputSettings *settings)
priv->two_finger_devices = g_hash_table_new (NULL, NULL); priv->two_finger_devices = g_hash_table_new (NULL, NULL);
} }
MetaInputSettings *
meta_input_settings_create (void)
{
#ifdef HAVE_NATIVE_BACKEND
MetaBackend *backend;
backend = meta_get_backend ();
if (META_IS_BACKEND_NATIVE (backend))
return g_object_new (META_TYPE_INPUT_SETTINGS_NATIVE, NULL);
#endif
if (!meta_is_wayland_compositor ())
return g_object_new (META_TYPE_INPUT_SETTINGS_X11, NULL);
return NULL;
}
GSettings * GSettings *
meta_input_settings_get_tablet_settings (MetaInputSettings *settings, meta_input_settings_get_tablet_settings (MetaInputSettings *settings,
ClutterInputDevice *device) ClutterInputDevice *device)
@@ -1684,8 +1563,7 @@ meta_input_settings_get_pad_button_action (MetaInputSettings *input_settings,
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (pad), g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (pad),
G_DESKTOP_PAD_BUTTON_ACTION_NONE); G_DESKTOP_PAD_BUTTON_ACTION_NONE);
settings = lookup_pad_action_settings (pad, META_PAD_ACTION_BUTTON, settings = lookup_pad_button_settings (pad, button);
button, META_PAD_DIRECTION_NONE, -1);
action = g_settings_get_enum (settings, "action"); action = g_settings_get_enum (settings, "action");
g_object_unref (settings); g_object_unref (settings);
@@ -1741,7 +1619,7 @@ cycle_logical_monitors (MetaInputSettings *settings,
if (l->next) if (l->next)
*next_logical_monitor = l->next->data; *next_logical_monitor = l->next->data;
else else
*next_logical_monitor = NULL; *next_logical_monitor = logical_monitors->data;
} }
return TRUE; return TRUE;
@@ -1834,20 +1712,24 @@ emulate_modifiers (ClutterVirtualInputDevice *device,
static void static void
meta_input_settings_emulate_keybinding (MetaInputSettings *input_settings, meta_input_settings_emulate_keybinding (MetaInputSettings *input_settings,
const gchar *accel, ClutterInputDevice *pad,
guint button,
gboolean is_press) gboolean is_press)
{ {
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
ClutterKeyState state; ClutterKeyState state;
GSettings *settings;
guint key, mods; guint key, mods;
gchar *accel;
if (!accel || !*accel)
return;
priv = meta_input_settings_get_instance_private (input_settings); priv = meta_input_settings_get_instance_private (input_settings);
settings = lookup_pad_button_settings (pad, button);
accel = g_settings_get_string (settings, "keybinding");
g_object_unref (settings);
/* FIXME: This is appalling */ /* FIXME: This is appalling */
gtk_accelerator_parse (accel, &key, &mods); gtk_accelerator_parse (accel, &key, &mods);
g_free (accel);
if (!priv->virtual_pad_keyboard) if (!priv->virtual_pad_keyboard)
{ {
@@ -1884,21 +1766,20 @@ meta_input_settings_is_pad_button_grabbed (MetaInputSettings *input_settings,
G_DESKTOP_PAD_BUTTON_ACTION_NONE); G_DESKTOP_PAD_BUTTON_ACTION_NONE);
} }
static gboolean gboolean
meta_input_settings_handle_pad_button (MetaInputSettings *input_settings, meta_input_settings_handle_pad_button (MetaInputSettings *input_settings,
ClutterInputDevice *pad,
const ClutterPadButtonEvent *event) const ClutterPadButtonEvent *event)
{ {
GDesktopPadButtonAction action; GDesktopPadButtonAction action;
ClutterInputDevice *pad;
gint button, group, mode; gint button, group, mode;
gboolean is_press; gboolean is_press;
GSettings *settings;
gchar *accel;
g_return_val_if_fail (META_IS_INPUT_SETTINGS (input_settings), FALSE); g_return_val_if_fail (META_IS_INPUT_SETTINGS (input_settings), FALSE);
g_return_val_if_fail (event->type == CLUTTER_PAD_BUTTON_PRESS || g_return_val_if_fail (event->type == CLUTTER_PAD_BUTTON_PRESS ||
event->type == CLUTTER_PAD_BUTTON_RELEASE, FALSE); event->type == CLUTTER_PAD_BUTTON_RELEASE, FALSE);
pad = clutter_event_get_source_device ((ClutterEvent *) event);
button = event->button; button = event->button;
mode = event->mode; mode = event->mode;
group = clutter_input_device_get_mode_switch_button_group (pad, button); group = clutter_input_device_get_mode_switch_button_group (pad, button);
@@ -1908,19 +1789,18 @@ meta_input_settings_handle_pad_button (MetaInputSettings *input_settin
{ {
guint n_modes = clutter_input_device_get_group_n_modes (pad, group); guint n_modes = clutter_input_device_get_group_n_modes (pad, group);
const gchar *pretty_name = NULL; const gchar *pretty_name = NULL;
#ifdef HAVE_LIBWACOM
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
DeviceMappingInfo *info; DeviceMappingInfo *info;
priv = meta_input_settings_get_instance_private (input_settings); priv = meta_input_settings_get_instance_private (input_settings);
info = g_hash_table_lookup (priv->mappable_devices, pad); info = g_hash_table_lookup (priv->mappable_devices, pad);
#ifdef HAVE_LIBWACOM
if (info && info->wacom_device) if (info && info->wacom_device)
pretty_name = libwacom_get_name (info->wacom_device); pretty_name = libwacom_get_name (info->wacom_device);
#endif #endif
meta_display_notify_pad_group_switch (meta_get_display (), pad, meta_display_notify_pad_group_switch (meta_get_display (), pad,
pretty_name, group, mode, n_modes); pretty_name, group, mode, n_modes);
info->group_modes[group] = mode;
} }
action = meta_input_settings_get_pad_button_action (input_settings, pad, button); action = meta_input_settings_get_pad_button_action (input_settings, pad, button);
@@ -1936,12 +1816,8 @@ meta_input_settings_handle_pad_button (MetaInputSettings *input_settin
meta_display_request_pad_osd (meta_get_display (), pad, FALSE); meta_display_request_pad_osd (meta_get_display (), pad, FALSE);
return TRUE; return TRUE;
case G_DESKTOP_PAD_BUTTON_ACTION_KEYBINDING: case G_DESKTOP_PAD_BUTTON_ACTION_KEYBINDING:
settings = lookup_pad_action_settings (pad, META_PAD_ACTION_BUTTON, meta_input_settings_emulate_keybinding (input_settings, pad,
button, META_PAD_DIRECTION_NONE, -1); button, is_press);
accel = g_settings_get_string (settings, "keybinding");
meta_input_settings_emulate_keybinding (input_settings, accel, is_press);
g_object_unref (settings);
g_free (accel);
return TRUE; return TRUE;
case G_DESKTOP_PAD_BUTTON_ACTION_NONE: case G_DESKTOP_PAD_BUTTON_ACTION_NONE:
default: default:
@@ -1949,189 +1825,10 @@ meta_input_settings_handle_pad_button (MetaInputSettings *input_settin
} }
} }
static gboolean gchar *
meta_input_settings_handle_pad_action (MetaInputSettings *input_settings, meta_input_settings_get_pad_button_action_label (MetaInputSettings *input_settings,
ClutterInputDevice *pad, ClutterInputDevice *pad,
MetaPadActionType action, guint button)
guint number,
MetaPadDirection direction,
guint mode)
{
GSettings *settings;
gboolean handled = FALSE;
gchar *accel;
settings = lookup_pad_action_settings (pad, action, number, direction, mode);
accel = g_settings_get_string (settings, "keybinding");
if (accel && *accel)
{
meta_input_settings_emulate_keybinding (input_settings, accel, TRUE);
meta_input_settings_emulate_keybinding (input_settings, accel, FALSE);
handled = TRUE;
}
g_object_unref (settings);
g_free (accel);
return handled;
}
static gboolean
meta_input_settings_get_pad_action_direction (MetaInputSettings *input_settings,
const ClutterEvent *event,
MetaPadDirection *direction)
{
MetaInputSettingsPrivate *priv;
ClutterInputDevice *pad = clutter_event_get_device (event);
MetaPadActionType pad_action;
gboolean has_direction = FALSE;
MetaPadDirection inc_dir, dec_dir;
guint number;
gdouble value;
priv = meta_input_settings_get_instance_private (input_settings);
*direction = META_PAD_DIRECTION_NONE;
switch (event->type)
{
case CLUTTER_PAD_RING:
pad_action = META_PAD_ACTION_RING;
number = event->pad_ring.ring_number;
value = event->pad_ring.angle;
inc_dir = META_PAD_DIRECTION_CW;
dec_dir = META_PAD_DIRECTION_CCW;
break;
case CLUTTER_PAD_STRIP:
pad_action = META_PAD_ACTION_STRIP;
number = event->pad_strip.strip_number;
value = event->pad_strip.value;
inc_dir = META_PAD_DIRECTION_DOWN;
dec_dir = META_PAD_DIRECTION_UP;
break;
default:
return FALSE;
}
if (priv->last_pad_action_info.pad == pad &&
priv->last_pad_action_info.action == pad_action &&
priv->last_pad_action_info.number == number &&
value >= 0 && priv->last_pad_action_info.value >= 0)
{
*direction = (value - priv->last_pad_action_info.value) > 0 ?
inc_dir : dec_dir;
has_direction = TRUE;
}
priv->last_pad_action_info.pad = pad;
priv->last_pad_action_info.action = pad_action;
priv->last_pad_action_info.number = number;
priv->last_pad_action_info.value = value;
return has_direction;
}
gboolean
meta_input_settings_handle_pad_event (MetaInputSettings *input_settings,
const ClutterEvent *event)
{
ClutterInputDevice *pad;
MetaPadDirection direction = META_PAD_DIRECTION_NONE;
pad = clutter_event_get_source_device ((ClutterEvent *) event);
switch (event->type)
{
case CLUTTER_PAD_BUTTON_PRESS:
case CLUTTER_PAD_BUTTON_RELEASE:
return meta_input_settings_handle_pad_button (input_settings, pad,
&event->pad_button);
case CLUTTER_PAD_RING:
if (!meta_input_settings_get_pad_action_direction (input_settings,
event, &direction))
return FALSE;
return meta_input_settings_handle_pad_action (input_settings, pad,
META_PAD_ACTION_RING,
event->pad_ring.ring_number,
direction,
event->pad_ring.mode);
case CLUTTER_PAD_STRIP:
if (!meta_input_settings_get_pad_action_direction (input_settings,
event, &direction))
return FALSE;
return meta_input_settings_handle_pad_action (input_settings, pad,
META_PAD_ACTION_STRIP,
event->pad_strip.strip_number,
direction,
event->pad_strip.mode);
default:
return FALSE;
}
}
static gchar *
compose_directional_action_label (GSettings *direction1,
GSettings *direction2)
{
gchar *accel1, *accel2, *str = NULL;
accel1 = g_settings_get_string (direction1, "keybinding");
accel2 = g_settings_get_string (direction2, "keybinding");
if (accel1 && *accel1 && accel2 && *accel2)
str = g_strdup_printf ("%s / %s", accel1, accel2);
g_free (accel1);
g_free (accel2);
return str;
}
static gchar *
meta_input_settings_get_ring_label (MetaInputSettings *settings,
ClutterInputDevice *pad,
guint number,
guint mode)
{
GSettings *settings1, *settings2;
gchar *label;
/* We only allow keybinding actions with those */
settings1 = lookup_pad_action_settings (pad, META_PAD_ACTION_RING, number,
META_PAD_DIRECTION_CW, mode);
settings2 = lookup_pad_action_settings (pad, META_PAD_ACTION_RING, number,
META_PAD_DIRECTION_CCW, mode);
label = compose_directional_action_label (settings1, settings2);
g_object_unref (settings1);
g_object_unref (settings2);
return label;
}
static gchar *
meta_input_settings_get_strip_label (MetaInputSettings *settings,
ClutterInputDevice *pad,
guint number,
guint mode)
{
GSettings *settings1, *settings2;
gchar *label;
/* We only allow keybinding actions with those */
settings1 = lookup_pad_action_settings (pad, META_PAD_ACTION_STRIP, number,
META_PAD_DIRECTION_UP, mode);
settings2 = lookup_pad_action_settings (pad, META_PAD_ACTION_STRIP, number,
META_PAD_DIRECTION_DOWN, mode);
label = compose_directional_action_label (settings1, settings2);
g_object_unref (settings1);
g_object_unref (settings2);
return label;
}
static gchar *
meta_input_settings_get_button_label (MetaInputSettings *input_settings,
ClutterInputDevice *pad,
guint button)
{ {
GDesktopPadButtonAction action; GDesktopPadButtonAction action;
gint group; gint group;
@@ -2160,8 +1857,7 @@ meta_input_settings_get_button_label (MetaInputSettings *input_settings,
GSettings *settings; GSettings *settings;
gchar *accel; gchar *accel;
settings = lookup_pad_action_settings (pad, META_PAD_ACTION_BUTTON, settings = lookup_pad_button_settings (pad, button);
button, META_PAD_DIRECTION_NONE, -1);
accel = g_settings_get_string (settings, "keybinding"); accel = g_settings_get_string (settings, "keybinding");
g_object_unref (settings); g_object_unref (settings);
@@ -2179,55 +1875,3 @@ meta_input_settings_get_button_label (MetaInputSettings *input_settings,
return NULL; return NULL;
} }
} }
static guint
get_current_pad_mode (MetaInputSettings *input_settings,
ClutterInputDevice *pad,
MetaPadActionType action_type,
guint number)
{
MetaInputSettingsPrivate *priv;
DeviceMappingInfo *info;
guint group = 0, n_groups;
priv = meta_input_settings_get_instance_private (input_settings);
info = g_hash_table_lookup (priv->mappable_devices, pad);
n_groups = clutter_input_device_get_n_mode_groups (pad);
if (!info->group_modes || n_groups == 0)
return 0;
if (action_type == META_PAD_ACTION_RING ||
action_type == META_PAD_ACTION_STRIP)
{
/* Assume features are evenly distributed in groups */
group = number % n_groups;
}
return info->group_modes[group];
}
gchar *
meta_input_settings_get_pad_action_label (MetaInputSettings *input_settings,
ClutterInputDevice *pad,
MetaPadActionType action_type,
guint number)
{
guint mode;
switch (action_type)
{
case META_PAD_ACTION_BUTTON:
return meta_input_settings_get_button_label (input_settings, pad, number);
case META_PAD_ACTION_RING:
mode = get_current_pad_mode (input_settings, pad, action_type, number);
return meta_input_settings_get_ring_label (input_settings, pad,
number, mode);
case META_PAD_ACTION_STRIP:
mode = get_current_pad_mode (input_settings, pad, action_type, number);
return meta_input_settings_get_strip_label (input_settings, pad,
number, mode);
}
return NULL;
}

View File

@@ -107,15 +107,21 @@ MetaLogicalMonitor *
meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager, meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
MetaMonitor *monitor, MetaMonitor *monitor,
MetaRectangle *layout, MetaRectangle *layout,
float scale,
int monitor_number) int monitor_number)
{ {
MetaLogicalMonitor *logical_monitor; MetaLogicalMonitor *logical_monitor;
MetaOutput *main_output; MetaOutput *main_output;
MetaMonitorMode *monitor_mode;
int scale;
MetaMonitorTransform transform; MetaMonitorTransform transform;
logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL); logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL);
monitor_mode = meta_monitor_get_current_mode (monitor);
scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager,
monitor,
monitor_mode);
transform = derive_monitor_transform (monitor); transform = derive_monitor_transform (monitor);
main_output = meta_monitor_get_main_output (monitor); main_output = meta_monitor_get_main_output (monitor);
@@ -175,24 +181,12 @@ meta_logical_monitor_make_primary (MetaLogicalMonitor *logical_monitor)
logical_monitor->is_primary = TRUE; logical_monitor->is_primary = TRUE;
} }
float int
meta_logical_monitor_get_scale (MetaLogicalMonitor *logical_monitor) meta_logical_monitor_get_scale (MetaLogicalMonitor *logical_monitor)
{ {
return logical_monitor->scale; return logical_monitor->scale;
} }
MetaMonitorTransform
meta_logical_monitor_get_transform (MetaLogicalMonitor *logical_monitor)
{
return logical_monitor->transform;
}
MetaRectangle
meta_logical_monitor_get_layout (MetaLogicalMonitor *logical_monitor)
{
return logical_monitor->rect;
}
GList * GList *
meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor) meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor)
{ {
@@ -210,34 +204,34 @@ meta_logical_monitor_class_init (MetaLogicalMonitorClass *klass)
} }
gboolean gboolean
meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor, meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor,
MetaLogicalMonitor *neighbor, MetaLogicalMonitor *neighbor,
MetaDisplayDirection neighbor_direction) MetaScreenDirection neighbor_direction)
{ {
switch (neighbor_direction) switch (neighbor_direction)
{ {
case META_DISPLAY_RIGHT: case META_SCREEN_RIGHT:
if (neighbor->rect.x == (logical_monitor->rect.x + if (neighbor->rect.x == (logical_monitor->rect.x +
logical_monitor->rect.width) && logical_monitor->rect.width) &&
meta_rectangle_vert_overlap (&neighbor->rect, meta_rectangle_vert_overlap (&neighbor->rect,
&logical_monitor->rect)) &logical_monitor->rect))
return TRUE; return TRUE;
break; break;
case META_DISPLAY_LEFT: case META_SCREEN_LEFT:
if (logical_monitor->rect.x == (neighbor->rect.x + if (logical_monitor->rect.x == (neighbor->rect.x +
neighbor->rect.width) && neighbor->rect.width) &&
meta_rectangle_vert_overlap (&neighbor->rect, meta_rectangle_vert_overlap (&neighbor->rect,
&logical_monitor->rect)) &logical_monitor->rect))
return TRUE; return TRUE;
break; break;
case META_DISPLAY_UP: case META_SCREEN_UP:
if (logical_monitor->rect.y == (neighbor->rect.y + if (logical_monitor->rect.y == (neighbor->rect.y +
neighbor->rect.height) && neighbor->rect.height) &&
meta_rectangle_horiz_overlap (&neighbor->rect, meta_rectangle_horiz_overlap (&neighbor->rect,
&logical_monitor->rect)) &logical_monitor->rect))
return TRUE; return TRUE;
break; break;
case META_DISPLAY_DOWN: case META_SCREEN_DOWN:
if (neighbor->rect.y == (logical_monitor->rect.y + if (neighbor->rect.y == (logical_monitor->rect.y +
logical_monitor->rect.height) && logical_monitor->rect.height) &&
meta_rectangle_horiz_overlap (&neighbor->rect, meta_rectangle_horiz_overlap (&neighbor->rect,

View File

@@ -40,7 +40,7 @@ struct _MetaLogicalMonitor
gboolean is_primary; gboolean is_primary;
gboolean is_presentation; /* XXX: not yet used */ gboolean is_presentation; /* XXX: not yet used */
gboolean in_fullscreen; gboolean in_fullscreen;
float scale; int scale;
MetaMonitorTransform transform; MetaMonitorTransform transform;
/* The primary or first output for this monitor, 0 if we can't figure out. /* The primary or first output for this monitor, 0 if we can't figure out.
@@ -68,7 +68,6 @@ MetaLogicalMonitor * meta_logical_monitor_new (MetaMonitorManager *monitor
MetaLogicalMonitor * meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager, MetaLogicalMonitor * meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
MetaMonitor *monitor, MetaMonitor *monitor,
MetaRectangle *layout, MetaRectangle *layout,
float scale,
int monitor_number); int monitor_number);
void meta_logical_monitor_add_monitor (MetaLogicalMonitor *logical_monitor, void meta_logical_monitor_add_monitor (MetaLogicalMonitor *logical_monitor,
@@ -78,16 +77,12 @@ gboolean meta_logical_monitor_is_primary (MetaLogicalMonitor *logical_monitor);
void meta_logical_monitor_make_primary (MetaLogicalMonitor *logical_monitor); void meta_logical_monitor_make_primary (MetaLogicalMonitor *logical_monitor);
float meta_logical_monitor_get_scale (MetaLogicalMonitor *logical_monitor); int meta_logical_monitor_get_scale (MetaLogicalMonitor *logical_monitor);
MetaMonitorTransform meta_logical_monitor_get_transform (MetaLogicalMonitor *logical_monitor);
MetaRectangle meta_logical_monitor_get_layout (MetaLogicalMonitor *logical_monitor);
GList * meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor); GList * meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor);
gboolean meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor, gboolean meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor,
MetaLogicalMonitor *neighbor, MetaLogicalMonitor *neighbor,
MetaDisplayDirection neighbor_dir); MetaScreenDirection neighbor_dir);
#endif /* META_LOGICAL_MONITOR_H */ #endif /* META_LOGICAL_MONITOR_H */

View File

@@ -23,13 +23,10 @@
#include "backends/meta-monitor-config-manager.h" #include "backends/meta-monitor-config-manager.h"
#include "backends/meta-monitor-config-migration.h"
#include "backends/meta-monitor-config-store.h" #include "backends/meta-monitor-config-store.h"
#include "backends/meta-monitor-manager-private.h" #include "backends/meta-monitor-manager-private.h"
#include "core/boxes-private.h" #include "core/boxes-private.h"
#define CONFIG_HISTORY_MAX_SIZE 3
struct _MetaMonitorConfigManager struct _MetaMonitorConfigManager
{ {
GObject parent; GObject parent;
@@ -39,7 +36,7 @@ struct _MetaMonitorConfigManager
MetaMonitorConfigStore *config_store; MetaMonitorConfigStore *config_store;
MetaMonitorsConfig *current_config; MetaMonitorsConfig *current_config;
GQueue config_history; MetaMonitorsConfig *previous_config;
}; };
G_DEFINE_TYPE (MetaMonitorConfigManager, meta_monitor_config_manager, G_DEFINE_TYPE (MetaMonitorConfigManager, meta_monitor_config_manager,
@@ -48,12 +45,6 @@ G_DEFINE_TYPE (MetaMonitorConfigManager, meta_monitor_config_manager,
G_DEFINE_TYPE (MetaMonitorsConfig, meta_monitors_config, G_DEFINE_TYPE (MetaMonitorsConfig, meta_monitors_config,
G_TYPE_OBJECT) G_TYPE_OBJECT)
static void
meta_crtc_info_free (MetaCrtcInfo *info);
static void
meta_output_info_free (MetaOutputInfo *info);
MetaMonitorConfigManager * MetaMonitorConfigManager *
meta_monitor_config_manager_new (MetaMonitorManager *monitor_manager) meta_monitor_config_manager_new (MetaMonitorManager *monitor_manager)
{ {
@@ -364,12 +355,10 @@ create_key_for_current_state (MetaMonitorManager *monitor_manager)
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager)
{ {
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
MetaMonitorsConfigKey *config_key; MetaMonitorsConfigKey *config_key;
MetaMonitorsConfig *config; MetaMonitorsConfig *config;
GError *error = NULL;
config_key = create_key_for_current_state (monitor_manager); config_key = create_key_for_current_state (config_manager->monitor_manager);
if (!config_key) if (!config_key)
return NULL; return NULL;
@@ -377,22 +366,6 @@ meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager
config_key); config_key);
meta_monitors_config_key_free (config_key); meta_monitors_config_key_free (config_key);
if (!config)
return NULL;
if (config->flags & META_MONITORS_CONFIG_FLAG_MIGRATED)
{
if (!meta_finish_monitors_config_migration (monitor_manager, config,
&error))
{
g_warning ("Failed to finish monitors config migration: %s",
error->message);
g_error_free (error);
meta_monitor_config_store_remove (config_manager->config_store, config);
return NULL;
}
}
return config; return config;
} }
@@ -510,26 +483,19 @@ create_preferred_logical_monitor_config (MetaMonitorManager *monitor_ma
MetaMonitor *monitor, MetaMonitor *monitor,
int x, int x,
int y, int y,
MetaLogicalMonitorConfig *primary_logical_monitor_config,
MetaLogicalMonitorLayoutMode layout_mode) MetaLogicalMonitorLayoutMode layout_mode)
{ {
MetaMonitorMode *mode; MetaMonitorMode *mode;
int width, height; int width, height;
float scale; int scale;
MetaMonitorConfig *monitor_config; MetaMonitorConfig *monitor_config;
MetaLogicalMonitorConfig *logical_monitor_config; MetaLogicalMonitorConfig *logical_monitor_config;
mode = meta_monitor_get_preferred_mode (monitor); mode = meta_monitor_get_preferred_mode (monitor);
meta_monitor_mode_get_resolution (mode, &width, &height); meta_monitor_mode_get_resolution (mode, &width, &height);
scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager,
if ((meta_monitor_manager_get_capabilities (monitor_manager) & monitor,
META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED) && mode);
primary_logical_monitor_config)
scale = primary_logical_monitor_config->scale;
else
scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager,
monitor,
mode);
switch (layout_mode) switch (layout_mode)
{ {
@@ -580,7 +546,6 @@ meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_mana
create_preferred_logical_monitor_config (monitor_manager, create_preferred_logical_monitor_config (monitor_manager,
primary_monitor, primary_monitor,
0, 0, 0, 0,
NULL,
layout_mode); layout_mode);
primary_logical_monitor_config->is_primary = TRUE; primary_logical_monitor_config->is_primary = TRUE;
logical_monitor_configs = g_list_append (NULL, logical_monitor_configs = g_list_append (NULL,
@@ -604,7 +569,6 @@ meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_mana
create_preferred_logical_monitor_config (monitor_manager, create_preferred_logical_monitor_config (monitor_manager,
monitor, monitor,
x, 0, x, 0,
primary_logical_monitor_config,
layout_mode); layout_mode);
logical_monitor_configs = g_list_append (logical_monitor_configs, logical_monitor_configs = g_list_append (logical_monitor_configs,
logical_monitor_config); logical_monitor_config);
@@ -612,8 +576,7 @@ meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_mana
x += logical_monitor_config->layout.width; x += logical_monitor_config->layout.width;
} }
return meta_monitors_config_new (logical_monitor_configs, layout_mode, return meta_monitors_config_new (logical_monitor_configs, layout_mode);
META_MONITORS_CONFIG_FLAG_NONE);
} }
MetaMonitorsConfig * MetaMonitorsConfig *
@@ -635,14 +598,12 @@ meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_ma
create_preferred_logical_monitor_config (monitor_manager, create_preferred_logical_monitor_config (monitor_manager,
primary_monitor, primary_monitor,
0, 0, 0, 0,
NULL,
layout_mode); layout_mode);
primary_logical_monitor_config->is_primary = TRUE; primary_logical_monitor_config->is_primary = TRUE;
logical_monitor_configs = g_list_append (NULL, logical_monitor_configs = g_list_append (NULL,
primary_logical_monitor_config); primary_logical_monitor_config);
return meta_monitors_config_new (logical_monitor_configs, layout_mode, return meta_monitors_config_new (logical_monitor_configs, layout_mode);
META_MONITORS_CONFIG_FLAG_NONE);
} }
MetaMonitorsConfig * MetaMonitorsConfig *
@@ -654,7 +615,6 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
MetaLogicalMonitorLayoutMode layout_mode; MetaLogicalMonitorLayoutMode layout_mode;
GList *logical_monitor_configs; GList *logical_monitor_configs;
GList *region; GList *region;
int x, y;
GList *monitors; GList *monitors;
GList *l; GList *l;
@@ -662,30 +622,16 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
if (!primary_monitor) if (!primary_monitor)
return NULL; return NULL;
if (!meta_monitor_get_suggested_position (primary_monitor, &x, &y))
return NULL;
layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager); layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
primary_logical_monitor_config = logical_monitor_configs = NULL;
create_preferred_logical_monitor_config (monitor_manager, region = NULL;
primary_monitor,
x, y,
NULL,
layout_mode);
primary_logical_monitor_config->is_primary = TRUE;
logical_monitor_configs = g_list_append (NULL,
primary_logical_monitor_config);
region = g_list_prepend (NULL, &primary_logical_monitor_config->layout);
monitors = meta_monitor_manager_get_monitors (monitor_manager); monitors = meta_monitor_manager_get_monitors (monitor_manager);
for (l = monitors; l; l = l->next) for (l = monitors; l; l = l->next)
{ {
MetaMonitor *monitor = l->data; MetaMonitor *monitor = l->data;
MetaLogicalMonitorConfig *logical_monitor_config; MetaLogicalMonitorConfig *logical_monitor_config;
int x, y;
if (monitor == primary_monitor)
continue;
if (!meta_monitor_get_suggested_position (monitor, &x, &y)) if (!meta_monitor_get_suggested_position (monitor, &x, &y))
continue; continue;
@@ -694,7 +640,6 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
create_preferred_logical_monitor_config (monitor_manager, create_preferred_logical_monitor_config (monitor_manager,
monitor, monitor,
x, y, x, y,
primary_logical_monitor_config,
layout_mode); layout_mode);
logical_monitor_configs = g_list_append (logical_monitor_configs, logical_monitor_configs = g_list_append (logical_monitor_configs,
logical_monitor_config); logical_monitor_config);
@@ -710,6 +655,9 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
} }
region = g_list_prepend (region, &logical_monitor_config->layout); region = g_list_prepend (region, &logical_monitor_config->layout);
if (monitor == primary_monitor)
primary_logical_monitor_config = logical_monitor_config;
} }
g_list_free (region); g_list_free (region);
@@ -717,288 +665,21 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
if (!logical_monitor_configs) if (!logical_monitor_configs)
return NULL; return NULL;
return meta_monitors_config_new (logical_monitor_configs, layout_mode, if (!primary_logical_monitor_config)
META_MONITORS_CONFIG_FLAG_NONE); primary_logical_monitor_config =
} g_list_first (logical_monitor_configs)->data;
static MetaMonitorsConfig *
create_for_builtin_display_rotation (MetaMonitorConfigManager *config_manager,
gboolean rotate,
MetaMonitorTransform transform)
{
MetaLogicalMonitorConfig *logical_monitor_config;
MetaLogicalMonitorConfig *current_logical_monitor_config;
MetaMonitorConfig *monitor_config;
MetaMonitorConfig *current_monitor_config;
if (!meta_monitor_manager_get_is_builtin_display_on (config_manager->monitor_manager))
return NULL;
if (!config_manager->current_config)
return NULL;
if (g_list_length (config_manager->current_config->logical_monitor_configs) != 1)
return NULL;
current_logical_monitor_config = config_manager->current_config->logical_monitor_configs->data;
if (rotate)
transform = (current_logical_monitor_config->transform + 1) % META_MONITOR_TRANSFORM_FLIPPED;
if (current_logical_monitor_config->transform == transform)
return NULL;
if (g_list_length (current_logical_monitor_config->monitor_configs) != 1)
return NULL;
current_monitor_config = current_logical_monitor_config->monitor_configs->data;
monitor_config = g_new0 (MetaMonitorConfig, 1);
*monitor_config = (MetaMonitorConfig) {
.monitor_spec = meta_monitor_spec_clone (current_monitor_config->monitor_spec),
.mode_spec = g_memdup (current_monitor_config->mode_spec, sizeof (MetaMonitorModeSpec)),
.enable_underscanning = current_monitor_config->enable_underscanning
};
logical_monitor_config = g_memdup (current_logical_monitor_config, sizeof (MetaLogicalMonitorConfig));
logical_monitor_config->monitor_configs = g_list_append (NULL, monitor_config);
logical_monitor_config->transform = transform;
return meta_monitors_config_new (g_list_append (NULL, logical_monitor_config),
config_manager->current_config->layout_mode,
META_MONITORS_CONFIG_FLAG_NONE);
}
MetaMonitorsConfig *
meta_monitor_config_manager_create_for_orientation (MetaMonitorConfigManager *config_manager,
MetaMonitorTransform transform)
{
return create_for_builtin_display_rotation (config_manager, FALSE, transform);
}
MetaMonitorsConfig *
meta_monitor_config_manager_create_for_rotate_monitor (MetaMonitorConfigManager *config_manager)
{
return create_for_builtin_display_rotation (config_manager, TRUE, META_MONITOR_TRANSFORM_NORMAL);
}
static MetaMonitorsConfig *
create_for_switch_config_all_mirror (MetaMonitorConfigManager *config_manager)
{
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
MetaLogicalMonitorLayoutMode layout_mode;
MetaLogicalMonitorConfig *logical_monitor_config = NULL;
GList *monitor_configs = NULL;
gint common_mode_w = 0, common_mode_h = 0;
float best_scale = 1.0;
MetaMonitor *monitor;
GList *modes;
GList *monitors;
GList *l;
monitors = meta_monitor_manager_get_monitors (monitor_manager);
monitor = monitors->data;
modes = meta_monitor_get_modes (monitor);
for (l = modes; l; l = l->next)
{
MetaMonitorMode *mode = l->data;
gboolean common_mode_size = TRUE;
gint mode_w, mode_h;
GList *ll;
meta_monitor_mode_get_resolution (mode, &mode_w, &mode_h);
for (ll = monitors->next; ll; ll = ll->next)
{
MetaMonitor *monitor_b = ll->data;
gboolean have_same_mode_size = FALSE;
GList *mm;
for (mm = meta_monitor_get_modes (monitor_b); mm; mm = mm->next)
{
MetaMonitorMode *mode_b = mm->data;
gint mode_b_w, mode_b_h;
meta_monitor_mode_get_resolution (mode_b, &mode_b_w, &mode_b_h);
if (mode_w == mode_b_w &&
mode_h == mode_b_h)
{
have_same_mode_size = TRUE;
break;
}
}
if (!have_same_mode_size)
{
common_mode_size = FALSE;
break;
}
}
if (common_mode_size &&
common_mode_w * common_mode_h < mode_w * mode_h)
{
common_mode_w = mode_w;
common_mode_h = mode_h;
}
}
if (common_mode_w == 0 || common_mode_h == 0)
return NULL;
for (l = monitors; l; l = l->next)
{
MetaMonitor *monitor = l->data;
MetaMonitorMode *mode = NULL;
GList *ll;
float scale;
for (ll = meta_monitor_get_modes (monitor); ll; ll = ll->next)
{
gint mode_w, mode_h;
mode = ll->data;
meta_monitor_mode_get_resolution (mode, &mode_w, &mode_h);
if (mode_w == common_mode_w && mode_h == common_mode_h)
break;
}
if (!mode)
continue;
scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager, monitor, mode);
best_scale = MAX (best_scale, scale);
monitor_configs = g_list_prepend (monitor_configs, create_monitor_config (monitor, mode));
}
logical_monitor_config = g_new0 (MetaLogicalMonitorConfig, 1);
*logical_monitor_config = (MetaLogicalMonitorConfig) {
.layout = (MetaRectangle) {
.x = 0,
.y = 0,
.width = common_mode_w,
.height = common_mode_h
},
.scale = best_scale,
.monitor_configs = monitor_configs
};
layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
return meta_monitors_config_new (g_list_append (NULL, logical_monitor_config),
layout_mode,
META_MONITORS_CONFIG_FLAG_NONE);
}
static MetaMonitorsConfig *
create_for_switch_config_external (MetaMonitorConfigManager *config_manager)
{
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
GList *logical_monitor_configs = NULL;
int x = 0;
MetaLogicalMonitorLayoutMode layout_mode;
GList *monitors;
GList *l;
layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
monitors = meta_monitor_manager_get_monitors (monitor_manager);
for (l = monitors; l; l = l->next)
{
MetaMonitor *monitor = l->data;
MetaLogicalMonitorConfig *logical_monitor_config;
if (meta_monitor_is_laptop_panel (monitor))
continue;
logical_monitor_config =
create_preferred_logical_monitor_config (monitor_manager,
monitor,
x, 0,
NULL,
layout_mode);
logical_monitor_configs = g_list_append (logical_monitor_configs,
logical_monitor_config);
if (x == 0)
logical_monitor_config->is_primary = TRUE;
x += logical_monitor_config->layout.width;
}
return meta_monitors_config_new (logical_monitor_configs, layout_mode,
META_MONITORS_CONFIG_FLAG_NONE);
}
static MetaMonitorsConfig *
create_for_switch_config_builtin (MetaMonitorConfigManager *config_manager)
{
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
MetaLogicalMonitorLayoutMode layout_mode;
GList *logical_monitor_configs;
MetaLogicalMonitorConfig *primary_logical_monitor_config;
MetaMonitor *monitor;
monitor = meta_monitor_manager_get_laptop_panel (monitor_manager);
if (!monitor)
return NULL;
layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
primary_logical_monitor_config =
create_preferred_logical_monitor_config (monitor_manager,
monitor,
0, 0,
NULL,
layout_mode);
primary_logical_monitor_config->is_primary = TRUE; primary_logical_monitor_config->is_primary = TRUE;
logical_monitor_configs = g_list_append (NULL,
primary_logical_monitor_config);
return meta_monitors_config_new (logical_monitor_configs, layout_mode, return meta_monitors_config_new (logical_monitor_configs, layout_mode);
META_MONITORS_CONFIG_FLAG_NONE);
}
MetaMonitorsConfig *
meta_monitor_config_manager_create_for_switch_config (MetaMonitorConfigManager *config_manager,
MetaMonitorSwitchConfigType config_type)
{
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
if (!meta_monitor_manager_can_switch_config (monitor_manager))
return NULL;
switch (config_type)
{
case META_MONITOR_SWITCH_CONFIG_ALL_MIRROR:
return create_for_switch_config_all_mirror (config_manager);
case META_MONITOR_SWITCH_CONFIG_ALL_LINEAR:
return meta_monitor_config_manager_create_linear (config_manager);
case META_MONITOR_SWITCH_CONFIG_EXTERNAL:
return create_for_switch_config_external (config_manager);
case META_MONITOR_SWITCH_CONFIG_BUILTIN:
return create_for_switch_config_builtin (config_manager);
case META_MONITOR_SWITCH_CONFIG_UNKNOWN:
g_warn_if_reached ();
break;
}
return NULL;
} }
void void
meta_monitor_config_manager_set_current (MetaMonitorConfigManager *config_manager, meta_monitor_config_manager_set_current (MetaMonitorConfigManager *config_manager,
MetaMonitorsConfig *config) MetaMonitorsConfig *config)
{ {
if (config_manager->current_config) g_set_object (&config_manager->previous_config,
{ config_manager->current_config);
g_queue_push_head (&config_manager->config_history,
g_object_ref (config_manager->current_config));
if (g_queue_get_length (&config_manager->config_history) >
CONFIG_HISTORY_MAX_SIZE)
g_object_unref (g_queue_pop_tail (&config_manager->config_history));
}
g_set_object (&config_manager->current_config, config); g_set_object (&config_manager->current_config, config);
} }
@@ -1017,23 +698,10 @@ meta_monitor_config_manager_get_current (MetaMonitorConfigManager *config_manage
return config_manager->current_config; return config_manager->current_config;
} }
MetaMonitorsConfig *
meta_monitor_config_manager_pop_previous (MetaMonitorConfigManager *config_manager)
{
return g_queue_pop_head (&config_manager->config_history);
}
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_get_previous (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_get_previous (MetaMonitorConfigManager *config_manager)
{ {
return g_queue_peek_head (&config_manager->config_history); return config_manager->previous_config;
}
void
meta_monitor_config_manager_clear_history (MetaMonitorConfigManager *config_manager)
{
g_queue_foreach (&config_manager->config_history, (GFunc) g_object_unref, NULL);
g_queue_clear (&config_manager->config_history);
} }
static void static void
@@ -1043,7 +711,7 @@ meta_monitor_config_manager_dispose (GObject *object)
META_MONITOR_CONFIG_MANAGER (object); META_MONITOR_CONFIG_MANAGER (object);
g_clear_object (&config_manager->current_config); g_clear_object (&config_manager->current_config);
meta_monitor_config_manager_clear_history (config_manager); g_clear_object (&config_manager->previous_config);
G_OBJECT_CLASS (meta_monitor_config_manager_parent_class)->dispose (object); G_OBJECT_CLASS (meta_monitor_config_manager_parent_class)->dispose (object);
} }
@@ -1051,7 +719,6 @@ meta_monitor_config_manager_dispose (GObject *object)
static void static void
meta_monitor_config_manager_init (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_init (MetaMonitorConfigManager *config_manager)
{ {
g_queue_init (&config_manager->config_history);
} }
static void static void
@@ -1168,8 +835,7 @@ meta_monitors_config_key_equal (gconstpointer data_a,
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitors_config_new (GList *logical_monitor_configs, meta_monitors_config_new (GList *logical_monitor_configs,
MetaLogicalMonitorLayoutMode layout_mode, MetaLogicalMonitorLayoutMode layout_mode)
MetaMonitorsConfigFlag flags)
{ {
MetaMonitorsConfig *config; MetaMonitorsConfig *config;
@@ -1177,7 +843,6 @@ meta_monitors_config_new (GList *logical_monitor_configs,
config->logical_monitor_configs = logical_monitor_configs; config->logical_monitor_configs = logical_monitor_configs;
config->key = meta_monitors_config_key_new (logical_monitor_configs); config->key = meta_monitors_config_key_new (logical_monitor_configs);
config->layout_mode = layout_mode; config->layout_mode = layout_mode;
config->flags = flags;
return config; return config;
} }
@@ -1205,19 +870,6 @@ meta_monitors_config_class_init (MetaMonitorsConfigClass *klass)
object_class->finalize = meta_monitors_config_finalize; object_class->finalize = meta_monitors_config_finalize;
} }
static void
meta_crtc_info_free (MetaCrtcInfo *info)
{
g_ptr_array_free (info->outputs, TRUE);
g_slice_free (MetaCrtcInfo, info);
}
static void
meta_output_info_free (MetaOutputInfo *info)
{
g_slice_free (MetaOutputInfo, info);
}
gboolean gboolean
meta_verify_monitor_mode_spec (MetaMonitorModeSpec *monitor_mode_spec, meta_verify_monitor_mode_spec (MetaMonitorModeSpec *monitor_mode_spec,
GError **error) GError **error)
@@ -1274,13 +926,20 @@ meta_verify_monitor_config (MetaMonitorConfig *monitor_config,
gboolean gboolean
meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor_config, meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor_config,
MetaLogicalMonitorLayoutMode layout_mode, MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorManager *monitor_manager,
GError **error) GError **error)
{ {
GList *l; GList *l;
int expected_mode_width = 0; int expected_mode_width = 0;
int expected_mode_height = 0; int expected_mode_height = 0;
if (logical_monitor_config->scale < 1)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Invalid logical monitor config scale %d",
logical_monitor_config->scale);
return FALSE;
}
if (logical_monitor_config->layout.x < 0 || if (logical_monitor_config->layout.x < 0 ||
logical_monitor_config->layout.y < 0) logical_monitor_config->layout.y < 0)
{ {
@@ -1312,10 +971,8 @@ meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor
switch (layout_mode) switch (layout_mode)
{ {
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL: case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
expected_mode_width = roundf (expected_mode_width * expected_mode_width *= logical_monitor_config->scale;
logical_monitor_config->scale); expected_mode_height *= logical_monitor_config->scale;
expected_mode_height = roundf (expected_mode_height *
logical_monitor_config->scale);
break; break;
case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL: case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
break; break;
@@ -1367,14 +1024,12 @@ has_adjecent_neighbour (MetaMonitorsConfig *config,
gboolean gboolean
meta_verify_monitors_config (MetaMonitorsConfig *config, meta_verify_monitors_config (MetaMonitorsConfig *config,
MetaMonitorManager *monitor_manager,
GError **error) GError **error)
{ {
int min_x, min_y; int min_x, min_y;
gboolean has_primary; gboolean has_primary;
GList *region; GList *region;
GList *l; GList *l;
gboolean global_scale_required;
if (!config->logical_monitor_configs) if (!config->logical_monitor_configs)
{ {
@@ -1383,10 +1038,6 @@ meta_verify_monitors_config (MetaMonitorsConfig *config,
return FALSE; return FALSE;
} }
global_scale_required =
!!(meta_monitor_manager_get_capabilities (monitor_manager) &
META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED);
min_x = INT_MAX; min_x = INT_MAX;
min_y = INT_MAX; min_y = INT_MAX;
region = NULL; region = NULL;
@@ -1395,21 +1046,6 @@ meta_verify_monitors_config (MetaMonitorsConfig *config,
{ {
MetaLogicalMonitorConfig *logical_monitor_config = l->data; MetaLogicalMonitorConfig *logical_monitor_config = l->data;
if (global_scale_required)
{
MetaLogicalMonitorConfig *prev_logical_monitor_config =
l->prev ? l->prev->data : NULL;
if (prev_logical_monitor_config &&
(prev_logical_monitor_config->scale !=
logical_monitor_config->scale))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Logical monitor scales must be identical");
return FALSE;
}
}
if (meta_rectangle_overlaps_with_region (region, if (meta_rectangle_overlaps_with_region (region,
&logical_monitor_config->layout)) &logical_monitor_config->layout))
{ {

View File

@@ -41,7 +41,7 @@ typedef struct _MetaLogicalMonitorConfig
MetaRectangle layout; MetaRectangle layout;
GList *monitor_configs; GList *monitor_configs;
MetaMonitorTransform transform; MetaMonitorTransform transform;
float scale; int scale;
gboolean is_primary; gboolean is_primary;
gboolean is_presentation; gboolean is_presentation;
} MetaLogicalMonitorConfig; } MetaLogicalMonitorConfig;
@@ -51,12 +51,6 @@ typedef struct _MetaMonitorsConfigKey
GList *monitor_specs; GList *monitor_specs;
} MetaMonitorsConfigKey; } MetaMonitorsConfigKey;
typedef enum _MetaMonitorsConfigFlag
{
META_MONITORS_CONFIG_FLAG_NONE = 0,
META_MONITORS_CONFIG_FLAG_MIGRATED = (1 << 0),
} MetaMonitorsConfigFlag;
struct _MetaMonitorsConfig struct _MetaMonitorsConfig
{ {
GObject parent; GObject parent;
@@ -64,8 +58,6 @@ struct _MetaMonitorsConfig
MetaMonitorsConfigKey *key; MetaMonitorsConfigKey *key;
GList *logical_monitor_configs; GList *logical_monitor_configs;
MetaMonitorsConfigFlag flags;
MetaLogicalMonitorLayoutMode layout_mode; MetaLogicalMonitorLayoutMode layout_mode;
}; };
@@ -91,30 +83,17 @@ MetaMonitorsConfig * meta_monitor_config_manager_create_fallback (MetaMonitorCon
MetaMonitorsConfig * meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_manager); MetaMonitorsConfig * meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitor_config_manager_create_for_orientation (MetaMonitorConfigManager *config_manager,
MetaMonitorTransform transform);
MetaMonitorsConfig * meta_monitor_config_manager_create_for_rotate_monitor (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitor_config_manager_create_for_switch_config (MetaMonitorConfigManager *config_manager,
MetaMonitorSwitchConfigType config_type);
void meta_monitor_config_manager_set_current (MetaMonitorConfigManager *config_manager, void meta_monitor_config_manager_set_current (MetaMonitorConfigManager *config_manager,
MetaMonitorsConfig *config); MetaMonitorsConfig *config);
MetaMonitorsConfig * meta_monitor_config_manager_get_current (MetaMonitorConfigManager *config_manager); MetaMonitorsConfig * meta_monitor_config_manager_get_current (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitor_config_manager_pop_previous (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitor_config_manager_get_previous (MetaMonitorConfigManager *config_manager); MetaMonitorsConfig * meta_monitor_config_manager_get_previous (MetaMonitorConfigManager *config_manager);
void meta_monitor_config_manager_clear_history (MetaMonitorConfigManager *config_manager);
void meta_monitor_config_manager_save_current (MetaMonitorConfigManager *config_manager); void meta_monitor_config_manager_save_current (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitors_config_new (GList *logical_monitor_configs, MetaMonitorsConfig * meta_monitors_config_new (GList *logical_monitor_configs,
MetaLogicalMonitorLayoutMode layout_mode, MetaLogicalMonitorLayoutMode layout_mode);
MetaMonitorsConfigFlag flags);
unsigned int meta_monitors_config_key_hash (gconstpointer config_key); unsigned int meta_monitors_config_key_hash (gconstpointer config_key);
@@ -138,11 +117,9 @@ gboolean meta_verify_monitor_config (MetaMonitorConfig *monitor_config,
gboolean meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor_config, gboolean meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor_config,
MetaLogicalMonitorLayoutMode layout_mode, MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorManager *monitor_manager,
GError **error); GError **error);
gboolean meta_verify_monitors_config (MetaMonitorsConfig *config, gboolean meta_verify_monitors_config (MetaMonitorsConfig *config,
MetaMonitorManager *monitor_manager,
GError **error); GError **error);
#endif /* META_MONITOR_CONFIG_MANAGER_H */ #endif /* META_MONITOR_CONFIG_MANAGER_H */

File diff suppressed because it is too large Load Diff

View File

@@ -1,38 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2017 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_MONITOR_CONFIG_MIGRATION_H
#define META_MONITOR_CONFIG_MIGRATION_H
#include "backends/meta-monitor-manager-private.h"
gboolean meta_migrate_old_monitors_config (MetaMonitorConfigStore *config_store,
GFile *in_file,
GError **error);
gboolean meta_migrate_old_user_monitors_config (MetaMonitorConfigStore *config_store,
GError **error);
gboolean meta_finish_monitors_config_migration (MetaMonitorManager *monitor_manager,
MetaMonitorsConfig *config,
GError **error);
#endif /* META_MONITOR_CONFIG_MIGRATION_H */

View File

@@ -27,7 +27,6 @@
#include <string.h> #include <string.h>
#include "backends/meta-monitor-config-manager.h" #include "backends/meta-monitor-config-manager.h"
#include "backends/meta-monitor-config-migration.h"
#define MONITORS_CONFIG_XML_FORMAT_VERSION 2 #define MONITORS_CONFIG_XML_FORMAT_VERSION 2
@@ -54,7 +53,6 @@
* <width>1920</width> * <width>1920</width>
* <height>1080</height> * <height>1080</height>
* <rate>60.049972534179688</rate> * <rate>60.049972534179688</rate>
* <flag>interlace</flag>
* </mode> * </mode>
* </monitor> * </monitor>
* <transform> * <transform>
@@ -110,27 +108,14 @@ struct _MetaMonitorConfigStore
GCancellable *save_cancellable; GCancellable *save_cancellable;
GFile *user_file; GFile *user_file;
GFile *custom_read_file; GFile *custom_file;
GFile *custom_write_file;
}; };
#define META_MONITOR_CONFIG_STORE_ERROR (meta_monitor_config_store_error_quark ())
static GQuark meta_monitor_config_store_error_quark (void);
enum
{
META_MONITOR_CONFIG_STORE_ERROR_NEEDS_MIGRATION
};
G_DEFINE_QUARK (meta-monitor-config-store-error-quark,
meta_monitor_config_store_error)
typedef enum typedef enum
{ {
STATE_INITIAL, STATE_INITIAL,
STATE_MONITORS, STATE_MONITORS,
STATE_CONFIGURATION, STATE_CONFIGURATION,
STATE_MIGRATED,
STATE_LOGICAL_MONITOR, STATE_LOGICAL_MONITOR,
STATE_LOGICAL_MONITOR_X, STATE_LOGICAL_MONITOR_X,
STATE_LOGICAL_MONITOR_Y, STATE_LOGICAL_MONITOR_Y,
@@ -150,7 +135,6 @@ typedef enum
STATE_MONITOR_MODE_WIDTH, STATE_MONITOR_MODE_WIDTH,
STATE_MONITOR_MODE_HEIGHT, STATE_MONITOR_MODE_HEIGHT,
STATE_MONITOR_MODE_RATE, STATE_MONITOR_MODE_RATE,
STATE_MONITOR_MODE_FLAG,
STATE_MONITOR_UNDERSCANNING STATE_MONITOR_UNDERSCANNING
} ParserState; } ParserState;
@@ -159,7 +143,6 @@ typedef struct
ParserState state; ParserState state;
MetaMonitorConfigStore *config_store; MetaMonitorConfigStore *config_store;
gboolean current_was_migrated;
GList *current_logical_monitor_configs; GList *current_logical_monitor_configs;
MetaMonitorSpec *current_monitor_spec; MetaMonitorSpec *current_monitor_spec;
gboolean current_transform_flipped; gboolean current_transform_flipped;
@@ -204,14 +187,7 @@ handle_start_element (GMarkupParseContext *context,
"Missing config file format version"); "Missing config file format version");
} }
if (g_str_equal (version, "1")) /* TODO: Handle converting version 1 configuration files. */
{
g_set_error_literal (error,
META_MONITOR_CONFIG_STORE_ERROR,
META_MONITOR_CONFIG_STORE_ERROR_NEEDS_MIGRATION,
"monitors.xml has the old format");
return;
}
if (!g_str_equal (version, QUOTE (MONITORS_CONFIG_XML_FORMAT_VERSION))) if (!g_str_equal (version, QUOTE (MONITORS_CONFIG_XML_FORMAT_VERSION)))
{ {
@@ -234,40 +210,22 @@ handle_start_element (GMarkupParseContext *context,
} }
parser->state = STATE_CONFIGURATION; parser->state = STATE_CONFIGURATION;
parser->current_was_migrated = FALSE;
return; return;
} }
case STATE_CONFIGURATION: case STATE_CONFIGURATION:
{ {
if (g_str_equal (element_name, "logicalmonitor")) if (!g_str_equal (element_name, "logicalmonitor"))
{
parser->current_logical_monitor_config =
g_new0 (MetaLogicalMonitorConfig, 1);
parser->state = STATE_LOGICAL_MONITOR;
}
else if (g_str_equal (element_name, "migrated"))
{
parser->current_was_migrated = TRUE;
parser->state = STATE_MIGRATED;
}
else
{ {
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
"Invalid configuration element '%s'", element_name); "Invalid configuration element '%s'", element_name);
return; return;
} }
return; parser->current_logical_monitor_config =
} g_new0 (MetaLogicalMonitorConfig, 1);
case STATE_MIGRATED: parser->state = STATE_LOGICAL_MONITOR;
{
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
"Unexpected element '%s'", element_name);
return; return;
} }
@@ -426,10 +384,6 @@ handle_start_element (GMarkupParseContext *context,
{ {
parser->state = STATE_MONITOR_MODE_RATE; parser->state = STATE_MONITOR_MODE_RATE;
} }
else if (g_str_equal (element_name, "flag"))
{
parser->state = STATE_MONITOR_MODE_FLAG;
}
else else
{ {
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
@@ -443,7 +397,6 @@ handle_start_element (GMarkupParseContext *context,
case STATE_MONITOR_MODE_WIDTH: case STATE_MONITOR_MODE_WIDTH:
case STATE_MONITOR_MODE_HEIGHT: case STATE_MONITOR_MODE_HEIGHT:
case STATE_MONITOR_MODE_RATE: case STATE_MONITOR_MODE_RATE:
case STATE_MONITOR_MODE_FLAG:
{ {
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
"Invalid mode sub element '%s'", element_name); "Invalid mode sub element '%s'", element_name);
@@ -500,8 +453,8 @@ derive_logical_monitor_layout (MetaLogicalMonitorConfig *logical_monitor_conf
switch (layout_mode) switch (layout_mode)
{ {
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL: case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
width = roundf (width / logical_monitor_config->scale); width /= logical_monitor_config->scale;
height = roundf (height / logical_monitor_config->scale); height /= logical_monitor_config->scale;
break; break;
case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL: case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
break; break;
@@ -586,7 +539,6 @@ handle_end_element (GMarkupParseContext *context,
case STATE_MONITOR_MODE_WIDTH: case STATE_MONITOR_MODE_WIDTH:
case STATE_MONITOR_MODE_HEIGHT: case STATE_MONITOR_MODE_HEIGHT:
case STATE_MONITOR_MODE_RATE: case STATE_MONITOR_MODE_RATE:
case STATE_MONITOR_MODE_FLAG:
{ {
parser->state = STATE_MONITOR_MODE; parser->state = STATE_MONITOR_MODE;
return; return;
@@ -643,9 +595,7 @@ handle_end_element (GMarkupParseContext *context,
g_assert (g_str_equal (element_name, "logicalmonitor")); g_assert (g_str_equal (element_name, "logicalmonitor"));
if (parser->current_was_migrated) if (logical_monitor_config->scale == 0)
logical_monitor_config->scale = -1;
else if (logical_monitor_config->scale == 0)
logical_monitor_config->scale = 1; logical_monitor_config->scale = 1;
parser->current_logical_monitor_configs = parser->current_logical_monitor_configs =
@@ -657,29 +607,17 @@ handle_end_element (GMarkupParseContext *context,
return; return;
} }
case STATE_MIGRATED:
{
g_assert (g_str_equal (element_name, "migrated"));
parser->state = STATE_CONFIGURATION;
return;
}
case STATE_CONFIGURATION: case STATE_CONFIGURATION:
{ {
MetaMonitorConfigStore *store = parser->config_store; MetaMonitorConfigStore *store = parser->config_store;
MetaMonitorsConfig *config; MetaMonitorsConfig *config;
GList *l; GList *l;
MetaLogicalMonitorLayoutMode layout_mode; MetaLogicalMonitorLayoutMode layout_mode;
MetaMonitorsConfigFlag config_flags = META_MONITORS_CONFIG_FLAG_NONE;
g_assert (g_str_equal (element_name, "configuration")); g_assert (g_str_equal (element_name, "configuration"));
if (parser->current_was_migrated) layout_mode =
layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL; meta_monitor_manager_get_default_layout_mode (store->monitor_manager);
else
layout_mode =
meta_monitor_manager_get_default_layout_mode (store->monitor_manager);
for (l = parser->current_logical_monitor_configs; l; l = l->next) for (l = parser->current_logical_monitor_configs; l; l = l->next)
{ {
@@ -692,23 +630,17 @@ handle_end_element (GMarkupParseContext *context,
if (!meta_verify_logical_monitor_config (logical_monitor_config, if (!meta_verify_logical_monitor_config (logical_monitor_config,
layout_mode, layout_mode,
store->monitor_manager,
error)) error))
return; return;
} }
if (parser->current_was_migrated)
config_flags |= META_MONITORS_CONFIG_FLAG_MIGRATED;
config = config =
meta_monitors_config_new (parser->current_logical_monitor_configs, meta_monitors_config_new (parser->current_logical_monitor_configs,
layout_mode, layout_mode);
config_flags);
parser->current_logical_monitor_configs = NULL; parser->current_logical_monitor_configs = NULL;
if (!meta_verify_monitors_config (config, store->monitor_manager, if (!meta_verify_monitors_config (config, error))
error))
{ {
g_object_unref (config); g_object_unref (config);
return; return;
@@ -843,7 +775,6 @@ handle_text (GMarkupParseContext *context,
case STATE_INITIAL: case STATE_INITIAL:
case STATE_MONITORS: case STATE_MONITORS:
case STATE_CONFIGURATION: case STATE_CONFIGURATION:
case STATE_MIGRATED:
case STATE_LOGICAL_MONITOR: case STATE_LOGICAL_MONITOR:
case STATE_MONITOR: case STATE_MONITOR:
case STATE_MONITOR_SPEC: case STATE_MONITOR_SPEC:
@@ -896,14 +827,14 @@ handle_text (GMarkupParseContext *context,
case STATE_LOGICAL_MONITOR_SCALE: case STATE_LOGICAL_MONITOR_SCALE:
{ {
if (!read_float (text, text_len, if (!read_int (text, text_len,
&parser->current_logical_monitor_config->scale, error)) &parser->current_logical_monitor_config->scale, error))
return; return;
if (parser->current_logical_monitor_config->scale <= 0.0) if (parser->current_logical_monitor_config->scale <= 0)
{ {
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Logical monitor scale '%g' invalid", "Logical monitor scale '%d' invalid",
parser->current_logical_monitor_config->scale); parser->current_logical_monitor_config->scale);
return; return;
} }
@@ -976,22 +907,6 @@ handle_text (GMarkupParseContext *context,
return; return;
} }
case STATE_MONITOR_MODE_FLAG:
{
if (strncmp (text, "interlace", text_len) == 0)
{
parser->current_monitor_mode_spec->flags |=
META_CRTC_MODE_FLAG_INTERLACE;
}
else
{
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
"Invalid mode flag %.*s", (int) text_len, text);
}
return;
}
case STATE_MONITOR_UNDERSCANNING: case STATE_MONITOR_UNDERSCANNING:
{ {
read_bool (text, text_len, read_bool (text, text_len,
@@ -1090,8 +1005,6 @@ append_monitors (GString *buffer,
monitor_config->mode_spec->height); monitor_config->mode_spec->height);
g_string_append_printf (buffer, " <rate>%s</rate>\n", g_string_append_printf (buffer, " <rate>%s</rate>\n",
rate_str); rate_str);
if (monitor_config->mode_spec->flags & META_CRTC_MODE_FLAG_INTERLACE)
g_string_append_printf (buffer, " <flag>interlace</flag>\n");
g_string_append (buffer, " </mode>\n"); g_string_append (buffer, " </mode>\n");
if (monitor_config->enable_underscanning) if (monitor_config->enable_underscanning)
g_string_append (buffer, " <underscanning>yes</underscanning>\n"); g_string_append (buffer, " <underscanning>yes</underscanning>\n");
@@ -1153,21 +1066,15 @@ append_transform (GString *buffer,
static void static void
append_logical_monitor_xml (GString *buffer, append_logical_monitor_xml (GString *buffer,
MetaMonitorsConfig *config,
MetaLogicalMonitorConfig *logical_monitor_config) MetaLogicalMonitorConfig *logical_monitor_config)
{ {
char scale_str[G_ASCII_DTOSTR_BUF_SIZE];
g_string_append (buffer, " <logicalmonitor>\n"); g_string_append (buffer, " <logicalmonitor>\n");
g_string_append_printf (buffer, " <x>%d</x>\n", g_string_append_printf (buffer, " <x>%d</x>\n",
logical_monitor_config->layout.x); logical_monitor_config->layout.x);
g_string_append_printf (buffer, " <y>%d</y>\n", g_string_append_printf (buffer, " <y>%d</y>\n",
logical_monitor_config->layout.y); logical_monitor_config->layout.y);
g_ascii_dtostr (scale_str, G_ASCII_DTOSTR_BUF_SIZE, g_string_append_printf (buffer, " <scale>%d</scale>\n",
logical_monitor_config->scale); logical_monitor_config->scale);
if ((config->flags & META_MONITORS_CONFIG_FLAG_MIGRATED) == 0)
g_string_append_printf (buffer, " <scale>%s</scale>\n",
scale_str);
if (logical_monitor_config->is_primary) if (logical_monitor_config->is_primary)
g_string_append (buffer, " <primary>yes</primary>\n"); g_string_append (buffer, " <primary>yes</primary>\n");
if (logical_monitor_config->is_presentation) if (logical_monitor_config->is_presentation)
@@ -1195,14 +1102,11 @@ generate_config_xml (MetaMonitorConfigStore *config_store)
g_string_append (buffer, " <configuration>\n"); g_string_append (buffer, " <configuration>\n");
if (config->flags & META_MONITORS_CONFIG_FLAG_MIGRATED)
g_string_append (buffer, " <migrated/>\n");
for (l = config->logical_monitor_configs; l; l = l->next) for (l = config->logical_monitor_configs; l; l = l->next)
{ {
MetaLogicalMonitorConfig *logical_monitor_config = l->data; MetaLogicalMonitorConfig *logical_monitor_config = l->data;
append_logical_monitor_xml (buffer, config, logical_monitor_config); append_logical_monitor_xml (buffer, logical_monitor_config);
} }
g_string_append (buffer, " </configuration>\n"); g_string_append (buffer, " </configuration>\n");
@@ -1268,31 +1172,6 @@ meta_monitor_config_store_save (MetaMonitorConfigStore *config_store)
.buffer = buffer .buffer = buffer
}; };
/*
* Custom write file is only ever used by the test suite, and the test suite
* will want to have be able to read back the content immediately, so for
* custom write files, do the content replacement synchronously.
*/
if (config_store->custom_write_file)
{
GError *error = NULL;
if (!g_file_replace_contents (config_store->custom_write_file,
buffer->str, buffer->len,
NULL,
FALSE,
G_FILE_CREATE_REPLACE_DESTINATION,
NULL,
NULL,
&error))
{
g_warning ("Saving monitor configuration failed: %s\n",
error->message);
g_error_free (error);
}
return;
}
g_file_replace_contents_async (config_store->user_file, g_file_replace_contents_async (config_store->user_file,
buffer->str, buffer->len, buffer->str, buffer->len,
NULL, NULL,
@@ -1302,18 +1181,6 @@ meta_monitor_config_store_save (MetaMonitorConfigStore *config_store)
saved_cb, data); saved_cb, data);
} }
static void
maybe_save_configs (MetaMonitorConfigStore *config_store)
{
/*
* If a custom file is used, it means we are run by the test suite. When this
* is done, avoid replacing the user configuration file with test data,
* except if a custom write file is set as well.
*/
if (!config_store->custom_read_file || config_store->custom_write_file)
meta_monitor_config_store_save (config_store);
}
void void
meta_monitor_config_store_add (MetaMonitorConfigStore *config_store, meta_monitor_config_store_add (MetaMonitorConfigStore *config_store,
MetaMonitorsConfig *config) MetaMonitorsConfig *config)
@@ -1321,33 +1188,21 @@ meta_monitor_config_store_add (MetaMonitorConfigStore *config_store,
g_hash_table_replace (config_store->configs, g_hash_table_replace (config_store->configs,
config->key, g_object_ref (config)); config->key, g_object_ref (config));
maybe_save_configs (config_store); if (!config_store->custom_file)
} meta_monitor_config_store_save (config_store);
void
meta_monitor_config_store_remove (MetaMonitorConfigStore *config_store,
MetaMonitorsConfig *config)
{
g_hash_table_remove (config_store->configs, config->key);
maybe_save_configs (config_store);
} }
gboolean gboolean
meta_monitor_config_store_set_custom (MetaMonitorConfigStore *config_store, meta_monitor_config_store_set_custom (MetaMonitorConfigStore *config_store,
const char *read_path, const char *path,
const char *write_path,
GError **error) GError **error)
{ {
g_clear_object (&config_store->custom_read_file); g_clear_object (&config_store->custom_file);
g_clear_object (&config_store->custom_write_file);
g_hash_table_remove_all (config_store->configs); g_hash_table_remove_all (config_store->configs);
config_store->custom_read_file = g_file_new_for_path (read_path); config_store->custom_file = g_file_new_for_path (path);
if (write_path)
config_store->custom_write_file = g_file_new_for_path (write_path);
return read_config_file (config_store, config_store->custom_read_file, error); return read_config_file (config_store, config_store->custom_file, error);
} }
int int
@@ -1356,12 +1211,6 @@ meta_monitor_config_store_get_config_count (MetaMonitorConfigStore *config_store
return (int) g_hash_table_size (config_store->configs); return (int) g_hash_table_size (config_store->configs);
} }
MetaMonitorManager *
meta_monitor_config_store_get_monitor_manager (MetaMonitorConfigStore *config_store)
{
return config_store->monitor_manager;
}
MetaMonitorConfigStore * MetaMonitorConfigStore *
meta_monitor_config_store_new (MetaMonitorManager *monitor_manager) meta_monitor_config_store_new (MetaMonitorManager *monitor_manager)
{ {
@@ -1378,7 +1227,7 @@ meta_monitor_config_store_constructed (GObject *object)
GError *error = NULL; GError *error = NULL;
user_file_path = g_build_filename (g_get_user_config_dir (), user_file_path = g_build_filename (g_get_user_config_dir (),
"monitors.xml", "monitors-experimental.xml",
NULL); NULL);
config_store->user_file = g_file_new_for_path (user_file_path); config_store->user_file = g_file_new_for_path (user_file_path);
@@ -1386,23 +1235,9 @@ meta_monitor_config_store_constructed (GObject *object)
{ {
if (!read_config_file (config_store, config_store->user_file, &error)) if (!read_config_file (config_store, config_store->user_file, &error))
{ {
if (error->domain == META_MONITOR_CONFIG_STORE_ERROR && g_warning ("Failed to read monitors config file '%s': %s",
error->code == META_MONITOR_CONFIG_STORE_ERROR_NEEDS_MIGRATION) user_file_path, error->message);
{ g_error_free (error);
g_clear_error (&error);
if (!meta_migrate_old_user_monitors_config (config_store, &error))
{
g_warning ("Failed to migrate old monitors config file: %s",
error->message);
g_error_free (error);
}
}
else
{
g_warning ("Failed to read monitors config file '%s': %s",
user_file_path, error->message);
g_error_free (error);
}
} }
} }
@@ -1417,8 +1252,7 @@ meta_monitor_config_store_dispose (GObject *object)
g_clear_pointer (&config_store->configs, g_hash_table_destroy); g_clear_pointer (&config_store->configs, g_hash_table_destroy);
g_clear_object (&config_store->user_file); g_clear_object (&config_store->user_file);
g_clear_object (&config_store->custom_read_file); g_clear_object (&config_store->custom_file);
g_clear_object (&config_store->custom_write_file);
G_OBJECT_CLASS (meta_monitor_config_store_parent_class)->dispose (object); G_OBJECT_CLASS (meta_monitor_config_store_parent_class)->dispose (object);
} }

View File

@@ -38,16 +38,10 @@ MetaMonitorsConfig * meta_monitor_config_store_lookup (MetaMonitorConfigStore *c
void meta_monitor_config_store_add (MetaMonitorConfigStore *config_store, void meta_monitor_config_store_add (MetaMonitorConfigStore *config_store,
MetaMonitorsConfig *config); MetaMonitorsConfig *config);
void meta_monitor_config_store_remove (MetaMonitorConfigStore *config_store,
MetaMonitorsConfig *config);
gboolean meta_monitor_config_store_set_custom (MetaMonitorConfigStore *config_store, gboolean meta_monitor_config_store_set_custom (MetaMonitorConfigStore *config_store,
const char *read_path, const char *path,
const char *write_path,
GError **error); GError **error);
int meta_monitor_config_store_get_config_count (MetaMonitorConfigStore *config_store); int meta_monitor_config_store_get_config_count (MetaMonitorConfigStore *config_store);
MetaMonitorManager * meta_monitor_config_store_get_monitor_manager (MetaMonitorConfigStore *config_store);
#endif /* META_MONITOR_CONFIG_STORE_H */ #endif /* META_MONITOR_CONFIG_STORE_H */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,52 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2001 Havoc Pennington
* Copyright (C) 2003 Rob Adams
* Copyright (C) 2004-2006 Elijah Newren
* Copyright (C) 2013 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 <http://www.gnu.org/licenses/>.
*/
#ifndef META_MONITOR_CONFIG_H
#define META_MONITOR_CONFIG_H
#include "meta-monitor-manager-private.h"
#define META_TYPE_MONITOR_CONFIG (meta_monitor_config_get_type ())
G_DECLARE_FINAL_TYPE (MetaMonitorConfig, meta_monitor_config,
META, MONITOR_CONFIG, GObject)
MetaMonitorConfig *meta_monitor_config_new (MetaMonitorManager *manager);
gboolean meta_monitor_config_apply_stored (MetaMonitorConfig *config,
MetaMonitorManager *manager);
void meta_monitor_config_make_default (MetaMonitorConfig *config,
MetaMonitorManager *manager);
void meta_monitor_config_update_current (MetaMonitorConfig *config,
MetaMonitorManager *manager);
void meta_monitor_config_make_persistent (MetaMonitorConfig *config);
void meta_monitor_config_restore_previous (MetaMonitorConfig *config,
MetaMonitorManager *manager);
gboolean meta_monitor_config_get_is_builtin_display_on (MetaMonitorConfig *config);
void meta_monitor_config_lid_is_closed_changed (MetaMonitorConfig *self,
MetaMonitorManager *manager);
#endif /* META_MONITOR_CONFIG_H */

View File

@@ -31,7 +31,6 @@
#include <meta/util.h> #include <meta/util.h>
#include "backends/meta-backend-private.h" #include "backends/meta-backend-private.h"
#include "backends/meta-monitor.h"
#include "backends/meta-monitor-config-manager.h" #include "backends/meta-monitor-config-manager.h"
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1) #define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
@@ -41,6 +40,11 @@
#define MAX_CRTCS (MAX_MONITORS * 2) #define MAX_CRTCS (MAX_MONITORS * 2)
#define MAX_MODES (MAX_MONITORS * 4) #define MAX_MODES (MAX_MONITORS * 4)
static float supported_scales_dummy[] = {
1.0,
2.0
};
struct _MetaMonitorManagerDummy struct _MetaMonitorManagerDummy
{ {
MetaMonitorManager parent_instance; MetaMonitorManager parent_instance;
@@ -55,7 +59,7 @@ struct _MetaMonitorManagerDummyClass
typedef struct _MetaOutputDummy typedef struct _MetaOutputDummy
{ {
float scale; int scale;
} MetaOutputDummy; } MetaOutputDummy;
G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy, META_TYPE_MONITOR_MANAGER); G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy, META_TYPE_MONITOR_MANAGER);
@@ -70,7 +74,7 @@ static void
append_monitor (GArray *modes, append_monitor (GArray *modes,
GArray *crtcs, GArray *crtcs,
GArray *outputs, GArray *outputs,
float scale) int scale)
{ {
MetaCrtcMode modes_decl[] = { MetaCrtcMode modes_decl[] = {
{ {
@@ -242,7 +246,7 @@ static void
meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager) meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
{ {
unsigned int num_monitors = 1; unsigned int num_monitors = 1;
float *monitor_scales = NULL; int *monitor_scales = NULL;
const char *num_monitors_str; const char *num_monitors_str;
const char *monitor_scales_str; const char *monitor_scales_str;
const char *tiled_monitors_str; const char *tiled_monitors_str;
@@ -294,9 +298,9 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
} }
} }
monitor_scales = g_newa (typeof (*monitor_scales), num_monitors); monitor_scales = g_newa (int, num_monitors);
for (i = 0; i < num_monitors; i++) for (i = 0; i < num_monitors; i++)
monitor_scales[i] = 1.0; monitor_scales[i] = 1;
monitor_scales_str = getenv ("MUTTER_DEBUG_DUMMY_MONITOR_SCALES"); monitor_scales_str = getenv ("MUTTER_DEBUG_DUMMY_MONITOR_SCALES");
if (monitor_scales_str) if (monitor_scales_str)
@@ -309,9 +313,11 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
"of monitors (defaults to 1).\n"); "of monitors (defaults to 1).\n");
for (i = 0; i < num_monitors && scales_str_list[i]; i++) for (i = 0; i < num_monitors && scales_str_list[i]; i++)
{ {
float scale = g_ascii_strtod (scales_str_list[i], NULL); int scale = g_ascii_strtoll (scales_str_list[i], NULL, 10);
if (scale == 1 || scale == 2)
monitor_scales[i] = scale; monitor_scales[i] = scale;
else
meta_warning ("Invalid dummy monitor scale");
} }
g_strfreev (scales_str_list); g_strfreev (scales_str_list);
} }
@@ -350,15 +356,10 @@ meta_monitor_manager_dummy_ensure_initial_config (MetaMonitorManager *manager)
config = meta_monitor_manager_ensure_configured (manager); config = meta_monitor_manager_ensure_configured (manager);
if (meta_is_stage_views_enabled ()) if (meta_is_monitor_config_manager_enabled ())
meta_monitor_manager_update_logical_state (manager, config); meta_monitor_manager_update_logical_state (manager, config);
else else
{ meta_monitor_manager_update_logical_state_derived (manager);
MetaMonitorManagerDeriveFlag flags =
META_MONITOR_MANAGER_DERIVE_FLAG_NONE;
meta_monitor_manager_update_logical_state_derived (manager, flags);
}
} }
static void static void
@@ -539,6 +540,38 @@ meta_monitor_manager_dummy_apply_monitors_config (MetaMonitorManager *manag
return TRUE; return TRUE;
} }
static void
legacy_calculate_screen_size (MetaMonitorManager *manager)
{
unsigned int i;
int width = 0, height = 0;
for (i = 0; i < manager->n_crtcs; i++)
{
MetaCrtc *crtc = &manager->crtcs[i];
width = MAX (width, crtc->rect.x + crtc->rect.width);
height = MAX (height, crtc->rect.y + crtc->rect.height);
}
manager->screen_width = width;
manager->screen_height = height;
}
static void
meta_monitor_manager_dummy_apply_config (MetaMonitorManager *manager,
MetaCrtcInfo **crtcs,
unsigned int n_crtcs,
MetaOutputInfo **outputs,
unsigned int n_outputs)
{
apply_crtc_assignments (manager, crtcs, n_crtcs, outputs, n_outputs);
legacy_calculate_screen_size (manager);
meta_monitor_manager_rebuild_derived (manager);
}
static gboolean static gboolean
meta_monitor_manager_dummy_is_transform_handled (MetaMonitorManager *manager, meta_monitor_manager_dummy_is_transform_handled (MetaMonitorManager *manager,
MetaCrtc *crtc, MetaCrtc *crtc,
@@ -549,7 +582,7 @@ meta_monitor_manager_dummy_is_transform_handled (MetaMonitorManager *manager,
return manager_dummy->is_transform_handled; return manager_dummy->is_transform_handled;
} }
static float static int
meta_monitor_manager_dummy_calculate_monitor_mode_scale (MetaMonitorManager *manager, meta_monitor_manager_dummy_calculate_monitor_mode_scale (MetaMonitorManager *manager,
MetaMonitor *monitor, MetaMonitor *monitor,
MetaMonitorMode *monitor_mode) MetaMonitorMode *monitor_mode)
@@ -563,53 +596,35 @@ meta_monitor_manager_dummy_calculate_monitor_mode_scale (MetaMonitorManager *man
return output_dummy->scale; return output_dummy->scale;
} }
static float * static void
meta_monitor_manager_dummy_calculate_supported_scales (MetaMonitorManager *manager, meta_monitor_manager_dummy_get_supported_scales (MetaMonitorManager *manager,
MetaLogicalMonitorLayoutMode layout_mode, float **scales,
MetaMonitor *monitor, int *n_scales)
MetaMonitorMode *monitor_mode,
int *n_supported_scales)
{ {
MetaMonitorScalesConstraint constraints = *scales = supported_scales_dummy;
META_MONITOR_SCALES_CONSTRAINT_NONE; *n_scales = G_N_ELEMENTS (supported_scales_dummy);
switch (layout_mode)
{
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
break;
case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
constraints |= META_MONITOR_SCALES_CONSTRAINT_NO_FRAC;
break;
}
return meta_monitor_calculate_supported_scales (monitor, monitor_mode,
constraints,
n_supported_scales);
} }
static gboolean static gboolean
is_monitor_framebuffers_scaled (void) is_monitor_framebuffers_scaled (void)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaSettings *settings = meta_backend_get_settings (backend);
return meta_settings_is_experimental_feature_enabled ( return meta_backend_is_experimental_feature_enabled (
settings, backend,
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER); META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER);
} }
static MetaMonitorManagerCapability static MetaMonitorManagerCapability
meta_monitor_manager_dummy_get_capabilities (MetaMonitorManager *manager) meta_monitor_manager_dummy_get_capabilities (MetaMonitorManager *manager)
{ {
MetaBackend *backend = meta_get_backend ();
MetaSettings *settings = meta_backend_get_settings (backend);
MetaMonitorManagerCapability capabilities = MetaMonitorManagerCapability capabilities =
META_MONITOR_MANAGER_CAPABILITY_NONE; META_MONITOR_MANAGER_CAPABILITY_NONE;
capabilities |= META_MONITOR_MANAGER_CAPABILITY_MIRRORING; capabilities |= META_MONITOR_MANAGER_CAPABILITY_MIRRORING;
if (meta_settings_is_experimental_feature_enabled ( if (meta_backend_is_experimental_feature_enabled (
settings, meta_get_backend (),
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER)) META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER))
capabilities |= META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE; capabilities |= META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE;
@@ -650,9 +665,10 @@ meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass)
manager_class->read_current = meta_monitor_manager_dummy_read_current; manager_class->read_current = meta_monitor_manager_dummy_read_current;
manager_class->ensure_initial_config = meta_monitor_manager_dummy_ensure_initial_config; manager_class->ensure_initial_config = meta_monitor_manager_dummy_ensure_initial_config;
manager_class->apply_monitors_config = meta_monitor_manager_dummy_apply_monitors_config; manager_class->apply_monitors_config = meta_monitor_manager_dummy_apply_monitors_config;
manager_class->apply_configuration = meta_monitor_manager_dummy_apply_config;
manager_class->is_transform_handled = meta_monitor_manager_dummy_is_transform_handled; manager_class->is_transform_handled = meta_monitor_manager_dummy_is_transform_handled;
manager_class->calculate_monitor_mode_scale = meta_monitor_manager_dummy_calculate_monitor_mode_scale; manager_class->calculate_monitor_mode_scale = meta_monitor_manager_dummy_calculate_monitor_mode_scale;
manager_class->calculate_supported_scales = meta_monitor_manager_dummy_calculate_supported_scales; manager_class->get_supported_scales = meta_monitor_manager_dummy_get_supported_scales;
manager_class->get_capabilities = meta_monitor_manager_dummy_get_capabilities; manager_class->get_capabilities = meta_monitor_manager_dummy_get_capabilities;
manager_class->get_max_screen_size = meta_monitor_manager_dummy_get_max_screen_size; manager_class->get_max_screen_size = meta_monitor_manager_dummy_get_max_screen_size;
manager_class->get_default_layout_mode = meta_monitor_manager_dummy_get_default_layout_mode; manager_class->get_default_layout_mode = meta_monitor_manager_dummy_get_default_layout_mode;

View File

@@ -40,6 +40,7 @@
#include <libupower-glib/upower.h> #include <libupower-glib/upower.h>
#include "display-private.h" #include "display-private.h"
#include <meta/screen.h>
#include "stack-tracker.h" #include "stack-tracker.h"
#include <meta/meta-monitor-manager.h> #include <meta/meta-monitor-manager.h>
@@ -47,6 +48,7 @@
#include "meta-dbus-display-config.h" #include "meta-dbus-display-config.h"
#include "meta-cursor.h" #include "meta-cursor.h"
typedef struct _MetaMonitorConfig MetaMonitorConfig;
typedef struct _MetaMonitorConfigManager MetaMonitorConfigManager; typedef struct _MetaMonitorConfigManager MetaMonitorConfigManager;
typedef struct _MetaMonitorConfigStore MetaMonitorConfigStore; typedef struct _MetaMonitorConfigStore MetaMonitorConfigStore;
typedef struct _MetaMonitorsConfig MetaMonitorsConfig; typedef struct _MetaMonitorsConfig MetaMonitorsConfig;
@@ -70,8 +72,7 @@ typedef enum _MetaMonitorManagerCapability
{ {
META_MONITOR_MANAGER_CAPABILITY_NONE = 0, META_MONITOR_MANAGER_CAPABILITY_NONE = 0,
META_MONITOR_MANAGER_CAPABILITY_MIRRORING = (1 << 0), META_MONITOR_MANAGER_CAPABILITY_MIRRORING = (1 << 0),
META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE = (1 << 1), META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE = (1 << 1)
META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED = (1 << 2)
} MetaMonitorManagerCapability; } MetaMonitorManagerCapability;
/* Equivalent to the 'method' enum in org.gnome.Mutter.DisplayConfig */ /* Equivalent to the 'method' enum in org.gnome.Mutter.DisplayConfig */
@@ -89,12 +90,6 @@ typedef enum _MetaLogicalMonitorLayoutMode
META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL = 2 META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL = 2
} MetaLogicalMonitorLayoutMode; } MetaLogicalMonitorLayoutMode;
typedef enum _MetaMonitorManagerDeriveFlag
{
META_MONITOR_MANAGER_DERIVE_FLAG_NONE = 0,
META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE = (1 << 0)
} MetaMonitorManagerDeriveFlag;
typedef enum typedef enum
{ {
META_MONITOR_TRANSFORM_NORMAL, META_MONITOR_TRANSFORM_NORMAL,
@@ -129,28 +124,6 @@ typedef enum
META_CONNECTOR_TYPE_DSI = 16, META_CONNECTOR_TYPE_DSI = 16,
} MetaConnectorType; } MetaConnectorType;
/* Same as KMS mode flags and X11 randr flags */
typedef enum
{
META_CRTC_MODE_FLAG_NONE = 0,
META_CRTC_MODE_FLAG_PHSYNC = (1 << 0),
META_CRTC_MODE_FLAG_NHSYNC = (1 << 1),
META_CRTC_MODE_FLAG_PVSYNC = (1 << 2),
META_CRTC_MODE_FLAG_NVSYNC = (1 << 3),
META_CRTC_MODE_FLAG_INTERLACE = (1 << 4),
META_CRTC_MODE_FLAG_DBLSCAN = (1 << 5),
META_CRTC_MODE_FLAG_CSYNC = (1 << 6),
META_CRTC_MODE_FLAG_PCSYNC = (1 << 7),
META_CRTC_MODE_FLAG_NCSYNC = (1 << 8),
META_CRTC_MODE_FLAG_HSKEW = (1 << 9),
META_CRTC_MODE_FLAG_BCAST = (1 << 10),
META_CRTC_MODE_FLAG_PIXMUX = (1 << 11),
META_CRTC_MODE_FLAG_DBLCLK = (1 << 12),
META_CRTC_MODE_FLAG_CLKDIV2 = (1 << 13),
META_CRTC_MODE_FLAG_MASK = 0x3fff
} MetaCrtcModeFlag;
struct _MetaTileInfo struct _MetaTileInfo
{ {
guint32 group_id; guint32 group_id;
@@ -251,7 +224,7 @@ struct _MetaCrtcMode
int width; int width;
int height; int height;
float refresh_rate; float refresh_rate;
MetaCrtcModeFlag flags; guint32 flags;
gpointer driver_private; gpointer driver_private;
GDestroyNotify driver_notify; GDestroyNotify driver_notify;
@@ -259,9 +232,11 @@ struct _MetaCrtcMode
/* /*
* MetaCrtcInfo: * MetaCrtcInfo:
* This represents the writable part of a CRTC, as deserialized from DBus
* or built by MetaMonitorConfig
* *
* A representation of a CRTC configuration, generated by * Note: differently from the other structures in this file, MetaCrtcInfo
* MetaMonitorConfigManager. * is handled by pointer. This is to accomodate the usage in MetaMonitorConfig
*/ */
struct _MetaCrtcInfo struct _MetaCrtcInfo
{ {
@@ -275,9 +250,7 @@ struct _MetaCrtcInfo
/* /*
* MetaOutputInfo: * MetaOutputInfo:
* * this is the same as MetaCrtcInfo, but for outputs
* A representation of a connector configuration, generated by
* MetaMonitorConfigManager.
*/ */
struct _MetaOutputInfo struct _MetaOutputInfo
{ {
@@ -287,6 +260,12 @@ struct _MetaOutputInfo
gboolean is_underscanning; gboolean is_underscanning;
}; };
typedef enum _MetaMonitorConfigSystem
{
META_MONITOR_CONFIG_SYSTEM_LEGACY,
META_MONITOR_CONFIG_SYSTEM_MANAGER
} MetaMonitorConfigSystem;
#define META_TYPE_MONITOR_MANAGER (meta_monitor_manager_get_type ()) #define META_TYPE_MONITOR_MANAGER (meta_monitor_manager_get_type ())
#define META_MONITOR_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER, MetaMonitorManager)) #define META_MONITOR_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER, MetaMonitorManager))
#define META_MONITOR_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_MONITOR_MANAGER, MetaMonitorManagerClass)) #define META_MONITOR_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_MONITOR_MANAGER, MetaMonitorManagerClass))
@@ -335,16 +314,17 @@ struct _MetaMonitorManager
int dbus_name_id; int dbus_name_id;
MetaMonitorConfigSystem pending_persistent_system;
int persistent_timeout_id; int persistent_timeout_id;
MetaMonitorConfig *legacy_config;
MetaMonitorConfigManager *config_manager; MetaMonitorConfigManager *config_manager;
GnomePnpIds *pnp_ids; GnomePnpIds *pnp_ids;
UpClient *up_client; UpClient *up_client;
gulong experimental_features_changed_handler_id; gulong experimental_features_changed_handler_id;
MetaMonitorSwitchConfigType current_switch_config;
}; };
struct _MetaMonitorManagerClass struct _MetaMonitorManagerClass
@@ -367,6 +347,12 @@ struct _MetaMonitorManagerClass
MetaMonitorsConfigMethod , MetaMonitorsConfigMethod ,
GError **); GError **);
void (*apply_configuration) (MetaMonitorManager *,
MetaCrtcInfo **,
unsigned int ,
MetaOutputInfo **,
unsigned int);
void (*set_power_save_mode) (MetaMonitorManager *, void (*set_power_save_mode) (MetaMonitorManager *,
MetaPowerSave); MetaPowerSave);
@@ -397,15 +383,13 @@ struct _MetaMonitorManagerClass
MetaCrtc *, MetaCrtc *,
MetaMonitorTransform); MetaMonitorTransform);
float (*calculate_monitor_mode_scale) (MetaMonitorManager *, int (*calculate_monitor_mode_scale) (MetaMonitorManager *,
MetaMonitor *, MetaMonitor *,
MetaMonitorMode *); MetaMonitorMode *);
float * (*calculate_supported_scales) (MetaMonitorManager *, void (*get_supported_scales) (MetaMonitorManager *,
MetaLogicalMonitorLayoutMode , float **,
MetaMonitor *, int *);
MetaMonitorMode *,
int *);
MetaMonitorManagerCapability (*get_capabilities) (MetaMonitorManager *); MetaMonitorManagerCapability (*get_capabilities) (MetaMonitorManager *);
@@ -416,10 +400,11 @@ struct _MetaMonitorManagerClass
MetaLogicalMonitorLayoutMode (*get_default_layout_mode) (MetaMonitorManager *); MetaLogicalMonitorLayoutMode (*get_default_layout_mode) (MetaMonitorManager *);
}; };
gboolean meta_is_monitor_config_manager_enabled (void);
void meta_monitor_manager_rebuild (MetaMonitorManager *manager, void meta_monitor_manager_rebuild (MetaMonitorManager *manager,
MetaMonitorsConfig *config); MetaMonitorsConfig *config);
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager, void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager);
MetaMonitorManagerDeriveFlag flags);
int meta_monitor_manager_get_num_logical_monitors (MetaMonitorManager *manager); int meta_monitor_manager_get_num_logical_monitors (MetaMonitorManager *manager);
@@ -437,9 +422,9 @@ MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_at (MetaMonitorMana
MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_from_rect (MetaMonitorManager *manager, MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_from_rect (MetaMonitorManager *manager,
MetaRectangle *rect); MetaRectangle *rect);
MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_neighbor (MetaMonitorManager *manager, MetaLogicalMonitor *meta_monitor_manager_get_logical_monitor_neighbor (MetaMonitorManager *manager,
MetaLogicalMonitor *logical_monitor, MetaLogicalMonitor *logical_monitor,
MetaDisplayDirection direction); MetaScreenDirection direction);
MetaMonitor * meta_monitor_manager_get_primary_monitor (MetaMonitorManager *manager); MetaMonitor * meta_monitor_manager_get_primary_monitor (MetaMonitorManager *manager);
@@ -465,6 +450,12 @@ void meta_monitor_manager_get_screen_size (MetaMonitorManager *
int *width, int *width,
int *height); int *height);
void meta_monitor_manager_apply_configuration (MetaMonitorManager *manager,
MetaCrtcInfo **crtcs,
unsigned int n_crtcs,
MetaOutputInfo **outputs,
unsigned int n_outputs);
void meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager, void meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager,
gboolean ok); gboolean ok);
@@ -472,6 +463,9 @@ void meta_output_parse_edid (MetaOutput *output,
GBytes *edid); GBytes *edid);
gboolean meta_output_is_laptop (MetaOutput *output); gboolean meta_output_is_laptop (MetaOutput *output);
void meta_crtc_info_free (MetaCrtcInfo *info);
void meta_output_info_free (MetaOutputInfo *info);
gboolean meta_monitor_manager_has_hotplug_mode_update (MetaMonitorManager *manager); gboolean meta_monitor_manager_has_hotplug_mode_update (MetaMonitorManager *manager);
void meta_monitor_manager_read_current_state (MetaMonitorManager *manager); void meta_monitor_manager_read_current_state (MetaMonitorManager *manager);
void meta_monitor_manager_on_hotplug (MetaMonitorManager *manager); void meta_monitor_manager_on_hotplug (MetaMonitorManager *manager);
@@ -493,8 +487,7 @@ MetaMonitorsConfig * meta_monitor_manager_ensure_configured (MetaMonitorManager
void meta_monitor_manager_update_logical_state (MetaMonitorManager *manager, void meta_monitor_manager_update_logical_state (MetaMonitorManager *manager,
MetaMonitorsConfig *config); MetaMonitorsConfig *config);
void meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager, void meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager);
MetaMonitorManagerDeriveFlag flags);
gboolean meta_monitor_manager_is_lid_closed (MetaMonitorManager *manager); gboolean meta_monitor_manager_is_lid_closed (MetaMonitorManager *manager);
@@ -502,25 +495,10 @@ void meta_monitor_manager_lid_is_closed_changed (MetaMonitorManage
gboolean meta_monitor_manager_is_headless (MetaMonitorManager *manager); gboolean meta_monitor_manager_is_headless (MetaMonitorManager *manager);
float meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager, int meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager,
MetaMonitor *monitor, MetaMonitor *monitor,
MetaMonitorMode *monitor_mode); MetaMonitorMode *monitor_mode);
float * meta_monitor_manager_calculate_supported_scales (MetaMonitorManager *,
MetaLogicalMonitorLayoutMode ,
MetaMonitor *,
MetaMonitorMode *,
int *);
gboolean meta_monitor_manager_is_scale_supported (MetaMonitorManager *manager,
MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
float scale);
MetaMonitorManagerCapability
meta_monitor_manager_get_capabilities (MetaMonitorManager *manager);
gboolean meta_monitor_manager_get_max_screen_size (MetaMonitorManager *manager, gboolean meta_monitor_manager_get_max_screen_size (MetaMonitorManager *manager,
int *max_width, int *max_width,
int *max_height); int *max_height);
@@ -528,8 +506,6 @@ gboolean meta_monitor_manager_get_max_screen_size (MetaMonitorManager
MetaLogicalMonitorLayoutMode MetaLogicalMonitorLayoutMode
meta_monitor_manager_get_default_layout_mode (MetaMonitorManager *manager); meta_monitor_manager_get_default_layout_mode (MetaMonitorManager *manager);
void meta_monitor_manager_rotate_monitor (MetaMonitorManager *manager);
void meta_monitor_manager_clear_output (MetaOutput *output); void meta_monitor_manager_clear_output (MetaOutput *output);
void meta_monitor_manager_clear_mode (MetaCrtcMode *mode); void meta_monitor_manager_clear_mode (MetaCrtcMode *mode);
void meta_monitor_manager_clear_crtc (MetaCrtc *crtc); void meta_monitor_manager_clear_crtc (MetaCrtc *crtc);

File diff suppressed because it is too large Load Diff

View File

@@ -25,19 +25,9 @@
#include "backends/meta-backend-private.h" #include "backends/meta-backend-private.h"
#include "backends/meta-monitor-manager-private.h" #include "backends/meta-monitor-manager-private.h"
#include "backends/meta-settings-private.h"
#define SCALE_FACTORS_PER_INTEGER 4
#define MINIMUM_SCALE_FACTOR 1.0f
#define MAXIMUM_SCALE_FACTOR 4.0f
#define MINIMUM_LOGICAL_WIDTH 800
#define MINIMUM_LOGICAL_HEIGHT 600
#define HANDLED_CRTC_MODE_FLAGS (META_CRTC_MODE_FLAG_INTERLACE)
typedef struct _MetaMonitorMode typedef struct _MetaMonitorMode
{ {
char *id;
MetaMonitorModeSpec spec; MetaMonitorModeSpec spec;
MetaMonitorCrtcMode *crtc_modes; MetaMonitorCrtcMode *crtc_modes;
} MetaMonitorMode; } MetaMonitorMode;
@@ -51,11 +41,8 @@ typedef struct _MetaMonitorModeTiled
typedef struct _MetaMonitorPrivate typedef struct _MetaMonitorPrivate
{ {
MetaMonitorManager *monitor_manager;
GList *outputs; GList *outputs;
GList *modes; GList *modes;
GHashTable *mode_ids;
MetaMonitorMode *preferred_mode; MetaMonitorMode *preferred_mode;
MetaMonitorMode *current_mode; MetaMonitorMode *current_mode;
@@ -89,10 +76,6 @@ struct _MetaMonitorTiled
uint32_t tile_group_id; uint32_t tile_group_id;
/* The tile (0, 0) output. */
MetaOutput *origin_output;
/* The output enabled even when a non-tiled mode is used. */
MetaOutput *main_output; MetaOutput *main_output;
}; };
@@ -159,7 +142,7 @@ meta_monitor_spec_free (MetaMonitorSpec *monitor_spec)
} }
static void static void
meta_monitor_generate_spec (MetaMonitor *monitor) meta_monitor_generate_id (MetaMonitor *monitor)
{ {
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor); MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
MetaOutput *output = meta_monitor_get_main_output (monitor); MetaOutput *output = meta_monitor_get_main_output (monitor);
@@ -260,10 +243,11 @@ meta_monitor_get_current_resolution (MetaMonitor *monitor,
} }
void void
meta_monitor_derive_layout (MetaMonitor *monitor, meta_monitor_derive_dimensions (MetaMonitor *monitor,
MetaRectangle *layout) int *width,
int *height)
{ {
META_MONITOR_GET_CLASS (monitor)->derive_layout (monitor, layout); META_MONITOR_GET_CLASS (monitor)->derive_dimensions (monitor, width, height);
} }
void void
@@ -338,7 +322,6 @@ meta_monitor_finalize (GObject *object)
MetaMonitor *monitor = META_MONITOR (object); MetaMonitor *monitor = META_MONITOR (object);
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor); MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
g_hash_table_destroy (priv->mode_ids);
g_list_free_full (priv->modes, (GDestroyNotify) meta_monitor_mode_free); g_list_free_full (priv->modes, (GDestroyNotify) meta_monitor_mode_free);
g_clear_pointer (&priv->outputs, g_list_free); g_clear_pointer (&priv->outputs, g_list_free);
meta_monitor_spec_free (priv->spec); meta_monitor_spec_free (priv->spec);
@@ -347,9 +330,6 @@ meta_monitor_finalize (GObject *object)
static void static void
meta_monitor_init (MetaMonitor *monitor) meta_monitor_init (MetaMonitor *monitor)
{ {
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
priv->mode_ids = g_hash_table_new (g_str_hash, g_str_equal);
} }
static void static void
@@ -360,39 +340,6 @@ meta_monitor_class_init (MetaMonitorClass *klass)
object_class->finalize = meta_monitor_finalize; object_class->finalize = meta_monitor_finalize;
} }
static char *
generate_mode_id (MetaMonitorModeSpec *monitor_mode_spec)
{
gboolean is_interlaced;
char refresh_rate_str[G_ASCII_DTOSTR_BUF_SIZE];
is_interlaced = !!(monitor_mode_spec->flags & META_CRTC_MODE_FLAG_INTERLACE);
g_ascii_dtostr (refresh_rate_str, G_ASCII_DTOSTR_BUF_SIZE,
monitor_mode_spec->refresh_rate);
return g_strdup_printf ("%dx%d%s@%s",
monitor_mode_spec->width,
monitor_mode_spec->height,
is_interlaced ? "i" : "",
refresh_rate_str);
}
static gboolean
meta_monitor_add_mode (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode)
{
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
if (g_hash_table_lookup (priv->mode_ids,
meta_monitor_mode_get_id (monitor_mode)))
return FALSE;
priv->modes = g_list_append (priv->modes, monitor_mode);
g_hash_table_insert (priv->mode_ids, monitor_mode->id, monitor_mode);
return TRUE;
}
static void static void
meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal) meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
{ {
@@ -412,10 +359,8 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
mode->spec = (MetaMonitorModeSpec) { mode->spec = (MetaMonitorModeSpec) {
.width = crtc_mode->width, .width = crtc_mode->width,
.height = crtc_mode->height, .height = crtc_mode->height,
.refresh_rate = crtc_mode->refresh_rate, .refresh_rate = crtc_mode->refresh_rate
.flags = crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS
}, },
mode->id = generate_mode_id (&mode->spec);
mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1); mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1);
mode->crtc_modes[0] = (MetaMonitorCrtcMode) { mode->crtc_modes[0] = (MetaMonitorCrtcMode) {
.output = output, .output = output,
@@ -427,14 +372,12 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
if (output->crtc && crtc_mode == output->crtc->current_mode) if (output->crtc && crtc_mode == output->crtc->current_mode)
monitor_priv->current_mode = mode; monitor_priv->current_mode = mode;
if (!meta_monitor_add_mode (monitor, mode)) monitor_priv->modes = g_list_append (monitor_priv->modes, mode);
meta_monitor_mode_free (mode);
} }
} }
MetaMonitorNormal * MetaMonitorNormal *
meta_monitor_normal_new (MetaMonitorManager *monitor_manager, meta_monitor_normal_new (MetaOutput *output)
MetaOutput *output)
{ {
MetaMonitorNormal *monitor_normal; MetaMonitorNormal *monitor_normal;
MetaMonitor *monitor; MetaMonitor *monitor;
@@ -444,13 +387,11 @@ meta_monitor_normal_new (MetaMonitorManager *monitor_manager,
monitor = META_MONITOR (monitor_normal); monitor = META_MONITOR (monitor_normal);
monitor_priv = meta_monitor_get_instance_private (monitor); monitor_priv = meta_monitor_get_instance_private (monitor);
monitor_priv->monitor_manager = monitor_manager;
monitor_priv->outputs = g_list_append (NULL, output); monitor_priv->outputs = g_list_append (NULL, output);
monitor_priv->winsys_id = output->winsys_id; monitor_priv->winsys_id = output->winsys_id;
meta_monitor_generate_spec (monitor);
meta_monitor_normal_generate_modes (monitor_normal); meta_monitor_normal_generate_modes (monitor_normal);
meta_monitor_generate_id (monitor);
return monitor_normal; return monitor_normal;
} }
@@ -465,35 +406,15 @@ meta_monitor_normal_get_main_output (MetaMonitor *monitor)
} }
static void static void
meta_monitor_normal_derive_layout (MetaMonitor *monitor, meta_monitor_normal_derive_dimensions (MetaMonitor *monitor,
MetaRectangle *layout) int *width,
int *height)
{ {
MetaOutput *output; MetaOutput *output;
output = meta_monitor_get_main_output (monitor); output = meta_monitor_get_main_output (monitor);
*layout = (MetaRectangle) { *width = output->crtc->rect.width;
.x = output->crtc->rect.x, *height = output->crtc->rect.height;
.y = output->crtc->rect.y,
.width = output->crtc->rect.width,
.height = output->crtc->rect.height
};
}
static gboolean
meta_monitor_normal_get_suggested_position (MetaMonitor *monitor,
int *x,
int *y)
{
MetaOutput *output;
output = meta_monitor_get_main_output (monitor);
if (output->suggested_x < 0 && output->suggested_y < 0)
return FALSE;
*x = output->suggested_x;
*y = output->suggested_y;
return TRUE;
} }
static void static void
@@ -519,9 +440,8 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass)
MetaMonitorClass *monitor_class = META_MONITOR_CLASS (klass); MetaMonitorClass *monitor_class = META_MONITOR_CLASS (klass);
monitor_class->get_main_output = meta_monitor_normal_get_main_output; monitor_class->get_main_output = meta_monitor_normal_get_main_output;
monitor_class->derive_layout = meta_monitor_normal_derive_layout; monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions;
monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos; monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos;
monitor_class->get_suggested_position = meta_monitor_normal_get_suggested_position;
} }
uint32_t uint32_t
@@ -535,8 +455,16 @@ meta_monitor_get_suggested_position (MetaMonitor *monitor,
int *x, int *x,
int *y) int *y)
{ {
return META_MONITOR_GET_CLASS (monitor)->get_suggested_position (monitor, MetaOutput *main_output;
x, y);
main_output = meta_monitor_get_main_output (monitor);
if (main_output->suggested_x < 0 && main_output->suggested_y < 0)
return FALSE;
*x = main_output->suggested_x;
*y = main_output->suggested_y;
return TRUE;
} }
static void static void
@@ -555,7 +483,7 @@ add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager,
continue; continue;
g_warn_if_fail (output->subpixel_order == g_warn_if_fail (output->subpixel_order ==
monitor_tiled->origin_output->subpixel_order); monitor_tiled->main_output->subpixel_order);
monitor_priv->outputs = g_list_append (monitor_priv->outputs, output); monitor_priv->outputs = g_list_append (monitor_priv->outputs, output);
} }
@@ -675,157 +603,41 @@ is_monitor_mode_assigned (MetaMonitor *monitor,
return TRUE; return TRUE;
} }
static gboolean
is_crtc_mode_tiled (MetaOutput *output,
MetaCrtcMode *crtc_mode)
{
return (crtc_mode->width == (int) output->tile_info.tile_w &&
crtc_mode->height == (int) output->tile_info.tile_h);
}
static MetaCrtcMode *
find_tiled_crtc_mode (MetaOutput *output,
MetaCrtcMode *reference_crtc_mode)
{
MetaCrtcMode *crtc_mode;
unsigned int i;
crtc_mode = output->preferred_mode;
if (is_crtc_mode_tiled (output, crtc_mode))
return crtc_mode;
for (i = 0; i < output->n_modes; i++)
{
crtc_mode = output->modes[i];
if (!is_crtc_mode_tiled (output, crtc_mode))
continue;
if (crtc_mode->refresh_rate != reference_crtc_mode->refresh_rate)
continue;
if (crtc_mode->flags != reference_crtc_mode->flags)
continue;
return crtc_mode;
}
return NULL;
}
static MetaMonitorMode * static MetaMonitorMode *
create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled, create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled)
MetaCrtcMode *reference_crtc_mode,
gboolean *out_is_preferred)
{ {
MetaMonitor *monitor = META_MONITOR (monitor_tiled); MetaMonitor *monitor = META_MONITOR (monitor_tiled);
MetaMonitorPrivate *monitor_priv = MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor); meta_monitor_get_instance_private (monitor);
MetaMonitorModeTiled *mode; MetaMonitorModeTiled *mode;
int width, height;
GList *l; GList *l;
unsigned int i; int i;
gboolean is_preferred = TRUE;
mode = g_new0 (MetaMonitorModeTiled, 1); mode = g_new0 (MetaMonitorModeTiled, 1);
mode->is_tiled = TRUE; mode->is_tiled = TRUE;
meta_monitor_tiled_calculate_tiled_size (monitor, &width, &height); meta_monitor_tiled_calculate_tiled_size (monitor,
&mode->parent.spec.width,
mode->parent.spec = (MetaMonitorModeSpec) { &mode->parent.spec.height);
.width = width,
.height = height,
.refresh_rate = reference_crtc_mode->refresh_rate,
.flags = reference_crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS
};
mode->parent.id = generate_mode_id (&mode->parent.spec);
mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode, mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode,
g_list_length (monitor_priv->outputs)); g_list_length (monitor_priv->outputs));
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++) for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
{ {
MetaOutput *output = l->data; MetaOutput *output = l->data;
MetaCrtcMode *tiled_crtc_mode; MetaCrtcMode *preferred_crtc_mode = output->preferred_mode;
tiled_crtc_mode = find_tiled_crtc_mode (output, reference_crtc_mode);
if (!tiled_crtc_mode)
{
g_warning ("No tiled mode found on %s", output->name);
meta_monitor_mode_free ((MetaMonitorMode *) mode);
return NULL;
}
mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) { mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) {
.output = output, .output = output,
.crtc_mode = tiled_crtc_mode .crtc_mode = preferred_crtc_mode
}; };
is_preferred = is_preferred && tiled_crtc_mode == output->preferred_mode; g_warn_if_fail (mode->parent.spec.refresh_rate == 0.0f ||
(mode->parent.spec.refresh_rate ==
preferred_crtc_mode->refresh_rate));
mode->parent.spec.refresh_rate = preferred_crtc_mode->refresh_rate;
} }
*out_is_preferred = is_preferred; return &mode->parent;
return (MetaMonitorMode *) mode;
}
static void
generate_tiled_monitor_modes (MetaMonitorTiled *monitor_tiled)
{
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor);
MetaOutput *main_output;
GList *tiled_modes = NULL;
unsigned int i;
MetaMonitorMode *best_mode = NULL;
GList *l;
main_output = meta_monitor_get_main_output (META_MONITOR (monitor_tiled));
for (i = 0; i < main_output->n_modes; i++)
{
MetaCrtcMode *reference_crtc_mode = main_output->modes[i];
MetaMonitorMode *mode;
gboolean is_preferred;
if (!is_crtc_mode_tiled (main_output, reference_crtc_mode))
continue;
mode = create_tiled_monitor_mode (monitor_tiled, reference_crtc_mode,
&is_preferred);
if (!mode)
continue;
tiled_modes = g_list_append (tiled_modes, mode);
if (is_monitor_mode_assigned (monitor, mode))
monitor_priv->current_mode = mode;
if (is_preferred)
monitor_priv->preferred_mode = mode;
}
while ((l = tiled_modes))
{
MetaMonitorMode *mode = l->data;
tiled_modes = g_list_remove_link (tiled_modes, l);
if (!meta_monitor_add_mode (monitor, mode))
{
meta_monitor_mode_free (mode);
continue;
}
if (!monitor_priv->preferred_mode)
{
if (!best_mode ||
mode->spec.refresh_rate > best_mode->spec.refresh_rate)
best_mode = mode;
}
}
if (best_mode)
monitor_priv->preferred_mode = best_mode;
} }
static MetaMonitorMode * static MetaMonitorMode *
@@ -840,7 +652,12 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
GList *l; GList *l;
int i; int i;
if (is_crtc_mode_tiled (main_output, crtc_mode)) /*
* Assume modes with a resolution identical to the tile sizes are tiled
* modes.
*/
if (crtc_mode->width == (int) main_output->tile_info.tile_w &&
crtc_mode->height == (int) main_output->tile_info.tile_h)
return NULL; return NULL;
mode = g_new0 (MetaMonitorModeTiled, 1); mode = g_new0 (MetaMonitorModeTiled, 1);
@@ -849,12 +666,10 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
mode->parent.spec = (MetaMonitorModeSpec) { mode->parent.spec = (MetaMonitorModeSpec) {
.width = crtc_mode->width, .width = crtc_mode->width,
.height = crtc_mode->height, .height = crtc_mode->height,
.refresh_rate = crtc_mode->refresh_rate, .refresh_rate = crtc_mode->refresh_rate
.flags = crtc_mode->flags & HANDLED_CRTC_MODE_FLAGS
}; };
mode->parent.id = generate_mode_id (&mode->parent.spec);
mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode, mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode,
g_list_length (monitor_priv->outputs)); g_list_length (monitor_priv->outputs));
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++) for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
{ {
@@ -879,188 +694,42 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
return &mode->parent; return &mode->parent;
} }
static int
count_untiled_crtc_modes (MetaOutput *output)
{
int count;
unsigned int i;
count = 0;
for (i = 0; i < output->n_modes; i++)
{
MetaCrtcMode *crtc_mode = output->modes[i];
if (!is_crtc_mode_tiled (output, crtc_mode))
count++;
}
return count;
}
static MetaOutput *
find_untiled_output (MetaMonitorTiled *monitor_tiled)
{
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor);
MetaOutput *best_output;
int best_untiled_crtc_mode_count;
GList *l;
best_output = monitor_tiled->origin_output;
best_untiled_crtc_mode_count =
count_untiled_crtc_modes (monitor_tiled->origin_output);
for (l = monitor_priv->outputs; l; l = l->next)
{
MetaOutput *output = l->data;
int untiled_crtc_mode_count;
if (output == monitor_tiled->origin_output)
continue;
untiled_crtc_mode_count = count_untiled_crtc_modes (output);
if (untiled_crtc_mode_count > best_untiled_crtc_mode_count)
{
best_untiled_crtc_mode_count = untiled_crtc_mode_count;
best_output = output;
}
}
return best_output;
}
static void
generate_untiled_monitor_modes (MetaMonitorTiled *monitor_tiled)
{
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor);
MetaOutput *main_output;
unsigned int i;
main_output = meta_monitor_get_main_output (monitor);
for (i = 0; i < main_output->n_modes; i++)
{
MetaCrtcMode *crtc_mode = main_output->modes[i];
MetaMonitorMode *mode;
mode = create_untiled_monitor_mode (monitor_tiled,
main_output,
crtc_mode);
if (!mode)
continue;
if (!meta_monitor_add_mode (monitor, mode))
{
meta_monitor_mode_free (mode);
continue;
}
if (is_monitor_mode_assigned (monitor, mode))
{
g_assert (!monitor_priv->current_mode);
monitor_priv->current_mode = mode;
}
if (!monitor_priv->preferred_mode &&
crtc_mode == main_output->preferred_mode)
monitor_priv->preferred_mode = mode;
}
}
static MetaMonitorMode *
find_best_mode (MetaMonitor *monitor)
{
MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor);
MetaMonitorMode *best_mode = NULL;
GList *l;
for (l = monitor_priv->modes; l; l = l->next)
{
MetaMonitorMode *mode = l->data;
int area, best_area;
if (!best_mode)
{
best_mode = mode;
continue;
}
area = mode->spec.width * mode->spec.height;
best_area = best_mode->spec.width * best_mode->spec.height;
if (area > best_area)
{
best_mode = mode;
continue;
}
if (mode->spec.refresh_rate > best_mode->spec.refresh_rate)
{
best_mode = mode;
continue;
}
}
return best_mode;
}
static void static void
meta_monitor_tiled_generate_modes (MetaMonitorTiled *monitor_tiled) meta_monitor_tiled_generate_modes (MetaMonitorTiled *monitor_tiled)
{ {
MetaMonitor *monitor = META_MONITOR (monitor_tiled); MetaMonitor *monitor = META_MONITOR (monitor_tiled);
MetaMonitorPrivate *monitor_priv = MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor); meta_monitor_get_instance_private (monitor);
MetaMonitorMode *mode;
MetaOutput *main_output;
unsigned int i;
/* mode = create_tiled_monitor_mode (monitor_tiled);
* Tiled monitors may look a bit different from each other, depending on the monitor_priv->modes = g_list_append (monitor_priv->modes, mode);
* monitor itself, the driver, etc.
*
* On some, the tiled modes will be the preferred CRTC modes, and running
* untiled is done by only enabling (0, 0) tile. In this case, things are
* pretty straight forward.
*
* Other times a monitor may have some bogus mode preferred on the main tile,
* and an untiled mode preferred on the non-main tile, and there seems to be
* no guarantee that the (0, 0) tile is the one that should drive the
* non-tiled mode.
*
* To handle both these cases, the following hueristics are implemented:
*
* 1) Find all the tiled CRTC modes of the (0, 0) tile, and create tiled
* monitor modes for all tiles based on these.
* 2) If there is any tiled monitor mode combination where all CRTC modes
* are the preferred ones, that one is marked as preferred.
* 3) If there is no preferred mode determined so far, assume the tiled
* monitor mode with the highest refresh rate is preferred.
* 4) Find the tile with highest number of untiled CRTC modes available,
* assume this is the one driving the monitor in untiled mode, and
* create monitor modes for all untiled CRTC modes of that tile. If
* there is still no preferred mode, set any untiled mode as preferred
* if the CRTC mode is marked as such.
* 5) If at this point there is still no preferred mode, just pick the one
* with the highest number of pixels and highest refresh rate.
*
* Note that this ignores the preference if the preference is a non-tiled
* mode. This seems to be the case on some systems, where the user tends to
* manually set up the tiled mode anyway.
*/
generate_tiled_monitor_modes (monitor_tiled); monitor_priv->preferred_mode = mode;
if (!monitor_priv->preferred_mode) if (is_monitor_mode_assigned (monitor, mode))
g_warning ("Tiled monitor on %s didn't have any tiled modes", monitor_priv->current_mode = mode;
monitor_priv->spec->connector);
generate_untiled_monitor_modes (monitor_tiled); main_output = meta_monitor_get_main_output (monitor);
for (i = 0; i < main_output->n_modes; i++)
if (!monitor_priv->preferred_mode)
{ {
g_warning ("Tiled monitor on %s didn't have a valid preferred mode", MetaCrtcMode *crtc_mode = main_output->modes[i];
monitor_priv->spec->connector);
monitor_priv->preferred_mode = find_best_mode (monitor); mode = create_untiled_monitor_mode (monitor_tiled,
main_output,
crtc_mode);
if (mode)
{
monitor_priv->modes = g_list_append (monitor_priv->modes, mode);
if (is_monitor_mode_assigned (monitor, mode))
{
g_assert (!monitor_priv->current_mode);
monitor_priv->current_mode = mode;
}
}
} }
} }
@@ -1076,22 +745,17 @@ meta_monitor_tiled_new (MetaMonitorManager *monitor_manager,
monitor = META_MONITOR (monitor_tiled); monitor = META_MONITOR (monitor_tiled);
monitor_priv = meta_monitor_get_instance_private (monitor); monitor_priv = meta_monitor_get_instance_private (monitor);
monitor_priv->monitor_manager = monitor_manager;
monitor_tiled->tile_group_id = output->tile_info.group_id; monitor_tiled->tile_group_id = output->tile_info.group_id;
monitor_priv->winsys_id = output->winsys_id; monitor_priv->winsys_id = output->winsys_id;
monitor_tiled->origin_output = output; monitor_tiled->main_output = output;
add_tiled_monitor_outputs (monitor_manager, monitor_tiled); add_tiled_monitor_outputs (monitor_manager, monitor_tiled);
monitor_tiled->main_output = find_untiled_output (monitor_tiled);
meta_monitor_generate_spec (monitor);
meta_monitor_manager_tiled_monitor_added (monitor_manager, meta_monitor_manager_tiled_monitor_added (monitor_manager,
META_MONITOR (monitor_tiled)); META_MONITOR (monitor_tiled));
meta_monitor_tiled_generate_modes (monitor_tiled); meta_monitor_tiled_generate_modes (monitor_tiled);
meta_monitor_generate_id (monitor);
return monitor_tiled; return monitor_tiled;
} }
@@ -1105,8 +769,9 @@ meta_monitor_tiled_get_main_output (MetaMonitor *monitor)
} }
static void static void
meta_monitor_derived_derive_layout (MetaMonitor *monitor, meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor,
MetaRectangle *layout) int *out_width,
int *out_height)
{ {
MetaMonitorPrivate *monitor_priv = MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor); meta_monitor_get_instance_private (monitor);
@@ -1130,20 +795,8 @@ meta_monitor_derived_derive_layout (MetaMonitor *monitor,
max_y = MAX (output->crtc->rect.y + output->crtc->rect.height, max_y); max_y = MAX (output->crtc->rect.y + output->crtc->rect.height, max_y);
} }
*layout = (MetaRectangle) { *out_width = max_x - min_x;
.x = min_x, *out_height = max_y - min_y;
.y = min_y,
.width = max_x - min_x,
.height = max_y - min_y
};
}
static gboolean
meta_monitor_tiled_get_suggested_position (MetaMonitor *monitor,
int *x,
int *y)
{
return FALSE;
} }
static void static void
@@ -1171,12 +824,13 @@ meta_monitor_tiled_calculate_crtc_pos (MetaMonitor *monitor,
static void static void
meta_monitor_tiled_finalize (GObject *object) meta_monitor_tiled_finalize (GObject *object)
{ {
MetaMonitor *monitor = META_MONITOR (object); MetaMonitorTiled *monitor_tiled = META_MONITOR_TILED (object);
MetaMonitorPrivate *monitor_priv = MetaBackend *backend = meta_get_backend ();
meta_monitor_get_instance_private (monitor); MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
meta_monitor_manager_tiled_monitor_removed (monitor_priv->monitor_manager, meta_monitor_manager_tiled_monitor_removed (monitor_manager,
monitor); META_MONITOR (monitor_tiled));
} }
static void static void
@@ -1193,15 +847,13 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass)
object_class->finalize = meta_monitor_tiled_finalize; object_class->finalize = meta_monitor_tiled_finalize;
monitor_class->get_main_output = meta_monitor_tiled_get_main_output; monitor_class->get_main_output = meta_monitor_tiled_get_main_output;
monitor_class->derive_layout = meta_monitor_derived_derive_layout; monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions;
monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos; monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos;
monitor_class->get_suggested_position = meta_monitor_tiled_get_suggested_position;
} }
static void static void
meta_monitor_mode_free (MetaMonitorMode *monitor_mode) meta_monitor_mode_free (MetaMonitorMode *monitor_mode)
{ {
g_free (monitor_mode->id);
g_free (monitor_mode->crtc_modes); g_free (monitor_mode->crtc_modes);
g_free (monitor_mode); g_free (monitor_mode);
} }
@@ -1225,15 +877,6 @@ meta_monitor_get_logical_monitor (MetaMonitor *monitor)
return NULL; return NULL;
} }
MetaMonitorMode *
meta_monitor_get_mode_from_id (MetaMonitor *monitor,
const char *monitor_mode_id)
{
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
return g_hash_table_lookup (priv->mode_ids, monitor_mode_id);
}
static gboolean static gboolean
meta_monitor_mode_spec_equals (MetaMonitorModeSpec *monitor_mode_spec, meta_monitor_mode_spec_equals (MetaMonitorModeSpec *monitor_mode_spec,
MetaMonitorModeSpec *other_monitor_mode_spec) MetaMonitorModeSpec *other_monitor_mode_spec)
@@ -1241,8 +884,7 @@ meta_monitor_mode_spec_equals (MetaMonitorModeSpec *monitor_mode_spec,
return (monitor_mode_spec->width == other_monitor_mode_spec->width && return (monitor_mode_spec->width == other_monitor_mode_spec->width &&
monitor_mode_spec->height == other_monitor_mode_spec->height && monitor_mode_spec->height == other_monitor_mode_spec->height &&
(monitor_mode_spec->refresh_rate == (monitor_mode_spec->refresh_rate ==
other_monitor_mode_spec->refresh_rate) && other_monitor_mode_spec->refresh_rate));
monitor_mode_spec->flags == other_monitor_mode_spec->flags);
} }
MetaMonitorMode * MetaMonitorMode *
@@ -1334,221 +976,12 @@ meta_monitor_calculate_crtc_pos (MetaMonitor *monitor,
out_y); out_y);
} }
/* The minimum resolution at which we turn on a window-scale of 2 */
#define HIDPI_LIMIT 192
/*
* The minimum screen height at which we turn on a window-scale of 2;
* below this there just isn't enough vertical real estate for GNOME
* apps to work, and it's better to just be tiny
*/
#define HIDPI_MIN_HEIGHT 1200
/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */
#define SMALLEST_4K_WIDTH 3656
static float
calculate_scale (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode)
{
int resolution_width, resolution_height;
int width_mm, height_mm;
int scale;
scale = 1.0;
meta_monitor_mode_get_resolution (monitor_mode,
&resolution_width,
&resolution_height);
if (resolution_height < HIDPI_MIN_HEIGHT)
goto out;
/* 4K TV */
switch (meta_monitor_get_connector_type (monitor))
{
case META_CONNECTOR_TYPE_HDMIA:
case META_CONNECTOR_TYPE_HDMIB:
if (resolution_width < SMALLEST_4K_WIDTH)
goto out;
break;
default:
break;
}
meta_monitor_get_physical_dimensions (monitor, &width_mm, &height_mm);
/*
* Somebody encoded the aspect ratio (16/9 or 16/10) instead of the physical
* size.
*/
if ((width_mm == 160 && height_mm == 90) ||
(width_mm == 160 && height_mm == 100) ||
(width_mm == 16 && height_mm == 9) ||
(width_mm == 16 && height_mm == 10))
goto out;
if (width_mm > 0 && height_mm > 0)
{
double dpi_x, dpi_y;
dpi_x = (double) resolution_width / (width_mm / 25.4);
dpi_y = (double) resolution_height / (height_mm / 25.4);
/*
* We don't completely trust these values so both must be high, and never
* pick higher ratio than 2 automatically.
*/
if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT)
scale = 2.0;
}
out:
return scale;
}
float
meta_monitor_calculate_mode_scale (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode)
{
MetaBackend *backend = meta_get_backend ();
MetaSettings *settings = meta_backend_get_settings (backend);
int global_scaling_factor;
if (meta_settings_get_global_scaling_factor (settings,
&global_scaling_factor))
return global_scaling_factor;
return calculate_scale (monitor, monitor_mode);
}
static float
get_closest_scale_factor_for_resolution (float width,
float height,
float scale,
float scale_step)
{
unsigned int i, j;
float scaled_h;
float scaled_w;
float best_scale;
int base_scaled_w;
gboolean limit_exceeded;
gboolean found_one;
best_scale = 0;
scaled_w = width / scale;
scaled_h = height / scale;
if (scale < MINIMUM_SCALE_FACTOR ||
scale > MAXIMUM_SCALE_FACTOR ||
floorf (scaled_w) < MINIMUM_LOGICAL_WIDTH ||
floorf (scaled_h) < MINIMUM_LOGICAL_HEIGHT)
goto out;
if (floorf (scaled_w) == scaled_w && floorf (scaled_h) == scaled_h)
return scale;
i = 0;
found_one = FALSE;
limit_exceeded = FALSE;
base_scaled_w = floorf (scaled_w);
do
{
for (j = 0; j < 2; j++)
{
float current_scale;
int offset = i * (j ? 1 : -1);
scaled_w = base_scaled_w + offset;
current_scale = width / scaled_w;
scaled_h = height / current_scale;
if (current_scale >= scale + scale_step ||
current_scale <= scale - scale_step ||
current_scale < MINIMUM_SCALE_FACTOR ||
current_scale > MAXIMUM_SCALE_FACTOR)
{
limit_exceeded = TRUE;
continue;
}
if (floorf (scaled_h) == scaled_h)
{
found_one = TRUE;
if (fabsf (current_scale - scale) < fabsf (best_scale - scale))
best_scale = current_scale;
}
}
i++;
}
while (!found_one && !limit_exceeded);
out:
return best_scale;
}
float *
meta_monitor_calculate_supported_scales (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
MetaMonitorScalesConstraint constraints,
int *n_supported_scales)
{
unsigned int i, j;
int width, height;
float scale_steps;
GArray *supported_scales;
scale_steps = 1.0 / (float) SCALE_FACTORS_PER_INTEGER;
supported_scales = g_array_new (FALSE, FALSE, sizeof (float));
meta_monitor_mode_get_resolution (monitor_mode, &width, &height);
for (i = floorf (MINIMUM_SCALE_FACTOR);
i <= ceilf (MAXIMUM_SCALE_FACTOR);
i++)
{
for (j = 0; j < SCALE_FACTORS_PER_INTEGER; j++)
{
float scale;
float scale_value = i + j * scale_steps;
if ((constraints & META_MONITOR_SCALES_CONSTRAINT_NO_FRAC) &&
fmodf (scale_value, 1.0) != 0.0)
{
continue;
}
scale = get_closest_scale_factor_for_resolution (width,
height,
scale_value,
scale_steps);
if (scale > 0.0f)
g_array_append_val (supported_scales, scale);
}
}
*n_supported_scales = supported_scales->len;
return (float *) g_array_free (supported_scales, FALSE);
}
MetaMonitorModeSpec * MetaMonitorModeSpec *
meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode) meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode)
{ {
return &monitor_mode->spec; return &monitor_mode->spec;
} }
const char *
meta_monitor_mode_get_id (MetaMonitorMode *monitor_mode)
{
return monitor_mode->id;
}
void void
meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode, meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode,
int *width, int *width,
@@ -1564,12 +997,6 @@ meta_monitor_mode_get_refresh_rate (MetaMonitorMode *monitor_mode)
return monitor_mode->spec.refresh_rate; return monitor_mode->spec.refresh_rate;
} }
MetaCrtcModeFlag
meta_monitor_mode_get_flags (MetaMonitorMode *monitor_mode)
{
return monitor_mode->spec.flags;
}
gboolean gboolean
meta_monitor_mode_foreach_crtc (MetaMonitor *monitor, meta_monitor_mode_foreach_crtc (MetaMonitor *monitor,
MetaMonitorMode *mode, MetaMonitorMode *mode,

View File

@@ -39,7 +39,6 @@ typedef struct _MetaMonitorModeSpec
int width; int width;
int height; int height;
float refresh_rate; float refresh_rate;
MetaCrtcModeFlag flags;
} MetaMonitorModeSpec; } MetaMonitorModeSpec;
typedef struct _MetaMonitorCrtcMode typedef struct _MetaMonitorCrtcMode
@@ -54,12 +53,6 @@ typedef gboolean (* MetaMonitorModeFunc) (MetaMonitor *monitor,
gpointer user_data, gpointer user_data,
GError **error); GError **error);
typedef enum _MetaMonitorScalesConstraint
{
META_MONITOR_SCALES_CONSTRAINT_NONE = 0,
META_MONITOR_SCALES_CONSTRAINT_NO_FRAC = (1 << 0),
} MetaMonitorScalesConstraint;
#define META_TYPE_MONITOR (meta_monitor_get_type ()) #define META_TYPE_MONITOR (meta_monitor_get_type ())
G_DECLARE_DERIVABLE_TYPE (MetaMonitor, meta_monitor, META, MONITOR, GObject) G_DECLARE_DERIVABLE_TYPE (MetaMonitor, meta_monitor, META, MONITOR, GObject)
@@ -68,17 +61,15 @@ struct _MetaMonitorClass
GObjectClass parent_class; GObjectClass parent_class;
MetaOutput * (* get_main_output) (MetaMonitor *monitor); MetaOutput * (* get_main_output) (MetaMonitor *monitor);
void (* derive_layout) (MetaMonitor *monitor, void (* derive_dimensions) (MetaMonitor *monitor,
MetaRectangle *layout); int *width,
int *height);
void (* calculate_crtc_pos) (MetaMonitor *monitor, void (* calculate_crtc_pos) (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode, MetaMonitorMode *monitor_mode,
MetaOutput *output, MetaOutput *output,
MetaMonitorTransform crtc_transform, MetaMonitorTransform crtc_transform,
int *out_x, int *out_x,
int *out_y); int *out_y);
gboolean (* get_suggested_position) (MetaMonitor *monitor,
int *width,
int *height);
}; };
#define META_TYPE_MONITOR_NORMAL (meta_monitor_normal_get_type ()) #define META_TYPE_MONITOR_NORMAL (meta_monitor_normal_get_type ())
@@ -94,8 +85,7 @@ G_DECLARE_FINAL_TYPE (MetaMonitorTiled, meta_monitor_tiled,
MetaMonitorTiled * meta_monitor_tiled_new (MetaMonitorManager *monitor_manager, MetaMonitorTiled * meta_monitor_tiled_new (MetaMonitorManager *monitor_manager,
MetaOutput *main_output); MetaOutput *main_output);
MetaMonitorNormal * meta_monitor_normal_new (MetaMonitorManager *monitor_manager, MetaMonitorNormal * meta_monitor_normal_new (MetaOutput *output);
MetaOutput *output);
MetaMonitorSpec * meta_monitor_get_spec (MetaMonitor *monitor); MetaMonitorSpec * meta_monitor_get_spec (MetaMonitor *monitor);
@@ -117,8 +107,9 @@ void meta_monitor_get_current_resolution (MetaMonitor *monitor,
int *width, int *width,
int *height); int *height);
void meta_monitor_derive_layout (MetaMonitor *monitor, void meta_monitor_derive_dimensions (MetaMonitor *monitor,
MetaRectangle *layout); int *width,
int *height);
void meta_monitor_get_physical_dimensions (MetaMonitor *monitor, void meta_monitor_get_physical_dimensions (MetaMonitor *monitor,
int *width_mm, int *width_mm,
@@ -144,9 +135,6 @@ gboolean meta_monitor_get_suggested_position (MetaMonitor *monitor,
MetaLogicalMonitor * meta_monitor_get_logical_monitor (MetaMonitor *monitor); MetaLogicalMonitor * meta_monitor_get_logical_monitor (MetaMonitor *monitor);
MetaMonitorMode * meta_monitor_get_mode_from_id (MetaMonitor *monitor,
const char *monitor_mode_id);
MetaMonitorMode * meta_monitor_get_mode_from_spec (MetaMonitor *monitor, MetaMonitorMode * meta_monitor_get_mode_from_spec (MetaMonitor *monitor,
MetaMonitorModeSpec *monitor_mode_spec); MetaMonitorModeSpec *monitor_mode_spec);
@@ -168,16 +156,6 @@ void meta_monitor_calculate_crtc_pos (MetaMonitor *monitor,
int *out_x, int *out_x,
int *out_y); int *out_y);
float meta_monitor_calculate_mode_scale (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode);
float * meta_monitor_calculate_supported_scales (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
MetaMonitorScalesConstraint constraints,
int *n_supported_scales);
const char * meta_monitor_mode_get_id (MetaMonitorMode *monitor_mode);
MetaMonitorModeSpec * meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode); MetaMonitorModeSpec * meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode);
void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode, void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode,
@@ -186,8 +164,6 @@ void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode,
float meta_monitor_mode_get_refresh_rate (MetaMonitorMode *monitor_mode); float meta_monitor_mode_get_refresh_rate (MetaMonitorMode *monitor_mode);
MetaCrtcModeFlag meta_monitor_mode_get_flags (MetaMonitorMode *monitor_mode);
gboolean meta_monitor_mode_foreach_crtc (MetaMonitor *monitor, gboolean meta_monitor_mode_foreach_crtc (MetaMonitor *monitor,
MetaMonitorMode *mode, MetaMonitorMode *mode,
MetaMonitorModeFunc func, MetaMonitorModeFunc func,

View File

@@ -1,280 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2017 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include "config.h"
#include <gio/gio.h>
#include "backends/meta-orientation-manager.h"
enum
{
ORIENTATION_CHANGED,
N_SIGNALS
};
static guint signals[N_SIGNALS];
struct _MetaOrientationManager
{
GObject parent_instance;
GCancellable *cancellable;
guint iio_watch_id;
GDBusProxy *iio_proxy;
MetaOrientation prev_orientation;
MetaOrientation curr_orientation;
GSettings *settings;
};
G_DEFINE_TYPE (MetaOrientationManager, meta_orientation_manager, G_TYPE_OBJECT)
#define CONF_SCHEMA "org.gnome.settings-daemon.peripherals.touchscreen"
#define ORIENTATION_LOCK_KEY "orientation-lock"
static MetaOrientation
orientation_from_string (const char *orientation)
{
if (g_strcmp0 (orientation, "normal") == 0)
return META_ORIENTATION_NORMAL;
if (g_strcmp0 (orientation, "bottom-up") == 0)
return META_ORIENTATION_BOTTOM_UP;
if (g_strcmp0 (orientation, "left-up") == 0)
return META_ORIENTATION_LEFT_UP;
if (g_strcmp0 (orientation, "right-up") == 0)
return META_ORIENTATION_RIGHT_UP;
return META_ORIENTATION_UNDEFINED;
}
static void
read_iio_proxy (MetaOrientationManager *self)
{
gboolean has_accel = FALSE;
GVariant *v;
self->curr_orientation = META_ORIENTATION_UNDEFINED;
if (!self->iio_proxy)
return;
v = g_dbus_proxy_get_cached_property (self->iio_proxy, "HasAccelerometer");
if (v)
{
has_accel = g_variant_get_boolean (v);
g_variant_unref (v);
}
if (has_accel)
{
v = g_dbus_proxy_get_cached_property (self->iio_proxy, "AccelerometerOrientation");
if (v)
{
self->curr_orientation = orientation_from_string (g_variant_get_string (v, NULL));
g_variant_unref (v);
}
}
}
static void
sync_state (MetaOrientationManager *self)
{
read_iio_proxy (self);
if (self->prev_orientation == self->curr_orientation)
return;
self->prev_orientation = self->curr_orientation;
if (self->curr_orientation == META_ORIENTATION_UNDEFINED)
return;
if (g_settings_get_boolean (self->settings, ORIENTATION_LOCK_KEY))
return;
g_signal_emit (self, signals[ORIENTATION_CHANGED], 0);
}
static void
orientation_lock_changed (GSettings *settings,
gchar *key,
gpointer user_data)
{
MetaOrientationManager *self = user_data;
sync_state (self);
}
static void
iio_properties_changed (GDBusProxy *proxy,
GVariant *changed_properties,
GStrv invalidated_properties,
gpointer user_data)
{
MetaOrientationManager *self = user_data;
sync_state (self);
}
static void
accelerometer_claimed (GObject *source,
GAsyncResult *res,
gpointer user_data)
{
MetaOrientationManager *self = user_data;
GVariant *v;
GError *error = NULL;
v = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), res, &error);
if (!v)
{
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning ("Failed to claim accelerometer: %s", error->message);
g_error_free (error);
return;
}
g_variant_unref (v);
sync_state (self);
}
static void
iio_proxy_ready (GObject *source,
GAsyncResult *res,
gpointer user_data)
{
MetaOrientationManager *self = user_data;
GDBusProxy *proxy;
GError *error = NULL;
proxy = g_dbus_proxy_new_finish (res, &error);
if (!proxy)
{
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning ("Failed to obtain IIO DBus proxy: %s", error->message);
g_error_free (error);
return;
}
self->iio_proxy = proxy;
g_signal_connect_object (self->iio_proxy, "g-properties-changed",
G_CALLBACK (iio_properties_changed), self, 0);
g_dbus_proxy_call (self->iio_proxy,
"ClaimAccelerometer",
NULL,
G_DBUS_CALL_FLAGS_NONE,
-1,
self->cancellable,
accelerometer_claimed,
self);
}
static void
iio_sensor_appeared_cb (GDBusConnection *connection,
const gchar *name,
const gchar *name_owner,
gpointer user_data)
{
MetaOrientationManager *self = user_data;
self->cancellable = g_cancellable_new ();
g_dbus_proxy_new (connection,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
"net.hadess.SensorProxy",
"/net/hadess/SensorProxy",
"net.hadess.SensorProxy",
self->cancellable,
iio_proxy_ready,
self);
}
static void
iio_sensor_vanished_cb (GDBusConnection *connection,
const gchar *name,
gpointer user_data)
{
MetaOrientationManager *self = user_data;
g_cancellable_cancel (self->cancellable);
g_clear_object (&self->cancellable);
g_clear_object (&self->iio_proxy);
sync_state (self);
}
static void
meta_orientation_manager_init (MetaOrientationManager *self)
{
self->iio_watch_id = g_bus_watch_name (G_BUS_TYPE_SYSTEM,
"net.hadess.SensorProxy",
G_BUS_NAME_WATCHER_FLAGS_NONE,
iio_sensor_appeared_cb,
iio_sensor_vanished_cb,
self,
NULL);
self->settings = g_settings_new (CONF_SCHEMA);
g_signal_connect_object (self->settings, "changed::"ORIENTATION_LOCK_KEY,
G_CALLBACK (orientation_lock_changed), self, 0);
sync_state (self);
}
static void
meta_orientation_manager_finalize (GObject *object)
{
MetaOrientationManager *self = META_ORIENTATION_MANAGER (object);
g_cancellable_cancel (self->cancellable);
g_clear_object (&self->cancellable);
g_bus_unwatch_name (self->iio_watch_id);
g_clear_object (&self->iio_proxy);
g_clear_object (&self->settings);
G_OBJECT_CLASS (meta_orientation_manager_parent_class)->finalize (object);
}
static void
meta_orientation_manager_class_init (MetaOrientationManagerClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = meta_orientation_manager_finalize;
signals[ORIENTATION_CHANGED] =
g_signal_new ("orientation-changed",
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
}
MetaOrientation
meta_orientation_manager_get_orientation (MetaOrientationManager *self)
{
return self->curr_orientation;
}

View File

@@ -1,40 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2017 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_ORIENTATION_MANAGER_H
#define META_ORIENTATION_MANAGER_H
typedef enum
{
META_ORIENTATION_UNDEFINED,
META_ORIENTATION_NORMAL,
META_ORIENTATION_BOTTOM_UP,
META_ORIENTATION_LEFT_UP,
META_ORIENTATION_RIGHT_UP
} MetaOrientation;
#define META_TYPE_ORIENTATION_MANAGER (meta_orientation_manager_get_type ())
G_DECLARE_FINAL_TYPE (MetaOrientationManager, meta_orientation_manager,
META, ORIENTATION_MANAGER, GObject)
MetaOrientation meta_orientation_manager_get_orientation (MetaOrientationManager *self);
#endif /* META_ORIENTATION_MANAGER_H */

View File

@@ -1,59 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2017 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_SETTINGS_PRIVATE_H
#define META_SETTINGS_PRIVATE_H
#include <glib-object.h>
#include "meta/meta-settings.h"
#include "meta/types.h"
typedef enum _MetaExperimentalFeature
{
META_EXPERIMENTAL_FEATURE_NONE = 0,
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0),
} MetaExperimentalFeature;
#define META_TYPE_SETTINGS (meta_settings_get_type ())
G_DECLARE_FINAL_TYPE (MetaSettings, meta_settings,
META, SETTINGS, GObject)
MetaSettings * meta_settings_new (MetaBackend *backend);
void meta_settings_post_init (MetaSettings *settings);
void meta_settings_update_ui_scaling_factor (MetaSettings *settings);
gboolean meta_settings_get_global_scaling_factor (MetaSettings *settings,
int *scaing_factor);
gboolean meta_settings_is_experimental_feature_enabled (MetaSettings *settings,
MetaExperimentalFeature feature);
MetaExperimentalFeature meta_settings_get_experimental_features (MetaSettings *settings);
void meta_settings_override_experimental_features (MetaSettings *settings);
void meta_settings_enable_experimental_feature (MetaSettings *settings,
MetaExperimentalFeature feature);
#endif /* META_SETTINGS_PRIVATE_H */

View File

@@ -1,396 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2017 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include "config.h"
#include "backends/meta-settings-private.h"
#include <gio/gio.h>
#include "backends/meta-backend-private.h"
#include "backends/meta-logical-monitor.h"
#include "backends/meta-monitor-manager-private.h"
#include "ui/theme-private.h"
enum
{
UI_SCALING_FACTOR_CHANGED,
GLOBAL_SCALING_FACTOR_CHANGED,
FONT_DPI_CHANGED,
EXPERIMENTAL_FEATURES_CHANGED,
N_SIGNALS
};
static guint signals[N_SIGNALS];
struct _MetaSettings
{
GObject parent;
MetaBackend *backend;
GSettings *interface_settings;
GSettings *mutter_settings;
int ui_scaling_factor;
int global_scaling_factor;
int font_dpi;
MetaExperimentalFeature experimental_features;
gboolean experimental_features_overridden;
};
G_DEFINE_TYPE (MetaSettings, meta_settings, G_TYPE_OBJECT)
static int
calculate_ui_scaling_factor (MetaSettings *settings)
{
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (settings->backend);
GList *logical_monitors;
GList *l;
float max_scale = 1.0;
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager);
for (l = logical_monitors; l; l = l->next)
{
MetaLogicalMonitor *logical_monitor = l->data;
max_scale = MAX (meta_logical_monitor_get_scale (logical_monitor),
max_scale);
}
g_warn_if_fail (fmodf (max_scale, 1.0) == 0.0);
return (int) max_scale;
}
static gboolean
update_ui_scaling_factor (MetaSettings *settings)
{
int ui_scaling_factor;
if (meta_is_stage_views_scaled ())
ui_scaling_factor = 1;
else
ui_scaling_factor = calculate_ui_scaling_factor (settings);
if (settings->ui_scaling_factor != ui_scaling_factor)
{
settings->ui_scaling_factor = ui_scaling_factor;
return TRUE;
}
else
{
return FALSE;
}
}
void
meta_settings_update_ui_scaling_factor (MetaSettings *settings)
{
if (update_ui_scaling_factor (settings))
g_signal_emit (settings, signals[UI_SCALING_FACTOR_CHANGED], 0);
}
int
meta_settings_get_ui_scaling_factor (MetaSettings *settings)
{
g_assert (settings->ui_scaling_factor != 0);
return settings->ui_scaling_factor;
}
static gboolean
update_global_scaling_factor (MetaSettings *settings)
{
int global_scaling_factor;
global_scaling_factor =
(int) g_settings_get_uint (settings->interface_settings,
"scaling-factor");
if (settings->global_scaling_factor != global_scaling_factor)
{
settings->global_scaling_factor = global_scaling_factor;
return TRUE;
}
else
{
return FALSE;
}
}
gboolean
meta_settings_get_global_scaling_factor (MetaSettings *settings,
int *out_scaling_factor)
{
if (settings->global_scaling_factor == 0)
return FALSE;
*out_scaling_factor = settings->global_scaling_factor;
return TRUE;
}
static gboolean
update_font_dpi (MetaSettings *settings)
{
double text_scaling_factor;
/* Number of logical pixels on an inch when unscaled */
const double dots_per_inch = 96;
/* Being based on Xft, API users expect the DPI to be 1/1024th of an inch. */
const double xft_factor = 1024;
int font_dpi;
text_scaling_factor = g_settings_get_double (settings->interface_settings,
"text-scaling-factor");
font_dpi = (int) (text_scaling_factor *
dots_per_inch *
xft_factor *
settings->ui_scaling_factor);
if (font_dpi != settings->font_dpi)
{
settings->font_dpi = font_dpi;
g_object_set (clutter_settings_get_default (),
"font-dpi", font_dpi,
NULL);
return TRUE;
}
else
{
return FALSE;
}
}
static void
meta_settings_update_font_dpi (MetaSettings *settings)
{
if (update_font_dpi (settings))
g_signal_emit (settings, signals[FONT_DPI_CHANGED], 0);
}
int
meta_settings_get_font_dpi (MetaSettings *settings)
{
g_assert (settings->font_dpi != 0);
return settings->font_dpi;
}
static void
interface_settings_changed (GSettings *interface_settings,
const char *key,
MetaSettings *settings)
{
if (g_str_equal (key, "scaling-factor"))
{
if (update_global_scaling_factor (settings))
g_signal_emit (settings, signals[GLOBAL_SCALING_FACTOR_CHANGED], 0);
}
else if (g_str_equal (key, "text-scaling-factor"))
{
meta_settings_update_font_dpi (settings);
}
}
gboolean
meta_settings_is_experimental_feature_enabled (MetaSettings *settings,
MetaExperimentalFeature feature)
{
return !!(settings->experimental_features & feature);
}
void
meta_settings_override_experimental_features (MetaSettings *settings)
{
settings->experimental_features = META_EXPERIMENTAL_FEATURE_NONE;
settings->experimental_features_overridden = TRUE;
}
void
meta_settings_enable_experimental_feature (MetaSettings *settings,
MetaExperimentalFeature feature)
{
g_assert (settings->experimental_features_overridden);
settings->experimental_features |= feature;
}
static gboolean
experimental_features_handler (GVariant *features_variant,
gpointer *result,
gpointer data)
{
MetaSettings *settings = data;
GVariantIter features_iter;
char *feature;
MetaExperimentalFeature features = META_EXPERIMENTAL_FEATURE_NONE;
if (settings->experimental_features_overridden)
{
*result = GINT_TO_POINTER (FALSE);
return TRUE;
}
g_variant_iter_init (&features_iter, features_variant);
while (g_variant_iter_loop (&features_iter, "s", &feature))
{
/* So far no experimental features defined. */
if (g_str_equal (feature, "scale-monitor-framebuffer"))
features |= META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER;
else
g_info ("Unknown experimental feature '%s'\n", feature);
}
if (features != settings->experimental_features)
{
settings->experimental_features = features;
*result = GINT_TO_POINTER (TRUE);
}
else
{
*result = GINT_TO_POINTER (FALSE);
}
return TRUE;
}
static gboolean
update_experimental_features (MetaSettings *settings)
{
return GPOINTER_TO_INT (g_settings_get_mapped (settings->mutter_settings,
"experimental-features",
experimental_features_handler,
settings));
}
static void
mutter_settings_changed (GSettings *mutter_settings,
gchar *key,
MetaSettings *settings)
{
MetaExperimentalFeature old_experimental_features;
if (!g_str_equal (key, "experimental-features"))
return;
old_experimental_features = settings->experimental_features;
if (update_experimental_features (settings))
g_signal_emit (settings, signals[EXPERIMENTAL_FEATURES_CHANGED], 0,
(unsigned int) old_experimental_features);
}
MetaSettings *
meta_settings_new (MetaBackend *backend)
{
MetaSettings *settings;
settings = g_object_new (META_TYPE_SETTINGS, NULL);
settings->backend = backend;
return settings;
}
static void
meta_settings_dispose (GObject *object)
{
MetaSettings *settings = META_SETTINGS (object);
g_clear_object (&settings->mutter_settings);
g_clear_object (&settings->interface_settings);
G_OBJECT_CLASS (meta_settings_parent_class)->dispose (object);
}
static void
meta_settings_init (MetaSettings *settings)
{
settings->interface_settings = g_settings_new ("org.gnome.desktop.interface");
g_signal_connect (settings->interface_settings, "changed",
G_CALLBACK (interface_settings_changed),
settings);
settings->mutter_settings = g_settings_new ("org.gnome.mutter");
g_signal_connect (settings->mutter_settings, "changed",
G_CALLBACK (mutter_settings_changed),
settings);
/* Chain up inter-dependent settings. */
g_signal_connect (settings, "global-scaling-factor-changed",
G_CALLBACK (meta_settings_update_ui_scaling_factor), NULL);
g_signal_connect (settings, "ui-scaling-factor-changed",
G_CALLBACK (meta_settings_update_font_dpi), NULL);
update_global_scaling_factor (settings);
update_experimental_features (settings);
}
void
meta_settings_post_init (MetaSettings *settings)
{
update_ui_scaling_factor (settings);
update_font_dpi (settings);
}
static void
meta_settings_class_init (MetaSettingsClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = meta_settings_dispose;
signals[UI_SCALING_FACTOR_CHANGED] =
g_signal_new ("ui-scaling-factor-changed",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
signals[GLOBAL_SCALING_FACTOR_CHANGED] =
g_signal_new ("global-scaling-factor-changed",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
signals[FONT_DPI_CHANGED] =
g_signal_new ("font-dpi-changed",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
signals[EXPERIMENTAL_FEATURES_CHANGED] =
g_signal_new ("experimental-features-changed",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
}

View File

@@ -36,8 +36,8 @@ struct _MetaOverlay {
CoglPipeline *pipeline; CoglPipeline *pipeline;
CoglTexture *texture; CoglTexture *texture;
ClutterRect current_rect; MetaRectangle current_rect;
ClutterRect previous_rect; MetaRectangle previous_rect;
gboolean previous_is_valid; gboolean previous_is_valid;
}; };
@@ -71,9 +71,9 @@ meta_overlay_free (MetaOverlay *overlay)
} }
static void static void
meta_overlay_set (MetaOverlay *overlay, meta_overlay_set (MetaOverlay *overlay,
CoglTexture *texture, CoglTexture *texture,
ClutterRect *rect) MetaRectangle *rect)
{ {
if (overlay->texture != texture) if (overlay->texture != texture)
{ {
@@ -104,12 +104,12 @@ meta_overlay_paint (MetaOverlay *overlay)
cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (), cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (),
overlay->pipeline, overlay->pipeline,
overlay->current_rect.origin.x, overlay->current_rect.x,
overlay->current_rect.origin.y, overlay->current_rect.y,
(overlay->current_rect.origin.x + overlay->current_rect.x +
overlay->current_rect.size.width), overlay->current_rect.width,
(overlay->current_rect.origin.y + overlay->current_rect.y +
overlay->current_rect.size.height)); overlay->current_rect.height);
overlay->previous_rect = overlay->current_rect; overlay->previous_rect = overlay->current_rect;
overlay->previous_is_valid = TRUE; overlay->previous_is_valid = TRUE;
@@ -204,10 +204,10 @@ queue_redraw_for_overlay (MetaStage *stage,
/* Clear the location the overlay was at before, if we need to. */ /* Clear the location the overlay was at before, if we need to. */
if (overlay->previous_is_valid) if (overlay->previous_is_valid)
{ {
clip.x = floorf (overlay->previous_rect.origin.x), clip.x = overlay->previous_rect.x;
clip.y = floorf (overlay->previous_rect.origin.y), clip.y = overlay->previous_rect.y;
clip.width = ceilf (overlay->previous_rect.size.width), clip.width = overlay->previous_rect.width;
clip.height = ceilf (overlay->previous_rect.size.height), clip.height = overlay->previous_rect.height;
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip); clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip);
overlay->previous_is_valid = FALSE; overlay->previous_is_valid = FALSE;
} }
@@ -215,10 +215,10 @@ queue_redraw_for_overlay (MetaStage *stage,
/* Draw the overlay at the new position */ /* Draw the overlay at the new position */
if (overlay->enabled) if (overlay->enabled)
{ {
clip.x = floorf (overlay->current_rect.origin.x), clip.x = overlay->current_rect.x;
clip.y = floorf (overlay->current_rect.origin.y), clip.y = overlay->current_rect.y;
clip.width = ceilf (overlay->current_rect.size.width), clip.width = overlay->current_rect.width;
clip.height = ceilf (overlay->current_rect.size.height), clip.height = overlay->current_rect.height;
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip); clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip);
} }
} }
@@ -251,10 +251,10 @@ meta_stage_remove_cursor_overlay (MetaStage *stage,
} }
void void
meta_stage_update_cursor_overlay (MetaStage *stage, meta_stage_update_cursor_overlay (MetaStage *stage,
MetaOverlay *overlay, MetaOverlay *overlay,
CoglTexture *texture, CoglTexture *texture,
ClutterRect *rect) MetaRectangle *rect)
{ {
g_assert (meta_is_wayland_compositor () || texture == NULL); g_assert (meta_is_wayland_compositor () || texture == NULL);

View File

@@ -56,10 +56,10 @@ MetaOverlay *meta_stage_create_cursor_overlay (MetaStage *stage);
void meta_stage_remove_cursor_overlay (MetaStage *stage, void meta_stage_remove_cursor_overlay (MetaStage *stage,
MetaOverlay *overlay); MetaOverlay *overlay);
void meta_stage_update_cursor_overlay (MetaStage *stage, void meta_stage_update_cursor_overlay (MetaStage *stage,
MetaOverlay *overlay, MetaOverlay *overlay,
CoglTexture *texture, CoglTexture *texture,
ClutterRect *rect); MetaRectangle *rect);
void meta_stage_set_active (MetaStage *stage, void meta_stage_set_active (MetaStage *stage,
gboolean is_active); gboolean is_active);

View File

@@ -45,7 +45,6 @@
#include "backends/meta-pointer-constraint.h" #include "backends/meta-pointer-constraint.h"
#include "backends/meta-stage.h" #include "backends/meta-stage.h"
#include "backends/native/meta-clutter-backend-native.h" #include "backends/native/meta-clutter-backend-native.h"
#include "backends/native/meta-input-settings-native.h"
#include "backends/native/meta-renderer-native.h" #include "backends/native/meta-renderer-native.h"
#include "backends/native/meta-stage-native.h" #include "backends/native/meta-stage-native.h"
@@ -268,7 +267,7 @@ relative_motion_across_outputs (MetaMonitorManager *monitor_manager,
MetaLogicalMonitor *cur = current; MetaLogicalMonitor *cur = current;
float x = cur_x, y = cur_y; float x = cur_x, y = cur_y;
float dx = *dx_inout, dy = *dy_inout; float dx = *dx_inout, dy = *dy_inout;
MetaDisplayDirection direction = -1; MetaScreenDirection direction = -1;
while (cur) while (cur)
{ {
@@ -296,18 +295,18 @@ relative_motion_across_outputs (MetaMonitorManager *monitor_manager,
{ cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height } { cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height }
}; };
if (direction != META_DISPLAY_RIGHT && if (direction != META_SCREEN_RIGHT &&
meta_line2_intersects_with (&motion, &left, &intersection)) meta_line2_intersects_with (&motion, &left, &intersection))
direction = META_DISPLAY_LEFT; direction = META_SCREEN_LEFT;
else if (direction != META_DISPLAY_LEFT && else if (direction != META_SCREEN_LEFT &&
meta_line2_intersects_with (&motion, &right, &intersection)) meta_line2_intersects_with (&motion, &right, &intersection))
direction = META_DISPLAY_RIGHT; direction = META_SCREEN_RIGHT;
else if (direction != META_DISPLAY_DOWN && else if (direction != META_SCREEN_DOWN &&
meta_line2_intersects_with (&motion, &top, &intersection)) meta_line2_intersects_with (&motion, &top, &intersection))
direction = META_DISPLAY_UP; direction = META_SCREEN_UP;
else if (direction != META_DISPLAY_UP && else if (direction != META_SCREEN_UP &&
meta_line2_intersects_with (&motion, &bottom, &intersection)) meta_line2_intersects_with (&motion, &bottom, &intersection))
direction = META_DISPLAY_DOWN; direction = META_SCREEN_DOWN;
else else
{ {
/* We reached the dest logical monitor */ /* We reached the dest logical monitor */
@@ -341,9 +340,6 @@ relative_motion_filter (ClutterInputDevice *device,
MetaLogicalMonitor *logical_monitor, *dest_logical_monitor; MetaLogicalMonitor *logical_monitor, *dest_logical_monitor;
float new_dx, new_dy; float new_dx, new_dy;
if (meta_is_stage_views_scaled ())
return;
logical_monitor = meta_monitor_manager_get_logical_monitor_at (monitor_manager, logical_monitor = meta_monitor_manager_get_logical_monitor_at (monitor_manager,
x, y); x, y);
if (!logical_monitor) if (!logical_monitor)
@@ -435,12 +431,6 @@ meta_backend_native_create_renderer (MetaBackend *backend)
return META_RENDERER (renderer_native); return META_RENDERER (renderer_native);
} }
static MetaInputSettings *
meta_backend_native_create_input_settings (MetaBackend *backend)
{
return g_object_new (META_TYPE_INPUT_SETTINGS_NATIVE, NULL);
}
static void static void
meta_backend_native_warp_pointer (MetaBackend *backend, meta_backend_native_warp_pointer (MetaBackend *backend,
int x, int x,
@@ -507,24 +497,11 @@ meta_backend_native_get_keymap (MetaBackend *backend)
return clutter_evdev_get_keyboard_map (manager); return clutter_evdev_get_keyboard_map (manager);
} }
static xkb_layout_index_t
meta_backend_native_get_keymap_layout_group (MetaBackend *backend)
{
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
return clutter_evdev_get_keyboard_layout_index (manager);
}
static void static void
meta_backend_native_lock_layout_group (MetaBackend *backend, meta_backend_native_lock_layout_group (MetaBackend *backend,
guint idx) guint idx)
{ {
ClutterDeviceManager *manager = clutter_device_manager_get_default (); ClutterDeviceManager *manager = clutter_device_manager_get_default ();
xkb_layout_index_t old_idx;
old_idx = meta_backend_native_get_keymap_layout_group (backend);
if (old_idx == idx)
return;
clutter_evdev_set_keyboard_layout_index (manager, idx); clutter_evdev_set_keyboard_layout_index (manager, idx);
meta_backend_notify_keymap_layout_group_changed (backend, idx); meta_backend_notify_keymap_layout_group_changed (backend, idx);
@@ -584,7 +561,6 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager; backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer; backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer;
backend_class->create_renderer = meta_backend_native_create_renderer; backend_class->create_renderer = meta_backend_native_create_renderer;
backend_class->create_input_settings = meta_backend_native_create_input_settings;
backend_class->warp_pointer = meta_backend_native_warp_pointer; backend_class->warp_pointer = meta_backend_native_warp_pointer;
@@ -592,7 +568,6 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
backend_class->set_keymap = meta_backend_native_set_keymap; backend_class->set_keymap = meta_backend_native_set_keymap;
backend_class->get_keymap = meta_backend_native_get_keymap; backend_class->get_keymap = meta_backend_native_get_keymap;
backend_class->get_keymap_layout_group = meta_backend_native_get_keymap_layout_group;
backend_class->lock_layout_group = meta_backend_native_lock_layout_group; backend_class->lock_layout_group = meta_backend_native_lock_layout_group;
backend_class->get_relative_motion_deltas = meta_backend_native_get_relative_motion_deltas; backend_class->get_relative_motion_deltas = meta_backend_native_get_relative_motion_deltas;
backend_class->update_screen_size = meta_backend_native_update_screen_size; backend_class->update_screen_size = meta_backend_native_update_screen_size;
@@ -682,14 +657,11 @@ meta_backend_native_pause (MetaBackendNative *native)
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
MetaMonitorManagerKms *monitor_manager_kms = MetaMonitorManagerKms *monitor_manager_kms =
META_MONITOR_MANAGER_KMS (monitor_manager); META_MONITOR_MANAGER_KMS (monitor_manager);
MetaRendererNative *renderer_native =
META_RENDERER_NATIVE (meta_backend_get_renderer (backend));
clutter_evdev_release_devices (); clutter_evdev_release_devices ();
clutter_egl_freeze_master_clock (); clutter_egl_freeze_master_clock ();
meta_monitor_manager_kms_pause (monitor_manager_kms); meta_monitor_manager_kms_pause (monitor_manager_kms);
meta_renderer_native_pause (renderer_native);
} }
void meta_backend_native_resume (MetaBackendNative *native) void meta_backend_native_resume (MetaBackendNative *native)

View File

@@ -39,7 +39,6 @@
#include "backends/meta-monitor.h" #include "backends/meta-monitor.h"
#include "backends/meta-monitor-manager-private.h" #include "backends/meta-monitor-manager-private.h"
#include "backends/native/meta-renderer-native.h" #include "backends/native/meta-renderer-native.h"
#include "core/boxes-private.h"
#include "meta/boxes.h" #include "meta/boxes.h"
#ifndef DRM_CAP_CURSOR_WIDTH #ifndef DRM_CAP_CURSOR_WIDTH
@@ -221,7 +220,7 @@ typedef struct
{ {
MetaCursorRendererNative *in_cursor_renderer_native; MetaCursorRendererNative *in_cursor_renderer_native;
MetaLogicalMonitor *in_logical_monitor; MetaLogicalMonitor *in_logical_monitor;
ClutterRect in_local_cursor_rect; MetaRectangle in_local_cursor_rect;
MetaCursorSprite *in_cursor_sprite; MetaCursorSprite *in_cursor_sprite;
gboolean out_painted; gboolean out_painted;
@@ -239,50 +238,43 @@ update_monitor_crtc_cursor (MetaMonitor *monitor,
data->in_cursor_renderer_native; data->in_cursor_renderer_native;
MetaCursorRendererNativePrivate *priv = MetaCursorRendererNativePrivate *priv =
meta_cursor_renderer_native_get_instance_private (cursor_renderer_native); meta_cursor_renderer_native_get_instance_private (cursor_renderer_native);
ClutterRect scaled_crtc_rect; MetaRectangle scaled_crtc_rect;
float scale; int scale;
int crtc_x, crtc_y; int crtc_x, crtc_y;
if (meta_is_stage_views_scaled ()) if (meta_is_stage_views_scaled ())
scale = meta_logical_monitor_get_scale (data->in_logical_monitor); scale = meta_logical_monitor_get_scale (data->in_logical_monitor);
else else
scale = 1.0; scale = 1;
meta_monitor_calculate_crtc_pos (monitor, monitor_mode, meta_monitor_calculate_crtc_pos (monitor, monitor_mode,
monitor_crtc_mode->output, monitor_crtc_mode->output,
META_MONITOR_TRANSFORM_NORMAL, META_MONITOR_TRANSFORM_NORMAL,
&crtc_x, &crtc_y); &crtc_x, &crtc_y);
scaled_crtc_rect = (ClutterRect) { scaled_crtc_rect = (MetaRectangle) {
.origin = { .x = crtc_x / scale,
.x = crtc_x / scale, .y = crtc_y / scale,
.y = crtc_y / scale .width = monitor_crtc_mode->crtc_mode->width / scale,
}, .height = monitor_crtc_mode->crtc_mode->height / scale
.size = {
.width = monitor_crtc_mode->crtc_mode->width / scale,
.height = monitor_crtc_mode->crtc_mode->height / scale
},
}; };
if (priv->has_hw_cursor && if (priv->has_hw_cursor &&
clutter_rect_intersection (&scaled_crtc_rect, meta_rectangle_overlap (&scaled_crtc_rect,
&data->in_local_cursor_rect, &data->in_local_cursor_rect))
NULL))
{ {
float crtc_cursor_x, crtc_cursor_y; int crtc_cursor_x, crtc_cursor_y;
set_crtc_cursor (data->in_cursor_renderer_native, set_crtc_cursor (data->in_cursor_renderer_native,
monitor_crtc_mode->output->crtc, monitor_crtc_mode->output->crtc,
data->in_cursor_sprite); data->in_cursor_sprite);
crtc_cursor_x = (data->in_local_cursor_rect.origin.x - crtc_cursor_x = (data->in_local_cursor_rect.x - scaled_crtc_rect.x) * scale;
scaled_crtc_rect.origin.x) * scale; crtc_cursor_y = (data->in_local_cursor_rect.y - scaled_crtc_rect.y) * scale;
crtc_cursor_y = (data->in_local_cursor_rect.origin.y -
scaled_crtc_rect.origin.y) * scale;
drmModeMoveCursor (priv->drm_fd, drmModeMoveCursor (priv->drm_fd,
monitor_crtc_mode->output->crtc->crtc_id, monitor_crtc_mode->output->crtc->crtc_id,
roundf (crtc_cursor_x), crtc_cursor_x,
roundf (crtc_cursor_y)); crtc_cursor_y);
data->out_painted = data->out_painted || TRUE; data->out_painted = data->out_painted || TRUE;
} }
@@ -306,13 +298,13 @@ update_hw_cursor (MetaCursorRendererNative *native,
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
GList *logical_monitors; GList *logical_monitors;
GList *l; GList *l;
ClutterRect rect; MetaRectangle rect;
gboolean painted = FALSE; gboolean painted = FALSE;
if (cursor_sprite) if (cursor_sprite)
rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite); rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
else else
rect = (ClutterRect) { 0 }; rect = (MetaRectangle) { 0 };
logical_monitors = logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager); meta_monitor_manager_get_logical_monitors (monitor_manager);
@@ -326,12 +318,11 @@ update_hw_cursor (MetaCursorRendererNative *native,
data = (UpdateCrtcCursorData) { data = (UpdateCrtcCursorData) {
.in_cursor_renderer_native = native, .in_cursor_renderer_native = native,
.in_logical_monitor = logical_monitor, .in_logical_monitor = logical_monitor,
.in_local_cursor_rect = (ClutterRect) { .in_local_cursor_rect = (MetaRectangle) {
.origin = { .x = rect.x - logical_monitor->rect.x,
.x = rect.origin.x - logical_monitor->rect.x, .y = rect.y - logical_monitor->rect.y,
.y = rect.origin.y - logical_monitor->rect.y .width = rect.width,
}, .height = rect.height
.size = rect.size
}, },
.in_cursor_sprite = cursor_sprite .in_cursor_sprite = cursor_sprite
}; };
@@ -383,37 +374,25 @@ has_valid_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite)
} }
static gboolean static gboolean
cursor_over_transformed_logical_monitor (MetaCursorRenderer *renderer, cursor_over_transformed_crtc (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaBackend *backend = meta_get_backend (); MetaMonitorManager *monitors;
MetaMonitorManager *monitor_manager = MetaCrtc *crtcs;
meta_backend_get_monitor_manager (backend); unsigned int i, n_crtcs;
GList *logical_monitors; MetaRectangle rect;
GList *l;
ClutterRect cursor_rect;
cursor_rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite); monitors = meta_monitor_manager_get ();
logical_monitors = meta_monitor_manager_get_resources (monitors, NULL, NULL,
meta_monitor_manager_get_logical_monitors (monitor_manager); &crtcs, &n_crtcs, NULL, NULL);
for (l = logical_monitors; l; l = l->next) rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
for (i = 0; i < n_crtcs; i++)
{ {
MetaLogicalMonitor *logical_monitor = l->data; if (!meta_rectangle_overlap (&rect, &crtcs[i].rect))
MetaRectangle logical_monitor_layout;
ClutterRect logical_monitor_rect;
MetaMonitorTransform transform;
logical_monitor_layout =
meta_logical_monitor_get_layout (logical_monitor);
logical_monitor_rect =
meta_rectangle_to_clutter_rect (&logical_monitor_layout);
if (!clutter_rect_intersection (&cursor_rect, &logical_monitor_rect,
NULL))
continue; continue;
transform = meta_logical_monitor_get_transform (logical_monitor); if (crtcs[i].transform != META_MONITOR_TRANSFORM_NORMAL)
if (transform != META_MONITOR_TRANSFORM_NORMAL)
return TRUE; return TRUE;
} }
@@ -434,7 +413,7 @@ can_draw_cursor_unscaled (MetaCursorRenderer *renderer,
{ {
MetaBackend *backend; MetaBackend *backend;
MetaMonitorManager *monitor_manager; MetaMonitorManager *monitor_manager;
ClutterRect cursor_rect; MetaRectangle cursor_rect;
GList *logical_monitors; GList *logical_monitors;
GList *l; GList *l;
gboolean has_visible_crtc_sprite = FALSE; gboolean has_visible_crtc_sprite = FALSE;
@@ -455,12 +434,8 @@ can_draw_cursor_unscaled (MetaCursorRenderer *renderer,
for (l = logical_monitors; l; l = l->next) for (l = logical_monitors; l; l = l->next)
{ {
MetaLogicalMonitor *logical_monitor = l->data; MetaLogicalMonitor *logical_monitor = l->data;
ClutterRect logical_monitor_rect =
meta_rectangle_to_clutter_rect (&logical_monitor->rect);
if (!clutter_rect_intersection (&cursor_rect, if (!meta_rectangle_overlap (&cursor_rect, &logical_monitor->rect))
&logical_monitor_rect,
NULL))
continue; continue;
if (calculate_cursor_crtc_sprite_scale (cursor_sprite, if (calculate_cursor_crtc_sprite_scale (cursor_sprite,
@@ -487,7 +462,7 @@ should_have_hw_cursor (MetaCursorRenderer *renderer,
if (!cursor_sprite) if (!cursor_sprite)
return FALSE; return FALSE;
if (cursor_over_transformed_logical_monitor (renderer, cursor_sprite)) if (cursor_over_transformed_crtc (renderer, cursor_sprite))
return FALSE; return FALSE;
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite); texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);

View File

@@ -121,43 +121,6 @@ meta_input_settings_native_set_tap_enabled (MetaInputSettings *settings,
LIBINPUT_CONFIG_TAP_DISABLED); LIBINPUT_CONFIG_TAP_DISABLED);
} }
static void
meta_input_settings_native_set_tap_and_drag_enabled (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean enabled)
{
struct libinput_device *libinput_device;
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
if (!libinput_device)
return;
if (libinput_device_config_tap_get_finger_count (libinput_device) > 0)
libinput_device_config_tap_set_drag_enabled (libinput_device,
enabled ?
LIBINPUT_CONFIG_DRAG_ENABLED :
LIBINPUT_CONFIG_DRAG_DISABLED);
}
static void
meta_input_settings_native_set_disable_while_typing (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean enabled)
{
struct libinput_device *libinput_device;
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
if (!libinput_device)
return;
if (libinput_device_config_dwt_is_available (libinput_device))
libinput_device_config_dwt_set_enabled (libinput_device,
enabled ?
LIBINPUT_CONFIG_DWT_ENABLED :
LIBINPUT_CONFIG_DWT_DISABLED);
}
static void static void
meta_input_settings_native_set_invert_scroll (MetaInputSettings *settings, meta_input_settings_native_set_invert_scroll (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
@@ -469,18 +432,8 @@ meta_input_settings_native_set_tablet_area (MetaInputSettings *settings,
gdouble padding_bottom) gdouble padding_bottom)
{ {
struct libinput_device *libinput_device; struct libinput_device *libinput_device;
gfloat scale_x; gfloat matrix[6] = { 1. - (padding_left + padding_right), 0., padding_left,
gfloat scale_y; 0., 1. - (padding_top + padding_bottom), padding_top };
gfloat offset_x;
gfloat offset_y;
scale_x = 1. / (1. - (padding_left + padding_right));
scale_y = 1. / (1. - (padding_top + padding_bottom));
offset_x = -padding_left * scale_x;
offset_y = -padding_top * scale_y;
gfloat matrix[6] = { scale_x, 0., offset_x,
0., scale_y, offset_y };
libinput_device = clutter_evdev_input_device_get_libinput_device (device); libinput_device = clutter_evdev_input_device_get_libinput_device (device);
if (!libinput_device || if (!libinput_device ||
@@ -548,14 +501,12 @@ meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass)
input_settings_class->set_speed = meta_input_settings_native_set_speed; input_settings_class->set_speed = meta_input_settings_native_set_speed;
input_settings_class->set_left_handed = meta_input_settings_native_set_left_handed; input_settings_class->set_left_handed = meta_input_settings_native_set_left_handed;
input_settings_class->set_tap_enabled = meta_input_settings_native_set_tap_enabled; input_settings_class->set_tap_enabled = meta_input_settings_native_set_tap_enabled;
input_settings_class->set_tap_and_drag_enabled = meta_input_settings_native_set_tap_and_drag_enabled;
input_settings_class->set_invert_scroll = meta_input_settings_native_set_invert_scroll; input_settings_class->set_invert_scroll = meta_input_settings_native_set_invert_scroll;
input_settings_class->set_edge_scroll = meta_input_settings_native_set_edge_scroll; input_settings_class->set_edge_scroll = meta_input_settings_native_set_edge_scroll;
input_settings_class->set_two_finger_scroll = meta_input_settings_native_set_two_finger_scroll; input_settings_class->set_two_finger_scroll = meta_input_settings_native_set_two_finger_scroll;
input_settings_class->set_scroll_button = meta_input_settings_native_set_scroll_button; input_settings_class->set_scroll_button = meta_input_settings_native_set_scroll_button;
input_settings_class->set_click_method = meta_input_settings_native_set_click_method; input_settings_class->set_click_method = meta_input_settings_native_set_click_method;
input_settings_class->set_keyboard_repeat = meta_input_settings_native_set_keyboard_repeat; input_settings_class->set_keyboard_repeat = meta_input_settings_native_set_keyboard_repeat;
input_settings_class->set_disable_while_typing = meta_input_settings_native_set_disable_while_typing;
input_settings_class->set_tablet_mapping = meta_input_settings_native_set_tablet_mapping; input_settings_class->set_tablet_mapping = meta_input_settings_native_set_tablet_mapping;
input_settings_class->set_tablet_keep_aspect = meta_input_settings_native_set_tablet_keep_aspect; input_settings_class->set_tablet_keep_aspect = meta_input_settings_native_set_tablet_keep_aspect;

View File

@@ -188,22 +188,9 @@ on_evdev_device_open (const char *path,
/* Allow readonly access to sysfs */ /* Allow readonly access to sysfs */
if (g_str_has_prefix (path, "/sys/")) if (g_str_has_prefix (path, "/sys/"))
{ {
do fd = open (path, flags);
{ if (fd >= 0)
fd = open (path, flags); g_hash_table_add (self->sysfs_fds, GINT_TO_POINTER (fd));
}
while (fd < 0 && errno == EINTR);
if (fd < 0)
{
g_set_error (error,
G_FILE_ERROR,
g_file_error_from_errno (errno),
"Could not open /sys file: %s: %m", path);
return -1;
}
g_hash_table_add (self->sysfs_fds, GINT_TO_POINTER (fd));
return fd; return fd;
} }

View File

@@ -24,6 +24,7 @@
#include "config.h" #include "config.h"
#include "meta-monitor-manager-kms.h" #include "meta-monitor-manager-kms.h"
#include "meta-monitor-config.h"
#include "meta-monitor-config-manager.h" #include "meta-monitor-config-manager.h"
#include "meta-backend-private.h" #include "meta-backend-private.h"
#include "meta-renderer-native.h" #include "meta-renderer-native.h"
@@ -41,7 +42,7 @@
#include <xf86drmMode.h> #include <xf86drmMode.h>
#include <meta/main.h> #include <meta/main.h>
#include <meta/meta-x11-errors.h> #include <meta/errors.h>
#include <gudev/gudev.h> #include <gudev/gudev.h>
@@ -51,6 +52,11 @@
#define ALL_TRANSFORMS_MASK ((1 << ALL_TRANSFORMS) - 1) #define ALL_TRANSFORMS_MASK ((1 << ALL_TRANSFORMS) - 1)
#define SYNC_TOLERANCE 0.01 /* 1 percent */ #define SYNC_TOLERANCE 0.01 /* 1 percent */
static float supported_scales_kms[] = {
1.0,
2.0
};
typedef struct typedef struct
{ {
drmModeConnector *connector; drmModeConnector *connector;
@@ -109,6 +115,8 @@ struct _MetaMonitorManagerKms
GUdevClient *udev; GUdevClient *udev;
guint uevent_handler_id; guint uevent_handler_id;
GSettings *desktop_settings;
gboolean page_flips_not_supported; gboolean page_flips_not_supported;
int max_buffer_width; int max_buffer_width;
@@ -1090,7 +1098,7 @@ init_outputs (MetaMonitorManager *manager,
MetaOutput *old_output; MetaOutput *old_output;
old_output = find_output_by_id (old_outputs, n_old_outputs, old_output = find_output_by_id (old_outputs, n_old_outputs,
connector->connector_id); output->winsys_id);
init_output (output, manager, connector, old_output); init_output (output, manager, connector, old_output);
n_actual_outputs++; n_actual_outputs++;
} }
@@ -1252,7 +1260,10 @@ meta_monitor_manager_kms_ensure_initial_config (MetaMonitorManager *manager)
config = meta_monitor_manager_ensure_configured (manager); config = meta_monitor_manager_ensure_configured (manager);
meta_monitor_manager_update_logical_state (manager, config); if (meta_is_monitor_config_manager_enabled ())
meta_monitor_manager_update_logical_state (manager, config);
else
meta_monitor_manager_update_logical_state_derived (manager);
} }
static void static void
@@ -1458,6 +1469,37 @@ meta_monitor_manager_kms_apply_monitors_config (MetaMonitorManager *manager
return TRUE; return TRUE;
} }
static void
legacy_calculate_screen_size (MetaMonitorManager *manager)
{
unsigned int i;
int width = 0, height = 0;
for (i = 0; i < manager->n_crtcs; i++)
{
MetaCrtc *crtc = &manager->crtcs[i];
width = MAX (width, crtc->rect.x + crtc->rect.width);
height = MAX (height, crtc->rect.y + crtc->rect.height);
}
manager->screen_width = width;
manager->screen_height = height;
}
static void
meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
MetaCrtcInfo **crtcs,
unsigned int n_crtcs,
MetaOutputInfo **outputs,
unsigned int n_outputs)
{
apply_crtc_assignments (manager, crtcs, n_crtcs, outputs, n_outputs);
legacy_calculate_screen_size (manager);
meta_monitor_manager_rebuild_derived (manager);
}
static void static void
meta_monitor_manager_kms_get_crtc_gamma (MetaMonitorManager *manager, meta_monitor_manager_kms_get_crtc_gamma (MetaMonitorManager *manager,
MetaCrtc *crtc, MetaCrtc *crtc,
@@ -1597,6 +1639,8 @@ meta_monitor_manager_kms_init (MetaMonitorManagerKms *manager_kms)
G_IO_IN | G_IO_ERR); G_IO_IN | G_IO_ERR);
manager_kms->source->manager_kms = manager_kms; manager_kms->source->manager_kms = manager_kms;
g_source_attach (source, NULL); g_source_attach (source, NULL);
manager_kms->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
} }
static void static void
@@ -1788,50 +1832,113 @@ meta_monitor_manager_kms_is_transform_handled (MetaMonitorManager *manager,
return FALSE; return FALSE;
} }
static float /* The minimum resolution at which we turn on a window-scale of 2 */
#define HIDPI_LIMIT 192
/* The minimum screen height at which we turn on a window-scale of 2;
* below this there just isn't enough vertical real estate for GNOME
* apps to work, and it's better to just be tiny */
#define HIDPI_MIN_HEIGHT 1200
/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */
#define SMALLEST_4K_WIDTH 3656
static int
compute_scale (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode)
{
int resolution_width, resolution_height;
int width_mm, height_mm;
int scale;
scale = 1;
meta_monitor_mode_get_resolution (monitor_mode,
&resolution_width,
&resolution_height);
if (resolution_height < HIDPI_MIN_HEIGHT)
goto out;
/* 4K TV */
switch (meta_monitor_get_connector_type (monitor))
{
case META_CONNECTOR_TYPE_HDMIA:
case META_CONNECTOR_TYPE_HDMIB:
if (resolution_width >= SMALLEST_4K_WIDTH)
goto out;
break;
default:
break;
}
meta_monitor_get_physical_dimensions (monitor, &width_mm, &height_mm);
/*
* Somebody encoded the aspect ratio (16/9 or 16/10) instead of the physical
* size.
*/
if ((width_mm == 160 && height_mm == 90) ||
(width_mm == 160 && height_mm == 100) ||
(width_mm == 16 && height_mm == 9) ||
(width_mm == 16 && height_mm == 10))
goto out;
if (width_mm > 0 && height_mm > 0)
{
double dpi_x, dpi_y;
dpi_x = (double) resolution_width / (width_mm / 25.4);
dpi_y = (double) resolution_height / (height_mm / 25.4);
/*
* We don't completely trust these values so both must be high, and never
* pick higher ratio than 2 automatically.
*/
if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT)
scale = 2;
}
out:
return scale;
}
static int
meta_monitor_manager_kms_calculate_monitor_mode_scale (MetaMonitorManager *manager, meta_monitor_manager_kms_calculate_monitor_mode_scale (MetaMonitorManager *manager,
MetaMonitor *monitor, MetaMonitor *monitor,
MetaMonitorMode *monitor_mode) MetaMonitorMode *monitor_mode)
{ {
return meta_monitor_calculate_mode_scale (monitor, monitor_mode); MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
int global_scale;
global_scale = g_settings_get_uint (manager_kms->desktop_settings,
"scaling-factor");
if (global_scale > 0)
return global_scale;
else
return compute_scale (monitor, monitor_mode);
} }
static float * static void
meta_monitor_manager_kms_calculate_supported_scales (MetaMonitorManager *manager, meta_monitor_manager_kms_get_supported_scales (MetaMonitorManager *manager,
MetaLogicalMonitorLayoutMode layout_mode, float **scales,
MetaMonitor *monitor, int *n_scales)
MetaMonitorMode *monitor_mode,
int *n_supported_scales)
{ {
MetaMonitorScalesConstraint constraints = *scales = supported_scales_kms;
META_MONITOR_SCALES_CONSTRAINT_NONE; *n_scales = G_N_ELEMENTS (supported_scales_kms);
switch (layout_mode)
{
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
break;
case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
constraints |= META_MONITOR_SCALES_CONSTRAINT_NO_FRAC;
break;
}
return meta_monitor_calculate_supported_scales (monitor, monitor_mode,
constraints,
n_supported_scales);
} }
static MetaMonitorManagerCapability static MetaMonitorManagerCapability
meta_monitor_manager_kms_get_capabilities (MetaMonitorManager *manager) meta_monitor_manager_kms_get_capabilities (MetaMonitorManager *manager)
{ {
MetaBackend *backend = meta_get_backend (); MetaBackend *backend = meta_get_backend ();
MetaSettings *settings = meta_backend_get_settings (backend);
MetaRenderer *renderer = meta_backend_get_renderer (backend); MetaRenderer *renderer = meta_backend_get_renderer (backend);
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer); MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
MetaMonitorManagerCapability capabilities = MetaMonitorManagerCapability capabilities =
META_MONITOR_MANAGER_CAPABILITY_NONE; META_MONITOR_MANAGER_CAPABILITY_NONE;
if (meta_settings_is_experimental_feature_enabled ( if (meta_backend_is_experimental_feature_enabled (
settings, backend,
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER)) META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER))
capabilities |= META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE; capabilities |= META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE;
@@ -1868,14 +1975,11 @@ meta_monitor_manager_kms_get_max_screen_size (MetaMonitorManager *manager,
static MetaLogicalMonitorLayoutMode static MetaLogicalMonitorLayoutMode
meta_monitor_manager_kms_get_default_layout_mode (MetaMonitorManager *manager) meta_monitor_manager_kms_get_default_layout_mode (MetaMonitorManager *manager)
{ {
MetaBackend *backend = meta_get_backend ();
MetaSettings *settings = meta_backend_get_settings (backend);
if (!meta_is_stage_views_enabled ()) if (!meta_is_stage_views_enabled ())
return META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL; return META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL;
if (meta_settings_is_experimental_feature_enabled ( if (meta_backend_is_experimental_feature_enabled (
settings, meta_get_backend (),
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER)) META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER))
return META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL; return META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL;
else else
@@ -1888,6 +1992,7 @@ meta_monitor_manager_kms_dispose (GObject *object)
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (object); MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (object);
g_clear_object (&manager_kms->udev); g_clear_object (&manager_kms->udev);
g_clear_object (&manager_kms->desktop_settings);
G_OBJECT_CLASS (meta_monitor_manager_kms_parent_class)->dispose (object); G_OBJECT_CLASS (meta_monitor_manager_kms_parent_class)->dispose (object);
} }
@@ -1916,12 +2021,13 @@ meta_monitor_manager_kms_class_init (MetaMonitorManagerKmsClass *klass)
manager_class->read_edid = meta_monitor_manager_kms_read_edid; manager_class->read_edid = meta_monitor_manager_kms_read_edid;
manager_class->ensure_initial_config = meta_monitor_manager_kms_ensure_initial_config; manager_class->ensure_initial_config = meta_monitor_manager_kms_ensure_initial_config;
manager_class->apply_monitors_config = meta_monitor_manager_kms_apply_monitors_config; manager_class->apply_monitors_config = meta_monitor_manager_kms_apply_monitors_config;
manager_class->apply_configuration = meta_monitor_manager_kms_apply_configuration;
manager_class->set_power_save_mode = meta_monitor_manager_kms_set_power_save_mode; manager_class->set_power_save_mode = meta_monitor_manager_kms_set_power_save_mode;
manager_class->get_crtc_gamma = meta_monitor_manager_kms_get_crtc_gamma; manager_class->get_crtc_gamma = meta_monitor_manager_kms_get_crtc_gamma;
manager_class->set_crtc_gamma = meta_monitor_manager_kms_set_crtc_gamma; manager_class->set_crtc_gamma = meta_monitor_manager_kms_set_crtc_gamma;
manager_class->is_transform_handled = meta_monitor_manager_kms_is_transform_handled; manager_class->is_transform_handled = meta_monitor_manager_kms_is_transform_handled;
manager_class->calculate_monitor_mode_scale = meta_monitor_manager_kms_calculate_monitor_mode_scale; manager_class->calculate_monitor_mode_scale = meta_monitor_manager_kms_calculate_monitor_mode_scale;
manager_class->calculate_supported_scales = meta_monitor_manager_kms_calculate_supported_scales; manager_class->get_supported_scales = meta_monitor_manager_kms_get_supported_scales;
manager_class->get_capabilities = meta_monitor_manager_kms_get_capabilities; manager_class->get_capabilities = meta_monitor_manager_kms_get_capabilities;
manager_class->get_max_screen_size = meta_monitor_manager_kms_get_max_screen_size; manager_class->get_max_screen_size = meta_monitor_manager_kms_get_max_screen_size;
manager_class->get_default_layout_mode = meta_monitor_manager_kms_get_default_layout_mode; manager_class->get_default_layout_mode = meta_monitor_manager_kms_get_default_layout_mode;

View File

@@ -1707,7 +1707,7 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
MetaMonitorTransform view_transform; MetaMonitorTransform view_transform;
CoglOnscreen *onscreen = NULL; CoglOnscreen *onscreen = NULL;
CoglOffscreen *offscreen = NULL; CoglOffscreen *offscreen = NULL;
float scale; int scale;
int width, height; int width, height;
MetaRendererView *view; MetaRendererView *view;
GError *error = NULL; GError *error = NULL;
@@ -1715,9 +1715,9 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
view_transform = calculate_view_transform (monitor_manager, logical_monitor); view_transform = calculate_view_transform (monitor_manager, logical_monitor);
if (meta_is_stage_views_scaled ()) if (meta_is_stage_views_scaled ())
scale = meta_logical_monitor_get_scale (logical_monitor); scale = logical_monitor->scale;
else else
scale = 1.0; scale = 1;
width = logical_monitor->rect.width * scale; width = logical_monitor->rect.width * scale;
height = logical_monitor->rect.height * scale; height = logical_monitor->rect.height * scale;
@@ -1786,24 +1786,6 @@ meta_renderer_native_get_frame_counter (MetaRendererNative *renderer_native)
return renderer_native->frame_counter; return renderer_native->frame_counter;
} }
void
meta_renderer_native_pause (MetaRendererNative *renderer_native)
{
GList *views;
GList *l;
views = meta_renderer_get_views (META_RENDERER (renderer_native));
for (l = views; l; l = l->next)
{
ClutterStageView *stage_view = l->data;
g_object_set (G_OBJECT (stage_view),
"framebuffer", NULL,
"offscreen", NULL,
NULL);
}
}
static void static void
meta_renderer_native_get_property (GObject *object, meta_renderer_native_get_property (GObject *object,
guint prop_id, guint prop_id,
@@ -2088,23 +2070,16 @@ meta_renderer_native_initable_init (GInitable *initable,
GError *egl_device_error = NULL; GError *egl_device_error = NULL;
#endif #endif
#ifdef HAVE_EGL_DEVICE
/* Try to initialize the EGLDevice backend first. Whenever we use a
* non-NVIDIA GPU, the EGLDevice enumeration function won't find a match, and
* we'll fall back to GBM (which will always succeed as it has a software
* rendering fallback)
*/
if (init_egl_device (renderer_native, &egl_device_error))
return TRUE;
#endif
if (init_gbm (renderer_native, &gbm_error)) if (init_gbm (renderer_native, &gbm_error))
{ return TRUE;
#ifdef HAVE_EGL_DEVICE #ifdef HAVE_EGL_DEVICE
g_error_free (egl_device_error); if (init_egl_device (renderer_native, &egl_device_error))
#endif {
g_error_free (gbm_error);
return TRUE; return TRUE;
} }
#endif
g_set_error (error, G_IO_ERROR, g_set_error (error, G_IO_ERROR,
G_IO_ERROR_FAILED, G_IO_ERROR_FAILED,

View File

@@ -71,6 +71,4 @@ void meta_renderer_native_finish_frame (MetaRendererNative *renderer_native);
int64_t meta_renderer_native_get_frame_counter (MetaRendererNative *renderer_native); int64_t meta_renderer_native_get_frame_counter (MetaRendererNative *renderer_native);
void meta_renderer_native_pause (MetaRendererNative *renderer_native);
#endif /* META_RENDERER_NATIVE_H */ #endif /* META_RENDERER_NATIVE_H */

View File

@@ -28,7 +28,6 @@
#include "backends/meta-backend-private.h" #include "backends/meta-backend-private.h"
#include "backends/x11/meta-cursor-renderer-x11.h" #include "backends/x11/meta-cursor-renderer-x11.h"
#include "backends/x11/meta-input-settings-x11.h"
#include "backends/x11/meta-monitor-manager-xrandr.h" #include "backends/x11/meta-monitor-manager-xrandr.h"
#include "backends/x11/cm/meta-renderer-x11-cm.h" #include "backends/x11/cm/meta-renderer-x11-cm.h"
@@ -109,12 +108,6 @@ meta_backend_x11_cm_create_cursor_renderer (MetaBackend *backend)
return g_object_new (META_TYPE_CURSOR_RENDERER_X11, NULL); return g_object_new (META_TYPE_CURSOR_RENDERER_X11, NULL);
} }
static MetaInputSettings *
meta_backend_x11_cm_create_input_settings (MetaBackend *backend)
{
return g_object_new (META_TYPE_INPUT_SETTINGS_X11, NULL);
}
static void static void
meta_backend_x11_cm_update_screen_size (MetaBackend *backend, meta_backend_x11_cm_update_screen_size (MetaBackend *backend,
int width, int width,
@@ -397,7 +390,6 @@ meta_backend_x11_cm_class_init (MetaBackendX11CmClass *klass)
backend_class->create_renderer = meta_backend_x11_cm_create_renderer; backend_class->create_renderer = meta_backend_x11_cm_create_renderer;
backend_class->create_monitor_manager = meta_backend_x11_cm_create_monitor_manager; backend_class->create_monitor_manager = meta_backend_x11_cm_create_monitor_manager;
backend_class->create_cursor_renderer = meta_backend_x11_cm_create_cursor_renderer; backend_class->create_cursor_renderer = meta_backend_x11_cm_create_cursor_renderer;
backend_class->create_input_settings = meta_backend_x11_cm_create_input_settings;
backend_class->update_screen_size = meta_backend_x11_cm_update_screen_size; backend_class->update_screen_size = meta_backend_x11_cm_update_screen_size;
backend_class->select_stage_events = meta_backend_x11_cm_select_stage_events; backend_class->select_stage_events = meta_backend_x11_cm_select_stage_events;
backend_class->lock_layout_group = meta_backend_x11_cm_lock_layout_group; backend_class->lock_layout_group = meta_backend_x11_cm_lock_layout_group;

View File

@@ -67,21 +67,12 @@ struct _MetaBackendX11Private
uint8_t xkb_error_base; uint8_t xkb_error_base;
struct xkb_keymap *keymap; struct xkb_keymap *keymap;
xkb_layout_index_t keymap_layout_group;
MetaLogicalMonitor *cached_current_logical_monitor; MetaLogicalMonitor *cached_current_logical_monitor;
}; };
typedef struct _MetaBackendX11Private MetaBackendX11Private; typedef struct _MetaBackendX11Private MetaBackendX11Private;
static GInitableIface *initable_parent_iface; G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendX11, meta_backend_x11, META_TYPE_BACKEND);
static void
initable_iface_init (GInitableIface *initable_iface);
G_DEFINE_TYPE_WITH_CODE (MetaBackendX11, meta_backend_x11, META_TYPE_BACKEND,
G_ADD_PRIVATE (MetaBackendX11)
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
initable_iface_init));
static void static void
handle_alarm_notify (MetaBackend *backend, handle_alarm_notify (MetaBackend *backend,
@@ -110,7 +101,7 @@ translate_device_event (MetaBackendX11 *x11,
meta_backend_x11_translate_device_event (x11, device_event); meta_backend_x11_translate_device_event (x11, device_event);
if (!device_event->send_event && device_event->time != META_CURRENT_TIME) if (!device_event->send_event && device_event->time != CurrentTime)
{ {
if (device_event->time < priv->latest_evtime) if (device_event->time < priv->latest_evtime)
{ {
@@ -266,7 +257,7 @@ handle_host_xevent (MetaBackend *backend,
if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event)) if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event))
bypass_clutter = TRUE; bypass_clutter = TRUE;
if (meta_dnd_handle_xdnd_event (backend, compositor, priv->xdisplay, event)) if (meta_dnd_handle_xdnd_event (backend, compositor, display, event))
bypass_clutter = TRUE; bypass_clutter = TRUE;
} }
} }
@@ -289,22 +280,6 @@ handle_host_xevent (MetaBackend *backend,
case XkbMapNotify: case XkbMapNotify:
keymap_changed (backend); keymap_changed (backend);
break; break;
case XkbStateNotify:
if (xkb_ev->state.changed & XkbGroupLockMask)
{
int layout_group;
gboolean layout_group_changed;
layout_group = xkb_ev->state.locked_group;
layout_group_changed =
(int) priv->keymap_layout_group != layout_group;
priv->keymap_layout_group = layout_group;
if (layout_group_changed)
meta_backend_notify_keymap_layout_group_changed (backend,
layout_group);
}
break;
default: default:
break; break;
} }
@@ -417,6 +392,8 @@ meta_backend_x11_post_init (MetaBackend *backend)
int major, minor; int major, minor;
gboolean has_xi = FALSE; gboolean has_xi = FALSE;
priv->xdisplay = clutter_x11_get_default_display ();
priv->source = x_event_source_new (backend); priv->source = x_event_source_new (backend);
if (!XSyncQueryExtension (priv->xdisplay, &priv->xsync_event_base, &priv->xsync_error_base) || if (!XSyncQueryExtension (priv->xdisplay, &priv->xsync_event_base, &priv->xsync_error_base) ||
@@ -441,6 +418,7 @@ meta_backend_x11_post_init (MetaBackend *backend)
if (!has_xi) if (!has_xi)
meta_fatal ("X server doesn't have the XInput extension, version 2.2 or newer\n"); meta_fatal ("X server doesn't have the XInput extension, version 2.2 or newer\n");
priv->xcb = XGetXCBConnection (priv->xdisplay);
if (!xkb_x11_setup_xkb_extension (priv->xcb, if (!xkb_x11_setup_xkb_extension (priv->xcb,
XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MAJOR_XKB_VERSION,
XKB_X11_MIN_MINOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION,
@@ -484,7 +462,7 @@ meta_backend_x11_grab_device (MetaBackend *backend,
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits }; XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
int ret; int ret;
if (timestamp != META_CURRENT_TIME) if (timestamp != CurrentTime)
timestamp = MAX (timestamp, priv->latest_evtime); timestamp = MAX (timestamp, priv->latest_evtime);
XISetMask (mask.mask, XI_ButtonPress); XISetMask (mask.mask, XI_ButtonPress);
@@ -584,15 +562,6 @@ meta_backend_x11_get_keymap (MetaBackend *backend)
return priv->keymap; return priv->keymap;
} }
static xkb_layout_index_t
meta_backend_x11_get_keymap_layout_group (MetaBackend *backend)
{
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
return priv->keymap_layout_group;
}
static void static void
meta_backend_x11_set_numlock (MetaBackend *backend, meta_backend_x11_set_numlock (MetaBackend *backend,
gboolean numlock_state) gboolean numlock_state)
@@ -617,68 +586,6 @@ meta_backend_x11_get_xkb_event_base (MetaBackendX11 *x11)
return priv->xkb_event_base; return priv->xkb_event_base;
} }
static void
init_xkb_state (MetaBackendX11 *x11)
{
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
struct xkb_keymap *keymap;
int32_t device_id;
struct xkb_state *state;
keymap = meta_backend_get_keymap (META_BACKEND (x11));
device_id = xkb_x11_get_core_keyboard_device_id (priv->xcb);
state = xkb_x11_state_new_from_device (keymap, priv->xcb, device_id);
priv->keymap_layout_group =
xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_LOCKED);
xkb_state_unref (state);
}
static gboolean
meta_backend_x11_initable_init (GInitable *initable,
GCancellable *cancellable,
GError **error)
{
MetaBackendX11 *x11 = META_BACKEND_X11 (initable);
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
Display *xdisplay;
const char *xdisplay_name;
xdisplay_name = g_getenv ("DISPLAY");
if (!xdisplay_name)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Unable to open display, DISPLAY not set");
return FALSE;
}
xdisplay = XOpenDisplay (xdisplay_name);
if (!xdisplay)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Unable to open display '%s'", xdisplay_name);
return FALSE;
}
priv->xdisplay = xdisplay;
priv->xcb = XGetXCBConnection (priv->xdisplay);
clutter_x11_set_display (xdisplay);
init_xkb_state (x11);
return initable_parent_iface->init (initable, cancellable, error);
}
static void
initable_iface_init (GInitableIface *initable_iface)
{
initable_parent_iface = g_type_interface_peek_parent (initable_iface);
initable_iface->init = meta_backend_x11_initable_init;
}
static void static void
meta_backend_x11_class_init (MetaBackendX11Class *klass) meta_backend_x11_class_init (MetaBackendX11Class *klass)
{ {
@@ -692,7 +599,6 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
backend_class->warp_pointer = meta_backend_x11_warp_pointer; backend_class->warp_pointer = meta_backend_x11_warp_pointer;
backend_class->get_current_logical_monitor = meta_backend_x11_get_current_logical_monitor; backend_class->get_current_logical_monitor = meta_backend_x11_get_current_logical_monitor;
backend_class->get_keymap = meta_backend_x11_get_keymap; backend_class->get_keymap = meta_backend_x11_get_keymap;
backend_class->get_keymap_layout_group = meta_backend_x11_get_keymap_layout_group;
backend_class->set_numlock = meta_backend_x11_set_numlock; backend_class->set_numlock = meta_backend_x11_set_numlock;
} }

View File

@@ -40,7 +40,6 @@
#include <meta/barrier.h> #include <meta/barrier.h>
#include "backends/x11/meta-barrier-x11.h" #include "backends/x11/meta-barrier-x11.h"
#include "display-private.h" #include "display-private.h"
#include "x11/meta-x11-display-private.h"
struct _MetaBarrierImplX11Private struct _MetaBarrierImplX11Private
{ {
@@ -69,11 +68,10 @@ _meta_barrier_impl_x11_release (MetaBarrierImpl *impl,
MetaBarrierImplX11Private *priv = MetaBarrierImplX11Private *priv =
meta_barrier_impl_x11_get_instance_private (self); meta_barrier_impl_x11_get_instance_private (self);
MetaDisplay *display = priv->barrier->priv->display; MetaDisplay *display = priv->barrier->priv->display;
Display *dpy = meta_x11_display_get_xdisplay (display->x11_display);
if (META_X11_DISPLAY_HAS_XINPUT_23 (display->x11_display)) if (META_DISPLAY_HAS_XINPUT_23 (display))
{ {
XIBarrierReleasePointer (dpy, XIBarrierReleasePointer (display->xdisplay,
META_VIRTUAL_CORE_POINTER_ID, META_VIRTUAL_CORE_POINTER_ID,
priv->xbarrier, event->event_id); priv->xbarrier, event->event_id);
} }
@@ -91,13 +89,13 @@ _meta_barrier_impl_x11_destroy (MetaBarrierImpl *impl)
if (display == NULL) if (display == NULL)
return; return;
dpy = meta_x11_display_get_xdisplay (display->x11_display); dpy = display->xdisplay;
if (!meta_barrier_is_active (priv->barrier)) if (!meta_barrier_is_active (priv->barrier))
return; return;
XFixesDestroyPointerBarrier (dpy, priv->xbarrier); XFixesDestroyPointerBarrier (dpy, priv->xbarrier);
g_hash_table_remove (display->x11_display->xids, &priv->xbarrier); g_hash_table_remove (display->xids, &priv->xbarrier);
priv->xbarrier = 0; priv->xbarrier = 0;
} }
@@ -121,7 +119,7 @@ meta_barrier_impl_x11_new (MetaBarrier *barrier)
priv = meta_barrier_impl_x11_get_instance_private (self); priv = meta_barrier_impl_x11_get_instance_private (self);
priv->barrier = barrier; priv->barrier = barrier;
dpy = meta_x11_display_get_xdisplay (display->x11_display); dpy = display->xdisplay;
root = DefaultRootWindow (dpy); root = DefaultRootWindow (dpy);
allowed_motion_dirs = allowed_motion_dirs =
@@ -134,7 +132,7 @@ meta_barrier_impl_x11_new (MetaBarrier *barrier)
allowed_motion_dirs, allowed_motion_dirs,
0, NULL); 0, NULL);
g_hash_table_insert (display->x11_display->xids, &priv->xbarrier, barrier); g_hash_table_insert (display->xids, &priv->xbarrier, barrier);
return META_BARRIER_IMPL (self); return META_BARRIER_IMPL (self);
} }
@@ -174,8 +172,8 @@ meta_barrier_fire_xevent (MetaBarrier *barrier,
} }
gboolean gboolean
meta_x11_display_process_barrier_xevent (MetaX11Display *x11_display, meta_display_process_barrier_xevent (MetaDisplay *display,
XIEvent *event) XIEvent *event)
{ {
MetaBarrier *barrier; MetaBarrier *barrier;
XIBarrierEvent *xev; XIBarrierEvent *xev;
@@ -193,7 +191,7 @@ meta_x11_display_process_barrier_xevent (MetaX11Display *x11_display,
} }
xev = (XIBarrierEvent *) event; xev = (XIBarrierEvent *) event;
barrier = g_hash_table_lookup (x11_display->xids, &xev->barrier); barrier = g_hash_table_lookup (display->xids, &xev->barrier);
if (barrier != NULL) if (barrier != NULL)
{ {
meta_barrier_fire_xevent (barrier, xev); meta_barrier_fire_xevent (barrier, xev);

View File

@@ -35,7 +35,7 @@
#include <gudev/gudev.h> #include <gudev/gudev.h>
#endif #endif
#include <meta/meta-x11-errors.h> #include <meta/errors.h>
#include "backends/meta-logical-monitor.h" #include "backends/meta-logical-monitor.h"
typedef struct _MetaInputSettingsX11Private typedef struct _MetaInputSettingsX11Private
@@ -189,14 +189,9 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
gboolean enabled) gboolean enabled)
{ {
ClutterInputDeviceType device_type;
guchar value; guchar value;
device_type = clutter_input_device_get_device_type (device); if (clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE)
if (device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE ||
device_type == CLUTTER_ERASER_DEVICE)
{ {
value = enabled ? 3 : 0; value = enabled ? 3 : 0;
change_property (device, "Wacom Rotation", change_property (device, "Wacom Rotation",
@@ -210,17 +205,6 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
} }
} }
static void
meta_input_settings_x11_set_disable_while_typing (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean enabled)
{
guchar value = (enabled) ? 1 : 0;
change_property (device, "libinput Disable While Typing Enabled",
XA_INTEGER, 8, &value, 1);
}
static void static void
meta_input_settings_x11_set_tap_enabled (MetaInputSettings *settings, meta_input_settings_x11_set_tap_enabled (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
@@ -232,17 +216,6 @@ meta_input_settings_x11_set_tap_enabled (MetaInputSettings *settings,
XA_INTEGER, 8, &value, 1); XA_INTEGER, 8, &value, 1);
} }
static void
meta_input_settings_x11_set_tap_and_drag_enabled (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean enabled)
{
guchar value = (enabled) ? 1 : 0;
change_property (device, "libinput TappingDrag Enabled",
XA_INTEGER, 8, &value, 1);
}
static void static void
meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings, meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
@@ -547,7 +520,7 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
return; return;
/* Grab the puke bucket! */ /* Grab the puke bucket! */
meta_x11_error_trap_push (display->x11_display); meta_error_trap_push (display);
xdev = XOpenDevice (xdisplay, device_id); xdev = XOpenDevice (xdisplay, device_id);
if (xdev) if (xdev)
{ {
@@ -557,26 +530,15 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
XCloseDevice (xdisplay, xdev); XCloseDevice (xdisplay, xdev);
} }
if (meta_x11_error_trap_pop_with_return (display->x11_display)) if (meta_error_trap_pop_with_return (display))
{ {
g_warning ("Could not set tablet mapping for %s", g_warning ("Could not set tablet mapping for %s",
clutter_input_device_get_device_name (device)); clutter_input_device_get_device_name (device));
} }
else
{
ClutterInputDeviceMapping dev_mapping;
dev_mapping = (mapping == G_DESKTOP_TABLET_MAPPING_ABSOLUTE) ?
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE :
CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE;
clutter_input_device_set_mapping_mode (device, dev_mapping);
}
} }
static gboolean static gboolean
device_query_area (ClutterInputDevice *device, device_query_area (ClutterInputDevice *device,
gint *x,
gint *y,
gint *width, gint *width,
gint *height) gint *height)
{ {
@@ -602,15 +564,9 @@ device_query_area (ClutterInputDevice *device,
if (valuator->type != XIValuatorClass) if (valuator->type != XIValuatorClass)
continue; continue;
if (valuator->label == abs_x) if (valuator->label == abs_x)
{ *width = valuator->max - valuator->min;
*x = valuator->min;
*width = valuator->max - valuator->min;
}
else if (valuator->label == abs_y) else if (valuator->label == abs_y)
{ *height = valuator->max - valuator->min;
*y = valuator->min;
*height = valuator->max - valuator->min;
}
} }
XIFreeDeviceInfo (info); XIFreeDeviceInfo (info);
@@ -634,15 +590,15 @@ meta_input_settings_x11_set_tablet_area (MetaInputSettings *settings,
gdouble padding_top, gdouble padding_top,
gdouble padding_bottom) gdouble padding_bottom)
{ {
gint32 x, y, width, height, area[4] = { 0 }; gint32 width, height, area[4] = { 0 };
if (!device_query_area (device, &x, &y, &width, &height)) if (!device_query_area (device, &width, &height))
return; return;
area[0] = (width * padding_left) + x; area[0] = width * padding_left;
area[1] = (height * padding_top) + y; area[1] = height * padding_top;
area[2] = width - (width * padding_right) + x; area[2] = width - (width * padding_right);
area[3] = height - (height * padding_bottom) + y; area[2] = height - (height * padding_bottom);
update_tablet_area (settings, device, area); update_tablet_area (settings, device, area);
} }
@@ -652,9 +608,9 @@ meta_input_settings_x11_set_tablet_keep_aspect (MetaInputSettings *settings,
MetaLogicalMonitor *logical_monitor, MetaLogicalMonitor *logical_monitor,
gboolean keep_aspect) gboolean keep_aspect)
{ {
gint32 width, height, dev_x, dev_y, dev_width, dev_height, area[4] = { 0 }; gint32 width, height, dev_width, dev_height, area[4] = { 0 };
if (!device_query_area (device, &dev_x, &dev_y, &dev_width, &dev_height)) if (!device_query_area (device, &dev_width, &dev_height))
return; return;
if (keep_aspect) if (keep_aspect)
@@ -686,10 +642,8 @@ meta_input_settings_x11_set_tablet_keep_aspect (MetaInputSettings *settings,
dev_height = dev_width / aspect_ratio; dev_height = dev_width / aspect_ratio;
} }
area[0] = dev_x; area[2] = dev_width;
area[1] = dev_y; area[3] = dev_height;
area[2] = dev_width + dev_x;
area[3] = dev_height + dev_y;
update_tablet_area (settings, device, area); update_tablet_area (settings, device, area);
} }
@@ -744,7 +698,7 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
return; return;
/* Grab the puke bucket! */ /* Grab the puke bucket! */
meta_x11_error_trap_push (display->x11_display); meta_error_trap_push (display);
xdev = XOpenDevice (xdisplay, device_id); xdev = XOpenDevice (xdisplay, device_id);
if (xdev) if (xdev)
{ {
@@ -758,7 +712,7 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
XCloseDevice (xdisplay, xdev); XCloseDevice (xdisplay, xdev);
} }
if (meta_x11_error_trap_pop_with_return (display->x11_display)) if (meta_error_trap_pop_with_return (display))
{ {
g_warning ("Could not set stylus button map for %s", g_warning ("Could not set stylus button map for %s",
clutter_input_device_get_device_name (device)); clutter_input_device_get_device_name (device));
@@ -790,8 +744,6 @@ meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
input_settings_class->set_speed = meta_input_settings_x11_set_speed; input_settings_class->set_speed = meta_input_settings_x11_set_speed;
input_settings_class->set_left_handed = meta_input_settings_x11_set_left_handed; input_settings_class->set_left_handed = meta_input_settings_x11_set_left_handed;
input_settings_class->set_tap_enabled = meta_input_settings_x11_set_tap_enabled; input_settings_class->set_tap_enabled = meta_input_settings_x11_set_tap_enabled;
input_settings_class->set_tap_and_drag_enabled = meta_input_settings_x11_set_tap_and_drag_enabled;
input_settings_class->set_disable_while_typing = meta_input_settings_x11_set_disable_while_typing;
input_settings_class->set_invert_scroll = meta_input_settings_x11_set_invert_scroll; input_settings_class->set_invert_scroll = meta_input_settings_x11_set_invert_scroll;
input_settings_class->set_edge_scroll = meta_input_settings_x11_set_edge_scroll; input_settings_class->set_edge_scroll = meta_input_settings_x11_set_edge_scroll;
input_settings_class->set_two_finger_scroll = meta_input_settings_x11_set_two_finger_scroll; input_settings_class->set_two_finger_scroll = meta_input_settings_x11_set_two_finger_scroll;

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