Compare commits
54 Commits
wip/carlos
...
wip/fmuell
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9622733140 | ||
|
|
16a2eab290 | ||
|
|
41a69f194d | ||
|
|
b77e6f0c98 | ||
|
|
b67394dcd1 | ||
|
|
f9e33a89fd | ||
|
|
39e9e53871 | ||
|
|
7f3fda6df6 | ||
|
|
73ce5b3a8d | ||
|
|
53319a121f | ||
|
|
cf2d06e9b9 | ||
|
|
d39211f438 | ||
|
|
909464f749 | ||
|
|
5669b64021 | ||
|
|
8f0b4767de | ||
|
|
9e75ce2ad7 | ||
|
|
c010a3b195 | ||
|
|
7c807c6e2a | ||
|
|
9a20271f90 | ||
|
|
1760a6e560 | ||
|
|
8c2b805d88 | ||
|
|
2f01418d45 | ||
|
|
a76107a19f | ||
|
|
6372e3e4db | ||
|
|
c80ba819e7 | ||
|
|
14c6a347c1 | ||
|
|
11bd847896 | ||
|
|
870f38542d | ||
|
|
c22edeff1f | ||
|
|
183de60d91 | ||
|
|
176b508029 | ||
|
|
9be189daa7 | ||
|
|
bf12a2497b | ||
|
|
55d168d01a | ||
|
|
8a9a78ec8a | ||
|
|
803ffc19a4 | ||
|
|
ddd2ce3a88 | ||
|
|
979e689278 | ||
|
|
2c1ab8b3cc | ||
|
|
252e64a0ea | ||
|
|
d2f1edd6c6 | ||
|
|
944a4763f6 | ||
|
|
22a296f971 | ||
|
|
ef2153739c | ||
|
|
9e1c8e2c22 | ||
|
|
fca0e6abb1 | ||
|
|
6975c8b424 | ||
|
|
f4f823f238 | ||
|
|
1c67260bd4 | ||
|
|
79f90c147c | ||
|
|
4e751a3b58 | ||
|
|
1c2e8fcf06 | ||
|
|
00ca387ec7 | ||
|
|
5688f1cf6e |
23
NEWS
23
NEWS
@@ -1,3 +1,26 @@
|
||||
3.31.91
|
||||
=======
|
||||
* Fix infinite loop in EDID matching [Marco; #459]
|
||||
* wayland: Don't resetin text-input state prematurely [Carlos; !410]
|
||||
* wayland: Don't maximize windows if minimum size is too big [Olivier; #463]
|
||||
* Fix crash when using "restore shortcuts" without focus window [Olivier; #464]
|
||||
* Add flag parameter to grab accelerator API [Andrea; !169]
|
||||
* Reuse old CRTC if possible to avoid flicker on hotplug [Pekka, Emilio; #373]
|
||||
* Misc. bug fixes and cleanups [Marco, Jonas, Niels, Adam, Olivier; !436,
|
||||
!421, #462, !439, !440, !444, !321, !445, !456]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Andrea Azzarone, Olivier Fourdan, Carlos Garnacho,
|
||||
Niels De Graef, Adam Jackson, Emilio Pozuelo Monfort, Pekka Paalanen,
|
||||
Marco Trevisan (Treviño)
|
||||
|
||||
Translators:
|
||||
Jiri Grönroos [fi], Charles Monzat [fr], Claude Paroz [fr], Fran Dieguez [gl],
|
||||
Emin Tufan Çetin [tr], Aurimas Černius [lt], Anders Jonsson [sv],
|
||||
Matej Urbančič [sl], Marek Cernocky [cs], Daniel Șerbănescu [ro],
|
||||
Alan Mortensen [da], Baurzhan Muftakhidinov [kk], Yi-Jyun Pan [zh_TW],
|
||||
Daniel Mustieles [es], Rafael Fontenelle [pt_BR]
|
||||
|
||||
3.31.90
|
||||
=======
|
||||
* Fix support of extended characters in on-screen keyboard [Andrea; #109]
|
||||
|
||||
@@ -283,9 +283,6 @@ void _clutter_actor_queue_redraw_full
|
||||
const ClutterPaintVolume *volume,
|
||||
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,
|
||||
ClutterPaintVolume *clip);
|
||||
|
||||
|
||||
@@ -635,6 +635,7 @@
|
||||
#include "clutter-interval.h"
|
||||
#include "clutter-main.h"
|
||||
#include "clutter-marshal.h"
|
||||
#include "clutter-mutter.h"
|
||||
#include "clutter-paint-nodes.h"
|
||||
#include "clutter-paint-node-private.h"
|
||||
#include "clutter-paint-volume-private.h"
|
||||
@@ -1022,7 +1023,7 @@ typedef struct _TransitionClosure
|
||||
|
||||
static void clutter_container_iface_init (ClutterContainerIface *iface);
|
||||
static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
|
||||
static void clutter_animatable_iface_init (ClutterAnimatableIface *iface);
|
||||
static void clutter_animatable_iface_init (ClutterAnimatableInterface *iface);
|
||||
static void atk_implementor_iface_init (AtkImplementorIface *iface);
|
||||
|
||||
/* These setters are all static for now, maybe they should be in the
|
||||
@@ -1108,7 +1109,6 @@ static void clutter_actor_pop_in_cloned_branch (ClutterActor *self,
|
||||
{ _transform; } \
|
||||
cogl_matrix_translate ((m), -_tx, -_ty, -_tz); } G_STMT_END
|
||||
|
||||
static GQuark quark_shader_data = 0;
|
||||
static GQuark quark_actor_layout_info = 0;
|
||||
static GQuark quark_actor_transform_info = 0;
|
||||
static GQuark quark_actor_animation_info = 0;
|
||||
@@ -2689,9 +2689,12 @@ clutter_actor_real_allocate (ClutterActor *self,
|
||||
}
|
||||
|
||||
static void
|
||||
_clutter_actor_signal_queue_redraw (ClutterActor *self,
|
||||
ClutterActor *origin)
|
||||
_clutter_actor_propagate_queue_redraw (ClutterActor *self,
|
||||
ClutterActor *origin,
|
||||
ClutterPaintVolume *pv)
|
||||
{
|
||||
gboolean stop = FALSE;
|
||||
|
||||
/* no point in queuing a redraw on a destroyed actor */
|
||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
|
||||
return;
|
||||
@@ -2700,27 +2703,33 @@ _clutter_actor_signal_queue_redraw (ClutterActor *self,
|
||||
* the actor bas been cloned. In this case the clone will need to
|
||||
* 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))
|
||||
{
|
||||
g_signal_emit (self, actor_signals[QUEUE_REDRAW], 0, origin);
|
||||
}
|
||||
else
|
||||
{
|
||||
CLUTTER_ACTOR_GET_CLASS (self)->queue_redraw (self, origin);
|
||||
{
|
||||
g_signal_emit (self, actor_signals[QUEUE_REDRAW], 0, origin, pv, &stop);
|
||||
}
|
||||
else
|
||||
{
|
||||
stop = CLUTTER_ACTOR_GET_CLASS (self)->queue_redraw (self, origin, pv);
|
||||
}
|
||||
|
||||
if (stop)
|
||||
break;
|
||||
|
||||
self = clutter_actor_get_parent (self);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_actor_real_queue_redraw (ClutterActor *self,
|
||||
ClutterActor *origin)
|
||||
static gboolean
|
||||
clutter_actor_real_queue_redraw (ClutterActor *self,
|
||||
ClutterActor *origin,
|
||||
ClutterPaintVolume *paint_volume)
|
||||
{
|
||||
ClutterActor *parent;
|
||||
|
||||
CLUTTER_NOTE (PAINT, "Redraw queued on '%s' (from: '%s')",
|
||||
_clutter_actor_get_debug_name (self),
|
||||
origin != NULL ? _clutter_actor_get_debug_name (origin)
|
||||
@@ -2728,7 +2737,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
|
||||
|
||||
/* no point in queuing a redraw on a destroyed actor */
|
||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (self))
|
||||
return;
|
||||
return TRUE;
|
||||
|
||||
/* If the queue redraw is coming from a child then the actor has
|
||||
become dirty and any queued effect is no longer valid */
|
||||
@@ -2743,7 +2752,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
|
||||
* won't change so we don't have to propagate up the hierarchy.
|
||||
*/
|
||||
if (!CLUTTER_ACTOR_IS_VISIBLE (self))
|
||||
return;
|
||||
return TRUE;
|
||||
|
||||
/* Although we could determine here that a full stage redraw
|
||||
* has already been queued and immediately bail out, we actually
|
||||
@@ -2757,7 +2766,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
|
||||
ClutterActor *stage = _clutter_actor_get_stage_internal (self);
|
||||
if (stage != NULL &&
|
||||
_clutter_stage_has_full_redraw_queued (CLUTTER_STAGE (stage)))
|
||||
return;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
self->priv->propagated_one_redraw = TRUE;
|
||||
@@ -2765,12 +2774,7 @@ clutter_actor_real_queue_redraw (ClutterActor *self,
|
||||
/* notify parents, if they are all visible eventually we'll
|
||||
* queue redraw on the stage, which queues the redraw idle.
|
||||
*/
|
||||
parent = clutter_actor_get_parent (self);
|
||||
if (parent != NULL)
|
||||
{
|
||||
/* this will go up recursively */
|
||||
_clutter_actor_signal_queue_redraw (parent, origin);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -3561,12 +3565,6 @@ _clutter_actor_update_last_paint_volume (ClutterActor *self)
|
||||
priv->last_paint_volume_valid = TRUE;
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
actor_has_shader_data (ClutterActor *self)
|
||||
{
|
||||
return g_object_get_qdata (G_OBJECT (self), quark_shader_data) != NULL;
|
||||
}
|
||||
|
||||
guint32
|
||||
_clutter_actor_get_pick_id (ClutterActor *self)
|
||||
{
|
||||
@@ -3808,7 +3806,6 @@ clutter_actor_paint (ClutterActor *self)
|
||||
ClutterActorPrivate *priv;
|
||||
ClutterPickMode pick_mode;
|
||||
gboolean clip_set = FALSE;
|
||||
gboolean shader_applied = FALSE;
|
||||
ClutterStage *stage;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
@@ -3978,25 +3975,13 @@ clutter_actor_paint (ClutterActor *self)
|
||||
}
|
||||
|
||||
if (priv->effects == NULL)
|
||||
{
|
||||
if (pick_mode == CLUTTER_PICK_NONE &&
|
||||
actor_has_shader_data (self))
|
||||
{
|
||||
_clutter_actor_shader_pre_paint (self, FALSE);
|
||||
shader_applied = TRUE;
|
||||
}
|
||||
|
||||
priv->next_effect_to_paint = NULL;
|
||||
}
|
||||
priv->next_effect_to_paint = NULL;
|
||||
else
|
||||
priv->next_effect_to_paint =
|
||||
_clutter_meta_group_peek_metas (priv->effects);
|
||||
|
||||
clutter_actor_continue_paint (self);
|
||||
|
||||
if (shader_applied)
|
||||
_clutter_actor_shader_post_paint (self);
|
||||
|
||||
if (G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_PAINT_VOLUMES &&
|
||||
pick_mode == CLUTTER_PICK_NONE))
|
||||
_clutter_actor_draw_paint_volume (self);
|
||||
@@ -6337,7 +6322,6 @@ clutter_actor_class_init (ClutterActorClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
quark_shader_data = g_quark_from_static_string ("-clutter-actor-shader-data");
|
||||
quark_actor_layout_info = g_quark_from_static_string ("-clutter-actor-layout-info");
|
||||
quark_actor_transform_info = g_quark_from_static_string ("-clutter-actor-transform-info");
|
||||
quark_actor_animation_info = g_quark_from_static_string ("-clutter-actor-animation-info");
|
||||
@@ -8010,6 +7994,7 @@ clutter_actor_class_init (ClutterActorClass *klass)
|
||||
* ClutterActor::queue-redraw:
|
||||
* @actor: the actor we're bubbling the redraw request through
|
||||
* @origin: the actor which initiated the redraw request
|
||||
* @volume: paint volume to redraw
|
||||
*
|
||||
* The ::queue_redraw signal is emitted when clutter_actor_queue_redraw()
|
||||
* is called on @origin.
|
||||
@@ -8063,10 +8048,12 @@ clutter_actor_class_init (ClutterActorClass *klass)
|
||||
G_SIGNAL_RUN_LAST |
|
||||
G_SIGNAL_NO_HOOKS,
|
||||
G_STRUCT_OFFSET (ClutterActorClass, queue_redraw),
|
||||
NULL, NULL,
|
||||
_clutter_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1,
|
||||
CLUTTER_TYPE_ACTOR);
|
||||
g_signal_accumulator_true_handled,
|
||||
NULL,
|
||||
_clutter_marshal_BOOLEAN__OBJECT_BOXED,
|
||||
G_TYPE_BOOLEAN, 2,
|
||||
CLUTTER_TYPE_ACTOR,
|
||||
CLUTTER_TYPE_PAINT_VOLUME);
|
||||
|
||||
/**
|
||||
* ClutterActor::queue-relayout:
|
||||
@@ -8665,8 +8652,7 @@ _clutter_actor_finish_queue_redraw (ClutterActor *self,
|
||||
ClutterPaintVolume *clip)
|
||||
{
|
||||
ClutterActorPrivate *priv = self->priv;
|
||||
ClutterPaintVolume *pv;
|
||||
gboolean clipped;
|
||||
ClutterPaintVolume *pv = NULL;
|
||||
|
||||
/* Remove queue entry early in the process, otherwise a new
|
||||
queue_redraw() during signal handling could put back this
|
||||
@@ -8693,8 +8679,7 @@ _clutter_actor_finish_queue_redraw (ClutterActor *self,
|
||||
*/
|
||||
if (clip)
|
||||
{
|
||||
_clutter_actor_set_queue_redraw_clip (self, clip);
|
||||
clipped = TRUE;
|
||||
pv = clip;
|
||||
}
|
||||
else if (G_LIKELY (priv->last_paint_volume_valid))
|
||||
{
|
||||
@@ -8704,36 +8689,12 @@ _clutter_actor_finish_queue_redraw (ClutterActor *self,
|
||||
ClutterActor *stage = _clutter_actor_get_stage_internal (self);
|
||||
|
||||
/* make sure we redraw the actors old position... */
|
||||
_clutter_actor_set_queue_redraw_clip (stage,
|
||||
&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;
|
||||
_clutter_actor_propagate_queue_redraw (stage, stage,
|
||||
&priv->last_paint_volume);
|
||||
}
|
||||
else
|
||||
clipped = FALSE;
|
||||
}
|
||||
else
|
||||
clipped = FALSE;
|
||||
|
||||
_clutter_actor_signal_queue_redraw (self, self);
|
||||
|
||||
/* 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);
|
||||
_clutter_actor_propagate_queue_redraw (self, self, pv);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -8893,8 +8854,7 @@ _clutter_actor_queue_redraw_full (ClutterActor *self,
|
||||
{
|
||||
/* NB: NULL denotes an undefined clip which will result in a
|
||||
* full redraw... */
|
||||
_clutter_actor_set_queue_redraw_clip (self, NULL);
|
||||
_clutter_actor_signal_queue_redraw (self, self);
|
||||
_clutter_actor_propagate_queue_redraw (self, self, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -15159,7 +15119,7 @@ clutter_actor_set_final_state (ClutterAnimatable *animatable,
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_animatable_iface_init (ClutterAnimatableIface *iface)
|
||||
clutter_animatable_iface_init (ClutterAnimatableInterface *iface)
|
||||
{
|
||||
iface->find_property = clutter_actor_find_property;
|
||||
iface->get_initial_state = clutter_actor_get_initial_state;
|
||||
@@ -16487,6 +16447,12 @@ clutter_actor_is_in_clone_paint (ClutterActor *self)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
clutter_actor_has_damage (ClutterActor *actor)
|
||||
{
|
||||
return actor->priv->is_dirty;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
set_direction_recursive (ClutterActor *actor,
|
||||
gpointer user_data)
|
||||
@@ -16704,26 +16670,6 @@ clutter_actor_has_pointer (ClutterActor *self)
|
||||
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:
|
||||
* @self: a #ClutterActor
|
||||
|
||||
@@ -236,8 +236,9 @@ struct _ClutterActorClass
|
||||
void (* pick) (ClutterActor *actor,
|
||||
const ClutterColor *color);
|
||||
|
||||
void (* queue_redraw) (ClutterActor *actor,
|
||||
ClutterActor *leaf_that_queued);
|
||||
gboolean (* queue_redraw) (ClutterActor *actor,
|
||||
ClutterActor *leaf_that_queued,
|
||||
ClutterPaintVolume *paint_volume);
|
||||
|
||||
/* size negotiation */
|
||||
void (* get_preferred_width) (ClutterActor *self,
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
* to control how a #ClutterAnimation will animate a property.
|
||||
*
|
||||
* Each #ClutterAnimatable should implement the
|
||||
* #ClutterAnimatableIface.interpolate_property() virtual function of the
|
||||
* #ClutterAnimatableInterface.interpolate_property() virtual function of the
|
||||
* interface to compute the animation state between two values of an interval
|
||||
* depending on a progress factor, expressed as a floating point value.
|
||||
*
|
||||
@@ -57,7 +57,6 @@
|
||||
#include "deprecated/clutter-animatable.h"
|
||||
#include "deprecated/clutter-animation.h"
|
||||
|
||||
typedef ClutterAnimatableIface ClutterAnimatableInterface;
|
||||
G_DEFINE_INTERFACE (ClutterAnimatable, clutter_animatable, G_TYPE_OBJECT);
|
||||
|
||||
static void
|
||||
@@ -101,7 +100,7 @@ clutter_animatable_animate_property (ClutterAnimatable *animatable,
|
||||
gdouble progress,
|
||||
GValue *value)
|
||||
{
|
||||
ClutterAnimatableIface *iface;
|
||||
ClutterAnimatableInterface *iface;
|
||||
gboolean res;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ANIMATABLE (animatable), FALSE);
|
||||
@@ -155,7 +154,7 @@ GParamSpec *
|
||||
clutter_animatable_find_property (ClutterAnimatable *animatable,
|
||||
const gchar *property_name)
|
||||
{
|
||||
ClutterAnimatableIface *iface;
|
||||
ClutterAnimatableInterface *iface;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ANIMATABLE (animatable), NULL);
|
||||
g_return_val_if_fail (property_name != NULL, NULL);
|
||||
@@ -185,7 +184,7 @@ clutter_animatable_get_initial_state (ClutterAnimatable *animatable,
|
||||
const gchar *property_name,
|
||||
GValue *value)
|
||||
{
|
||||
ClutterAnimatableIface *iface;
|
||||
ClutterAnimatableInterface *iface;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ANIMATABLE (animatable));
|
||||
g_return_if_fail (property_name != NULL);
|
||||
@@ -214,7 +213,7 @@ clutter_animatable_set_final_state (ClutterAnimatable *animatable,
|
||||
const gchar *property_name,
|
||||
const GValue *value)
|
||||
{
|
||||
ClutterAnimatableIface *iface;
|
||||
ClutterAnimatableInterface *iface;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ANIMATABLE (animatable));
|
||||
g_return_if_fail (property_name != NULL);
|
||||
@@ -260,7 +259,7 @@ clutter_animatable_interpolate_value (ClutterAnimatable *animatable,
|
||||
gdouble progress,
|
||||
GValue *value)
|
||||
{
|
||||
ClutterAnimatableIface *iface;
|
||||
ClutterAnimatableInterface *iface;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ANIMATABLE (animatable), FALSE);
|
||||
g_return_val_if_fail (property_name != NULL, FALSE);
|
||||
|
||||
@@ -33,24 +33,15 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_TYPE_ANIMATABLE (clutter_animatable_get_type ())
|
||||
#define CLUTTER_ANIMATABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ANIMATABLE, ClutterAnimatable))
|
||||
#define CLUTTER_IS_ANIMATABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ANIMATABLE))
|
||||
#define CLUTTER_ANIMATABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), CLUTTER_TYPE_ANIMATABLE, ClutterAnimatableIface))
|
||||
#define CLUTTER_TYPE_ANIMATABLE (clutter_animatable_get_type ())
|
||||
|
||||
typedef struct _ClutterAnimatableIface ClutterAnimatableIface;
|
||||
CLUTTER_EXPORT
|
||||
G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable,
|
||||
CLUTTER, ANIMATABLE,
|
||||
GObject)
|
||||
|
||||
/**
|
||||
* ClutterAnimatable:
|
||||
*
|
||||
* #ClutterAnimatable is an opaque structure whose members cannot be directly
|
||||
* accessed
|
||||
*
|
||||
* Since: 1.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* ClutterAnimatableIface:
|
||||
* ClutterAnimatableInterface:
|
||||
* @animate_property: virtual function for custom interpolation of a
|
||||
* property. This virtual function is deprecated
|
||||
* @find_property: virtual function for retrieving the #GParamSpec of
|
||||
@@ -67,7 +58,7 @@ typedef struct _ClutterAnimatableIface ClutterAnimatableIface;
|
||||
*
|
||||
* Since: 1.0
|
||||
*/
|
||||
struct _ClutterAnimatableIface
|
||||
struct _ClutterAnimatableInterface
|
||||
{
|
||||
/*< private >*/
|
||||
GTypeInterface parent_iface;
|
||||
@@ -95,9 +86,6 @@ struct _ClutterAnimatableIface
|
||||
GValue *value);
|
||||
};
|
||||
|
||||
CLUTTER_EXPORT
|
||||
GType clutter_animatable_get_type (void) G_GNUC_CONST;
|
||||
|
||||
CLUTTER_EXPORT
|
||||
GParamSpec *clutter_animatable_find_property (ClutterAnimatable *animatable,
|
||||
const gchar *property_name);
|
||||
|
||||
@@ -34,7 +34,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterAction, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActor, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActorMeta, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterAlignConstraint, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterAnimatable, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBackend, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBindConstraint, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBindingPool, g_object_unref)
|
||||
@@ -49,7 +48,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterClone, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterColorizeEffect, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterConstraint, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterContainer, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterContent, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDeformEffect, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDesaturateEffect, g_object_unref)
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDeviceManager, g_object_unref)
|
||||
|
||||
@@ -97,7 +97,7 @@ enum
|
||||
|
||||
static guint canvas_signals[LAST_SIGNAL] = { 0, };
|
||||
|
||||
static void clutter_content_iface_init (ClutterContentIface *iface);
|
||||
static void clutter_content_iface_init (ClutterContentInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (ClutterCanvas, clutter_canvas, G_TYPE_OBJECT,
|
||||
G_ADD_PRIVATE (ClutterCanvas)
|
||||
@@ -457,7 +457,7 @@ clutter_canvas_get_preferred_size (ClutterContent *content,
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_content_iface_init (ClutterContentIface *iface)
|
||||
clutter_content_iface_init (ClutterContentInterface *iface)
|
||||
{
|
||||
iface->invalidate = clutter_canvas_invalidate;
|
||||
iface->paint_content = clutter_canvas_paint_content;
|
||||
|
||||
@@ -45,8 +45,6 @@
|
||||
#include "clutter-marshal.h"
|
||||
#include "clutter-private.h"
|
||||
|
||||
typedef struct _ClutterContentIface ClutterContentInterface;
|
||||
|
||||
enum
|
||||
{
|
||||
ATTACHED,
|
||||
@@ -130,7 +128,7 @@ clutter_content_default_init (ClutterContentInterface *iface)
|
||||
g_signal_new (I_("attached"),
|
||||
G_TYPE_FROM_INTERFACE (iface),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET (ClutterContentIface, attached),
|
||||
G_STRUCT_OFFSET (ClutterContentInterface, attached),
|
||||
NULL, NULL,
|
||||
_clutter_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1,
|
||||
@@ -150,7 +148,7 @@ clutter_content_default_init (ClutterContentInterface *iface)
|
||||
g_signal_new (I_("detached"),
|
||||
G_TYPE_FROM_INTERFACE (iface),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET (ClutterContentIface, detached),
|
||||
G_STRUCT_OFFSET (ClutterContentInterface, detached),
|
||||
NULL, NULL,
|
||||
_clutter_marshal_VOID__OBJECT,
|
||||
G_TYPE_NONE, 1,
|
||||
@@ -245,7 +243,7 @@ clutter_content_invalidate_size (ClutterContent *content)
|
||||
* is associated to a #ClutterContent, to set up a backpointer from
|
||||
* the @content to the @actor.
|
||||
*
|
||||
* This function will invoke the #ClutterContentIface.attached() virtual
|
||||
* This function will invoke the #ClutterContentInterface.attached() virtual
|
||||
* function.
|
||||
*/
|
||||
void
|
||||
@@ -279,7 +277,7 @@ _clutter_content_attached (ClutterContent *content,
|
||||
* This function should be used internally every time a #ClutterActor
|
||||
* removes the association with a #ClutterContent.
|
||||
*
|
||||
* This function will invoke the #ClutterContentIface.detached() virtual
|
||||
* This function will invoke the #ClutterContentInterface.detached() virtual
|
||||
* function.
|
||||
*/
|
||||
void
|
||||
@@ -308,7 +306,7 @@ _clutter_content_detached (ClutterContent *content,
|
||||
*
|
||||
* Creates the render tree for the @content and @actor.
|
||||
*
|
||||
* This function will invoke the #ClutterContentIface.paint_content()
|
||||
* This function will invoke the #ClutterContentInterface.paint_content()
|
||||
* virtual function.
|
||||
*/
|
||||
void
|
||||
|
||||
@@ -33,24 +33,13 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_TYPE_CONTENT (clutter_content_get_type ())
|
||||
#define CLUTTER_CONTENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_CONTENT, ClutterContent))
|
||||
#define CLUTTER_IS_CONTENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_CONTENT))
|
||||
#define CLUTTER_CONTENT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), CLUTTER_TYPE_CONTENT, ClutterContentIface))
|
||||
#define CLUTTER_TYPE_CONTENT (clutter_content_get_type ())
|
||||
|
||||
typedef struct _ClutterContentIface ClutterContentIface;
|
||||
CLUTTER_EXPORT
|
||||
G_DECLARE_INTERFACE (ClutterContent, clutter_content, CLUTTER, CONTENT, GObject)
|
||||
|
||||
/**
|
||||
* ClutterContent:
|
||||
*
|
||||
* The #ClutterContent structure is an opaque type
|
||||
* whose members cannot be acccessed directly.
|
||||
*
|
||||
* Since: 1.10
|
||||
*/
|
||||
|
||||
/**
|
||||
* ClutterContentIface:
|
||||
* ClutterContentInterface:
|
||||
* @get_preferred_size: virtual function; should be overridden by subclasses
|
||||
* of #ClutterContent that have a natural size
|
||||
* @paint_content: virtual function; called each time the content needs to
|
||||
@@ -62,12 +51,12 @@ typedef struct _ClutterContentIface ClutterContentIface;
|
||||
* @invalidate: virtual function; called each time a #ClutterContent state
|
||||
* is changed.
|
||||
*
|
||||
* The #ClutterContentIface structure contains only
|
||||
* The #ClutterContentInterface structure contains only
|
||||
* private data.
|
||||
*
|
||||
* Since: 1.10
|
||||
*/
|
||||
struct _ClutterContentIface
|
||||
struct _ClutterContentInterface
|
||||
{
|
||||
/*< private >*/
|
||||
GTypeInterface g_iface;
|
||||
@@ -90,9 +79,6 @@ struct _ClutterContentIface
|
||||
void (* invalidate_size) (ClutterContent *content);
|
||||
};
|
||||
|
||||
CLUTTER_EXPORT
|
||||
GType clutter_content_get_type (void) G_GNUC_CONST;
|
||||
|
||||
CLUTTER_EXPORT
|
||||
gboolean clutter_content_get_preferred_size (ClutterContent *content,
|
||||
gfloat *width,
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "deprecated/clutter-alpha.h"
|
||||
#include "deprecated/clutter-animatable.h"
|
||||
#include "deprecated/clutter-animation.h"
|
||||
#include "deprecated/clutter-animator.h"
|
||||
#include "deprecated/clutter-behaviour.h"
|
||||
#include "deprecated/clutter-behaviour-depth.h"
|
||||
#include "deprecated/clutter-behaviour-ellipse.h"
|
||||
@@ -26,7 +25,6 @@
|
||||
#include "deprecated/clutter-main.h"
|
||||
#include "deprecated/clutter-model.h"
|
||||
#include "deprecated/clutter-rectangle.h"
|
||||
#include "deprecated/clutter-score.h"
|
||||
#include "deprecated/clutter-shader.h"
|
||||
#include "deprecated/clutter-stage-manager.h"
|
||||
#include "deprecated/clutter-stage.h"
|
||||
|
||||
@@ -57,7 +57,7 @@ struct _ClutterImagePrivate
|
||||
gint height;
|
||||
};
|
||||
|
||||
static void clutter_content_iface_init (ClutterContentIface *iface);
|
||||
static void clutter_content_iface_init (ClutterContentInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (ClutterImage, clutter_image, G_TYPE_OBJECT,
|
||||
G_ADD_PRIVATE (ClutterImage)
|
||||
@@ -154,7 +154,7 @@ clutter_image_get_preferred_size (ClutterContent *content,
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_content_iface_init (ClutterContentIface *iface)
|
||||
clutter_content_iface_init (ClutterContentInterface *iface)
|
||||
{
|
||||
iface->get_preferred_size = clutter_image_get_preferred_size;
|
||||
iface->paint_content = clutter_image_paint_content;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
BOOLEAN:BOXED
|
||||
BOOLEAN:BOXED,INT,INT
|
||||
BOOLEAN:OBJECT,BOOLEAN
|
||||
BOOLEAN:OBJECT,BOXED
|
||||
BOOLEAN:OBJECT,BOXED,DOUBLE
|
||||
BOOLEAN:OBJECT,DOUBLE
|
||||
BOOLEAN:OBJECT,ENUM
|
||||
|
||||
@@ -109,7 +109,8 @@ static GSourceFuncs clock_funcs = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static void clutter_master_clock_iface_init (ClutterMasterClockIface *iface);
|
||||
static void
|
||||
clutter_master_clock_iface_init (ClutterMasterClockInterface *iface);
|
||||
|
||||
#define clutter_master_clock_default_get_type _clutter_master_clock_default_get_type
|
||||
|
||||
@@ -689,7 +690,7 @@ clutter_master_clock_default_set_paused (ClutterMasterClock *clock,
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_master_clock_iface_init (ClutterMasterClockIface *iface)
|
||||
clutter_master_clock_iface_init (ClutterMasterClockInterface *iface)
|
||||
{
|
||||
iface->add_timeline = clutter_master_clock_default_add_timeline;
|
||||
iface->remove_timeline = clutter_master_clock_default_remove_timeline;
|
||||
|
||||
@@ -37,10 +37,6 @@
|
||||
#include "clutter-master-clock-default.h"
|
||||
#include "clutter-private.h"
|
||||
|
||||
#define clutter_master_clock_get_type _clutter_master_clock_get_type
|
||||
|
||||
typedef ClutterMasterClockIface ClutterMasterClockInterface;
|
||||
|
||||
G_DEFINE_INTERFACE (ClutterMasterClock, clutter_master_clock, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
|
||||
@@ -28,15 +28,12 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_TYPE_MASTER_CLOCK (_clutter_master_clock_get_type ())
|
||||
#define CLUTTER_MASTER_CLOCK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_MASTER_CLOCK, ClutterMasterClock))
|
||||
#define CLUTTER_IS_MASTER_CLOCK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_MASTER_CLOCK))
|
||||
#define CLUTTER_MASTER_CLOCK_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), CLUTTER_TYPE_MASTER_CLOCK, ClutterMasterClockIface))
|
||||
#define CLUTTER_TYPE_MASTER_CLOCK (clutter_master_clock_get_type ())
|
||||
G_DECLARE_INTERFACE (ClutterMasterClock, clutter_master_clock,
|
||||
CLUTTER, MASTER_CLOCK,
|
||||
GObject)
|
||||
|
||||
typedef struct _ClutterMasterClock ClutterMasterClock; /* dummy */
|
||||
typedef struct _ClutterMasterClockIface ClutterMasterClockIface;
|
||||
|
||||
struct _ClutterMasterClockIface
|
||||
struct _ClutterMasterClockInterface
|
||||
{
|
||||
/*< private >*/
|
||||
GTypeInterface parent_iface;
|
||||
@@ -51,8 +48,6 @@ struct _ClutterMasterClockIface
|
||||
gboolean paused);
|
||||
};
|
||||
|
||||
GType _clutter_master_clock_get_type (void) G_GNUC_CONST;
|
||||
|
||||
ClutterMasterClock * _clutter_master_clock_get_default (void);
|
||||
void _clutter_master_clock_add_timeline (ClutterMasterClock *master_clock,
|
||||
ClutterTimeline *timeline);
|
||||
|
||||
@@ -49,6 +49,9 @@ void clutter_stage_freeze_updates (ClutterStage *stage);
|
||||
CLUTTER_EXPORT
|
||||
void clutter_stage_thaw_updates (ClutterStage *stage);
|
||||
|
||||
CLUTTER_EXPORT
|
||||
gboolean clutter_actor_has_damage (ClutterActor *actor);
|
||||
|
||||
#undef __CLUTTER_H_INSIDE__
|
||||
|
||||
#endif /* __CLUTTER_MUTTER_H__ */
|
||||
|
||||
@@ -84,9 +84,9 @@ enum
|
||||
static GParamSpec *obj_props[PROP_LAST] = { NULL, };
|
||||
static GParamSpec *animatable_props[ANIM_PROP_LAST] = { NULL, };
|
||||
|
||||
static ClutterAnimatableIface *parent_animatable_iface = NULL;
|
||||
static ClutterAnimatableInterface *parent_animatable_iface = NULL;
|
||||
|
||||
static void clutter_animatable_iface_init (ClutterAnimatableIface *iface);
|
||||
static void clutter_animatable_iface_init (ClutterAnimatableInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (ClutterScrollActor, clutter_scroll_actor, CLUTTER_TYPE_ACTOR,
|
||||
G_ADD_PRIVATE (ClutterScrollActor)
|
||||
@@ -240,7 +240,7 @@ clutter_scroll_actor_get_initial_state (ClutterAnimatable *animatable,
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_animatable_iface_init (ClutterAnimatableIface *iface)
|
||||
clutter_animatable_iface_init (ClutterAnimatableInterface *iface)
|
||||
{
|
||||
parent_animatable_iface = g_type_interface_peek_parent (iface);
|
||||
|
||||
|
||||
@@ -14,10 +14,6 @@
|
||||
* #ClutterStage actor, abstracting away the specifics of the windowing system.
|
||||
*/
|
||||
|
||||
#define clutter_stage_window_get_type _clutter_stage_window_get_type
|
||||
|
||||
typedef ClutterStageWindowIface ClutterStageWindowInterface;
|
||||
|
||||
G_DEFINE_INTERFACE (ClutterStageWindow, clutter_stage_window, G_TYPE_OBJECT);
|
||||
|
||||
static void
|
||||
@@ -60,7 +56,7 @@ void
|
||||
_clutter_stage_window_set_title (ClutterStageWindow *window,
|
||||
const gchar *title)
|
||||
{
|
||||
ClutterStageWindowIface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
ClutterStageWindowInterface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
|
||||
if (iface->set_title)
|
||||
iface->set_title (window, title);
|
||||
@@ -70,7 +66,7 @@ void
|
||||
_clutter_stage_window_set_fullscreen (ClutterStageWindow *window,
|
||||
gboolean is_fullscreen)
|
||||
{
|
||||
ClutterStageWindowIface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
ClutterStageWindowInterface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
|
||||
if (iface->set_fullscreen)
|
||||
iface->set_fullscreen (window, is_fullscreen);
|
||||
@@ -80,7 +76,7 @@ void
|
||||
_clutter_stage_window_set_cursor_visible (ClutterStageWindow *window,
|
||||
gboolean is_visible)
|
||||
{
|
||||
ClutterStageWindowIface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
ClutterStageWindowInterface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
|
||||
if (iface->set_cursor_visible)
|
||||
iface->set_cursor_visible (window, is_visible);
|
||||
@@ -138,7 +134,7 @@ void
|
||||
_clutter_stage_window_schedule_update (ClutterStageWindow *window,
|
||||
int sync_delay)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
|
||||
|
||||
@@ -163,7 +159,7 @@ _clutter_stage_window_schedule_update (ClutterStageWindow *window,
|
||||
gint64
|
||||
_clutter_stage_window_get_update_time (ClutterStageWindow *window)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), 0);
|
||||
|
||||
@@ -186,7 +182,7 @@ _clutter_stage_window_get_update_time (ClutterStageWindow *window)
|
||||
void
|
||||
_clutter_stage_window_clear_update_time (ClutterStageWindow *window)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
|
||||
|
||||
@@ -204,7 +200,7 @@ void
|
||||
_clutter_stage_window_add_redraw_clip (ClutterStageWindow *window,
|
||||
cairo_rectangle_int_t *stage_clip)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
|
||||
|
||||
@@ -224,7 +220,7 @@ _clutter_stage_window_add_redraw_clip (ClutterStageWindow *window,
|
||||
gboolean
|
||||
_clutter_stage_window_has_redraw_clips (ClutterStageWindow *window)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
|
||||
|
||||
@@ -246,7 +242,7 @@ _clutter_stage_window_has_redraw_clips (ClutterStageWindow *window)
|
||||
gboolean
|
||||
_clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
|
||||
|
||||
@@ -261,7 +257,7 @@ gboolean
|
||||
_clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow *window,
|
||||
cairo_rectangle_int_t *stage_clip)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
|
||||
|
||||
@@ -276,7 +272,7 @@ void
|
||||
_clutter_stage_window_set_accept_focus (ClutterStageWindow *window,
|
||||
gboolean accept_focus)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
|
||||
|
||||
@@ -288,7 +284,7 @@ _clutter_stage_window_set_accept_focus (ClutterStageWindow *window,
|
||||
void
|
||||
_clutter_stage_window_redraw (ClutterStageWindow *window)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
|
||||
|
||||
@@ -303,7 +299,7 @@ _clutter_stage_window_get_dirty_pixel (ClutterStageWindow *window,
|
||||
ClutterStageView *view,
|
||||
int *x, int *y)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
*x = 0;
|
||||
*y = 0;
|
||||
@@ -318,7 +314,7 @@ _clutter_stage_window_get_dirty_pixel (ClutterStageWindow *window,
|
||||
gboolean
|
||||
_clutter_stage_window_can_clip_redraws (ClutterStageWindow *window)
|
||||
{
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
|
||||
|
||||
@@ -332,7 +328,7 @@ _clutter_stage_window_can_clip_redraws (ClutterStageWindow *window)
|
||||
GList *
|
||||
_clutter_stage_window_get_views (ClutterStageWindow *window)
|
||||
{
|
||||
ClutterStageWindowIface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
ClutterStageWindowInterface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
|
||||
return iface->get_views (window);
|
||||
}
|
||||
@@ -340,7 +336,7 @@ _clutter_stage_window_get_views (ClutterStageWindow *window)
|
||||
void
|
||||
_clutter_stage_window_finish_frame (ClutterStageWindow *window)
|
||||
{
|
||||
ClutterStageWindowIface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
ClutterStageWindowInterface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
|
||||
if (iface->finish_frame)
|
||||
iface->finish_frame (window);
|
||||
@@ -349,7 +345,7 @@ _clutter_stage_window_finish_frame (ClutterStageWindow *window)
|
||||
int64_t
|
||||
_clutter_stage_window_get_frame_counter (ClutterStageWindow *window)
|
||||
{
|
||||
ClutterStageWindowIface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
ClutterStageWindowInterface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
|
||||
|
||||
if (iface->get_frame_counter)
|
||||
return iface->get_frame_counter (window);
|
||||
|
||||
@@ -7,30 +7,21 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_TYPE_STAGE_WINDOW (_clutter_stage_window_get_type ())
|
||||
#define CLUTTER_STAGE_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_STAGE_WINDOW, ClutterStageWindow))
|
||||
#define CLUTTER_IS_STAGE_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_STAGE_WINDOW))
|
||||
#define CLUTTER_STAGE_WINDOW_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), CLUTTER_TYPE_STAGE_WINDOW, ClutterStageWindowIface))
|
||||
#define CLUTTER_TYPE_STAGE_WINDOW (clutter_stage_window_get_type ())
|
||||
|
||||
CLUTTER_EXPORT
|
||||
G_DECLARE_INTERFACE (ClutterStageWindow, clutter_stage_window,
|
||||
CLUTTER, STAGE_WINDOW,
|
||||
GObject)
|
||||
|
||||
/*
|
||||
* ClutterStageWindow: (skip)
|
||||
*
|
||||
* #ClutterStageWindow is an opaque structure
|
||||
* whose members should not be accessed directly
|
||||
*
|
||||
* Since: 0.8
|
||||
*/
|
||||
typedef struct _ClutterStageWindow ClutterStageWindow; /* dummy */
|
||||
typedef struct _ClutterStageWindowIface ClutterStageWindowIface;
|
||||
|
||||
/*
|
||||
* ClutterStageWindowIface: (skip)
|
||||
* ClutterStageWindowInterface: (skip)
|
||||
*
|
||||
* The interface implemented by backends for stage windows
|
||||
*
|
||||
* Since: 0.8
|
||||
*/
|
||||
struct _ClutterStageWindowIface
|
||||
struct _ClutterStageWindowInterface
|
||||
{
|
||||
/*< private >*/
|
||||
GTypeInterface parent_iface;
|
||||
@@ -88,9 +79,6 @@ struct _ClutterStageWindowIface
|
||||
void (* finish_frame) (ClutterStageWindow *stage_window);
|
||||
};
|
||||
|
||||
CLUTTER_EXPORT
|
||||
GType _clutter_stage_window_get_type (void) G_GNUC_CONST;
|
||||
|
||||
ClutterActor * _clutter_stage_window_get_wrapper (ClutterStageWindow *window);
|
||||
|
||||
void _clutter_stage_window_set_title (ClutterStageWindow *window,
|
||||
|
||||
@@ -1274,45 +1274,44 @@ clutter_stage_real_queue_relayout (ClutterActor *self)
|
||||
parent_class->queue_relayout (self);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_real_queue_redraw (ClutterActor *actor,
|
||||
ClutterActor *leaf)
|
||||
static gboolean
|
||||
clutter_stage_real_queue_redraw (ClutterActor *actor,
|
||||
ClutterActor *leaf,
|
||||
ClutterPaintVolume *redraw_clip)
|
||||
{
|
||||
ClutterStage *stage = CLUTTER_STAGE (actor);
|
||||
ClutterStageWindow *stage_window;
|
||||
ClutterPaintVolume *redraw_clip;
|
||||
ClutterActorBox bounding_box;
|
||||
ClutterActorBox intersection_box;
|
||||
cairo_rectangle_int_t geom, stage_clip;
|
||||
|
||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (actor))
|
||||
return;
|
||||
return TRUE;
|
||||
|
||||
/* 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
|
||||
* any clip volume into stage coordinates... */
|
||||
stage_window = _clutter_stage_get_window (stage);
|
||||
if (stage_window == NULL)
|
||||
return;
|
||||
return TRUE;
|
||||
|
||||
if (_clutter_stage_window_ignoring_redraw_clips (stage_window))
|
||||
{
|
||||
_clutter_stage_window_add_redraw_clip (stage_window, NULL);
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Convert the clip volume into stage coordinates and then into an
|
||||
* axis aligned stage coordinates bounding box...
|
||||
*/
|
||||
redraw_clip = _clutter_actor_get_queue_redraw_clip (leaf);
|
||||
if (redraw_clip == NULL)
|
||||
{
|
||||
_clutter_stage_window_add_redraw_clip (stage_window, NULL);
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (redraw_clip->is_empty)
|
||||
return;
|
||||
return TRUE;
|
||||
|
||||
_clutter_paint_volume_get_stage_paint_box (redraw_clip,
|
||||
stage,
|
||||
@@ -1328,7 +1327,7 @@ clutter_stage_real_queue_redraw (ClutterActor *actor,
|
||||
/* There is no need to track degenerate/empty redraw clips */
|
||||
if (intersection_box.x2 <= intersection_box.x1 ||
|
||||
intersection_box.y2 <= intersection_box.y1)
|
||||
return;
|
||||
return TRUE;
|
||||
|
||||
/* when converting to integer coordinates make sure we round the edges of the
|
||||
* clip rectangle outwards... */
|
||||
@@ -1338,6 +1337,7 @@ clutter_stage_real_queue_redraw (ClutterActor *actor,
|
||||
stage_clip.height = intersection_box.y2 - stage_clip.y;
|
||||
|
||||
_clutter_stage_window_add_redraw_clip (stage_window, &stage_clip);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -2742,7 +2742,7 @@ clutter_stage_set_fullscreen (ClutterStage *stage,
|
||||
if (priv->is_fullscreen != fullscreen)
|
||||
{
|
||||
ClutterStageWindow *impl = CLUTTER_STAGE_WINDOW (priv->impl);
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
iface = CLUTTER_STAGE_WINDOW_GET_IFACE (impl);
|
||||
|
||||
@@ -2807,7 +2807,7 @@ clutter_stage_set_user_resizable (ClutterStage *stage,
|
||||
&& priv->is_user_resizable != resizable)
|
||||
{
|
||||
ClutterStageWindow *impl = CLUTTER_STAGE_WINDOW (priv->impl);
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
iface = CLUTTER_STAGE_WINDOW_GET_IFACE (impl);
|
||||
if (iface->set_user_resizable)
|
||||
@@ -2856,7 +2856,7 @@ clutter_stage_show_cursor (ClutterStage *stage)
|
||||
if (!priv->is_cursor_visible)
|
||||
{
|
||||
ClutterStageWindow *impl = CLUTTER_STAGE_WINDOW (priv->impl);
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
iface = CLUTTER_STAGE_WINDOW_GET_IFACE (impl);
|
||||
if (iface->set_cursor_visible)
|
||||
@@ -2889,7 +2889,7 @@ clutter_stage_hide_cursor (ClutterStage *stage)
|
||||
if (priv->is_cursor_visible)
|
||||
{
|
||||
ClutterStageWindow *impl = CLUTTER_STAGE_WINDOW (priv->impl);
|
||||
ClutterStageWindowIface *iface;
|
||||
ClutterStageWindowInterface *iface;
|
||||
|
||||
iface = CLUTTER_STAGE_WINDOW_GET_IFACE (impl);
|
||||
if (iface->set_cursor_visible)
|
||||
|
||||
@@ -279,7 +279,7 @@ static const ClutterColor default_selected_text_color = { 0, 0, 0, 255 };
|
||||
|
||||
static CoglPipeline *default_color_pipeline = NULL;
|
||||
|
||||
static ClutterAnimatableIface *parent_animatable_iface = NULL;
|
||||
static ClutterAnimatableInterface *parent_animatable_iface = NULL;
|
||||
static ClutterScriptableIface *parent_scriptable_iface = NULL;
|
||||
|
||||
/* ClutterTextInputFocus */
|
||||
@@ -389,7 +389,7 @@ clutter_text_input_focus_new (ClutterText *text)
|
||||
|
||||
/* ClutterText */
|
||||
static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
|
||||
static void clutter_animatable_iface_init (ClutterAnimatableIface *iface);
|
||||
static void clutter_animatable_iface_init (ClutterAnimatableInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (ClutterText,
|
||||
clutter_text,
|
||||
@@ -3547,7 +3547,7 @@ clutter_text_set_final_state (ClutterAnimatable *animatable,
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_animatable_iface_init (ClutterAnimatableIface *iface)
|
||||
clutter_animatable_iface_init (ClutterAnimatableInterface *iface)
|
||||
{
|
||||
parent_animatable_iface = g_type_interface_peek_parent (iface);
|
||||
|
||||
|
||||
@@ -90,7 +90,6 @@ typedef struct _ClutterVertex ClutterVertex;
|
||||
|
||||
typedef struct _ClutterAlpha ClutterAlpha;
|
||||
typedef struct _ClutterAnimation ClutterAnimation;
|
||||
typedef struct _ClutterAnimator ClutterAnimator;
|
||||
typedef struct _ClutterState ClutterState;
|
||||
|
||||
typedef struct _ClutterInputDeviceTool ClutterInputDeviceTool;
|
||||
|
||||
@@ -60,7 +60,8 @@ typedef struct _ClutterStageViewCoglPrivate
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (ClutterStageViewCogl, clutter_stage_view_cogl,
|
||||
CLUTTER_TYPE_STAGE_VIEW)
|
||||
|
||||
static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
|
||||
static void
|
||||
clutter_stage_window_iface_init (ClutterStageWindowInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (ClutterStageCogl,
|
||||
_clutter_stage_cogl,
|
||||
@@ -994,7 +995,7 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
|
||||
clutter_stage_window_iface_init (ClutterStageWindowInterface *iface)
|
||||
{
|
||||
iface->realize = clutter_stage_cogl_realize;
|
||||
iface->unrealize = clutter_stage_cogl_unrealize;
|
||||
|
||||
@@ -9,370 +9,6 @@
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-shader.h"
|
||||
|
||||
typedef struct _ShaderData ShaderData;
|
||||
|
||||
struct _ShaderData
|
||||
{
|
||||
ClutterShader *shader;
|
||||
|
||||
/* back pointer to the actor */
|
||||
ClutterActor *actor;
|
||||
|
||||
/* list of values that should be set on the shader
|
||||
* before each paint cycle
|
||||
*/
|
||||
GHashTable *value_hash;
|
||||
};
|
||||
|
||||
static void
|
||||
shader_value_free (gpointer data)
|
||||
{
|
||||
GValue *var = data;
|
||||
g_value_unset (var);
|
||||
g_slice_free (GValue, var);
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_shader_data (gpointer data)
|
||||
{
|
||||
ShaderData *shader_data = data;
|
||||
|
||||
if (shader_data == NULL)
|
||||
return;
|
||||
|
||||
if (shader_data->shader != NULL)
|
||||
{
|
||||
g_object_unref (shader_data->shader);
|
||||
shader_data->shader = NULL;
|
||||
}
|
||||
|
||||
if (shader_data->value_hash != NULL)
|
||||
{
|
||||
g_hash_table_destroy (shader_data->value_hash);
|
||||
shader_data->value_hash = NULL;
|
||||
}
|
||||
|
||||
g_slice_free (ShaderData, shader_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_actor_get_shader:
|
||||
* @self: a #ClutterActor
|
||||
*
|
||||
* Queries the currently set #ClutterShader on @self.
|
||||
*
|
||||
* Return value: (transfer none): The currently set #ClutterShader
|
||||
* or %NULL if no shader is set.
|
||||
*
|
||||
* Since: 0.6
|
||||
*
|
||||
* Deprecated: 1.8: Use clutter_actor_get_effect() instead.
|
||||
*/
|
||||
ClutterShader *
|
||||
clutter_actor_get_shader (ClutterActor *self)
|
||||
{
|
||||
ShaderData *shader_data;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), NULL);
|
||||
|
||||
shader_data = g_object_get_data (G_OBJECT (self), "-clutter-actor-shader-data");
|
||||
if (shader_data != NULL)
|
||||
return shader_data->shader;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_actor_set_shader:
|
||||
* @self: a #ClutterActor
|
||||
* @shader: (allow-none): a #ClutterShader or %NULL to unset the shader.
|
||||
*
|
||||
* Sets the #ClutterShader to be used when rendering @self.
|
||||
*
|
||||
* If @shader is %NULL this function will unset any currently set shader
|
||||
* for the actor.
|
||||
*
|
||||
* Any #ClutterEffect applied to @self will take the precedence
|
||||
* over the #ClutterShader set using this function.
|
||||
*
|
||||
* Return value: %TRUE if the shader was successfully applied
|
||||
* or removed
|
||||
*
|
||||
* Since: 0.6
|
||||
*
|
||||
* Deprecated: 1.8: Use #ClutterShaderEffect and
|
||||
* clutter_actor_add_effect() instead.
|
||||
*/
|
||||
gboolean
|
||||
clutter_actor_set_shader (ClutterActor *self,
|
||||
ClutterShader *shader)
|
||||
{
|
||||
ShaderData *shader_data;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
|
||||
g_return_val_if_fail (shader == NULL || CLUTTER_IS_SHADER (shader), FALSE);
|
||||
|
||||
if (shader != NULL)
|
||||
g_object_ref (shader);
|
||||
else
|
||||
{
|
||||
/* if shader passed in is NULL we destroy the shader */
|
||||
g_object_set_data (G_OBJECT (self), "-clutter-actor-shader-data", NULL);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
shader_data = g_object_get_data (G_OBJECT (self), "-clutter-actor-shader-data");
|
||||
if (shader_data == NULL)
|
||||
{
|
||||
shader_data = g_slice_new (ShaderData);
|
||||
shader_data->actor = self;
|
||||
shader_data->shader = NULL;
|
||||
shader_data->value_hash =
|
||||
g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
g_free,
|
||||
shader_value_free);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (self), "-clutter-actor-shader-data",
|
||||
shader_data,
|
||||
destroy_shader_data);
|
||||
}
|
||||
|
||||
if (shader_data->shader != NULL)
|
||||
g_object_unref (shader_data->shader);
|
||||
|
||||
shader_data->shader = shader;
|
||||
|
||||
clutter_actor_queue_redraw (self);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
set_each_param (gpointer key,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
{
|
||||
ClutterShader *shader = user_data;
|
||||
const gchar *uniform = key;
|
||||
GValue *var = value;
|
||||
|
||||
clutter_shader_set_uniform (shader, uniform, var);
|
||||
}
|
||||
|
||||
void
|
||||
_clutter_actor_shader_pre_paint (ClutterActor *actor,
|
||||
gboolean repeat)
|
||||
{
|
||||
ShaderData *shader_data;
|
||||
ClutterShader *shader;
|
||||
|
||||
shader_data = g_object_get_data (G_OBJECT (actor), "-clutter-actor-shader-data");
|
||||
if (shader_data == NULL)
|
||||
return;
|
||||
|
||||
shader = shader_data->shader;
|
||||
if (shader != NULL)
|
||||
{
|
||||
clutter_shader_set_is_enabled (shader, TRUE);
|
||||
|
||||
g_hash_table_foreach (shader_data->value_hash, set_each_param, shader);
|
||||
|
||||
if (!repeat)
|
||||
_clutter_context_push_shader_stack (actor);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_clutter_actor_shader_post_paint (ClutterActor *actor)
|
||||
{
|
||||
ShaderData *shader_data;
|
||||
ClutterShader *shader;
|
||||
|
||||
shader_data = g_object_get_data (G_OBJECT (actor), "-clutter-actor-shader-data");
|
||||
if (G_LIKELY (shader_data == NULL))
|
||||
return;
|
||||
|
||||
shader = shader_data->shader;
|
||||
if (shader != NULL)
|
||||
{
|
||||
ClutterActor *head;
|
||||
|
||||
clutter_shader_set_is_enabled (shader, FALSE);
|
||||
|
||||
/* remove the actor from the shaders stack; if there is another
|
||||
* actor inside it, then call pre-paint again to set its shader
|
||||
* but this time with the second argument being TRUE, indicating
|
||||
* that we are re-applying an existing shader and thus should it
|
||||
* not be prepended to the stack
|
||||
*/
|
||||
head = _clutter_context_pop_shader_stack (actor);
|
||||
if (head != NULL)
|
||||
_clutter_actor_shader_pre_paint (head, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
clutter_actor_set_shader_param_internal (ClutterActor *self,
|
||||
const gchar *param,
|
||||
const GValue *value)
|
||||
{
|
||||
ShaderData *shader_data;
|
||||
GValue *var;
|
||||
|
||||
shader_data = g_object_get_data (G_OBJECT (self), "-clutter-actor-shader-data");
|
||||
if (shader_data == NULL)
|
||||
return;
|
||||
|
||||
var = g_slice_new0 (GValue);
|
||||
g_value_init (var, G_VALUE_TYPE (value));
|
||||
g_value_copy (value, var);
|
||||
g_hash_table_insert (shader_data->value_hash, g_strdup (param), var);
|
||||
|
||||
clutter_actor_queue_redraw (self);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_actor_set_shader_param:
|
||||
* @self: a #ClutterActor
|
||||
* @param: the name of the parameter
|
||||
* @value: the value of the parameter
|
||||
*
|
||||
* Sets the value for a named parameter of the shader applied
|
||||
* to @actor.
|
||||
*
|
||||
* Since: 1.0
|
||||
*
|
||||
* Deprecated: 1.8: Use clutter_shader_effect_set_uniform_value() instead
|
||||
*/
|
||||
void
|
||||
clutter_actor_set_shader_param (ClutterActor *self,
|
||||
const gchar *param,
|
||||
const GValue *value)
|
||||
{
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
g_return_if_fail (param != NULL);
|
||||
g_return_if_fail (CLUTTER_VALUE_HOLDS_SHADER_FLOAT (value) ||
|
||||
CLUTTER_VALUE_HOLDS_SHADER_INT (value) ||
|
||||
CLUTTER_VALUE_HOLDS_SHADER_MATRIX (value) ||
|
||||
G_VALUE_HOLDS_FLOAT (value) ||
|
||||
G_VALUE_HOLDS_INT (value));
|
||||
|
||||
clutter_actor_set_shader_param_internal (self, param, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_actor_set_shader_param_float:
|
||||
* @self: a #ClutterActor
|
||||
* @param: the name of the parameter
|
||||
* @value: the value of the parameter
|
||||
*
|
||||
* Sets the value for a named float parameter of the shader applied
|
||||
* to @actor.
|
||||
*
|
||||
* Since: 0.8
|
||||
*
|
||||
* Deprecated: 1.8: Use clutter_shader_effect_set_uniform() instead
|
||||
*/
|
||||
void
|
||||
clutter_actor_set_shader_param_float (ClutterActor *self,
|
||||
const gchar *param,
|
||||
gfloat value)
|
||||
{
|
||||
GValue var = { 0, };
|
||||
|
||||
g_value_init (&var, G_TYPE_FLOAT);
|
||||
g_value_set_float (&var, value);
|
||||
|
||||
clutter_actor_set_shader_param_internal (self, param, &var);
|
||||
|
||||
g_value_unset (&var);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_actor_set_shader_param_int:
|
||||
* @self: a #ClutterActor
|
||||
* @param: the name of the parameter
|
||||
* @value: the value of the parameter
|
||||
*
|
||||
* Sets the value for a named int parameter of the shader applied to
|
||||
* @actor.
|
||||
*
|
||||
* Since: 0.8
|
||||
*
|
||||
* Deprecated: 1.8: Use clutter_shader_effect_set_uniform() instead
|
||||
*/
|
||||
void
|
||||
clutter_actor_set_shader_param_int (ClutterActor *self,
|
||||
const gchar *param,
|
||||
gint value)
|
||||
{
|
||||
GValue var = { 0, };
|
||||
|
||||
g_value_init (&var, G_TYPE_INT);
|
||||
g_value_set_int (&var, value);
|
||||
|
||||
clutter_actor_set_shader_param_internal (self, param, &var);
|
||||
|
||||
g_value_unset (&var);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_actor_set_geometry:
|
||||
* @self: A #ClutterActor
|
||||
* @geometry: A #ClutterGeometry
|
||||
*
|
||||
* Sets the actor's fixed position and forces its minimum and natural
|
||||
* size, in pixels. This means the untransformed actor will have the
|
||||
* given geometry. This is the same as calling clutter_actor_set_position()
|
||||
* and clutter_actor_set_size().
|
||||
*
|
||||
* Deprecated: 1.10: Use clutter_actor_set_position() and
|
||||
* clutter_actor_set_size() instead.
|
||||
*/
|
||||
void
|
||||
clutter_actor_set_geometry (ClutterActor *self,
|
||||
const ClutterGeometry *geometry)
|
||||
{
|
||||
g_object_freeze_notify (G_OBJECT (self));
|
||||
|
||||
clutter_actor_set_position (self, geometry->x, geometry->y);
|
||||
clutter_actor_set_size (self, geometry->width, geometry->height);
|
||||
|
||||
g_object_thaw_notify (G_OBJECT (self));
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_actor_get_geometry:
|
||||
* @self: A #ClutterActor
|
||||
* @geometry: (out caller-allocates): A location to store actors #ClutterGeometry
|
||||
*
|
||||
* Gets the size and position of an actor relative to its parent
|
||||
* actor. This is the same as calling clutter_actor_get_position() and
|
||||
* clutter_actor_get_size(). It tries to "do what you mean" and get the
|
||||
* requested size and position if the actor's allocation is invalid.
|
||||
*
|
||||
* Deprecated: 1.10: Use clutter_actor_get_position() and
|
||||
* clutter_actor_get_size(), or clutter_actor_get_allocation_geometry()
|
||||
* instead.
|
||||
*/
|
||||
void
|
||||
clutter_actor_get_geometry (ClutterActor *self,
|
||||
ClutterGeometry *geometry)
|
||||
{
|
||||
gfloat x, y, width, height;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR (self));
|
||||
g_return_if_fail (geometry != NULL);
|
||||
|
||||
clutter_actor_get_position (self, &x, &y);
|
||||
clutter_actor_get_size (self, &width, &height);
|
||||
|
||||
geometry->x = (int) x;
|
||||
geometry->y = (int) y;
|
||||
geometry->width = (int) width;
|
||||
geometry->height = (int) height;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_actor_get_allocation_geometry:
|
||||
* @self: A #ClutterActor
|
||||
|
||||
@@ -33,13 +33,6 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_actor_set_geometry (ClutterActor *self,
|
||||
const ClutterGeometry *geometry);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_actor_get_allocation_geometry)
|
||||
void clutter_actor_get_geometry (ClutterActor *self,
|
||||
ClutterGeometry *geometry);
|
||||
CLUTTER_DEPRECATED
|
||||
guint32 clutter_actor_get_gid (ClutterActor *self);
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,188 +0,0 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright (C) 2010 Intel Corporation
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author:
|
||||
* Øyvind Kolås <pippin@linux.intel.com>
|
||||
*/
|
||||
|
||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
|
||||
#error "Only <clutter/clutter.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __CLUTTER_ANIMATOR_H__
|
||||
#define __CLUTTER_ANIMATOR_H__
|
||||
|
||||
#include <clutter/clutter-types.h>
|
||||
#include <clutter/clutter-timeline.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_TYPE_ANIMATOR (clutter_animator_get_type ())
|
||||
#define CLUTTER_TYPE_ANIMATOR_KEY (clutter_animator_key_get_type ())
|
||||
|
||||
#define CLUTTER_ANIMATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ANIMATOR, ClutterAnimator))
|
||||
#define CLUTTER_ANIMATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ANIMATOR, ClutterAnimatorClass))
|
||||
#define CLUTTER_IS_ANIMATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ANIMATOR))
|
||||
#define CLUTTER_IS_ANIMATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ANIMATOR))
|
||||
#define CLUTTER_ANIMATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ANIMATOR, ClutterAnimatorClass))
|
||||
|
||||
/* ClutterAnimator is typedef in clutter-types.h */
|
||||
|
||||
typedef struct _ClutterAnimatorClass ClutterAnimatorClass;
|
||||
typedef struct _ClutterAnimatorPrivate ClutterAnimatorPrivate;
|
||||
|
||||
/**
|
||||
* ClutterAnimatorKey:
|
||||
*
|
||||
* A key frame inside a #ClutterAnimator
|
||||
*
|
||||
* Since: 1.2
|
||||
*
|
||||
* Deprecated: 1.12
|
||||
*/
|
||||
typedef struct _ClutterAnimatorKey ClutterAnimatorKey;
|
||||
|
||||
/**
|
||||
* ClutterAnimator:
|
||||
*
|
||||
* The #ClutterAnimator structure contains only private data and
|
||||
* should be accessed using the provided API
|
||||
*
|
||||
* Since: 1.2
|
||||
*
|
||||
* Deprecated: 1.12
|
||||
*/
|
||||
struct _ClutterAnimator
|
||||
{
|
||||
/*< private >*/
|
||||
GObject parent_instance;
|
||||
|
||||
ClutterAnimatorPrivate *priv;
|
||||
};
|
||||
|
||||
/**
|
||||
* ClutterAnimatorClass:
|
||||
*
|
||||
* The #ClutterAnimatorClass structure contains only private data
|
||||
*
|
||||
* Since: 1.2
|
||||
*
|
||||
* Deprecated: 1.12
|
||||
*/
|
||||
struct _ClutterAnimatorClass
|
||||
{
|
||||
/*< private >*/
|
||||
GObjectClass parent_class;
|
||||
|
||||
/* padding for future expansion */
|
||||
gpointer _padding_dummy[16];
|
||||
};
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
GType clutter_animator_get_type (void) G_GNUC_CONST;
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
ClutterAnimator * clutter_animator_new (void);
|
||||
CLUTTER_DEPRECATED
|
||||
ClutterAnimator * clutter_animator_set_key (ClutterAnimator *animator,
|
||||
GObject *object,
|
||||
const gchar *property_name,
|
||||
guint mode,
|
||||
gdouble progress,
|
||||
const GValue *value);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_animator_set (ClutterAnimator *animator,
|
||||
gpointer first_object,
|
||||
const gchar *first_property_name,
|
||||
guint first_mode,
|
||||
gdouble first_progress,
|
||||
...) G_GNUC_NULL_TERMINATED;
|
||||
CLUTTER_DEPRECATED
|
||||
GList * clutter_animator_get_keys (ClutterAnimator *animator,
|
||||
GObject *object,
|
||||
const gchar *property_name,
|
||||
gdouble progress);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_animator_remove_key (ClutterAnimator *animator,
|
||||
GObject *object,
|
||||
const gchar *property_name,
|
||||
gdouble progress);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
ClutterTimeline * clutter_animator_start (ClutterAnimator *animator);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
gboolean clutter_animator_compute_value (ClutterAnimator *animator,
|
||||
GObject *object,
|
||||
const gchar *property_name,
|
||||
gdouble progress,
|
||||
GValue *value);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
ClutterTimeline * clutter_animator_get_timeline (ClutterAnimator *animator);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_animator_set_timeline (ClutterAnimator *animator,
|
||||
ClutterTimeline *timeline);
|
||||
CLUTTER_DEPRECATED
|
||||
guint clutter_animator_get_duration (ClutterAnimator *animator);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_animator_set_duration (ClutterAnimator *animator,
|
||||
guint duration);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
gboolean clutter_animator_property_get_ease_in (ClutterAnimator *animator,
|
||||
GObject *object,
|
||||
const gchar *property_name);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_animator_property_set_ease_in (ClutterAnimator *animator,
|
||||
GObject *object,
|
||||
const gchar *property_name,
|
||||
gboolean ease_in);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
ClutterInterpolation clutter_animator_property_get_interpolation (ClutterAnimator *animator,
|
||||
GObject *object,
|
||||
const gchar *property_name);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_animator_property_set_interpolation (ClutterAnimator *animator,
|
||||
GObject *object,
|
||||
const gchar *property_name,
|
||||
ClutterInterpolation interpolation);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
GType clutter_animator_key_get_type (void) G_GNUC_CONST;
|
||||
CLUTTER_DEPRECATED
|
||||
GObject * clutter_animator_key_get_object (const ClutterAnimatorKey *key);
|
||||
CLUTTER_DEPRECATED
|
||||
const gchar * clutter_animator_key_get_property_name (const ClutterAnimatorKey *key);
|
||||
CLUTTER_DEPRECATED
|
||||
GType clutter_animator_key_get_property_type (const ClutterAnimatorKey *key);
|
||||
CLUTTER_DEPRECATED
|
||||
gulong clutter_animator_key_get_mode (const ClutterAnimatorKey *key);
|
||||
CLUTTER_DEPRECATED
|
||||
gdouble clutter_animator_key_get_progress (const ClutterAnimatorKey *key);
|
||||
CLUTTER_DEPRECATED
|
||||
gboolean clutter_animator_key_get_value (const ClutterAnimatorKey *key,
|
||||
GValue *value);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_ANIMATOR_H__ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,144 +0,0 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Authored By Matthew Allum <mallum@openedhand.com>
|
||||
*
|
||||
* Copyright (C) 2006 OpenedHand
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
|
||||
#error "Only <clutter/clutter.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __CLUTTER_SCORE_H__
|
||||
#define __CLUTTER_SCORE_H__
|
||||
|
||||
#include <clutter/clutter-timeline.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_TYPE_SCORE (clutter_score_get_type ())
|
||||
|
||||
#define CLUTTER_SCORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_SCORE, ClutterScore))
|
||||
#define CLUTTER_SCORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_SCORE, ClutterScoreClass))
|
||||
#define CLUTTER_IS_SCORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_SCORE))
|
||||
#define CLUTTER_IS_SCORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_SCORE))
|
||||
#define CLUTTER_SCORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_SCORE, ClutterScoreClass))
|
||||
|
||||
typedef struct _ClutterScore ClutterScore;
|
||||
typedef struct _ClutterScorePrivate ClutterScorePrivate;
|
||||
typedef struct _ClutterScoreClass ClutterScoreClass;
|
||||
|
||||
/**
|
||||
* ClutterScore:
|
||||
*
|
||||
* The #ClutterScore structure contains only private data
|
||||
* and should be accessed using the provided API
|
||||
*
|
||||
* Since: 0.6
|
||||
*/
|
||||
struct _ClutterScore
|
||||
{
|
||||
/*< private >*/
|
||||
GObject parent;
|
||||
ClutterScorePrivate *priv;
|
||||
};
|
||||
|
||||
/**
|
||||
* ClutterScoreClass:
|
||||
* @timeline_started: handler for the #ClutterScore::timeline-started signal
|
||||
* @timeline_completed: handler for the #ClutterScore::timeline-completed
|
||||
* signal
|
||||
* @started: handler for the #ClutterScore::started signal
|
||||
* @completed: handler for the #ClutterScore::completed signal
|
||||
* @paused: handler for the #ClutterScore::paused signal
|
||||
*
|
||||
* The #ClutterScoreClass structure contains only private data
|
||||
*
|
||||
* Since: 0.6
|
||||
*/
|
||||
struct _ClutterScoreClass
|
||||
{
|
||||
/*< private >*/
|
||||
GObjectClass parent_class;
|
||||
|
||||
/*< public >*/
|
||||
void (* timeline_started) (ClutterScore *score,
|
||||
ClutterTimeline *timeline);
|
||||
void (* timeline_completed) (ClutterScore *score,
|
||||
ClutterTimeline *timeline);
|
||||
|
||||
void (* started) (ClutterScore *score);
|
||||
void (* completed) (ClutterScore *score);
|
||||
void (* paused) (ClutterScore *score);
|
||||
|
||||
/*< private >*/
|
||||
/* padding for future expansion */
|
||||
void (*_clutter_score_1) (void);
|
||||
void (*_clutter_score_2) (void);
|
||||
void (*_clutter_score_3) (void);
|
||||
void (*_clutter_score_4) (void);
|
||||
void (*_clutter_score_5) (void);
|
||||
};
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
GType clutter_score_get_type (void) G_GNUC_CONST;
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
ClutterScore * clutter_score_new (void);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_score_set_loop (ClutterScore *score,
|
||||
gboolean loop);
|
||||
CLUTTER_DEPRECATED
|
||||
gboolean clutter_score_get_loop (ClutterScore *score);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
gulong clutter_score_append (ClutterScore *score,
|
||||
ClutterTimeline *parent,
|
||||
ClutterTimeline *timeline);
|
||||
CLUTTER_DEPRECATED
|
||||
gulong clutter_score_append_at_marker (ClutterScore *score,
|
||||
ClutterTimeline *parent,
|
||||
const gchar *marker_name,
|
||||
ClutterTimeline *timeline);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_score_remove (ClutterScore *score,
|
||||
gulong id_);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_score_remove_all (ClutterScore *score);
|
||||
CLUTTER_DEPRECATED
|
||||
ClutterTimeline *clutter_score_get_timeline (ClutterScore *score,
|
||||
gulong id_);
|
||||
CLUTTER_DEPRECATED
|
||||
GSList * clutter_score_list_timelines (ClutterScore *score);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_score_start (ClutterScore *score);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_score_stop (ClutterScore *score);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_score_pause (ClutterScore *score);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_score_rewind (ClutterScore *score);
|
||||
CLUTTER_DEPRECATED
|
||||
gboolean clutter_score_is_playing (ClutterScore *score);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_SCORE_H__ */
|
||||
@@ -153,30 +153,6 @@ CoglHandle clutter_shader_get_cogl_fragment_shader (ClutterShader
|
||||
CLUTTER_DEPRECATED_FOR(ClutterShaderEffect)
|
||||
CoglHandle clutter_shader_get_cogl_vertex_shader (ClutterShader *shader);
|
||||
|
||||
/* ClutterActor methods */
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_actor_add_effect)
|
||||
gboolean clutter_actor_set_shader (ClutterActor *self,
|
||||
ClutterShader *shader);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_actor_get_effect)
|
||||
ClutterShader * clutter_actor_get_shader (ClutterActor *self);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_shader_effect_set_uniform_value)
|
||||
void clutter_actor_set_shader_param (ClutterActor *self,
|
||||
const gchar *param,
|
||||
const GValue *value);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_shader_effect_set_uniform)
|
||||
void clutter_actor_set_shader_param_int (ClutterActor *self,
|
||||
const gchar *param,
|
||||
gint value);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_shader_effect_set_uniform)
|
||||
void clutter_actor_set_shader_param_float (ClutterActor *self,
|
||||
const gchar *param,
|
||||
gfloat value);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_SHADER_H__ */
|
||||
|
||||
@@ -131,7 +131,6 @@
|
||||
* "source" : "source-state",
|
||||
* "target" : "target-state",
|
||||
* "duration" : milliseconds,
|
||||
* "animator" : "animator-definition"
|
||||
* },
|
||||
* ...
|
||||
* ]
|
||||
@@ -142,7 +141,7 @@
|
||||
* as clutter_state_set_key() function arguments.
|
||||
*
|
||||
* The source and target values control the source and target state of the
|
||||
* transition. The key and animator properties are mutually exclusive.
|
||||
* transition.
|
||||
*
|
||||
* The pre-delay and post-delay values are optional.
|
||||
*
|
||||
@@ -189,7 +188,6 @@
|
||||
|
||||
#include "clutter-alpha.h"
|
||||
#include "clutter-animatable.h"
|
||||
#include "clutter-animator.h"
|
||||
#include "clutter-enum-types.h"
|
||||
#include "clutter-interval.h"
|
||||
#include "clutter-marshal.h"
|
||||
@@ -197,11 +195,6 @@
|
||||
#include "clutter-scriptable.h"
|
||||
#include "clutter-script-private.h"
|
||||
|
||||
typedef struct StateAnimator {
|
||||
const gchar *source_state_name; /* interned string identifying entry */
|
||||
ClutterAnimator *animator; /* pointer to animator itself */
|
||||
} StateAnimator;
|
||||
|
||||
typedef struct State
|
||||
{
|
||||
const gchar *name; /* interned string for this state name */
|
||||
@@ -209,8 +202,6 @@ typedef struct State
|
||||
names */
|
||||
GList *keys; /* list of all keys pertaining to transitions
|
||||
from other states to this one */
|
||||
GArray *animators; /* list of animators for transitioning from
|
||||
* specific source states */
|
||||
ClutterState *clutter_state; /* the ClutterState object this state belongs to
|
||||
*/
|
||||
} State;
|
||||
@@ -227,8 +218,6 @@ struct _ClutterStatePrivate
|
||||
State *source_state; /* current source_state */
|
||||
const gchar *target_state_name; /* current target state */
|
||||
State *target_state; /* target state name */
|
||||
ClutterAnimator *current_animator; /* !NULL if the current transition is
|
||||
overriden by an animator */
|
||||
};
|
||||
|
||||
#define SLAVE_TIMELINE_LENGTH 10000
|
||||
@@ -496,7 +485,6 @@ state_free (gpointer data)
|
||||
state->keys = g_list_remove (state->keys, state->keys->data))
|
||||
clutter_state_key_free (state->keys->data);
|
||||
|
||||
g_array_free (state->animators, TRUE);
|
||||
g_hash_table_destroy (state->durations);
|
||||
g_free (state);
|
||||
}
|
||||
@@ -510,7 +498,6 @@ state_new (ClutterState *clutter_state,
|
||||
state = g_new0 (State, 1);
|
||||
state->clutter_state = clutter_state;
|
||||
state->name = name;
|
||||
state->animators = g_array_new (TRUE, TRUE, sizeof (StateAnimator));
|
||||
state->durations = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||
|
||||
return state;
|
||||
@@ -533,14 +520,6 @@ static void
|
||||
clutter_state_completed (ClutterTimeline *timeline,
|
||||
ClutterState *state)
|
||||
{
|
||||
ClutterStatePrivate *priv = state->priv;
|
||||
|
||||
if (priv->current_animator)
|
||||
{
|
||||
clutter_animator_set_timeline (priv->current_animator, NULL);
|
||||
priv->current_animator = NULL;
|
||||
}
|
||||
|
||||
g_signal_emit (state, state_signals[COMPLETED], 0);
|
||||
}
|
||||
|
||||
@@ -556,9 +535,6 @@ clutter_state_new_frame (ClutterTimeline *timeline,
|
||||
GObject *curobj = NULL;
|
||||
gboolean found_specific = FALSE;
|
||||
|
||||
if (priv->current_animator)
|
||||
return;
|
||||
|
||||
progress = clutter_timeline_get_progress (timeline);
|
||||
|
||||
for (k = priv->target_state->keys; k; k = k->next)
|
||||
@@ -649,7 +625,6 @@ clutter_state_change (ClutterState *state,
|
||||
gboolean animate)
|
||||
{
|
||||
ClutterStatePrivate *priv;
|
||||
ClutterAnimator *animator;
|
||||
State *new_state;
|
||||
guint duration;
|
||||
GList *k;
|
||||
@@ -673,12 +648,6 @@ clutter_state_change (ClutterState *state,
|
||||
clutter_timeline_stop (priv->timeline);
|
||||
clutter_timeline_rewind (priv->timeline);
|
||||
|
||||
if (priv->current_animator)
|
||||
{
|
||||
clutter_animator_set_timeline (priv->current_animator, NULL);
|
||||
priv->current_animator = NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -694,12 +663,6 @@ clutter_state_change (ClutterState *state,
|
||||
return priv->timeline;
|
||||
}
|
||||
|
||||
if (priv->current_animator != NULL)
|
||||
{
|
||||
clutter_animator_set_timeline (priv->current_animator, NULL);
|
||||
priv->current_animator = NULL;
|
||||
}
|
||||
|
||||
priv->source_state_name = priv->target_state_name;
|
||||
priv->target_state_name = target_state_name;
|
||||
|
||||
@@ -718,55 +681,37 @@ clutter_state_change (ClutterState *state,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
animator = clutter_state_get_animator (state,
|
||||
priv->source_state_name,
|
||||
priv->target_state_name);
|
||||
priv->target_state = new_state;
|
||||
|
||||
if (animator == NULL && new_state->keys == NULL)
|
||||
animator = clutter_state_get_animator (state, NULL,
|
||||
priv->target_state_name);
|
||||
|
||||
if (animator != NULL)
|
||||
for (k = new_state->keys; k != NULL; k = k->next)
|
||||
{
|
||||
/* we've got an animator overriding the tweened animation */
|
||||
priv->current_animator = animator;
|
||||
clutter_animator_set_timeline (animator, priv->timeline);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (k = new_state->keys; k != NULL; k = k->next)
|
||||
ClutterStateKey *key = k->data;
|
||||
GValue initial = G_VALUE_INIT;
|
||||
|
||||
/* Reset the pre-pre-delay - this is only used for setting keys
|
||||
* during transitions.
|
||||
*/
|
||||
key->pre_pre_delay = 0;
|
||||
|
||||
g_value_init (&initial, clutter_interval_get_value_type (key->interval));
|
||||
|
||||
if (key->is_animatable)
|
||||
{
|
||||
ClutterStateKey *key = k->data;
|
||||
GValue initial = G_VALUE_INIT;
|
||||
ClutterAnimatable *animatable;
|
||||
|
||||
/* Reset the pre-pre-delay - this is only used for setting keys
|
||||
* during transitions.
|
||||
*/
|
||||
key->pre_pre_delay = 0;
|
||||
|
||||
g_value_init (&initial, clutter_interval_get_value_type (key->interval));
|
||||
|
||||
if (key->is_animatable)
|
||||
{
|
||||
ClutterAnimatable *animatable;
|
||||
|
||||
animatable = CLUTTER_ANIMATABLE (key->object);
|
||||
clutter_animatable_get_initial_state (animatable,
|
||||
key->property_name,
|
||||
&initial);
|
||||
}
|
||||
else
|
||||
g_object_get_property (key->object, key->property_name, &initial);
|
||||
|
||||
if (clutter_alpha_get_mode (key->alpha) != key->mode)
|
||||
clutter_alpha_set_mode (key->alpha, key->mode);
|
||||
|
||||
clutter_interval_set_initial_value (key->interval, &initial);
|
||||
clutter_interval_set_final_value (key->interval, &key->value);
|
||||
|
||||
g_value_unset (&initial);
|
||||
animatable = CLUTTER_ANIMATABLE (key->object);
|
||||
clutter_animatable_get_initial_state (animatable,
|
||||
key->property_name,
|
||||
&initial);
|
||||
}
|
||||
else
|
||||
g_object_get_property (key->object, key->property_name, &initial);
|
||||
|
||||
if (clutter_alpha_get_mode (key->alpha) != key->mode)
|
||||
clutter_alpha_set_mode (key->alpha, key->mode);
|
||||
|
||||
clutter_interval_set_initial_value (key->interval, &initial);
|
||||
clutter_interval_set_final_value (key->interval, &key->value);
|
||||
|
||||
g_value_unset (&initial);
|
||||
}
|
||||
|
||||
if (!animate)
|
||||
@@ -1549,126 +1494,6 @@ clutter_state_init (ClutterState *self)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* clutter_state_get_animator:
|
||||
* @state: a #ClutterState instance.
|
||||
* @source_state_name: the name of a source state
|
||||
* @target_state_name: the name of a target state
|
||||
*
|
||||
* Retrieves the #ClutterAnimator that is being used for transitioning
|
||||
* between the two states, if any has been set
|
||||
*
|
||||
* Return value: (transfer none): a #ClutterAnimator instance, or %NULL
|
||||
*
|
||||
* Since: 1.4
|
||||
* Deprecated: 1.12: Use #ClutterKeyframeTransition and
|
||||
* #ClutterTransitionGroup instead
|
||||
*/
|
||||
ClutterAnimator *
|
||||
clutter_state_get_animator (ClutterState *state,
|
||||
const gchar *source_state_name,
|
||||
const gchar *target_state_name)
|
||||
{
|
||||
State *target_state;
|
||||
guint i;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_STATE (state), NULL);
|
||||
|
||||
source_state_name = g_intern_string (source_state_name);
|
||||
if (source_state_name == g_intern_static_string (""))
|
||||
source_state_name = NULL;
|
||||
|
||||
target_state_name = g_intern_string (target_state_name);
|
||||
|
||||
target_state = clutter_state_fetch_state (state, target_state_name, FALSE);
|
||||
if (target_state == NULL)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < target_state->animators->len; i++)
|
||||
{
|
||||
const StateAnimator *animator;
|
||||
|
||||
animator = &g_array_index (target_state->animators, StateAnimator, i);
|
||||
if (animator->source_state_name == source_state_name)
|
||||
return animator->animator;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_state_set_animator:
|
||||
* @state: a #ClutterState instance.
|
||||
* @source_state_name: the name of a source state
|
||||
* @target_state_name: the name of a target state
|
||||
* @animator: (allow-none): a #ClutterAnimator instance, or %NULL to
|
||||
* unset an existing #ClutterAnimator
|
||||
*
|
||||
* Specifies a #ClutterAnimator to be used when transitioning between
|
||||
* the two named states.
|
||||
*
|
||||
* The @animator allows specifying a transition between the state that is
|
||||
* more elaborate than the basic transitions allowed by the tweening of
|
||||
* properties defined in the #ClutterState keys.
|
||||
*
|
||||
* If @animator is %NULL it will unset an existing animator.
|
||||
*
|
||||
* #ClutterState will take a reference on the passed @animator, if any
|
||||
*
|
||||
* Since: 1.4
|
||||
* Deprecated: 1.12: Use #ClutterKeyframeTransition and
|
||||
* #ClutterTransitionGroup instead
|
||||
*/
|
||||
void
|
||||
clutter_state_set_animator (ClutterState *state,
|
||||
const gchar *source_state_name,
|
||||
const gchar *target_state_name,
|
||||
ClutterAnimator *animator)
|
||||
{
|
||||
State *target_state;
|
||||
guint i;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_STATE (state));
|
||||
|
||||
source_state_name = g_intern_string (source_state_name);
|
||||
target_state_name = g_intern_string (target_state_name);
|
||||
|
||||
target_state = clutter_state_fetch_state (state, target_state_name, TRUE);
|
||||
if (target_state == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; target_state->animators->len; i++)
|
||||
{
|
||||
StateAnimator *a;
|
||||
|
||||
a = &g_array_index (target_state->animators, StateAnimator, i);
|
||||
if (a->source_state_name == source_state_name)
|
||||
{
|
||||
g_object_unref (a->animator);
|
||||
|
||||
if (animator != NULL)
|
||||
a->animator = g_object_ref (animator);
|
||||
else
|
||||
{
|
||||
/* remove the matched animator if passed NULL */
|
||||
g_array_remove_index (target_state->animators, i);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (animator != NULL)
|
||||
{
|
||||
StateAnimator state_animator = {
|
||||
source_state_name,
|
||||
g_object_ref (animator)
|
||||
};
|
||||
|
||||
g_array_append_val (target_state->animators, state_animator);
|
||||
}
|
||||
}
|
||||
|
||||
static gpointer
|
||||
clutter_state_key_copy (gpointer boxed)
|
||||
{
|
||||
@@ -2107,12 +1932,10 @@ parse_state_transition (JsonArray *array,
|
||||
|
||||
if (!json_object_has_member (object, "source") ||
|
||||
!json_object_has_member (object, "target") ||
|
||||
!(json_object_has_member (object, "keys") ||
|
||||
json_object_has_member (object, "animator")))
|
||||
!(json_object_has_member (object, "keys")))
|
||||
{
|
||||
g_warning ("The transition description at index %d is missing one "
|
||||
"of the mandatory members: source, target and keys or "
|
||||
"animator", index_);
|
||||
"of the mandatory members: source, target and keys", index_);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2131,29 +1954,11 @@ parse_state_transition (JsonArray *array,
|
||||
duration);
|
||||
}
|
||||
|
||||
if (json_object_has_member (object, "animator"))
|
||||
{
|
||||
const gchar *id_ = json_object_get_string_member (object, "animator");
|
||||
GObject *animator;
|
||||
|
||||
animator = clutter_script_get_object (clos->script, id_);
|
||||
if (animator == NULL)
|
||||
{
|
||||
g_warning ("No object with id '%s' has been defined.", id_);
|
||||
return;
|
||||
}
|
||||
|
||||
clutter_state_set_animator (clos->state,
|
||||
source_name,
|
||||
target_name,
|
||||
CLUTTER_ANIMATOR (animator));
|
||||
}
|
||||
|
||||
if (!json_object_has_member (object, "keys"))
|
||||
return;
|
||||
|
||||
keys = json_object_get_array_member (object, "keys");
|
||||
if (keys == NULL && !json_object_has_member (object, "animator"))
|
||||
if (keys == NULL)
|
||||
{
|
||||
g_warning ("The transition description at index %d has an invalid "
|
||||
"key member of type '%s' when an array was expected.",
|
||||
|
||||
@@ -145,15 +145,6 @@ void clutter_state_remove_key (ClutterState *state,
|
||||
CLUTTER_DEPRECATED
|
||||
ClutterTimeline * clutter_state_get_timeline (ClutterState *state);
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_state_set_animator (ClutterState *state,
|
||||
const gchar *source_state_name,
|
||||
const gchar *target_state_name,
|
||||
ClutterAnimator *animator);
|
||||
CLUTTER_DEPRECATED
|
||||
ClutterAnimator * clutter_state_get_animator (ClutterState *state,
|
||||
const gchar *source_state_name,
|
||||
const gchar *target_state_name);
|
||||
CLUTTER_DEPRECATED
|
||||
const gchar * clutter_state_get_state (ClutterState *state);
|
||||
|
||||
/*
|
||||
|
||||
@@ -479,22 +479,10 @@ update_fbo (ClutterActor *self)
|
||||
{
|
||||
ClutterTexture *texture = CLUTTER_TEXTURE (self);
|
||||
ClutterTexturePrivate *priv = texture->priv;
|
||||
ClutterActor *head;
|
||||
ClutterShader *shader = NULL;
|
||||
ClutterActor *stage = NULL;
|
||||
CoglMatrix projection;
|
||||
CoglColor transparent_col;
|
||||
|
||||
head = _clutter_context_peek_shader_stack ();
|
||||
if (head != NULL)
|
||||
shader = clutter_actor_get_shader (head);
|
||||
|
||||
/* Temporarily turn off the shader on the top of the context's
|
||||
* shader stack, to restore the GL pipeline to it's natural state.
|
||||
*/
|
||||
if (shader != NULL)
|
||||
clutter_shader_set_is_enabled (shader, FALSE);
|
||||
|
||||
/* Redirect drawing to the fbo */
|
||||
cogl_push_framebuffer (priv->fbo_handle);
|
||||
|
||||
@@ -553,10 +541,6 @@ update_fbo (ClutterActor *self)
|
||||
|
||||
/* Restore drawing to the previous framebuffer */
|
||||
cogl_pop_framebuffer ();
|
||||
|
||||
/* If there is a shader on top of the shader stack, turn it back on. */
|
||||
if (shader != NULL)
|
||||
clutter_shader_set_is_enabled (shader, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -264,40 +264,6 @@ clutter_backend_egl_native_new (void)
|
||||
return g_object_new (CLUTTER_TYPE_BACKEND_EGL_NATIVE, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_eglx_display:
|
||||
*
|
||||
* Retrieves the EGL display used by Clutter.
|
||||
*
|
||||
* Return value: the EGL display, or 0
|
||||
*
|
||||
* Since: 0.6
|
||||
*
|
||||
* Deprecated: 1.6: Use clutter_egl_get_egl_display() instead.
|
||||
*/
|
||||
EGLDisplay
|
||||
clutter_eglx_display (void)
|
||||
{
|
||||
return clutter_egl_get_egl_display ();
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_egl_display:
|
||||
*
|
||||
* Retrieves the EGL display used by Clutter.
|
||||
*
|
||||
* Return value: the EGL display used by Clutter, or 0
|
||||
*
|
||||
* Since: 0.6
|
||||
*
|
||||
* Deprecated: 1.6: Use clutter_egl_get_egl_display() instead.
|
||||
*/
|
||||
EGLDisplay
|
||||
clutter_egl_display (void)
|
||||
{
|
||||
return clutter_egl_get_egl_display ();
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_egl_get_egl_display:
|
||||
*
|
||||
|
||||
@@ -48,33 +48,6 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* clutter_eglx_display:
|
||||
*
|
||||
* Retrieves the #EGLDisplay used by Clutter,
|
||||
* if Clutter has been compiled with EGL and X11 support.
|
||||
*
|
||||
* Return value: the EGL display
|
||||
*
|
||||
* Since: 0.4
|
||||
*
|
||||
* Deprecated: 1.6: Use clutter_egl_get_egl_display() instead
|
||||
*/
|
||||
CLUTTER_DEPRECATED_FOR(clutter_egl_get_egl_display)
|
||||
EGLDisplay clutter_eglx_display (void);
|
||||
|
||||
/**
|
||||
* clutter_egl_display:
|
||||
*
|
||||
* Retrieves the #EGLDisplay used by Clutter
|
||||
*
|
||||
* Return value: the EGL display
|
||||
*
|
||||
* Deprecated: 1.6: Use clutter_egl_get_egl_display() instead
|
||||
*/
|
||||
CLUTTER_DEPRECATED_FOR(clutter_egl_get_egl_display)
|
||||
EGLDisplay clutter_egl_display (void);
|
||||
|
||||
/**
|
||||
* clutter_egl_get_egl_display:
|
||||
*
|
||||
|
||||
@@ -220,7 +220,6 @@ clutter_deprecated_headers = [
|
||||
'deprecated/clutter-alpha.h',
|
||||
'deprecated/clutter-animatable.h',
|
||||
'deprecated/clutter-animation.h',
|
||||
'deprecated/clutter-animator.h',
|
||||
'deprecated/clutter-behaviour.h',
|
||||
'deprecated/clutter-behaviour-depth.h',
|
||||
'deprecated/clutter-behaviour-ellipse.h',
|
||||
@@ -239,7 +238,6 @@ clutter_deprecated_headers = [
|
||||
'deprecated/clutter-main.h',
|
||||
'deprecated/clutter-model.h',
|
||||
'deprecated/clutter-rectangle.h',
|
||||
'deprecated/clutter-score.h',
|
||||
'deprecated/clutter-shader.h',
|
||||
'deprecated/clutter-stage-manager.h',
|
||||
'deprecated/clutter-stage.h',
|
||||
@@ -253,7 +251,6 @@ clutter_deprecated_sources = [
|
||||
'deprecated/clutter-actor-deprecated.c',
|
||||
'deprecated/clutter-alpha.c',
|
||||
'deprecated/clutter-animation.c',
|
||||
'deprecated/clutter-animator.c',
|
||||
'deprecated/clutter-behaviour.c',
|
||||
'deprecated/clutter-behaviour-depth.c',
|
||||
'deprecated/clutter-behaviour-ellipse.c',
|
||||
@@ -269,7 +266,6 @@ clutter_deprecated_sources = [
|
||||
'deprecated/clutter-list-model.c',
|
||||
'deprecated/clutter-model.c',
|
||||
'deprecated/clutter-rectangle.c',
|
||||
'deprecated/clutter-score.c',
|
||||
'deprecated/clutter-shader.c',
|
||||
'deprecated/clutter-state.c',
|
||||
'deprecated/clutter-table-layout.c',
|
||||
@@ -297,10 +293,8 @@ clutter_backend_private_headers = [
|
||||
if have_x11
|
||||
clutter_x11_sources = [
|
||||
'x11/clutter-backend-x11.c',
|
||||
'x11/clutter-device-manager-core-x11.c',
|
||||
'x11/clutter-device-manager-xi2.c',
|
||||
'x11/clutter-event-x11.c',
|
||||
'x11/clutter-input-device-core-x11.c',
|
||||
'x11/clutter-input-device-tool-xi2.c',
|
||||
'x11/clutter-input-device-xi2.c',
|
||||
'x11/clutter-keymap-x11.c',
|
||||
@@ -323,9 +317,7 @@ if have_x11
|
||||
|
||||
clutter_x11_private_headers = [
|
||||
'x11/clutter-backend-x11.h',
|
||||
'x11/clutter-device-manager-core-x11.h',
|
||||
'x11/clutter-device-manager-xi2.h',
|
||||
'x11/clutter-input-device-core-x11.h',
|
||||
'x11/clutter-input-device-tool-xi2.h',
|
||||
'x11/clutter-input-device-xi2.h',
|
||||
'x11/clutter-keymap-x11.h',
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include <errno.h>
|
||||
|
||||
#include "clutter-backend-x11.h"
|
||||
#include "clutter-device-manager-core-x11.h"
|
||||
#include "clutter-device-manager-xi2.h"
|
||||
#include "clutter-settings-x11.h"
|
||||
#include "clutter-stage-x11.h"
|
||||
@@ -265,13 +264,8 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11)
|
||||
|
||||
if (backend_x11->device_manager == NULL)
|
||||
{
|
||||
CLUTTER_NOTE (BACKEND, "Creating Core device manager");
|
||||
g_critical ("XI2 extension is missing.");
|
||||
backend_x11->has_xinput = FALSE;
|
||||
backend_x11->device_manager =
|
||||
g_object_new (CLUTTER_TYPE_DEVICE_MANAGER_X11,
|
||||
"backend", backend_x11,
|
||||
NULL);
|
||||
|
||||
backend_x11->xi_minor = -1;
|
||||
}
|
||||
|
||||
@@ -480,9 +474,6 @@ _clutter_backend_x11_events_init (ClutterBackend *backend)
|
||||
backend_x11->event_source = source;
|
||||
}
|
||||
|
||||
/* create the device manager; we need this because we can effectively
|
||||
* choose between core+XI1 and XI2 input events
|
||||
*/
|
||||
clutter_backend_x11_create_device_manager (backend_x11);
|
||||
|
||||
/* register keymap; unless we create a generic Keymap object, I'm
|
||||
@@ -948,30 +939,6 @@ clutter_x11_set_display (Display *xdpy)
|
||||
_foreign_dpy= xdpy;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_x11_enable_xinput:
|
||||
*
|
||||
* Enables the use of the XInput extension if present on connected
|
||||
* XServer and support built into Clutter. XInput allows for multiple
|
||||
* pointing devices to be used.
|
||||
*
|
||||
* This function must be called before clutter_init().
|
||||
*
|
||||
* Since XInput might not be supported by the X server, you might
|
||||
* want to use clutter_x11_has_xinput() to see if support was enabled.
|
||||
*
|
||||
* Since: 0.8
|
||||
*
|
||||
* Deprecated: 1.14: This function does not do anything; XInput support
|
||||
* is enabled by default in Clutter. Use the CLUTTER_DISABLE_XINPUT
|
||||
* environment variable to disable XInput support and use Xlib core
|
||||
* events instead.
|
||||
*/
|
||||
void
|
||||
clutter_x11_enable_xinput (void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_x11_disable_event_retrieval:
|
||||
*
|
||||
@@ -1180,31 +1147,6 @@ clutter_x11_remove_filter (ClutterX11FilterFunc func,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_x11_get_input_devices:
|
||||
*
|
||||
* Retrieves a pointer to the list of input devices
|
||||
*
|
||||
* Deprecated: 1.2: Use clutter_device_manager_peek_devices() instead
|
||||
*
|
||||
* Since: 0.8
|
||||
*
|
||||
* Return value: (transfer none) (element-type Clutter.InputDevice): a
|
||||
* pointer to the internal list of input devices; the returned list is
|
||||
* owned by Clutter and should not be modified or freed
|
||||
*/
|
||||
const GSList *
|
||||
clutter_x11_get_input_devices (void)
|
||||
{
|
||||
ClutterDeviceManager *manager;
|
||||
|
||||
manager = clutter_device_manager_get_default ();
|
||||
if (manager == NULL)
|
||||
return NULL;
|
||||
|
||||
return clutter_device_manager_peek_devices (manager);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_x11_has_xinput:
|
||||
*
|
||||
|
||||
@@ -1,555 +0,0 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright © 2009, 2010, 2011 Intel Corp.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Emmanuele Bassi <ebassi@linux.intel.com>
|
||||
*/
|
||||
|
||||
#include "clutter-build-config.h"
|
||||
|
||||
#include "clutter-device-manager-core-x11.h"
|
||||
|
||||
#include "clutter-backend-x11.h"
|
||||
#include "clutter-input-device-core-x11.h"
|
||||
#include "clutter-stage-x11.h"
|
||||
#include "clutter-virtual-input-device-x11.h"
|
||||
|
||||
#include "clutter-backend.h"
|
||||
#include "clutter-debug.h"
|
||||
#include "clutter-device-manager-private.h"
|
||||
#include "clutter-event-private.h"
|
||||
#include "clutter-event-translator.h"
|
||||
#include "clutter-stage-private.h"
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-xkb-a11y-x11.h"
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
||||
PROP_EVENT_BASE,
|
||||
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static GParamSpec *obj_props[PROP_LAST] = { NULL, };
|
||||
|
||||
static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
|
||||
|
||||
#define clutter_device_manager_x11_get_type _clutter_device_manager_x11_get_type
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (ClutterDeviceManagerX11,
|
||||
clutter_device_manager_x11,
|
||||
CLUTTER_TYPE_DEVICE_MANAGER,
|
||||
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_EVENT_TRANSLATOR,
|
||||
clutter_event_translator_iface_init));
|
||||
|
||||
static inline void
|
||||
translate_key_event (ClutterBackendX11 *backend_x11,
|
||||
ClutterDeviceManagerX11 *manager_x11,
|
||||
ClutterEvent *event,
|
||||
XEvent *xevent)
|
||||
{
|
||||
ClutterEventX11 *event_x11;
|
||||
char buffer[256 + 1];
|
||||
int n;
|
||||
|
||||
event->key.type = xevent->xany.type == KeyPress ? CLUTTER_KEY_PRESS
|
||||
: CLUTTER_KEY_RELEASE;
|
||||
event->key.time = xevent->xkey.time;
|
||||
|
||||
clutter_event_set_device (event, manager_x11->core_keyboard);
|
||||
|
||||
/* KeyEvents have platform specific data associated to them */
|
||||
event_x11 = _clutter_event_x11_new ();
|
||||
_clutter_event_set_platform_data (event, event_x11);
|
||||
|
||||
event->key.modifier_state = (ClutterModifierType) xevent->xkey.state;
|
||||
event->key.hardware_keycode = xevent->xkey.keycode;
|
||||
|
||||
/* keyval is the key ignoring all modifiers ('1' vs. '!') */
|
||||
event->key.keyval =
|
||||
_clutter_keymap_x11_translate_key_state (backend_x11->keymap,
|
||||
event->key.hardware_keycode,
|
||||
&event->key.modifier_state,
|
||||
NULL);
|
||||
|
||||
event_x11->key_group =
|
||||
_clutter_keymap_x11_get_key_group (backend_x11->keymap,
|
||||
event->key.modifier_state);
|
||||
event_x11->key_is_modifier =
|
||||
_clutter_keymap_x11_get_is_modifier (backend_x11->keymap,
|
||||
event->key.hardware_keycode);
|
||||
event_x11->num_lock_set =
|
||||
clutter_keymap_get_num_lock_state (CLUTTER_KEYMAP (backend_x11->keymap));
|
||||
event_x11->caps_lock_set =
|
||||
clutter_keymap_get_caps_lock_state (CLUTTER_KEYMAP (backend_x11->keymap));
|
||||
|
||||
/* unicode_value is the printable representation */
|
||||
n = XLookupString (&xevent->xkey, buffer, sizeof (buffer) - 1, NULL, NULL);
|
||||
|
||||
if (n != NoSymbol)
|
||||
{
|
||||
event->key.unicode_value = g_utf8_get_char_validated (buffer, n);
|
||||
if ((event->key.unicode_value != (gunichar) -1) &&
|
||||
(event->key.unicode_value != (gunichar) -2))
|
||||
goto out;
|
||||
}
|
||||
else
|
||||
event->key.unicode_value = (gunichar)'\0';
|
||||
|
||||
out:
|
||||
CLUTTER_NOTE (EVENT,
|
||||
"%s: win:0x%x, key: %12s (%d)",
|
||||
event->any.type == CLUTTER_KEY_PRESS
|
||||
? "key press "
|
||||
: "key release",
|
||||
(unsigned int) xevent->xkey.window,
|
||||
event->key.keyval ? buffer : "(none)",
|
||||
event->key.keyval);
|
||||
return;
|
||||
}
|
||||
|
||||
static ClutterTranslateReturn
|
||||
clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator,
|
||||
gpointer native,
|
||||
ClutterEvent *event)
|
||||
{
|
||||
ClutterDeviceManagerX11 *manager_x11;
|
||||
ClutterBackendX11 *backend_x11;
|
||||
ClutterStageX11 *stage_x11;
|
||||
ClutterTranslateReturn res;
|
||||
ClutterStage *stage;
|
||||
XEvent *xevent;
|
||||
|
||||
manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (translator);
|
||||
backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
|
||||
|
||||
xevent = native;
|
||||
|
||||
stage = clutter_x11_get_stage_from_window (xevent->xany.window);
|
||||
if (stage == NULL)
|
||||
return CLUTTER_TRANSLATE_CONTINUE;
|
||||
|
||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (stage))
|
||||
return CLUTTER_TRANSLATE_CONTINUE;
|
||||
|
||||
stage_x11 = CLUTTER_STAGE_X11 (_clutter_stage_get_window (stage));
|
||||
|
||||
event->any.stage = stage;
|
||||
|
||||
res = CLUTTER_TRANSLATE_CONTINUE;
|
||||
|
||||
switch (xevent->type)
|
||||
{
|
||||
case KeyPress:
|
||||
translate_key_event (backend_x11, manager_x11, event, xevent);
|
||||
_clutter_stage_x11_set_user_time (stage_x11, xevent->xkey.time);
|
||||
res = CLUTTER_TRANSLATE_QUEUE;
|
||||
break;
|
||||
|
||||
case KeyRelease:
|
||||
/* old-style X11 terminals require that even modern X11 send
|
||||
* KeyPress/KeyRelease pairs when auto-repeating. for this
|
||||
* reason modern(-ish) API like XKB has a way to detect
|
||||
* auto-repeat and do a single KeyRelease at the end of a
|
||||
* KeyPress sequence.
|
||||
*
|
||||
* this check emulates XKB's detectable auto-repeat; we peek
|
||||
* the next event and check if it's a KeyPress for the same key
|
||||
* and timestamp - and then ignore it if it matches the
|
||||
* KeyRelease
|
||||
*
|
||||
* if we have XKB, and autorepeat is enabled, then this becomes
|
||||
* a no-op
|
||||
*/
|
||||
if (!backend_x11->have_xkb_autorepeat && XPending (xevent->xkey.display))
|
||||
{
|
||||
XEvent next_event;
|
||||
|
||||
XPeekEvent (xevent->xkey.display, &next_event);
|
||||
|
||||
if (next_event.type == KeyPress &&
|
||||
next_event.xkey.keycode == xevent->xkey.keycode &&
|
||||
next_event.xkey.time == xevent->xkey.time)
|
||||
{
|
||||
res = CLUTTER_TRANSLATE_REMOVE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
translate_key_event (backend_x11, manager_x11, event, xevent);
|
||||
res = CLUTTER_TRANSLATE_QUEUE;
|
||||
break;
|
||||
|
||||
case ButtonPress:
|
||||
CLUTTER_NOTE (EVENT,
|
||||
"button press: win: 0x%x, coords: %d, %d, button: %d",
|
||||
(unsigned int) stage_x11->xwin,
|
||||
xevent->xbutton.x,
|
||||
xevent->xbutton.y,
|
||||
xevent->xbutton.button);
|
||||
|
||||
switch (xevent->xbutton.button)
|
||||
{
|
||||
case 4: /* up */
|
||||
case 5: /* down */
|
||||
case 6: /* left */
|
||||
case 7: /* right */
|
||||
event->scroll.type = CLUTTER_SCROLL;
|
||||
|
||||
if (xevent->xbutton.button == 4)
|
||||
event->scroll.direction = CLUTTER_SCROLL_UP;
|
||||
else if (xevent->xbutton.button == 5)
|
||||
event->scroll.direction = CLUTTER_SCROLL_DOWN;
|
||||
else if (xevent->xbutton.button == 6)
|
||||
event->scroll.direction = CLUTTER_SCROLL_LEFT;
|
||||
else
|
||||
event->scroll.direction = CLUTTER_SCROLL_RIGHT;
|
||||
|
||||
event->scroll.time = xevent->xbutton.time;
|
||||
event->scroll.x = xevent->xbutton.x;
|
||||
event->scroll.y = xevent->xbutton.y;
|
||||
event->scroll.modifier_state = xevent->xbutton.state;
|
||||
event->scroll.axes = NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
event->button.type = event->type = CLUTTER_BUTTON_PRESS;
|
||||
event->button.time = xevent->xbutton.time;
|
||||
event->button.x = xevent->xbutton.x;
|
||||
event->button.y = xevent->xbutton.y;
|
||||
event->button.modifier_state = xevent->xbutton.state;
|
||||
event->button.button = xevent->xbutton.button;
|
||||
event->button.axes = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
clutter_event_set_device (event, manager_x11->core_pointer);
|
||||
|
||||
_clutter_stage_x11_set_user_time (stage_x11, xevent->xbutton.time);
|
||||
res = CLUTTER_TRANSLATE_QUEUE;
|
||||
break;
|
||||
|
||||
case ButtonRelease:
|
||||
CLUTTER_NOTE (EVENT,
|
||||
"button press: win: 0x%x, coords: %d, %d, button: %d",
|
||||
(unsigned int) stage_x11->xwin,
|
||||
xevent->xbutton.x,
|
||||
xevent->xbutton.y,
|
||||
xevent->xbutton.button);
|
||||
|
||||
/* scroll events don't have a corresponding release */
|
||||
if (xevent->xbutton.button == 4 ||
|
||||
xevent->xbutton.button == 5 ||
|
||||
xevent->xbutton.button == 6 ||
|
||||
xevent->xbutton.button == 7)
|
||||
{
|
||||
res = CLUTTER_TRANSLATE_REMOVE;
|
||||
break;
|
||||
}
|
||||
|
||||
event->button.type = event->type = CLUTTER_BUTTON_RELEASE;
|
||||
event->button.time = xevent->xbutton.time;
|
||||
event->button.x = xevent->xbutton.x;
|
||||
event->button.y = xevent->xbutton.y;
|
||||
event->button.modifier_state = xevent->xbutton.state;
|
||||
event->button.button = xevent->xbutton.button;
|
||||
event->button.axes = NULL;
|
||||
clutter_event_set_device (event, manager_x11->core_pointer);
|
||||
res = CLUTTER_TRANSLATE_QUEUE;
|
||||
break;
|
||||
|
||||
case MotionNotify:
|
||||
CLUTTER_NOTE (EVENT,
|
||||
"motion: win: 0x%x, coords: %d, %d",
|
||||
(unsigned int) stage_x11->xwin,
|
||||
xevent->xmotion.x,
|
||||
xevent->xmotion.y);
|
||||
|
||||
event->motion.type = event->type = CLUTTER_MOTION;
|
||||
event->motion.time = xevent->xmotion.time;
|
||||
event->motion.x = xevent->xmotion.x;
|
||||
event->motion.y = xevent->xmotion.y;
|
||||
event->motion.modifier_state = xevent->xmotion.state;
|
||||
event->motion.axes = NULL;
|
||||
clutter_event_set_device (event, manager_x11->core_pointer);
|
||||
res = CLUTTER_TRANSLATE_QUEUE;
|
||||
break;
|
||||
|
||||
case EnterNotify:
|
||||
CLUTTER_NOTE (EVENT, "Entering the stage (time:%u)",
|
||||
(unsigned int) xevent->xcrossing.time);
|
||||
|
||||
event->crossing.type = CLUTTER_ENTER;
|
||||
event->crossing.time = xevent->xcrossing.time;
|
||||
event->crossing.x = xevent->xcrossing.x;
|
||||
event->crossing.y = xevent->xcrossing.y;
|
||||
event->crossing.source = CLUTTER_ACTOR (stage);
|
||||
event->crossing.related = NULL;
|
||||
clutter_event_set_device (event, manager_x11->core_pointer);
|
||||
|
||||
_clutter_input_device_set_stage (manager_x11->core_pointer, stage);
|
||||
|
||||
res = CLUTTER_TRANSLATE_QUEUE;
|
||||
break;
|
||||
|
||||
case LeaveNotify:
|
||||
if (manager_x11->core_pointer->stage == NULL)
|
||||
{
|
||||
CLUTTER_NOTE (EVENT, "Discarding LeaveNotify for "
|
||||
"ButtonRelease event off-stage");
|
||||
res = CLUTTER_TRANSLATE_REMOVE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* we know that we are leaving the stage here */
|
||||
CLUTTER_NOTE (EVENT, "Leaving the stage (time:%u)",
|
||||
(unsigned int) xevent->xcrossing.time);
|
||||
|
||||
event->crossing.type = CLUTTER_LEAVE;
|
||||
event->crossing.time = xevent->xcrossing.time;
|
||||
event->crossing.x = xevent->xcrossing.x;
|
||||
event->crossing.y = xevent->xcrossing.y;
|
||||
event->crossing.source = CLUTTER_ACTOR (stage);
|
||||
event->crossing.related = NULL;
|
||||
clutter_event_set_device (event, manager_x11->core_pointer);
|
||||
|
||||
_clutter_input_device_set_stage (manager_x11->core_pointer, NULL);
|
||||
|
||||
res = CLUTTER_TRANSLATE_QUEUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface)
|
||||
{
|
||||
iface->translate_event = clutter_device_manager_x11_translate_event;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_device_manager_x11_constructed (GObject *gobject)
|
||||
{
|
||||
ClutterDeviceManagerX11 *manager_x11;
|
||||
ClutterDeviceManager *manager;
|
||||
ClutterBackendX11 *backend_x11;
|
||||
|
||||
manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (gobject);
|
||||
manager = CLUTTER_DEVICE_MANAGER (gobject);
|
||||
|
||||
g_object_get (gobject, "backend", &backend_x11, NULL);
|
||||
g_assert (backend_x11 != NULL);
|
||||
|
||||
manager_x11->core_pointer =
|
||||
g_object_new (CLUTTER_TYPE_INPUT_DEVICE_X11,
|
||||
"name", "Core Pointer",
|
||||
"has-cursor", TRUE,
|
||||
"device-type", CLUTTER_POINTER_DEVICE,
|
||||
"device-manager", manager_x11,
|
||||
"device-mode", CLUTTER_INPUT_MODE_MASTER,
|
||||
"backend", backend_x11,
|
||||
"enabled", TRUE,
|
||||
NULL);
|
||||
CLUTTER_NOTE (BACKEND, "Added core pointer device");
|
||||
|
||||
manager_x11->core_keyboard =
|
||||
g_object_new (CLUTTER_TYPE_INPUT_DEVICE_X11,
|
||||
"name", "Core Keyboard",
|
||||
"has-cursor", FALSE,
|
||||
"device-type", CLUTTER_KEYBOARD_DEVICE,
|
||||
"device-manager", manager_x11,
|
||||
"device-mode", CLUTTER_INPUT_MODE_MASTER,
|
||||
"backend", backend_x11,
|
||||
"enabled", TRUE,
|
||||
NULL);
|
||||
CLUTTER_NOTE (BACKEND, "Added core keyboard device");
|
||||
|
||||
/* associate core devices */
|
||||
_clutter_input_device_set_associated_device (manager_x11->core_pointer,
|
||||
manager_x11->core_keyboard);
|
||||
_clutter_input_device_set_associated_device (manager_x11->core_keyboard,
|
||||
manager_x11->core_pointer);
|
||||
|
||||
clutter_device_manager_x11_a11y_init (manager);
|
||||
|
||||
if (G_OBJECT_CLASS (clutter_device_manager_x11_parent_class)->constructed)
|
||||
G_OBJECT_CLASS (clutter_device_manager_x11_parent_class)->constructed (gobject);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_device_manager_x11_add_device (ClutterDeviceManager *manager,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
ClutterDeviceManagerX11 *manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (manager);
|
||||
|
||||
manager_x11->devices = g_slist_prepend (manager_x11->devices, device);
|
||||
g_hash_table_replace (manager_x11->devices_by_id,
|
||||
GINT_TO_POINTER (device->id),
|
||||
device);
|
||||
|
||||
/* blow the cache */
|
||||
g_slist_free (manager_x11->all_devices);
|
||||
manager_x11->all_devices = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_device_manager_x11_remove_device (ClutterDeviceManager *manager,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
ClutterDeviceManagerX11 *manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (manager);
|
||||
|
||||
g_hash_table_remove (manager_x11->devices_by_id,
|
||||
GINT_TO_POINTER (device->id));
|
||||
manager_x11->devices = g_slist_remove (manager_x11->devices, device);
|
||||
|
||||
/* blow the cache */
|
||||
g_slist_free (manager_x11->all_devices);
|
||||
manager_x11->all_devices = NULL;
|
||||
}
|
||||
|
||||
static const GSList *
|
||||
clutter_device_manager_x11_get_devices (ClutterDeviceManager *manager)
|
||||
{
|
||||
ClutterDeviceManagerX11 *manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (manager);
|
||||
|
||||
/* cache the devices list so that we can keep the core pointer
|
||||
* and keyboard outside of the ManagerX11:devices list
|
||||
*/
|
||||
if (manager_x11->all_devices == NULL)
|
||||
{
|
||||
GSList *all_devices = manager_x11->devices;
|
||||
|
||||
all_devices = g_slist_prepend (all_devices, manager_x11->core_keyboard);
|
||||
all_devices = g_slist_prepend (all_devices, manager_x11->core_pointer);
|
||||
|
||||
manager_x11->all_devices = all_devices;
|
||||
}
|
||||
|
||||
return CLUTTER_DEVICE_MANAGER_X11 (manager)->all_devices;
|
||||
}
|
||||
|
||||
static ClutterInputDevice *
|
||||
clutter_device_manager_x11_get_core_device (ClutterDeviceManager *manager,
|
||||
ClutterInputDeviceType type)
|
||||
{
|
||||
ClutterDeviceManagerX11 *manager_x11;
|
||||
|
||||
manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (manager);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case CLUTTER_POINTER_DEVICE:
|
||||
return manager_x11->core_pointer;
|
||||
|
||||
case CLUTTER_KEYBOARD_DEVICE:
|
||||
return manager_x11->core_keyboard;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ClutterInputDevice *
|
||||
clutter_device_manager_x11_get_device (ClutterDeviceManager *manager,
|
||||
gint id)
|
||||
{
|
||||
ClutterDeviceManagerX11 *manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (manager);
|
||||
|
||||
return g_hash_table_lookup (manager_x11->devices_by_id,
|
||||
GINT_TO_POINTER (id));
|
||||
}
|
||||
|
||||
static ClutterVirtualInputDevice *
|
||||
clutter_device_manager_x11_create_virtual_device (ClutterDeviceManager *device_manager,
|
||||
ClutterInputDeviceType device_type)
|
||||
{
|
||||
return g_object_new (CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE_X11, NULL);
|
||||
}
|
||||
|
||||
static ClutterVirtualDeviceType
|
||||
clutter_device_manager_x11_get_supported_virtual_device_types (ClutterDeviceManager *device_manager)
|
||||
{
|
||||
return (CLUTTER_VIRTUAL_DEVICE_TYPE_KEYBOARD |
|
||||
CLUTTER_VIRTUAL_DEVICE_TYPE_POINTER);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_device_manager_x11_set_property (GObject *gobject,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
ClutterDeviceManagerX11 *manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (gobject);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_EVENT_BASE:
|
||||
manager_x11->xi_event_base = g_value_get_int (value);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_device_manager_x11_class_init (ClutterDeviceManagerX11Class *klass)
|
||||
{
|
||||
ClutterDeviceManagerClass *manager_class;
|
||||
GObjectClass *gobject_class;
|
||||
|
||||
obj_props[PROP_EVENT_BASE] =
|
||||
g_param_spec_int ("event-base",
|
||||
"Event Base",
|
||||
"The first XI event",
|
||||
-1, G_MAXINT,
|
||||
-1,
|
||||
CLUTTER_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
gobject_class->constructed = clutter_device_manager_x11_constructed;
|
||||
gobject_class->set_property = clutter_device_manager_x11_set_property;
|
||||
|
||||
g_object_class_install_properties (gobject_class, PROP_LAST, obj_props);
|
||||
|
||||
manager_class = CLUTTER_DEVICE_MANAGER_CLASS (klass);
|
||||
manager_class->add_device = clutter_device_manager_x11_add_device;
|
||||
manager_class->remove_device = clutter_device_manager_x11_remove_device;
|
||||
manager_class->get_devices = clutter_device_manager_x11_get_devices;
|
||||
manager_class->get_core_device = clutter_device_manager_x11_get_core_device;
|
||||
manager_class->get_device = clutter_device_manager_x11_get_device;
|
||||
manager_class->create_virtual_device = clutter_device_manager_x11_create_virtual_device;
|
||||
manager_class->get_supported_virtual_device_types = clutter_device_manager_x11_get_supported_virtual_device_types;
|
||||
manager_class->apply_kbd_a11y_settings = clutter_device_manager_x11_apply_kbd_a11y_settings;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_device_manager_x11_init (ClutterDeviceManagerX11 *self)
|
||||
{
|
||||
self->devices_by_id = g_hash_table_new (NULL, NULL);
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright © 2009, 2010, 2011 Intel Corp.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Emmanuele Bassi <ebassi@linux.intel.com>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_DEVICE_MANAGER_X11_H__
|
||||
#define __CLUTTER_DEVICE_MANAGER_X11_H__
|
||||
|
||||
#include <clutter/clutter-device-manager.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_TYPE_DEVICE_MANAGER_X11 (_clutter_device_manager_x11_get_type ())
|
||||
#define CLUTTER_DEVICE_MANAGER_X11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DEVICE_MANAGER_X11, ClutterDeviceManagerX11))
|
||||
#define CLUTTER_IS_DEVICE_MANAGER_X11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DEVICE_MANAGER_X11))
|
||||
#define CLUTTER_DEVICE_MANAGER_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_DEVICE_MANAGER_X11, ClutterDeviceManagerX11Class))
|
||||
#define CLUTTER_IS_DEVICE_MANAGER_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_DEVICE_MANAGER_X11))
|
||||
#define CLUTTER_DEVICE_MANAGER_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_DEVICE_MANAGER_X11, ClutterDeviceManagerX11Class))
|
||||
|
||||
typedef struct _ClutterDeviceManagerX11 ClutterDeviceManagerX11;
|
||||
typedef struct _ClutterDeviceManagerX11Class ClutterDeviceManagerX11Class;
|
||||
|
||||
struct _ClutterDeviceManagerX11
|
||||
{
|
||||
ClutterDeviceManager parent_instance;
|
||||
|
||||
GHashTable *devices_by_id;
|
||||
|
||||
/* the list of transient devices */
|
||||
GSList *devices;
|
||||
|
||||
/* the list of all devices, transient and core; this can be
|
||||
* NULL-ified when adding or removing devices
|
||||
*/
|
||||
GSList *all_devices;
|
||||
|
||||
ClutterInputDevice *core_pointer;
|
||||
ClutterInputDevice *core_keyboard;
|
||||
|
||||
int xi_event_base;
|
||||
};
|
||||
|
||||
struct _ClutterDeviceManagerX11Class
|
||||
{
|
||||
ClutterDeviceManagerClass parent_class;
|
||||
};
|
||||
|
||||
GType _clutter_device_manager_x11_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_DEVICE_MANAGER_X11_H__ */
|
||||
@@ -1,159 +0,0 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Authored By Johan Bilien <johan.bilien@nokia.com>
|
||||
* Matthew Allum <mallum@o-hand.com>
|
||||
* Robert Bragg <bob@o-hand.com>
|
||||
* Neil Roberts <neil@linux.intel.com>
|
||||
*
|
||||
* Copyright (C) 2007 OpenedHand
|
||||
* Copyright (C) 2010 Intel Corporation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:clutter-glx-texture-pixmap
|
||||
* @Title: ClutterGLXTexturePixmap
|
||||
* @short_description: A texture which displays the content of an X Pixmap
|
||||
* @Deprecated: 1.4: Use #ClutterX11TexturePixmap instead.
|
||||
*
|
||||
* #ClutterGLXTexturePixmap is a class for displaying the content of an
|
||||
* X Pixmap as a ClutterActor. Used together with the X Composite extension,
|
||||
* it allows to display the content of X Windows inside Clutter.
|
||||
*
|
||||
* This class used to be necessary to use the
|
||||
* GLX_EXT_texture_from_pixmap extension to get fast texture
|
||||
* updates. However since Clutter 1.4 the handling of this extension
|
||||
* has moved down to Cogl. ClutterX11TexturePixmap and
|
||||
* ClutterGLXTexturePixmap are now equivalent and either one of them
|
||||
* may use the extension if it is possible.
|
||||
*/
|
||||
|
||||
#include "clutter-build-config.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
|
||||
#include "x11/clutter-x11-texture-pixmap.h"
|
||||
|
||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
||||
|
||||
#include "clutter-glx-texture-pixmap.h"
|
||||
|
||||
G_DEFINE_TYPE (ClutterGLXTexturePixmap, \
|
||||
clutter_glx_texture_pixmap, \
|
||||
CLUTTER_X11_TYPE_TEXTURE_PIXMAP);
|
||||
|
||||
static void
|
||||
clutter_glx_texture_pixmap_init (ClutterGLXTexturePixmap *self)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_glx_texture_pixmap_class_init (ClutterGLXTexturePixmapClass *klass)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_glx_texture_pixmap_using_extension:
|
||||
* @texture: A #ClutterGLXTexturePixmap
|
||||
*
|
||||
* Checks whether @texture is using the GLX_EXT_texture_from_pixmap
|
||||
* extension; this extension can be optionally (though it is strongly
|
||||
* encouraged) implemented as a zero-copy between a GLX pixmap and
|
||||
* a GL texture.
|
||||
*
|
||||
* Return value: %TRUE if the texture is using the
|
||||
* GLX_EXT_texture_from_pixmap OpenGL extension or falling back to the
|
||||
* slower software mechanism.
|
||||
*
|
||||
* Deprecated: 1.6: Use cogl_texture_pixmap_x11_is_using_tfp_extension()
|
||||
* on the texture handle instead.
|
||||
*
|
||||
* Since: 0.8
|
||||
*/
|
||||
gboolean
|
||||
clutter_glx_texture_pixmap_using_extension (ClutterGLXTexturePixmap *texture)
|
||||
{
|
||||
CoglHandle cogl_texture;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_GLX_IS_TEXTURE_PIXMAP (texture), FALSE);
|
||||
|
||||
cogl_texture = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (texture));
|
||||
|
||||
return (cogl_is_texture_pixmap_x11 (cogl_texture) &&
|
||||
cogl_texture_pixmap_x11_is_using_tfp_extension (cogl_texture));
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_glx_texture_pixmap_new_with_pixmap:
|
||||
* @pixmap: the X Pixmap to which this texture should be bound
|
||||
*
|
||||
* Creates a new #ClutterGLXTexturePixmap for @pixmap
|
||||
*
|
||||
* Return value: A new #ClutterGLXTexturePixmap bound to the given X Pixmap
|
||||
*
|
||||
* Since: 0.8
|
||||
*
|
||||
* Deprecated: 1.6: Use clutter_x11_texture_pixmap_new_with_pixmap() instead
|
||||
*/
|
||||
ClutterActor *
|
||||
clutter_glx_texture_pixmap_new_with_pixmap (Pixmap pixmap)
|
||||
{
|
||||
return g_object_new (CLUTTER_GLX_TYPE_TEXTURE_PIXMAP,
|
||||
"pixmap", pixmap,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_glx_texture_pixmap_new_with_window:
|
||||
* @window: the X window to which this texture should be bound
|
||||
*
|
||||
* Creates a new #ClutterGLXTexturePixmap for @window
|
||||
*
|
||||
* Return value: A new #ClutterGLXTexturePixmap bound to the given X window
|
||||
*
|
||||
* Since: 0.8
|
||||
*
|
||||
* Deprecated: 1.6: Use clutter_x11_texture_pixmap_new_with_window() instead
|
||||
*/
|
||||
ClutterActor *
|
||||
clutter_glx_texture_pixmap_new_with_window (Window window)
|
||||
{
|
||||
return g_object_new (CLUTTER_GLX_TYPE_TEXTURE_PIXMAP,
|
||||
"window", window,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_glx_texture_pixmap_new:
|
||||
*
|
||||
* Creates a new, empty #ClutterGLXTexturePixmap
|
||||
*
|
||||
* Return value: A new #ClutterGLXTexturePixmap
|
||||
*
|
||||
* Since: 0.8
|
||||
*
|
||||
* Deprecated: 1.6: Use clutter_x11_texture_pixmap_new() instead
|
||||
*/
|
||||
ClutterActor *
|
||||
clutter_glx_texture_pixmap_new (void)
|
||||
{
|
||||
return g_object_new (CLUTTER_GLX_TYPE_TEXTURE_PIXMAP, NULL);
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Authored By Johan Bilien <johan.bilien@nokia.com>
|
||||
*
|
||||
* Copyright (C) 2007 OpenedHand
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_GLX_TEXTURE_PIXMAP_H__
|
||||
#define __CLUTTER_GLX_TEXTURE_PIXMAP_H__
|
||||
|
||||
#include <clutter/x11/clutter-x11-texture-pixmap.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_GLX_TYPE_TEXTURE_PIXMAP (clutter_glx_texture_pixmap_get_type ())
|
||||
#define CLUTTER_GLX_TEXTURE_PIXMAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_GLX_TYPE_TEXTURE_PIXMAP, ClutterGLXTexturePixmap))
|
||||
#define CLUTTER_GLX_TEXTURE_PIXMAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_GLX_TYPE_TEXTURE_PIXMAP, ClutterGLXTexturePixmapClass))
|
||||
#define CLUTTER_GLX_IS_TEXTURE_PIXMAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_GLX_TYPE_TEXTURE_PIXMAP))
|
||||
#define CLUTTER_GLX_IS_TEXTURE_PIXMAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_GLX_TYPE_TEXTURE_PIXMAP))
|
||||
#define CLUTTER_GLX_TEXTURE_PIXMAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_GLX_TYPE_TEXTURE_PIXMAP, ClutterGLXTexturePixmapClass))
|
||||
|
||||
typedef struct _ClutterGLXTexturePixmap ClutterGLXTexturePixmap;
|
||||
typedef struct _ClutterGLXTexturePixmapClass ClutterGLXTexturePixmapClass;
|
||||
typedef struct _ClutterGLXTexturePixmapPrivate ClutterGLXTexturePixmapPrivate;
|
||||
|
||||
/**
|
||||
* ClutterGLXTexturePixmapClass:
|
||||
*
|
||||
* The #ClutterGLXTexturePixmapClass structure contains only private data
|
||||
*
|
||||
* Since: 0.8
|
||||
*
|
||||
* Deprecated: 1.6: Use #ClutterX11TexturePixmapClass instead
|
||||
*/
|
||||
struct _ClutterGLXTexturePixmapClass
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterX11TexturePixmapClass parent_class;
|
||||
};
|
||||
|
||||
/**
|
||||
* ClutterGLXTexturePixmap:
|
||||
*
|
||||
* The #ClutterGLXTexturePixmap structure contains only private data
|
||||
*
|
||||
* Since: 0.8
|
||||
*
|
||||
* Deprecated: 1.6: Use #ClutterX11TexturePixmap instead
|
||||
*/
|
||||
struct _ClutterGLXTexturePixmap
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterX11TexturePixmap parent;
|
||||
|
||||
ClutterGLXTexturePixmapPrivate *priv;
|
||||
};
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_x11_texture_pixmap_get_type)
|
||||
GType clutter_glx_texture_pixmap_get_type (void);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_x11_texture_pixmap_new)
|
||||
ClutterActor * clutter_glx_texture_pixmap_new (void);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_x11_texture_pixmap_new_with_pixmap)
|
||||
ClutterActor * clutter_glx_texture_pixmap_new_with_pixmap (Pixmap pixmap);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_x11_texture_pixmap_new_with_window)
|
||||
ClutterActor * clutter_glx_texture_pixmap_new_with_window (Window window);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(cogl_texture_pixmap_x11_is_using_tfp_extension)
|
||||
gboolean clutter_glx_texture_pixmap_using_extension (ClutterGLXTexturePixmap *texture);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_GLX_TEXTURE_PIXMAP_H__ */
|
||||
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Authored By Matthew Allum <mallum@openedhand.com>
|
||||
*
|
||||
* Copyright (C) 2006 OpenedHand
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_GLX_H__
|
||||
#define __CLUTTER_GLX_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include <clutter/clutter.h>
|
||||
#include <clutter/glx/clutter-glx-texture-pixmap.h>
|
||||
|
||||
#endif /* __CLUTTER_GLX_H__ */
|
||||
@@ -1,78 +0,0 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright © 2010, 2011 Intel Corp.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Emmanuele Bassi <ebassi@linux.intel.com>
|
||||
*/
|
||||
|
||||
#include "clutter-build-config.h"
|
||||
|
||||
#include "clutter-input-device-core-x11.h"
|
||||
|
||||
#include "clutter-debug.h"
|
||||
#include "clutter-device-manager-private.h"
|
||||
#include "clutter-private.h"
|
||||
#include "clutter-stage-private.h"
|
||||
|
||||
#include "clutter-backend-x11.h"
|
||||
#include "clutter-stage-x11.h"
|
||||
|
||||
typedef struct _ClutterInputDeviceClass ClutterInputDeviceX11Class;
|
||||
|
||||
/* a specific X11 input device */
|
||||
struct _ClutterInputDeviceX11
|
||||
{
|
||||
ClutterInputDevice device;
|
||||
|
||||
int min_keycode;
|
||||
int max_keycode;
|
||||
};
|
||||
|
||||
#define clutter_input_device_x11_get_type _clutter_input_device_x11_get_type
|
||||
|
||||
G_DEFINE_TYPE (ClutterInputDeviceX11,
|
||||
clutter_input_device_x11,
|
||||
CLUTTER_TYPE_INPUT_DEVICE);
|
||||
|
||||
static gboolean
|
||||
clutter_input_device_x11_keycode_to_evdev (ClutterInputDevice *device,
|
||||
guint hardware_keycode,
|
||||
guint *evdev_keycode)
|
||||
{
|
||||
/* When using evdev under X11 the hardware keycodes are the evdev
|
||||
keycodes plus 8. I haven't been able to find any documentation to
|
||||
know what the +8 is for. FIXME: This should probably verify that
|
||||
X server is using evdev. */
|
||||
*evdev_keycode = hardware_keycode - 8;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_device_x11_class_init (ClutterInputDeviceX11Class *klass)
|
||||
{
|
||||
ClutterInputDeviceClass *device_class = CLUTTER_INPUT_DEVICE_CLASS (klass);
|
||||
|
||||
device_class->keycode_to_evdev = clutter_input_device_x11_keycode_to_evdev;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_device_x11_init (ClutterInputDeviceX11 *self)
|
||||
{
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
/*
|
||||
* Clutter.
|
||||
*
|
||||
* An OpenGL based 'interactive canvas' library.
|
||||
*
|
||||
* Copyright © 2010, 2011 Intel Corp.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Emmanuele Bassi <ebassi@linux.intel.com>
|
||||
*/
|
||||
|
||||
#ifndef __CLUTTER_INPUT_DEVICE_X11_H__
|
||||
#define __CLUTTER_INPUT_DEVICE_X11_H__
|
||||
|
||||
#include <clutter/clutter-input-device.h>
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include "clutter-stage-x11.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CLUTTER_TYPE_INPUT_DEVICE_X11 (_clutter_input_device_x11_get_type ())
|
||||
#define CLUTTER_INPUT_DEVICE_X11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_INPUT_DEVICE_X11, ClutterInputDeviceX11))
|
||||
#define CLUTTER_IS_INPUT_DEVICE_X11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_INPUT_DEVICE_X11))
|
||||
|
||||
typedef struct _ClutterInputDeviceX11 ClutterInputDeviceX11;
|
||||
|
||||
GType _clutter_input_device_x11_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __CLUTTER_INPUT_DEVICE_X11_H__ */
|
||||
@@ -49,10 +49,12 @@
|
||||
|
||||
#define STAGE_X11_IS_MAPPED(s) ((((ClutterStageX11 *) (s))->wm_state & STAGE_X11_WITHDRAWN) == 0)
|
||||
|
||||
static ClutterStageWindowIface *clutter_stage_window_parent_iface = NULL;
|
||||
static ClutterStageWindowInterface *clutter_stage_window_parent_iface = NULL;
|
||||
|
||||
static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
|
||||
static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
|
||||
static void
|
||||
clutter_stage_window_iface_init (ClutterStageWindowInterface *iface);
|
||||
static void
|
||||
clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
|
||||
|
||||
static ClutterStageCogl *clutter_x11_get_stage_window_from_window (Window win);
|
||||
|
||||
@@ -972,7 +974,7 @@ clutter_stage_x11_init (ClutterStageX11 *stage)
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
|
||||
clutter_stage_window_iface_init (ClutterStageWindowInterface *iface)
|
||||
{
|
||||
clutter_stage_window_parent_iface = g_type_interface_peek_parent (iface);
|
||||
|
||||
@@ -1390,37 +1392,6 @@ clutter_x11_get_stage_from_window (Window win)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_x11_get_stage_visual: (skip)
|
||||
* @stage: a #ClutterStage
|
||||
*
|
||||
* Returns an XVisualInfo suitable for creating a foreign window for the given
|
||||
* stage. NOTE: It doesn't do as the name may suggest, which is return the
|
||||
* XVisualInfo that was used to create an existing window for the given stage.
|
||||
*
|
||||
* XXX: It might be best to deprecate this function and replace with something
|
||||
* along the lines of clutter_backend_x11_get_foreign_visual () or perhaps
|
||||
* clutter_stage_x11_get_foreign_visual ()
|
||||
*
|
||||
* Return value: (transfer full): An XVisualInfo suitable for creating a
|
||||
* foreign stage. Use XFree() to free the returned value instead
|
||||
*
|
||||
* Deprecated: 1.2: Use clutter_x11_get_visual_info() instead
|
||||
*
|
||||
* Since: 0.4
|
||||
*/
|
||||
XVisualInfo *
|
||||
clutter_x11_get_stage_visual (ClutterStage *stage)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterBackendX11 *backend_x11;
|
||||
|
||||
g_return_val_if_fail (CLUTTER_IS_BACKEND_X11 (backend), NULL);
|
||||
backend_x11 = CLUTTER_BACKEND_X11 (backend);
|
||||
|
||||
return _clutter_backend_x11_get_visual_info (backend_x11);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
ClutterStageX11 *stage_x11;
|
||||
cairo_rectangle_int_t geom;
|
||||
|
||||
@@ -104,9 +104,6 @@ XVisualInfo *clutter_x11_get_visual_info (void);
|
||||
CLUTTER_EXPORT
|
||||
void clutter_x11_set_display (Display * xdpy);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_x11_get_visual_info)
|
||||
XVisualInfo *clutter_x11_get_stage_visual (ClutterStage *stage);
|
||||
|
||||
CLUTTER_EXPORT
|
||||
Window clutter_x11_get_stage_window (ClutterStage *stage);
|
||||
CLUTTER_EXPORT
|
||||
@@ -131,11 +128,6 @@ gboolean clutter_x11_has_event_retrieval (void);
|
||||
CLUTTER_EXPORT
|
||||
ClutterStage *clutter_x11_get_stage_from_window (Window win);
|
||||
|
||||
CLUTTER_DEPRECATED_FOR(clutter_device_manager_peek_devices)
|
||||
const GSList* clutter_x11_get_input_devices (void);
|
||||
|
||||
CLUTTER_DEPRECATED
|
||||
void clutter_x11_enable_xinput (void);
|
||||
CLUTTER_EXPORT
|
||||
gboolean clutter_x11_has_xinput (void);
|
||||
|
||||
|
||||
@@ -1,199 +0,0 @@
|
||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
static void
|
||||
animator_multi_properties (void)
|
||||
{
|
||||
ClutterScript *script = clutter_script_new ();
|
||||
GObject *animator = NULL, *foo = NULL;
|
||||
GError *error = NULL;
|
||||
gchar *test_file;
|
||||
GList *keys;
|
||||
ClutterAnimatorKey *key;
|
||||
GValue value = { 0, };
|
||||
|
||||
test_file = g_test_build_filename (G_TEST_DIST,
|
||||
"scripts",
|
||||
"test-animator-3.json",
|
||||
NULL);
|
||||
clutter_script_load_from_file (script, test_file, &error);
|
||||
if (g_test_verbose () && error)
|
||||
g_print ("Error: %s", error->message);
|
||||
|
||||
g_assert_no_error (error);
|
||||
|
||||
foo = clutter_script_get_object (script, "foo");
|
||||
g_assert (G_IS_OBJECT (foo));
|
||||
|
||||
animator = clutter_script_get_object (script, "animator");
|
||||
g_assert (CLUTTER_IS_ANIMATOR (animator));
|
||||
|
||||
/* get all the keys for foo:x */
|
||||
keys = clutter_animator_get_keys (CLUTTER_ANIMATOR (animator),
|
||||
foo, "x",
|
||||
-1.0);
|
||||
g_assert_cmpint (g_list_length (keys), ==, 3);
|
||||
|
||||
key = g_list_nth_data (keys, 1);
|
||||
g_assert (key != NULL);
|
||||
|
||||
if (g_test_verbose ())
|
||||
{
|
||||
g_print ("(foo, x).keys[1] = \n"
|
||||
".object = %s\n"
|
||||
".progress = %.2f\n"
|
||||
".name = '%s'\n"
|
||||
".type = '%s'\n",
|
||||
clutter_get_script_id (clutter_animator_key_get_object (key)),
|
||||
clutter_animator_key_get_progress (key),
|
||||
clutter_animator_key_get_property_name (key),
|
||||
g_type_name (clutter_animator_key_get_property_type (key)));
|
||||
}
|
||||
|
||||
g_assert (clutter_animator_key_get_object (key) != NULL);
|
||||
g_assert_cmpfloat (clutter_animator_key_get_progress (key), ==, 0.2);
|
||||
g_assert_cmpstr (clutter_animator_key_get_property_name (key), ==, "x");
|
||||
|
||||
g_assert (clutter_animator_key_get_property_type (key) == G_TYPE_FLOAT);
|
||||
|
||||
g_value_init (&value, G_TYPE_FLOAT);
|
||||
g_assert (clutter_animator_key_get_value (key, &value));
|
||||
g_assert_cmpfloat (g_value_get_float (&value), ==, 150.0);
|
||||
g_value_unset (&value);
|
||||
|
||||
g_list_free (keys);
|
||||
|
||||
/* get all the keys for foo:y */
|
||||
keys = clutter_animator_get_keys (CLUTTER_ANIMATOR (animator),
|
||||
foo, "y",
|
||||
-1.0);
|
||||
g_assert_cmpint (g_list_length (keys), ==, 3);
|
||||
|
||||
key = g_list_nth_data (keys, 2);
|
||||
g_assert (key != NULL);
|
||||
|
||||
if (g_test_verbose ())
|
||||
{
|
||||
g_print ("(foo, y).keys[2] = \n"
|
||||
".object = %s\n"
|
||||
".progress = %.2f\n"
|
||||
".name = '%s'\n"
|
||||
".type = '%s'\n",
|
||||
clutter_get_script_id (clutter_animator_key_get_object (key)),
|
||||
clutter_animator_key_get_progress (key),
|
||||
clutter_animator_key_get_property_name (key),
|
||||
g_type_name (clutter_animator_key_get_property_type (key)));
|
||||
}
|
||||
|
||||
g_assert (clutter_animator_key_get_object (key) != NULL);
|
||||
g_assert_cmpfloat (clutter_animator_key_get_progress (key), ==, 0.8);
|
||||
g_assert_cmpstr (clutter_animator_key_get_property_name (key), ==, "y");
|
||||
|
||||
g_assert (clutter_animator_key_get_property_type (key) == G_TYPE_FLOAT);
|
||||
|
||||
g_value_init (&value, G_TYPE_FLOAT);
|
||||
g_assert (clutter_animator_key_get_value (key, &value));
|
||||
g_assert_cmpfloat (g_value_get_float (&value), ==, 200.0);
|
||||
g_value_unset (&value);
|
||||
|
||||
g_list_free (keys);
|
||||
|
||||
g_object_unref (script);
|
||||
g_free (test_file);
|
||||
}
|
||||
|
||||
static void
|
||||
animator_properties (void)
|
||||
{
|
||||
ClutterScript *script = clutter_script_new ();
|
||||
GObject *animator = NULL;
|
||||
GError *error = NULL;
|
||||
gchar *test_file;
|
||||
GList *keys;
|
||||
ClutterAnimatorKey *key;
|
||||
GValue value = { 0, };
|
||||
|
||||
test_file = g_test_build_filename (G_TEST_DIST,
|
||||
"scripts",
|
||||
"test-animator-2.json",
|
||||
NULL);
|
||||
clutter_script_load_from_file (script, test_file, &error);
|
||||
if (g_test_verbose () && error)
|
||||
g_print ("Error: %s", error->message);
|
||||
|
||||
g_assert_no_error (error);
|
||||
|
||||
animator = clutter_script_get_object (script, "animator");
|
||||
g_assert (CLUTTER_IS_ANIMATOR (animator));
|
||||
|
||||
/* get all the keys */
|
||||
keys = clutter_animator_get_keys (CLUTTER_ANIMATOR (animator),
|
||||
NULL, NULL, -1.0);
|
||||
g_assert_cmpint (g_list_length (keys), ==, 3);
|
||||
|
||||
key = g_list_nth_data (keys, 1);
|
||||
g_assert (key != NULL);
|
||||
|
||||
if (g_test_verbose ())
|
||||
{
|
||||
g_print ("keys[1] = \n"
|
||||
".object = %s\n"
|
||||
".progress = %.2f\n"
|
||||
".name = '%s'\n"
|
||||
".type = '%s'\n",
|
||||
clutter_get_script_id (clutter_animator_key_get_object (key)),
|
||||
clutter_animator_key_get_progress (key),
|
||||
clutter_animator_key_get_property_name (key),
|
||||
g_type_name (clutter_animator_key_get_property_type (key)));
|
||||
}
|
||||
|
||||
g_assert (clutter_animator_key_get_object (key) != NULL);
|
||||
g_assert_cmpfloat (clutter_animator_key_get_progress (key), ==, 0.2);
|
||||
g_assert_cmpstr (clutter_animator_key_get_property_name (key), ==, "x");
|
||||
|
||||
g_assert (clutter_animator_key_get_property_type (key) == G_TYPE_FLOAT);
|
||||
|
||||
g_value_init (&value, G_TYPE_FLOAT);
|
||||
g_assert (clutter_animator_key_get_value (key, &value));
|
||||
g_assert_cmpfloat (g_value_get_float (&value), ==, 150.0);
|
||||
g_value_unset (&value);
|
||||
|
||||
g_list_free (keys);
|
||||
g_object_unref (script);
|
||||
g_free (test_file);
|
||||
}
|
||||
|
||||
static void
|
||||
animator_base (void)
|
||||
{
|
||||
ClutterScript *script = clutter_script_new ();
|
||||
GObject *animator = NULL;
|
||||
GError *error = NULL;
|
||||
guint duration = 0;
|
||||
gchar *test_file;
|
||||
|
||||
test_file = g_test_build_filename (G_TEST_DIST,
|
||||
"scripts",
|
||||
"test-animator-1.json",
|
||||
NULL);
|
||||
clutter_script_load_from_file (script, test_file, &error);
|
||||
if (g_test_verbose () && error)
|
||||
g_print ("Error: %s", error->message);
|
||||
|
||||
g_assert_no_error (error);
|
||||
|
||||
animator = clutter_script_get_object (script, "animator");
|
||||
g_assert (CLUTTER_IS_ANIMATOR (animator));
|
||||
|
||||
duration = clutter_animator_get_duration (CLUTTER_ANIMATOR (animator));
|
||||
g_assert_cmpint (duration, ==, 1000);
|
||||
|
||||
g_object_unref (script);
|
||||
g_free (test_file);
|
||||
}
|
||||
|
||||
CLUTTER_TEST_SUITE (
|
||||
CLUTTER_TEST_UNIT ("/script/animator/base", animator_base)
|
||||
CLUTTER_TEST_UNIT ("/script/animator/properties", animator_properties)
|
||||
CLUTTER_TEST_UNIT ("/script/animator/multi-properties", animator_multi_properties)
|
||||
)
|
||||
@@ -40,7 +40,6 @@ clutter_conform_tests_general_tests = [
|
||||
]
|
||||
|
||||
clutter_conform_tests_deprecated_tests = [
|
||||
'animator',
|
||||
'behaviours',
|
||||
'group',
|
||||
'rectangle',
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
#include "test-conform-common.h"
|
||||
|
||||
static guint level = 0;
|
||||
|
||||
static void
|
||||
on_score_started (ClutterScore *score)
|
||||
{
|
||||
if (g_test_verbose ())
|
||||
g_print ("Score started\n");
|
||||
}
|
||||
|
||||
static void
|
||||
on_score_completed (ClutterScore *score)
|
||||
{
|
||||
if (g_test_verbose ())
|
||||
g_print ("Score completed\n");
|
||||
}
|
||||
|
||||
static void
|
||||
on_timeline_started (ClutterScore *score,
|
||||
ClutterTimeline *timeline)
|
||||
{
|
||||
if (g_test_verbose ())
|
||||
g_print ("Started timeline: '%s'\n",
|
||||
(gchar *) g_object_get_data (G_OBJECT (timeline), "timeline-name"));
|
||||
|
||||
level += 1;
|
||||
}
|
||||
|
||||
static void
|
||||
on_timeline_completed (ClutterScore *score,
|
||||
ClutterTimeline *timeline)
|
||||
{
|
||||
if (g_test_verbose ())
|
||||
g_print ("Completed timeline: '%s'\n",
|
||||
(gchar *) g_object_get_data (G_OBJECT (timeline), "timeline-name"));
|
||||
|
||||
level -= 1;
|
||||
}
|
||||
|
||||
void
|
||||
score_base (TestConformSimpleFixture *fixture,
|
||||
gconstpointer data)
|
||||
{
|
||||
ClutterScore *score;
|
||||
ClutterTimeline *timeline_1;
|
||||
ClutterTimeline *timeline_2;
|
||||
ClutterTimeline *timeline_3;
|
||||
ClutterTimeline *timeline_4;
|
||||
ClutterTimeline *timeline_5;
|
||||
GSList *timelines;
|
||||
|
||||
/* FIXME - this is necessary to make the master clock spin */
|
||||
ClutterActor *stage = clutter_stage_new ();
|
||||
|
||||
timeline_1 = clutter_timeline_new (100);
|
||||
g_object_set_data_full (G_OBJECT (timeline_1),
|
||||
"timeline-name", g_strdup ("Timeline 1"),
|
||||
g_free);
|
||||
|
||||
timeline_2 = clutter_timeline_new (100);
|
||||
clutter_timeline_add_marker_at_time (timeline_2, "foo", 50);
|
||||
g_object_set_data_full (G_OBJECT (timeline_2),
|
||||
"timeline-name", g_strdup ("Timeline 2"),
|
||||
g_free);
|
||||
|
||||
timeline_3 = clutter_timeline_new (100);
|
||||
g_object_set_data_full (G_OBJECT (timeline_3),
|
||||
"timeline-name", g_strdup ("Timeline 3"),
|
||||
g_free);
|
||||
|
||||
timeline_4 = clutter_timeline_new (100);
|
||||
g_object_set_data_full (G_OBJECT (timeline_4),
|
||||
"timeline-name", g_strdup ("Timeline 4"),
|
||||
g_free);
|
||||
|
||||
timeline_5 = clutter_timeline_new (100);
|
||||
g_object_set_data_full (G_OBJECT (timeline_5),
|
||||
"timeline-name", g_strdup ("Timeline 5"),
|
||||
g_free);
|
||||
|
||||
score = clutter_score_new();
|
||||
g_signal_connect (score, "started",
|
||||
G_CALLBACK (on_score_started),
|
||||
NULL);
|
||||
g_signal_connect (score, "timeline-started",
|
||||
G_CALLBACK (on_timeline_started),
|
||||
NULL);
|
||||
g_signal_connect (score, "timeline-completed",
|
||||
G_CALLBACK (on_timeline_completed),
|
||||
NULL);
|
||||
g_signal_connect (score, "completed",
|
||||
G_CALLBACK (on_score_completed),
|
||||
NULL);
|
||||
|
||||
clutter_score_append (score, NULL, timeline_1);
|
||||
clutter_score_append (score, timeline_1, timeline_2);
|
||||
clutter_score_append (score, timeline_1, timeline_3);
|
||||
clutter_score_append (score, timeline_3, timeline_4);
|
||||
|
||||
clutter_score_append_at_marker (score, timeline_2, "foo", timeline_5);
|
||||
|
||||
timelines = clutter_score_list_timelines (score);
|
||||
g_assert (5 == g_slist_length (timelines));
|
||||
g_slist_free (timelines);
|
||||
|
||||
clutter_score_start (score);
|
||||
|
||||
clutter_actor_destroy (stage);
|
||||
|
||||
g_object_unref (timeline_1);
|
||||
g_object_unref (timeline_2);
|
||||
g_object_unref (timeline_3);
|
||||
g_object_unref (timeline_4);
|
||||
g_object_unref (timeline_5);
|
||||
g_object_unref (score);
|
||||
}
|
||||
@@ -27,9 +27,7 @@ clutter_tests_interactive_test_sources = [
|
||||
'test-script.c',
|
||||
'test-grab.c',
|
||||
'test-cogl-shader-glsl.c',
|
||||
'test-animator.c',
|
||||
'test-state.c',
|
||||
'test-state-animator.c',
|
||||
'test-fbo.c',
|
||||
'test-multistage.c',
|
||||
'test-cogl-tex-tile.c',
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <gmodule.h>
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
static ClutterAnimator *animator;
|
||||
|
||||
gint
|
||||
test_animator_main (gint argc,
|
||||
gchar **argv);
|
||||
|
||||
static ClutterActor *new_rect (gint r,
|
||||
gint g,
|
||||
gint b,
|
||||
gint a)
|
||||
{
|
||||
GError *error = NULL;
|
||||
ClutterColor *color = clutter_color_new (r, g, b, a);
|
||||
ClutterActor *rectangle;
|
||||
|
||||
gchar *file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL);
|
||||
rectangle = clutter_texture_new_from_file (file, &error);
|
||||
if (rectangle == NULL)
|
||||
g_error ("image load failed: %s", error->message);
|
||||
g_free (file);
|
||||
|
||||
clutter_actor_set_size (rectangle, 128, 128);
|
||||
clutter_color_free (color);
|
||||
return rectangle;
|
||||
}
|
||||
|
||||
static gboolean nuke_one (gpointer actor)
|
||||
{
|
||||
clutter_actor_destroy (actor);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#define COUNT 4
|
||||
|
||||
static void reverse_timeline (ClutterTimeline *timeline,
|
||||
gpointer data)
|
||||
{
|
||||
ClutterTimelineDirection direction = clutter_timeline_get_direction (timeline);
|
||||
if (direction == CLUTTER_TIMELINE_FORWARD)
|
||||
clutter_timeline_set_direction (timeline, CLUTTER_TIMELINE_BACKWARD);
|
||||
else
|
||||
clutter_timeline_set_direction (timeline, CLUTTER_TIMELINE_FORWARD);
|
||||
clutter_timeline_start (timeline);
|
||||
}
|
||||
|
||||
|
||||
G_MODULE_EXPORT gint
|
||||
test_animator_main (gint argc,
|
||||
gchar **argv)
|
||||
{
|
||||
ClutterActor *stage;
|
||||
ClutterActor *rects[COUNT];
|
||||
gint i;
|
||||
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
|
||||
return 1;
|
||||
|
||||
stage = clutter_stage_new ();
|
||||
clutter_stage_set_title (CLUTTER_STAGE (stage), "Animator");
|
||||
g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
|
||||
|
||||
for (i = 0; i < COUNT; i++)
|
||||
{
|
||||
rects[i] = new_rect (255 * (i * 1.0 / COUNT), 50, 160, 255);
|
||||
clutter_container_add_actor (CLUTTER_CONTAINER (stage), rects[i]);
|
||||
clutter_actor_set_anchor_point (rects[i], 64, 64);
|
||||
clutter_actor_set_position (rects[i], 320.0, 240.0);
|
||||
clutter_actor_set_opacity (rects[i], 0x70);
|
||||
}
|
||||
|
||||
clutter_threads_add_timeout (10000, nuke_one, rects[2]);
|
||||
|
||||
animator = clutter_animator_new ();
|
||||
|
||||
/* Note: when both animations are active for the same actor at the same
|
||||
* time there is a race, such races should be handled by avoiding
|
||||
* controlling the same properties from multiple animations. This is
|
||||
* an intentional design flaw of this test for testing the corner case.
|
||||
*/
|
||||
|
||||
clutter_animator_set (animator,
|
||||
rects[0], "x", 1, 0.0, 180.0,
|
||||
rects[0], "x", CLUTTER_LINEAR, 0.25, 450.0,
|
||||
rects[0], "x", CLUTTER_LINEAR, 0.5, 450.0,
|
||||
rects[0], "x", CLUTTER_LINEAR, 0.75, 180.0,
|
||||
rects[0], "x", CLUTTER_LINEAR, 1.0, 180.0,
|
||||
|
||||
rects[0], "y", -1, 0.0, 100.0,
|
||||
rects[0], "y", CLUTTER_LINEAR, 0.25, 100.0,
|
||||
rects[0], "y", CLUTTER_LINEAR, 0.5, 380.0,
|
||||
rects[0], "y", CLUTTER_LINEAR, 0.75, 380.0,
|
||||
rects[0], "y", CLUTTER_LINEAR, 1.0, 100.0,
|
||||
|
||||
rects[3], "x", 0, 0.0, 180.0,
|
||||
rects[3], "x", CLUTTER_LINEAR, 0.25, 180.0,
|
||||
rects[3], "x", CLUTTER_LINEAR, 0.5, 450.0,
|
||||
rects[3], "x", CLUTTER_LINEAR, 0.75, 450.0,
|
||||
rects[3], "x", CLUTTER_LINEAR, 1.0, 180.0,
|
||||
|
||||
rects[3], "y", 0, 0.0, 100.0,
|
||||
rects[3], "y", CLUTTER_LINEAR, 0.25, 380.0,
|
||||
rects[3], "y", CLUTTER_LINEAR, 0.5, 380.0,
|
||||
rects[3], "y", CLUTTER_LINEAR, 0.75, 100.0,
|
||||
rects[3], "y", CLUTTER_LINEAR, 1.0, 100.0,
|
||||
|
||||
|
||||
rects[2], "rotation-angle-y", 0, 0.0, 0.0,
|
||||
rects[2], "rotation-angle-y", CLUTTER_LINEAR, 1.0, 360.0,
|
||||
|
||||
rects[1], "scale-x", 0, 0.0, 1.0,
|
||||
rects[1], "scale-x", CLUTTER_LINEAR, 1.0, 2.0,
|
||||
rects[1], "scale-y", 0, 0.0, 1.0,
|
||||
rects[1], "scale-y", CLUTTER_LINEAR, 1.0, 2.0,
|
||||
NULL);
|
||||
|
||||
|
||||
clutter_actor_set_scale (rects[0], 1.4, 1.4);
|
||||
clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "x",
|
||||
TRUE);
|
||||
clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "y",
|
||||
TRUE);
|
||||
clutter_animator_property_set_interpolation (animator, G_OBJECT (rects[0]),
|
||||
"x", CLUTTER_INTERPOLATION_CUBIC);
|
||||
clutter_animator_property_set_interpolation (animator, G_OBJECT (rects[0]),
|
||||
"y", CLUTTER_INTERPOLATION_CUBIC);
|
||||
|
||||
clutter_stage_hide_cursor(CLUTTER_STAGE (stage));
|
||||
clutter_actor_show (stage);
|
||||
clutter_animator_set_duration (animator, 5000);
|
||||
|
||||
g_signal_connect (clutter_animator_start (animator),
|
||||
"completed", G_CALLBACK (reverse_timeline), NULL);
|
||||
clutter_main ();
|
||||
|
||||
g_object_unref (animator);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
@@ -17,7 +17,7 @@ typedef struct _ColorContentClass {
|
||||
GObjectClass parent_class;
|
||||
} ColorContentClass;
|
||||
|
||||
static void clutter_content_iface_init (ClutterContentIface *iface);
|
||||
static void clutter_content_iface_init (ClutterContentInterface *iface);
|
||||
|
||||
GType color_content_get_type (void);
|
||||
|
||||
@@ -135,7 +135,7 @@ color_content_paint_content (ClutterContent *content,
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_content_iface_init (ClutterContentIface *iface)
|
||||
clutter_content_iface_init (ClutterContentInterface *iface)
|
||||
{
|
||||
iface->paint_content = color_content_paint_content;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ typedef struct _SolidContentClass {
|
||||
GObjectClass parent_class;
|
||||
} SolidContentClass;
|
||||
|
||||
static void clutter_content_iface_init (ClutterContentIface *iface);
|
||||
static void clutter_content_iface_init (ClutterContentInterface *iface);
|
||||
|
||||
GType solid_content_get_type (void);
|
||||
|
||||
@@ -136,7 +136,7 @@ solid_content_paint_content (ClutterContent *content,
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_content_iface_init (ClutterContentIface *iface)
|
||||
clutter_content_iface_init (ClutterContentInterface *iface)
|
||||
{
|
||||
iface->paint_content = solid_content_paint_content;
|
||||
}
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <gmodule.h>
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
static ClutterState *state;
|
||||
static ClutterAnimator *animator;
|
||||
|
||||
gint
|
||||
test_state_animator_main (gint argc,
|
||||
gchar **argv);
|
||||
|
||||
const char *
|
||||
test_state_animator_describe (void);
|
||||
|
||||
static gboolean press_event (ClutterActor *actor,
|
||||
ClutterEvent *event,
|
||||
gpointer user_data)
|
||||
{
|
||||
clutter_grab_pointer (actor);
|
||||
clutter_state_set_state (state, "end");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean release_event (ClutterActor *actor,
|
||||
ClutterEvent *event,
|
||||
gpointer user_data)
|
||||
{
|
||||
clutter_state_set_state (state, "start");
|
||||
clutter_ungrab_pointer ();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static ClutterActor *new_rect (gint r,
|
||||
gint g,
|
||||
gint b,
|
||||
gint a)
|
||||
{
|
||||
GError *error = NULL;
|
||||
ClutterColor *color = clutter_color_new (r, g, b, a);
|
||||
ClutterActor *rectangle;
|
||||
|
||||
gchar *file = g_build_filename (TESTS_DATADIR, "redhand.png", NULL);
|
||||
rectangle = clutter_texture_new_from_file (file, &error);
|
||||
if (rectangle == NULL)
|
||||
g_error ("image load failed: %s", error->message);
|
||||
g_free (file);
|
||||
|
||||
clutter_actor_set_size (rectangle, 128, 128);
|
||||
clutter_color_free (color);
|
||||
return rectangle;
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT gint
|
||||
test_state_animator_main (gint argc,
|
||||
gchar **argv)
|
||||
{
|
||||
ClutterActor *stage;
|
||||
ClutterActor *rects[40];
|
||||
gint i;
|
||||
|
||||
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
|
||||
return 1;
|
||||
|
||||
stage = clutter_stage_new ();
|
||||
clutter_stage_set_title (CLUTTER_STAGE (stage), "State and Animator");
|
||||
g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
rects[i] = new_rect (255 * (i * 1.0 / 40), 50, 160, 255);
|
||||
clutter_container_add_actor (CLUTTER_CONTAINER (stage), rects[i]);
|
||||
clutter_actor_set_anchor_point (rects[i], 64, 64);
|
||||
clutter_actor_set_position (rects[i], 320.0, 240.0);
|
||||
clutter_actor_set_opacity (rects[i], 0x70);
|
||||
|
||||
clutter_actor_set_reactive (rects[i], TRUE);
|
||||
g_signal_connect (rects[i], "button-press-event", G_CALLBACK (press_event), NULL);
|
||||
g_signal_connect (rects[i], "button-release-event", G_CALLBACK (release_event), NULL);
|
||||
}
|
||||
|
||||
state = clutter_state_new ();
|
||||
clutter_state_set (state, NULL, "start",
|
||||
rects[0], "depth", CLUTTER_LINEAR, 0.0,
|
||||
rects[0], "x", CLUTTER_LINEAR, 100.0,
|
||||
rects[0], "y", CLUTTER_LINEAR, 300.0,
|
||||
rects[1], "opacity", CLUTTER_LINEAR, 0x20,
|
||||
rects[1], "scale-x", CLUTTER_LINEAR, 1.0,
|
||||
rects[1], "scale-y", CLUTTER_LINEAR, 1.0,
|
||||
NULL);
|
||||
clutter_state_set (state, NULL, "end",
|
||||
rects[0], "depth", CLUTTER_LINEAR, 200.0,
|
||||
rects[0], "x", CLUTTER_LINEAR, 320.0,
|
||||
rects[0], "y", CLUTTER_LINEAR, 240.0,
|
||||
rects[1], "opacity", CLUTTER_LINEAR, 0xff,
|
||||
rects[1], "scale-x", CLUTTER_LINEAR, 2.0,
|
||||
rects[1], "scale-y", CLUTTER_LINEAR, 2.0,
|
||||
NULL);
|
||||
|
||||
animator = clutter_animator_new ();
|
||||
clutter_animator_set (animator,
|
||||
rects[0], "depth", -1, 0.0, 0.0,
|
||||
rects[0], "depth", CLUTTER_LINEAR, 1.0, 275.0,
|
||||
rects[0], "x", -1, 0.0, 0.0,
|
||||
rects[0], "x", CLUTTER_LINEAR, 0.5, 200.0,
|
||||
rects[0], "x", CLUTTER_LINEAR, 1.0, 320.0,
|
||||
|
||||
rects[0], "y", -1, 0.0, 0.0,
|
||||
rects[0], "y", CLUTTER_LINEAR, 0.3, 100.0,
|
||||
rects[0], "y", CLUTTER_LINEAR, 1.0, 240.0,
|
||||
|
||||
rects[1], "opacity", -1, 0.0, 0x20,
|
||||
rects[1], "opacity", CLUTTER_LINEAR, 1.0, 0xff,
|
||||
rects[1], "scale-x", -1, 0.0, 1.0,
|
||||
rects[1], "scale-x", CLUTTER_LINEAR, 0.5, 2.0,
|
||||
rects[1], "scale-x", CLUTTER_LINEAR, 1.0, 2.0,
|
||||
rects[1], "scale-y", -1, 0.0, 1.0,
|
||||
rects[1], "scale-y", CLUTTER_LINEAR, 0.5, 2.0,
|
||||
rects[1], "scale-y", CLUTTER_LINEAR, 1.0, 2.0,
|
||||
NULL);
|
||||
|
||||
clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "depth", TRUE);
|
||||
clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "x", TRUE);
|
||||
clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[0]), "y", TRUE);
|
||||
clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[1]), "opacity", TRUE);
|
||||
clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[1]), "scale-x", TRUE);
|
||||
clutter_animator_property_set_ease_in (animator, G_OBJECT (rects[1]), "scale-y", TRUE);
|
||||
|
||||
clutter_animator_property_set_interpolation (animator, G_OBJECT (rects[0]), "x",
|
||||
CLUTTER_INTERPOLATION_CUBIC);
|
||||
clutter_animator_property_set_interpolation (animator, G_OBJECT (rects[0]), "y",
|
||||
CLUTTER_INTERPOLATION_CUBIC);
|
||||
|
||||
clutter_state_set_animator (state, "start", "end", animator);
|
||||
g_object_unref (animator);
|
||||
|
||||
clutter_actor_show (stage);
|
||||
clutter_state_set_state (state, "start");
|
||||
|
||||
clutter_main ();
|
||||
g_object_unref (state);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT const char *
|
||||
test_state_animator_describe (void)
|
||||
{
|
||||
return "Animate using the State and Animator classes.";
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
project('mutter', 'c',
|
||||
version: '3.31.90',
|
||||
version: '3.31.91',
|
||||
meson_version: '>= 0.48.0',
|
||||
license: 'GPLv2+'
|
||||
)
|
||||
|
||||
@@ -57,7 +57,6 @@ clutter/clutter/clutter-virtual-input-device.c
|
||||
clutter/clutter/clutter-zoom-action.c
|
||||
clutter/clutter/deprecated/clutter-alpha.c
|
||||
clutter/clutter/deprecated/clutter-animation.c
|
||||
clutter/clutter/deprecated/clutter-animator.c
|
||||
clutter/clutter/deprecated/clutter-behaviour.c
|
||||
clutter/clutter/deprecated/clutter-behaviour-depth.c
|
||||
clutter/clutter/deprecated/clutter-behaviour-ellipse.c
|
||||
|
||||
91
po/de.po
91
po/de.po
@@ -13,16 +13,16 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-07-07 09:58+0000\n"
|
||||
"PO-Revision-Date: 2018-08-04 19:59+0200\n"
|
||||
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
|
||||
"POT-Creation-Date: 2019-02-04 17:52+0000\n"
|
||||
"PO-Revision-Date: 2019-02-26 20:43+0100\n"
|
||||
"Last-Translator: Tim Sabsch <tim@sabsch.com>\n"
|
||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 2.0.9\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
@@ -538,7 +538,7 @@ msgstr ""
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2325
|
||||
#: src/backends/meta-input-settings.c:2423
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Moduswechsel (Gruppe %d)"
|
||||
@@ -546,37 +546,44 @@ msgstr "Moduswechsel (Gruppe %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2348
|
||||
#: src/backends/meta-input-settings.c:2446
|
||||
msgid "Switch monitor"
|
||||
msgstr "Bildschirm wechseln"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2350
|
||||
#: src/backends/meta-input-settings.c:2448
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Bildschirmhilfe anzeigen"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:907
|
||||
#: src/backends/meta-monitor-manager.c:954
|
||||
msgid "Built-in display"
|
||||
msgstr "Eingebaute Anzeige"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:930
|
||||
#: src/backends/meta-monitor-manager.c:986
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:932
|
||||
#: src/backends/meta-monitor-manager.c:988
|
||||
msgid "Unknown Display"
|
||||
msgstr "Unbekannte Anzeige"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:940
|
||||
#: src/backends/meta-monitor-manager.c:996
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:1004
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name followed by product/model name where size in "
|
||||
"inches could not be calculated, e.g. Dell U2414H"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: src/compositor/compositor.c:481
|
||||
#: src/compositor/compositor.c:482
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@@ -584,65 +591,65 @@ msgstr ""
|
||||
"Ein weiterer Compositing-Verwalter läuft bereits auf Bildschirm %i der "
|
||||
"Anzeige »%s«."
|
||||
|
||||
#: src/core/bell.c:254
|
||||
#: src/core/bell.c:252
|
||||
msgid "Bell event"
|
||||
msgstr "Klangereignis"
|
||||
|
||||
#: src/core/main.c:191
|
||||
#: src/core/main.c:185
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Verbindung zur Sitzungsverwaltung deaktivieren"
|
||||
|
||||
#: src/core/main.c:197
|
||||
#: src/core/main.c:191
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Den aktuellen Fensterverwalter ersetzen"
|
||||
|
||||
#: src/core/main.c:203
|
||||
#: src/core/main.c:197
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Kennung der Sitzungsverwaltung angeben"
|
||||
|
||||
#: src/core/main.c:208
|
||||
#: src/core/main.c:202
|
||||
msgid "X Display to use"
|
||||
msgstr "Zu verwendende X-Anzeige"
|
||||
|
||||
#: src/core/main.c:214
|
||||
#: src/core/main.c:208
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Sitzung anhand gespeicherter Datei starten"
|
||||
|
||||
#: src/core/main.c:220
|
||||
#: src/core/main.c:214
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "X-Aufrufe abgleichen"
|
||||
|
||||
#: src/core/main.c:227
|
||||
#: src/core/main.c:221
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Als Wayland-Compositor ausführen"
|
||||
|
||||
#: src/core/main.c:233
|
||||
#: src/core/main.c:227
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Als eingebetteten Compositor ausführen"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:233
|
||||
msgid "Run wayland compositor without starting Xwayland"
|
||||
msgstr "Wayland-Compositor ausführen, ohne Xwayland zu starten"
|
||||
|
||||
#: src/core/main.c:247
|
||||
#: src/core/main.c:241
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Als vollwertigen Display-Server verwenden (nicht eingebettet)"
|
||||
|
||||
#: src/core/main.c:253
|
||||
#: src/core/main.c:247
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Mit X11-Backend ausführen"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:148
|
||||
#: src/core/meta-close-dialog-default.c:150
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "»%s« antwortet nicht."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:150
|
||||
#: src/core/meta-close-dialog-default.c:152
|
||||
msgid "Application is not responding."
|
||||
msgstr "Die Anwendung antwortet nicht."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:155
|
||||
#: src/core/meta-close-dialog-default.c:157
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -650,17 +657,17 @@ msgstr ""
|
||||
"Sie können der Anwendung noch etwas Zeit geben oder ein sofortiges Beenden "
|
||||
"erzwingen."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:162
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Beenden erzwingen"
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:162
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
msgid "_Wait"
|
||||
msgstr "_Warten"
|
||||
|
||||
# CHECK
|
||||
# c-format
|
||||
#: src/core/mutter.c:39
|
||||
#: src/core/mutter.c:38
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -676,20 +683,20 @@ msgstr ""
|
||||
"Es besteht KEINE Garantie auf MARKTREIFE oder EIGNUNG für einen BESTIMMTEN "
|
||||
"ZWECK.\n"
|
||||
|
||||
#: src/core/mutter.c:53
|
||||
#: src/core/mutter.c:52
|
||||
msgid "Print version"
|
||||
msgstr "Version ausgeben"
|
||||
|
||||
#: src/core/mutter.c:59
|
||||
#: src/core/mutter.c:58
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Zu benutzendes Mutter-Plugin"
|
||||
|
||||
#: src/core/prefs.c:1915
|
||||
#: src/core/prefs.c:1786
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbeitsfläche %d"
|
||||
|
||||
#: src/core/util.c:120
|
||||
#: src/core/util.c:121
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter wurde ohne Unterstützung für den redseligen Modus kompiliert\n"
|
||||
|
||||
@@ -707,21 +714,21 @@ msgstr ""
|
||||
"Bildschirm »%s« hat bereits einen Fensterverwalter. Versuchen Sie die Option "
|
||||
"»--replace«, um den aktuellen Fensterverwalter zu ersetzen."
|
||||
|
||||
#: src/x11/meta-x11-display.c:1010
|
||||
#: src/x11/meta-x11-display.c:1008
|
||||
msgid "Failed to initialize GDK\n"
|
||||
msgstr "GDK konnte nicht initialisiert werden\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1034
|
||||
#: src/x11/meta-x11-display.c:1032
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "X-Window-Systemanzeige »%s« konnte nicht geöffnet werden\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1117
|
||||
#: src/x11/meta-x11-display.c:1115
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Bildschirm %d auf Anzeige »%s« ist ungültig\n"
|
||||
|
||||
#: src/x11/session.c:1819
|
||||
#: src/x11/session.c:1821
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@@ -729,7 +736,7 @@ msgstr ""
|
||||
"Diese Fenster unterstützen das Speichern der aktuellen Einstellungen nicht "
|
||||
"und müssen bei der nächsten Anmeldung manuell neu gestartet werden."
|
||||
|
||||
#: src/x11/window-props.c:565
|
||||
#: src/x11/window-props.c:568
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (auf %s)"
|
||||
|
||||
11
po/es.po
11
po/es.po
@@ -13,8 +13,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter.master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2019-02-04 17:52+0000\n"
|
||||
"PO-Revision-Date: 2019-02-06 11:33+0100\n"
|
||||
"POT-Creation-Date: 2019-02-17 07:40+0000\n"
|
||||
"PO-Revision-Date: 2019-02-20 15:33+0100\n"
|
||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||
"Language-Team: es <gnome-es-list@gnome.org>\n"
|
||||
"Language: es\n"
|
||||
@@ -397,7 +397,6 @@ msgid "Enable experimental features"
|
||||
msgstr "Activar las características experimentales"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:108
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "To enable experimental features, add the feature keyword to the list. "
|
||||
#| "Whether the feature requires restarting the compositor depends on the "
|
||||
@@ -429,9 +428,7 @@ msgstr ""
|
||||
"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. • \"remote-desktop\" — activa el escritorio remoto. "
|
||||
"Para soportarlo con compartición de pantalla es necesario activar \"screen-"
|
||||
"cast\" • \"screen-cast\" — activa el soporte de compartición de pantalla."
|
||||
"requiere un reinicio."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:141
|
||||
msgid "Select window from tab popup"
|
||||
@@ -565,7 +562,6 @@ msgstr "Pantalla desconocida"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:996
|
||||
#, c-format
|
||||
#| msgid "%s %s"
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
|
||||
msgid "%s %s"
|
||||
@@ -573,7 +569,6 @@ msgstr "%s %s"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:1004
|
||||
#, c-format
|
||||
#| msgid "%s %s"
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name followed by product/model name where size in "
|
||||
"inches could not be calculated, e.g. Dell U2414H"
|
||||
|
||||
108
po/it.po
108
po/it.po
@@ -2,18 +2,18 @@
|
||||
# Based on Italian translation for Metacity
|
||||
# This file is distributed under the same license as metacity package
|
||||
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2018 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2018, 2019 Free Software Foundation, Inc.
|
||||
# Pier Luigi Fiorini <plfiorini@libero.it>, 2002.
|
||||
# Lapo Calamandrei <lapo.calamandrei@virgilio.it>, 2003.
|
||||
# Luca Ferretti <lferrett@gnome.org>, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012.
|
||||
# Milo Casagrande <milo@milo.name>, 2012, 2013, 2014, 2015, 2016, 2017, 2018.
|
||||
# Milo Casagrande <milo@milo.name>, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-07-07 09:58+0000\n"
|
||||
"PO-Revision-Date: 2018-08-07 10:11+0200\n"
|
||||
"POT-Creation-Date: 2019-02-04 17:52+0000\n"
|
||||
"PO-Revision-Date: 2019-02-15 15:48+0100\n"
|
||||
"Last-Translator: Milo Casagrande <milo@milo.name>\n"
|
||||
"Language-Team: Italian <tp@lists.linux.it>\n"
|
||||
"Language: it\n"
|
||||
@@ -21,7 +21,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
@@ -81,7 +81,7 @@ msgstr "Evidenzia l'applicazione precedente"
|
||||
|
||||
#: data/50-mutter-navigation.xml:52
|
||||
msgid "Switch windows"
|
||||
msgstr "Evidenzia direttamente le finestre"
|
||||
msgstr "Evidenzia le finestre"
|
||||
|
||||
#: data/50-mutter-navigation.xml:57
|
||||
msgid "Switch to previous window"
|
||||
@@ -113,7 +113,7 @@ msgstr "Evidenzia direttamente la finestra precedente"
|
||||
|
||||
#: data/50-mutter-navigation.xml:88
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "Evidenzia direttamente le finestre di una applicazione"
|
||||
msgstr "Evidenzia direttamente le finestre di un'applicazione"
|
||||
|
||||
#: data/50-mutter-navigation.xml:93
|
||||
msgid "Switch directly to previous window of an app"
|
||||
@@ -205,7 +205,7 @@ msgstr "Chiudi la finestra"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Hide window"
|
||||
msgstr "Ridimensiona la finestra"
|
||||
msgstr "Nascondi la finestra"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Move window"
|
||||
@@ -217,8 +217,7 @@ msgstr "Ridimensiona la finestra"
|
||||
|
||||
#: data/50-mutter-windows.xml:27
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr ""
|
||||
"Attiva/Disattiva la stato «su tutti gli spazi di lavoro» per la finestra"
|
||||
msgstr "Attiva/Disattiva la finestra su uno o su tutti gli spazi di lavoro"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
@@ -266,11 +265,11 @@ msgid ""
|
||||
"key” on PC hardware. It’s expected that this binding either the default or "
|
||||
"set to the empty string."
|
||||
msgstr ""
|
||||
"Questa chiave pone inizio alla \"overlay\", cioè una combinazione tra la "
|
||||
"Questa chiave inizializza l'\"overlay\", cioè una combinazione tra la "
|
||||
"panoramica delle finestre e il sistema di lancio delle applicazioni. Il "
|
||||
"valore predefinito è il \"tasto Windows\" su hardware PC. È atteso che "
|
||||
"questa scorciatoia sia o il valore predefinito, oppure che sia impostata "
|
||||
"alla stringa vuota."
|
||||
"questa scorciatoia sia o il valore predefinito oppure che sia impostata alla "
|
||||
"stringa vuota."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:20
|
||||
msgid "Attach modal dialogs"
|
||||
@@ -538,7 +537,7 @@ msgstr ""
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2325
|
||||
#: src/backends/meta-input-settings.c:2423
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Cambio modalità (gruppo %d)"
|
||||
@@ -546,37 +545,44 @@ msgstr "Cambio modalità (gruppo %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2348
|
||||
#: src/backends/meta-input-settings.c:2446
|
||||
msgid "Switch monitor"
|
||||
msgstr "Cambia monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2350
|
||||
#: src/backends/meta-input-settings.c:2448
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Mostra aiuto sullo schermo"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:907
|
||||
#: src/backends/meta-monitor-manager.c:954
|
||||
msgid "Built-in display"
|
||||
msgstr "Display integrato"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:930
|
||||
#: src/backends/meta-monitor-manager.c:986
|
||||
msgid "Unknown"
|
||||
msgstr "Sconosciuto"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:932
|
||||
#: src/backends/meta-monitor-manager.c:988
|
||||
msgid "Unknown Display"
|
||||
msgstr "Display sconosciuto"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:940
|
||||
#: src/backends/meta-monitor-manager.c:996
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:1004
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name followed by product/model name where size in "
|
||||
"inches could not be calculated, e.g. Dell U2414H"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: src/compositor/compositor.c:481
|
||||
#: src/compositor/compositor.c:482
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
@@ -584,65 +590,65 @@ msgstr ""
|
||||
"Un altro compositing manager è già in esecuzione sullo schermo %i sul "
|
||||
"display «%s»."
|
||||
|
||||
#: src/core/bell.c:254
|
||||
#: src/core/bell.c:252
|
||||
msgid "Bell event"
|
||||
msgstr "Evento campanella"
|
||||
|
||||
#: src/core/main.c:191
|
||||
#: src/core/main.c:185
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Disabilita la connessione al gestore di sessione"
|
||||
|
||||
#: src/core/main.c:197
|
||||
#: src/core/main.c:191
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Sostituisce il window manager in esecuzione"
|
||||
|
||||
#: src/core/main.c:203
|
||||
#: src/core/main.c:197
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Specifica l'ID di gestione sessione"
|
||||
|
||||
#: src/core/main.c:208
|
||||
#: src/core/main.c:202
|
||||
msgid "X Display to use"
|
||||
msgstr "Display X da usare"
|
||||
|
||||
#: src/core/main.c:214
|
||||
#: src/core/main.c:208
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Inizializza la sessione da file salvato"
|
||||
|
||||
#: src/core/main.c:220
|
||||
#: src/core/main.c:214
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Rende le chiamate X sincrone"
|
||||
|
||||
#: src/core/main.c:227
|
||||
#: src/core/main.c:221
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Esegui come compositor Wayland"
|
||||
|
||||
#: src/core/main.c:233
|
||||
#: src/core/main.c:227
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Esegui come compositor annidato"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:233
|
||||
msgid "Run wayland compositor without starting Xwayland"
|
||||
msgstr "Esegui il compositor Wayland senza avviare Xwayland"
|
||||
|
||||
#: src/core/main.c:247
|
||||
#: src/core/main.c:241
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Esegui come display server invece che annidato"
|
||||
|
||||
#: src/core/main.c:253
|
||||
#: src/core/main.c:247
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Esegui con sistema X11"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:148
|
||||
#: src/core/meta-close-dialog-default.c:150
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "Nessuna risposta da %s."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:150
|
||||
#: src/core/meta-close-dialog-default.c:152
|
||||
msgid "Application is not responding."
|
||||
msgstr "L'applicazione non risponde."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:155
|
||||
#: src/core/meta-close-dialog-default.c:157
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -650,15 +656,15 @@ 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:162
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Forza uscita"
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:162
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
msgid "_Wait"
|
||||
msgstr "_Attendi"
|
||||
|
||||
#: src/core/mutter.c:39
|
||||
#: src/core/mutter.c:38
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -673,20 +679,20 @@ msgstr ""
|
||||
"NON è fornita alcuna garanzia; neanche di COMMERCIABILITÀ o\n"
|
||||
"APPLICABILITÀ PER UNO SCOPO PARTICOLARE.\n"
|
||||
|
||||
#: src/core/mutter.c:53
|
||||
#: src/core/mutter.c:52
|
||||
msgid "Print version"
|
||||
msgstr "Stampa la versione"
|
||||
|
||||
#: src/core/mutter.c:59
|
||||
#: src/core/mutter.c:58
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Plugin Mutter da usare"
|
||||
|
||||
#: src/core/prefs.c:1915
|
||||
#: src/core/prefs.c:1786
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Spazio di lavoro %d"
|
||||
|
||||
#: src/core/util.c:120
|
||||
#: src/core/util.c:121
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr ""
|
||||
"Mutter è stato compilato escludendo il supporto per la modalità prolissa\n"
|
||||
@@ -705,21 +711,21 @@ msgstr ""
|
||||
"Il display «%s» ha già un window manager; provare a utilizzare l'opzione --"
|
||||
"replace per sostituirlo."
|
||||
|
||||
#: src/x11/meta-x11-display.c:1010
|
||||
#: src/x11/meta-x11-display.c:1008
|
||||
msgid "Failed to initialize GDK\n"
|
||||
msgstr "Inizializzazione GDK non riuscita\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1034
|
||||
#: src/x11/meta-x11-display.c:1032
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Apertura del display «%s» di X Window System non riuscita\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1117
|
||||
#: src/x11/meta-x11-display.c:1115
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Lo schermo %d sul display «%s» non è valido\n"
|
||||
|
||||
#: src/x11/session.c:1819
|
||||
#: src/x11/session.c:1821
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@@ -727,7 +733,7 @@ msgstr ""
|
||||
"Queste finestre non supportano la funzione «salva impostazioni attuali» e "
|
||||
"dovranno essere riavviate manualmente al prossimo accesso."
|
||||
|
||||
#: src/x11/window-props.c:565
|
||||
#: src/x11/window-props.c:568
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (su %s)"
|
||||
|
||||
122
po/pt_BR.po
122
po/pt_BR.po
@@ -1,5 +1,5 @@
|
||||
# Brazilian Portuguese translation of mutter.
|
||||
# Copyright (C) 2002-2018 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2002-2019 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the mutter package.
|
||||
# Sun G11n <gnome_int_l10n@ireland.sun.com>, 2002.
|
||||
# Evandro Fernandes Giovanini <evandrofg@ig.com.br>, 2002, 2003, 2006.
|
||||
@@ -15,21 +15,22 @@
|
||||
# Rodrigo Padula de Oliveira <contato@rodrigopadula.com>, 2011.
|
||||
# Artur de Aquino Morais <artur.morais93@outlook.com>, 2016.
|
||||
# Enrico Nicoletto <liverig@gmail.com>, 2012-2016.
|
||||
# Rafael Fontenelle <rafaelff@gnome.org>, 2013-2018.
|
||||
# Rafael Fontenelle <rafaelff@gnome.org>, 2013-2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-07-07 09:58+0000\n"
|
||||
"PO-Revision-Date: 2018-08-28 19:59-0200\n"
|
||||
"POT-Creation-Date: 2019-02-04 17:52+0000\n"
|
||||
"PO-Revision-Date: 2019-02-20 22:11-0300\n"
|
||||
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
|
||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||
"Language-Team: Portuguese - Brazil <gnome-pt_br-list@gnome.org>\n"
|
||||
"Language: pt_BR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Virtaal 1.0.0-beta1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
|
||||
"X-Generator: Gtranslator 3.31.90\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
@@ -405,18 +406,6 @@ msgid "Enable experimental features"
|
||||
msgstr "Habilitar recursos 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. Don’t 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. • “remote-desktop” — enables remote desktop support. To support "
|
||||
#| "remote desktop with screen sharing, “screen-cast” must also be enabled. • "
|
||||
#| "“screen-cast” — enables screen cast support."
|
||||
msgid ""
|
||||
"To enable experimental features, add the feature keyword to the list. "
|
||||
"Whether the feature requires restarting the compositor depends on the given "
|
||||
@@ -546,15 +535,15 @@ msgstr ""
|
||||
"usando o comando “xprop WM_CLASS”. Há suporte a curingas “*” e “?” nos "
|
||||
"valores. Os valores que começam com “!” são colocados em uma lista negra, "
|
||||
"que tem precedência sobre a lista branca, para revogar aplicativos da lista "
|
||||
"padrão do sistema. A lista de sistema padrão inclui os seguintes aplicativos:"
|
||||
" “@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@”. Os usuários podem quebrar uma "
|
||||
"captura existente usando o atalho de teclado específico definido pela chave "
|
||||
"de associação de tecla “restore-shortcuts”."
|
||||
"padrão do sistema. A lista de sistema padrão inclui os seguintes "
|
||||
"aplicativos: “@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@”. Os usuários podem "
|
||||
"quebrar uma captura existente usando o atalho de teclado específico definido "
|
||||
"pela chave de associação de tecla “restore-shortcuts”."
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2325
|
||||
#: src/backends/meta-input-settings.c:2423
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Alternador de modo (Grupo %d)"
|
||||
@@ -562,101 +551,110 @@ msgstr "Alternador de modo (Grupo %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2348
|
||||
#: src/backends/meta-input-settings.c:2446
|
||||
msgid "Switch monitor"
|
||||
msgstr "Trocar monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2350
|
||||
#: src/backends/meta-input-settings.c:2448
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Mostrar ajuda na tela"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:907
|
||||
#: src/backends/meta-monitor-manager.c:954
|
||||
msgid "Built-in display"
|
||||
msgstr "Tela embutida"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:930
|
||||
#: src/backends/meta-monitor-manager.c:986
|
||||
msgid "Unknown"
|
||||
msgstr "Desconhecido"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:932
|
||||
#: src/backends/meta-monitor-manager.c:988
|
||||
msgid "Unknown Display"
|
||||
msgstr "Monitor desconhecido"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:940
|
||||
#: src/backends/meta-monitor-manager.c:996
|
||||
#, c-format
|
||||
#| msgid "%s %s"
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
|
||||
msgid "%s %s"
|
||||
msgstr "%s de %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:1004
|
||||
#, c-format
|
||||
#| msgid "%s %s"
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name followed by product/model name where size in "
|
||||
"inches could not be calculated, e.g. Dell U2414H"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: src/compositor/compositor.c:481
|
||||
#: src/compositor/compositor.c:482
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
msgstr "Outro compositor de janelas está em execução na tela %i na área “%s”."
|
||||
|
||||
#: src/core/bell.c:254
|
||||
#: src/core/bell.c:252
|
||||
msgid "Bell event"
|
||||
msgstr "Evento de som"
|
||||
|
||||
#: src/core/main.c:191
|
||||
#: src/core/main.c:185
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Desabilita a conexão com o gerenciador de sessões"
|
||||
|
||||
#: src/core/main.c:197
|
||||
#: src/core/main.c:191
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Substitui o gerenciador de janelas em execução"
|
||||
|
||||
#: src/core/main.c:203
|
||||
#: src/core/main.c:197
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Especifica o ID do gerenciador de sessões"
|
||||
|
||||
#: src/core/main.c:208
|
||||
#: src/core/main.c:202
|
||||
msgid "X Display to use"
|
||||
msgstr "Display X a ser usado"
|
||||
|
||||
#: src/core/main.c:214
|
||||
#: src/core/main.c:208
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Inicializa a sessão a partir do arquivo salvo"
|
||||
|
||||
#: src/core/main.c:220
|
||||
#: src/core/main.c:214
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Faz X chamadas síncronas"
|
||||
|
||||
#: src/core/main.c:227
|
||||
#: src/core/main.c:221
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Executa como um compositor wayland"
|
||||
|
||||
#: src/core/main.c:233
|
||||
#: src/core/main.c:227
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Executa como um compositor aninhado"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:233
|
||||
msgid "Run wayland compositor without starting Xwayland"
|
||||
msgstr "Executa o compositor wayland sem iniciar o Xwayland"
|
||||
|
||||
#: src/core/main.c:247
|
||||
#: src/core/main.c:241
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Executa como um servidor de tela cheia, ao invés de aninhado"
|
||||
|
||||
#: src/core/main.c:253
|
||||
#: src/core/main.c:247
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Executa com backend X11"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:148
|
||||
#: src/core/meta-close-dialog-default.c:150
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "“%s” não está respondendo."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:150
|
||||
#: src/core/meta-close-dialog-default.c:152
|
||||
msgid "Application is not responding."
|
||||
msgstr "O aplicativo não está respondendo."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:155
|
||||
#: src/core/meta-close-dialog-default.c:157
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -664,15 +662,15 @@ msgstr ""
|
||||
"Você pode escolher aguardar um pouco e continuar ou forçar o aplicativo a "
|
||||
"sair completamente."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:162
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Forçar sair"
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:162
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
msgid "_Wait"
|
||||
msgstr "_Esperar"
|
||||
|
||||
#: src/core/mutter.c:39
|
||||
#: src/core/mutter.c:38
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -688,20 +686,20 @@ msgstr ""
|
||||
"Não há NENHUMA garantia; nem mesmo para a COMERCIALIZAÇÃO ou ADEQUAÇÃO\n"
|
||||
"PARA UM PROPÓSITO PARTICULAR.\n"
|
||||
|
||||
#: src/core/mutter.c:53
|
||||
#: src/core/mutter.c:52
|
||||
msgid "Print version"
|
||||
msgstr "Versão impressa"
|
||||
|
||||
#: src/core/mutter.c:59
|
||||
#: src/core/mutter.c:58
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Plug-in do Mutter para usar"
|
||||
|
||||
#: src/core/prefs.c:1915
|
||||
#: src/core/prefs.c:1786
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Espaço de trabalho %d"
|
||||
|
||||
#: src/core/util.c:120
|
||||
#: src/core/util.c:121
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "O Mutter foi compilado sem suporte para modo detalhado\n"
|
||||
|
||||
@@ -719,21 +717,21 @@ msgstr ""
|
||||
"A exibição “%s” já possui um gerenciador de janelas; tente usar a opção --"
|
||||
"replace para substituir o gerenciador de janelas atual."
|
||||
|
||||
#: src/x11/meta-x11-display.c:1010
|
||||
#: src/x11/meta-x11-display.c:1008
|
||||
msgid "Failed to initialize GDK\n"
|
||||
msgstr "Falha ao inicializar GDK\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1034
|
||||
#: src/x11/meta-x11-display.c:1032
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Falha ao abrir a exibição “%s” do sistema de janelas X\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1117
|
||||
#: src/x11/meta-x11-display.c:1115
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "A tela %d na exibição “%s” é inválida\n"
|
||||
|
||||
#: src/x11/session.c:1819
|
||||
#: src/x11/session.c:1821
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@@ -741,7 +739,7 @@ msgstr ""
|
||||
"Estas janelas não oferecem suporte para a opção “salvar configuração atual” "
|
||||
"e precisarão ser reiniciadas manualmente quando você reiniciar a sessão."
|
||||
|
||||
#: src/x11/window-props.c:565
|
||||
#: src/x11/window-props.c:568
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (em %s)"
|
||||
|
||||
@@ -91,11 +91,6 @@ meta_cursor_sprite_set_texture (MetaCursorSprite *sprite,
|
||||
MetaCursorSpritePrivate *priv =
|
||||
meta_cursor_sprite_get_instance_private (sprite);
|
||||
|
||||
if (priv->texture == COGL_TEXTURE_2D (texture) &&
|
||||
priv->hot_x == hot_x &&
|
||||
priv->hot_y == hot_y)
|
||||
return;
|
||||
|
||||
g_clear_pointer (&priv->texture, cogl_object_unref);
|
||||
if (texture)
|
||||
priv->texture = cogl_object_ref (texture);
|
||||
|
||||
@@ -55,8 +55,8 @@ handle_reset_idletime (MetaDBusIdleMonitor *skeleton,
|
||||
g_dbus_method_invocation_return_error_literal (invocation,
|
||||
G_DBUS_ERROR,
|
||||
G_DBUS_ERROR_UNKNOWN_METHOD,
|
||||
"No such method");
|
||||
return FALSE;
|
||||
"This method is for testing purposes only. MUTTER_DEBUG_RESET_IDLETIME must be set to use it");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2016 Red Hat
|
||||
* Copyright (c) 2018 DisplayLink (UK) Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -75,6 +76,22 @@ meta_monitor_config_manager_get_store (MetaMonitorConfigManager *config_manager)
|
||||
return config_manager->config_store;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_crtc_reserved (MetaCrtc *crtc,
|
||||
GArray *reserved_crtcs)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < reserved_crtcs->len; i++)
|
||||
{
|
||||
glong id = g_array_index (reserved_crtcs, glong, i);
|
||||
if (id == crtc->crtc_id)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_crtc_assigned (MetaCrtc *crtc,
|
||||
GPtrArray *crtc_infos)
|
||||
@@ -94,13 +111,34 @@ is_crtc_assigned (MetaCrtc *crtc,
|
||||
|
||||
static MetaCrtc *
|
||||
find_unassigned_crtc (MetaOutput *output,
|
||||
GPtrArray *crtc_infos)
|
||||
GPtrArray *crtc_infos,
|
||||
GArray *reserved_crtcs)
|
||||
{
|
||||
MetaCrtc *crtc;
|
||||
unsigned int i;
|
||||
|
||||
crtc = meta_output_get_assigned_crtc (output);
|
||||
if (crtc && !is_crtc_assigned (crtc, crtc_infos))
|
||||
return crtc;
|
||||
|
||||
/* then try to assign a CRTC that wasn't used */
|
||||
for (i = 0; i < output->n_possible_crtcs; i++)
|
||||
{
|
||||
MetaCrtc *crtc = output->possible_crtcs[i];
|
||||
crtc = output->possible_crtcs[i];
|
||||
|
||||
if (is_crtc_assigned (crtc, crtc_infos))
|
||||
continue;
|
||||
|
||||
if (is_crtc_reserved (crtc, reserved_crtcs))
|
||||
continue;
|
||||
|
||||
return crtc;
|
||||
}
|
||||
|
||||
/* finally just give a CRTC that we haven't assigned */
|
||||
for (i = 0; i < output->n_possible_crtcs; i++)
|
||||
{
|
||||
crtc = output->possible_crtcs[i];
|
||||
|
||||
if (is_crtc_assigned (crtc, crtc_infos))
|
||||
continue;
|
||||
@@ -118,6 +156,7 @@ typedef struct
|
||||
MetaMonitorConfig *monitor_config;
|
||||
GPtrArray *crtc_infos;
|
||||
GPtrArray *output_infos;
|
||||
GArray *reserved_crtcs;
|
||||
} MonitorAssignmentData;
|
||||
|
||||
static gboolean
|
||||
@@ -141,7 +180,8 @@ assign_monitor_crtc (MetaMonitor *monitor,
|
||||
|
||||
output = monitor_crtc_mode->output;
|
||||
|
||||
crtc = find_unassigned_crtc (output, data->crtc_infos);
|
||||
crtc = find_unassigned_crtc (output, data->crtc_infos, data->reserved_crtcs);
|
||||
|
||||
if (!crtc)
|
||||
{
|
||||
MetaMonitorSpec *monitor_spec = meta_monitor_get_spec (monitor);
|
||||
@@ -223,6 +263,7 @@ assign_monitor_crtcs (MetaMonitorManager *manager,
|
||||
MetaMonitorConfig *monitor_config,
|
||||
GPtrArray *crtc_infos,
|
||||
GPtrArray *output_infos,
|
||||
GArray *reserved_crtcs,
|
||||
GError **error)
|
||||
{
|
||||
MetaMonitorSpec *monitor_spec = monitor_config->monitor_spec;
|
||||
@@ -256,7 +297,8 @@ assign_monitor_crtcs (MetaMonitorManager *manager,
|
||||
.logical_monitor_config = logical_monitor_config,
|
||||
.monitor_config = monitor_config,
|
||||
.crtc_infos = crtc_infos,
|
||||
.output_infos = output_infos
|
||||
.output_infos = output_infos,
|
||||
.reserved_crtcs = reserved_crtcs
|
||||
};
|
||||
if (!meta_monitor_mode_foreach_crtc (monitor, monitor_mode,
|
||||
assign_monitor_crtc,
|
||||
@@ -272,6 +314,7 @@ assign_logical_monitor_crtcs (MetaMonitorManager *manager,
|
||||
MetaLogicalMonitorConfig *logical_monitor_config,
|
||||
GPtrArray *crtc_infos,
|
||||
GPtrArray *output_infos,
|
||||
GArray *reserved_crtcs,
|
||||
GError **error)
|
||||
{
|
||||
GList *l;
|
||||
@@ -284,7 +327,7 @@ assign_logical_monitor_crtcs (MetaMonitorManager *manager,
|
||||
logical_monitor_config,
|
||||
monitor_config,
|
||||
crtc_infos, output_infos,
|
||||
error))
|
||||
reserved_crtcs, error))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -300,12 +343,40 @@ meta_monitor_config_manager_assign (MetaMonitorManager *manager,
|
||||
{
|
||||
GPtrArray *crtc_infos;
|
||||
GPtrArray *output_infos;
|
||||
GArray *reserved_crtcs;
|
||||
GList *l;
|
||||
|
||||
crtc_infos =
|
||||
g_ptr_array_new_with_free_func ((GDestroyNotify) meta_crtc_info_free);
|
||||
output_infos =
|
||||
g_ptr_array_new_with_free_func ((GDestroyNotify) meta_output_info_free);
|
||||
reserved_crtcs = g_array_new (FALSE, FALSE, sizeof (glong));
|
||||
|
||||
for (l = config->logical_monitor_configs; l; l = l->next)
|
||||
{
|
||||
MetaLogicalMonitorConfig *logical_monitor_config = l->data;
|
||||
GList *k;
|
||||
|
||||
for (k = logical_monitor_config->monitor_configs; k; k = k->next)
|
||||
{
|
||||
MetaMonitorConfig *monitor_config = k->data;
|
||||
MetaMonitorSpec *monitor_spec = monitor_config->monitor_spec;
|
||||
MetaMonitor *monitor;
|
||||
GList *o;
|
||||
|
||||
monitor = meta_monitor_manager_get_monitor_from_spec (manager, monitor_spec);
|
||||
|
||||
for (o = meta_monitor_get_outputs (monitor); o; o = o->next)
|
||||
{
|
||||
MetaOutput *output = o->data;
|
||||
MetaCrtc *crtc;
|
||||
|
||||
crtc = meta_output_get_assigned_crtc (output);
|
||||
if (crtc)
|
||||
g_array_append_val (reserved_crtcs, crtc->crtc_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (l = config->logical_monitor_configs; l; l = l->next)
|
||||
{
|
||||
@@ -313,14 +384,17 @@ meta_monitor_config_manager_assign (MetaMonitorManager *manager,
|
||||
|
||||
if (!assign_logical_monitor_crtcs (manager, logical_monitor_config,
|
||||
crtc_infos, output_infos,
|
||||
error))
|
||||
reserved_crtcs, error))
|
||||
{
|
||||
g_ptr_array_free (crtc_infos, TRUE);
|
||||
g_ptr_array_free (output_infos, TRUE);
|
||||
g_array_free (reserved_crtcs, TRUE);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
g_array_free (reserved_crtcs, TRUE);
|
||||
|
||||
*out_crtc_infos = crtc_infos;
|
||||
*out_output_infos = output_infos;
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@ typedef enum _MetaMonitorsConfigFlag
|
||||
{
|
||||
META_MONITORS_CONFIG_FLAG_NONE = 0,
|
||||
META_MONITORS_CONFIG_FLAG_MIGRATED = (1 << 0),
|
||||
META_MONITORS_CONFIG_FLAG_SYSTEM_CONFIG = (1 << 1),
|
||||
} MetaMonitorsConfigFlag;
|
||||
|
||||
struct _MetaMonitorsConfig
|
||||
|
||||
@@ -179,6 +179,8 @@ typedef struct
|
||||
MetaMonitorConfig *current_monitor_config;
|
||||
MetaLogicalMonitorConfig *current_logical_monitor_config;
|
||||
GList *current_disabled_monitor_specs;
|
||||
|
||||
MetaMonitorsConfigFlag extra_config_flags;
|
||||
} ConfigParser;
|
||||
|
||||
G_DEFINE_TYPE (MetaMonitorConfigStore, meta_monitor_config_store,
|
||||
@@ -766,6 +768,8 @@ handle_end_element (GMarkupParseContext *context,
|
||||
if (parser->current_was_migrated)
|
||||
config_flags |= META_MONITORS_CONFIG_FLAG_MIGRATED;
|
||||
|
||||
config_flags |= parser->extra_config_flags;
|
||||
|
||||
config =
|
||||
meta_monitors_config_new_full (parser->current_logical_monitor_configs,
|
||||
parser->current_disabled_monitor_specs,
|
||||
@@ -1078,9 +1082,10 @@ static const GMarkupParser config_parser = {
|
||||
};
|
||||
|
||||
static gboolean
|
||||
read_config_file (MetaMonitorConfigStore *config_store,
|
||||
GFile *file,
|
||||
GError **error)
|
||||
read_config_file (MetaMonitorConfigStore *config_store,
|
||||
GFile *file,
|
||||
MetaMonitorsConfigFlag extra_config_flags,
|
||||
GError **error)
|
||||
{
|
||||
char *buffer;
|
||||
gsize size;
|
||||
@@ -1092,7 +1097,8 @@ read_config_file (MetaMonitorConfigStore *config_store,
|
||||
|
||||
parser = (ConfigParser) {
|
||||
.state = STATE_INITIAL,
|
||||
.config_store = config_store
|
||||
.config_store = config_store,
|
||||
.extra_config_flags = extra_config_flags,
|
||||
};
|
||||
|
||||
parse_context = g_markup_parse_context_new (&config_parser,
|
||||
@@ -1274,6 +1280,9 @@ generate_config_xml (MetaMonitorConfigStore *config_store)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
if (config->flags & META_MONITORS_CONFIG_FLAG_SYSTEM_CONFIG)
|
||||
continue;
|
||||
|
||||
g_string_append (buffer, " <configuration>\n");
|
||||
|
||||
if (config->flags & META_MONITORS_CONFIG_FLAG_MIGRATED)
|
||||
@@ -1425,6 +1434,12 @@ maybe_save_configs (MetaMonitorConfigStore *config_store)
|
||||
meta_monitor_config_store_save (config_store);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_system_config (MetaMonitorsConfig *config)
|
||||
{
|
||||
return !!(config->flags & META_MONITORS_CONFIG_FLAG_SYSTEM_CONFIG);
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_config_store_add (MetaMonitorConfigStore *config_store,
|
||||
MetaMonitorsConfig *config)
|
||||
@@ -1432,7 +1447,8 @@ meta_monitor_config_store_add (MetaMonitorConfigStore *config_store,
|
||||
g_hash_table_replace (config_store->configs,
|
||||
config->key, g_object_ref (config));
|
||||
|
||||
maybe_save_configs (config_store);
|
||||
if (!is_system_config (config))
|
||||
maybe_save_configs (config_store);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1441,7 +1457,8 @@ meta_monitor_config_store_remove (MetaMonitorConfigStore *config_store,
|
||||
{
|
||||
g_hash_table_remove (config_store->configs, config->key);
|
||||
|
||||
maybe_save_configs (config_store);
|
||||
if (!is_system_config (config))
|
||||
maybe_save_configs (config_store);
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -1458,7 +1475,10 @@ meta_monitor_config_store_set_custom (MetaMonitorConfigStore *config_store,
|
||||
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_read_file,
|
||||
META_MONITORS_CONFIG_FLAG_NONE,
|
||||
error);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -1485,9 +1505,42 @@ static void
|
||||
meta_monitor_config_store_constructed (GObject *object)
|
||||
{
|
||||
MetaMonitorConfigStore *config_store = META_MONITOR_CONFIG_STORE (object);
|
||||
const char * const *system_dirs;
|
||||
char *user_file_path;
|
||||
GError *error = NULL;
|
||||
|
||||
for (system_dirs = g_get_system_config_dirs ();
|
||||
system_dirs && *system_dirs;
|
||||
system_dirs++)
|
||||
{
|
||||
g_autofree char *system_file_path = NULL;
|
||||
|
||||
system_file_path = g_build_filename (*system_dirs, "monitors.xml", NULL);
|
||||
if (g_file_test (system_file_path, G_FILE_TEST_EXISTS))
|
||||
{
|
||||
g_autoptr (GFile) system_file = NULL;
|
||||
|
||||
system_file = g_file_new_for_path (system_file_path);
|
||||
if (!read_config_file (config_store,
|
||||
system_file,
|
||||
META_MONITORS_CONFIG_FLAG_SYSTEM_CONFIG,
|
||||
&error))
|
||||
{
|
||||
if (g_error_matches (error,
|
||||
META_MONITOR_CONFIG_STORE_ERROR,
|
||||
META_MONITOR_CONFIG_STORE_ERROR_NEEDS_MIGRATION))
|
||||
g_warning ("System monitor configuration file (%s) is "
|
||||
"incompatible; ask your administrator to migrate "
|
||||
"the system monitor configuation.",
|
||||
system_file_path);
|
||||
else
|
||||
g_warning ("Failed to read monitors config file '%s': %s",
|
||||
system_file_path, error->message);
|
||||
g_clear_error (&error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
user_file_path = g_build_filename (g_get_user_config_dir (),
|
||||
"monitors.xml",
|
||||
NULL);
|
||||
@@ -1495,7 +1548,10 @@ meta_monitor_config_store_constructed (GObject *object)
|
||||
|
||||
if (g_file_test (user_file_path, G_FILE_TEST_EXISTS))
|
||||
{
|
||||
if (!read_config_file (config_store, config_store->user_file, &error))
|
||||
if (!read_config_file (config_store,
|
||||
config_store->user_file,
|
||||
META_MONITORS_CONFIG_FLAG_NONE,
|
||||
&error))
|
||||
{
|
||||
if (error->domain == META_MONITOR_CONFIG_STORE_ERROR &&
|
||||
error->code == META_MONITOR_CONFIG_STORE_ERROR_NEEDS_MIGRATION)
|
||||
|
||||
@@ -344,64 +344,6 @@ meta_screen_cast_monitor_stream_src_record_frame (MetaScreenCastStreamSrc *src,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
draw_cursor_sprite_via_offscreen (MetaScreenCastMonitorStreamSrc *monitor_src,
|
||||
CoglTexture *cursor_texture,
|
||||
int bitmap_width,
|
||||
int bitmap_height,
|
||||
uint32_t *bitmap_data,
|
||||
GError **error)
|
||||
{
|
||||
MetaBackend *backend = get_backend (monitor_src);
|
||||
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
||||
CoglContext *cogl_context =
|
||||
clutter_backend_get_cogl_context (clutter_backend);
|
||||
CoglTexture2D *bitmap_texture;
|
||||
CoglOffscreen *offscreen;
|
||||
CoglFramebuffer *fb;
|
||||
CoglPipeline *pipeline;
|
||||
CoglColor clear_color;
|
||||
|
||||
bitmap_texture = cogl_texture_2d_new_with_size (cogl_context,
|
||||
bitmap_width, bitmap_height);
|
||||
cogl_primitive_texture_set_auto_mipmap (COGL_PRIMITIVE_TEXTURE (bitmap_texture),
|
||||
FALSE);
|
||||
if (!cogl_texture_allocate (COGL_TEXTURE (bitmap_texture), error))
|
||||
{
|
||||
cogl_object_unref (bitmap_texture);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (bitmap_texture));
|
||||
fb = COGL_FRAMEBUFFER (offscreen);
|
||||
cogl_object_unref (bitmap_texture);
|
||||
if (!cogl_framebuffer_allocate (fb, error))
|
||||
{
|
||||
cogl_object_unref (fb);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pipeline = cogl_pipeline_new (cogl_context);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, cursor_texture);
|
||||
cogl_pipeline_set_layer_filters (pipeline, 0,
|
||||
COGL_PIPELINE_FILTER_LINEAR,
|
||||
COGL_PIPELINE_FILTER_LINEAR);
|
||||
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
|
||||
cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
|
||||
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||
-1, 1, 1, -1);
|
||||
cogl_object_unref (pipeline);
|
||||
|
||||
cogl_framebuffer_read_pixels (fb,
|
||||
0, 0,
|
||||
bitmap_width, bitmap_height,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||
(uint8_t *) bitmap_data);
|
||||
cogl_object_unref (fb);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor)
|
||||
@@ -412,10 +354,7 @@ meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
|
||||
MetaCursorRenderer *cursor_renderer =
|
||||
meta_backend_get_cursor_renderer (backend);
|
||||
MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
||||
MetaSpaType *spa_type = meta_screen_cast_stream_src_get_spa_type (src);
|
||||
GError *error = NULL;
|
||||
MetaCursorSprite *cursor_sprite;
|
||||
CoglTexture *cursor_texture;
|
||||
MetaMonitor *monitor;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
MetaRectangle logical_monitor_layout;
|
||||
@@ -423,17 +362,14 @@ meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
|
||||
MetaRendererView *view;
|
||||
float view_scale;
|
||||
ClutterPoint cursor_position;
|
||||
struct spa_meta_bitmap *spa_meta_bitmap;
|
||||
int x, y;
|
||||
|
||||
cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
|
||||
if (cursor_sprite)
|
||||
cursor_texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||
else
|
||||
cursor_texture = NULL;
|
||||
|
||||
if (!is_cursor_in_stream (monitor_src))
|
||||
{
|
||||
spa_meta_cursor->id = 0;
|
||||
meta_screen_cast_stream_src_unset_cursor_metadata (src,
|
||||
spa_meta_cursor);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -456,86 +392,38 @@ meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
|
||||
cursor_position.x *= view_scale;
|
||||
cursor_position.y *= view_scale;
|
||||
|
||||
spa_meta_cursor->id = 1;
|
||||
spa_meta_cursor->position.x = (int32_t) roundf (cursor_position.x);
|
||||
spa_meta_cursor->position.y = (int32_t) roundf (cursor_position.y);
|
||||
x = (int) roundf (cursor_position.x);
|
||||
y = (int) roundf (cursor_position.y);
|
||||
|
||||
if (!monitor_src->cursor_bitmap_invalid)
|
||||
if (monitor_src->cursor_bitmap_invalid)
|
||||
{
|
||||
spa_meta_cursor->hotspot.x = 0;
|
||||
spa_meta_cursor->hotspot.y = 0;
|
||||
spa_meta_cursor->bitmap_offset = 0;
|
||||
return;
|
||||
}
|
||||
monitor_src->cursor_bitmap_invalid = FALSE;
|
||||
|
||||
spa_meta_cursor->bitmap_offset = sizeof (struct spa_meta_cursor);
|
||||
|
||||
spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
|
||||
spa_meta_cursor->bitmap_offset,
|
||||
struct spa_meta_bitmap);
|
||||
spa_meta_bitmap->format = spa_type->video_format.RGBA;
|
||||
spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
|
||||
|
||||
if (cursor_texture)
|
||||
{
|
||||
float cursor_scale;
|
||||
float bitmap_scale;
|
||||
int hotspot_x, hotspot_y;
|
||||
int texture_width, texture_height;
|
||||
int bitmap_width, bitmap_height;
|
||||
uint32_t *bitmap_data;
|
||||
|
||||
cursor_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite);
|
||||
bitmap_scale = view_scale * cursor_scale;
|
||||
|
||||
meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
|
||||
spa_meta_cursor->hotspot.x = (int32_t) roundf (hotspot_x * bitmap_scale);
|
||||
spa_meta_cursor->hotspot.y = (int32_t) roundf (hotspot_y * bitmap_scale);
|
||||
|
||||
texture_width = cogl_texture_get_width (cursor_texture);
|
||||
texture_height = cogl_texture_get_height (cursor_texture);
|
||||
bitmap_width = texture_width * bitmap_scale;
|
||||
bitmap_height = texture_height * bitmap_scale;
|
||||
|
||||
spa_meta_bitmap->size.width = bitmap_width;
|
||||
spa_meta_bitmap->size.height = bitmap_height;
|
||||
spa_meta_bitmap->stride = bitmap_width * 4;
|
||||
|
||||
bitmap_data = SPA_MEMBER (spa_meta_bitmap,
|
||||
spa_meta_bitmap->offset,
|
||||
uint32_t);
|
||||
|
||||
if (texture_width == bitmap_width &&
|
||||
texture_height == bitmap_height)
|
||||
if (cursor_sprite)
|
||||
{
|
||||
cogl_texture_get_data (cursor_texture,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||
texture_width * 4,
|
||||
(uint8_t *) bitmap_data);
|
||||
float cursor_scale;
|
||||
float scale;
|
||||
|
||||
cursor_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite);
|
||||
scale = view_scale * cursor_scale;
|
||||
meta_screen_cast_stream_src_set_cursor_sprite_metadata (src,
|
||||
spa_meta_cursor,
|
||||
cursor_sprite,
|
||||
x, y,
|
||||
scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!draw_cursor_sprite_via_offscreen (monitor_src,
|
||||
cursor_texture,
|
||||
bitmap_width,
|
||||
bitmap_height,
|
||||
bitmap_data,
|
||||
&error))
|
||||
{
|
||||
g_warning ("Failed to draw cursor via offscreen: %s",
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
spa_meta_cursor->id = 0;
|
||||
}
|
||||
meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (src,
|
||||
spa_meta_cursor,
|
||||
x, y);
|
||||
}
|
||||
|
||||
monitor_src->cursor_bitmap_invalid = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
spa_meta_cursor->hotspot.x = 0;
|
||||
spa_meta_cursor->hotspot.y = 0;
|
||||
|
||||
*spa_meta_bitmap = (struct spa_meta_bitmap) { 0 };
|
||||
meta_screen_cast_stream_src_set_cursor_position_metadata (src,
|
||||
spa_meta_cursor,
|
||||
x, y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -383,6 +383,7 @@ handle_record_window (MetaDBusScreenCastSession *skeleton,
|
||||
GDBusInterfaceSkeleton *interface_skeleton;
|
||||
GDBusConnection *connection;
|
||||
MetaWindow *window;
|
||||
MetaScreenCastCursorMode cursor_mode;
|
||||
GError *error = NULL;
|
||||
MetaDisplay *display;
|
||||
GVariant *window_id_variant = NULL;
|
||||
@@ -424,12 +425,28 @@ handle_record_window (MetaDBusScreenCastSession *skeleton,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!g_variant_lookup (properties_variant, "cursor-mode", "u", &cursor_mode))
|
||||
{
|
||||
cursor_mode = META_SCREEN_CAST_CURSOR_MODE_HIDDEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!is_valid_cursor_mode (cursor_mode))
|
||||
{
|
||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||
G_DBUS_ERROR_FAILED,
|
||||
"Unknown cursor mode");
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
interface_skeleton = G_DBUS_INTERFACE_SKELETON (skeleton);
|
||||
connection = g_dbus_interface_skeleton_get_connection (interface_skeleton);
|
||||
|
||||
window_stream = meta_screen_cast_window_stream_new (session,
|
||||
connection,
|
||||
window,
|
||||
cursor_mode,
|
||||
&error);
|
||||
if (!window_stream)
|
||||
{
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <stdint.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "backends/meta-screen-cast-session.h"
|
||||
#include "backends/meta-screen-cast-stream.h"
|
||||
#include "clutter/clutter-mutter.h"
|
||||
#include "core/meta-fraction.h"
|
||||
@@ -61,6 +62,15 @@ enum
|
||||
|
||||
static guint signals[N_SIGNALS];
|
||||
|
||||
typedef struct _MetaSpaType
|
||||
{
|
||||
struct spa_type_media_type media_type;
|
||||
struct spa_type_media_subtype media_subtype;
|
||||
struct spa_type_format_video format_video;
|
||||
struct spa_type_video_format video_format;
|
||||
uint32_t meta_cursor;
|
||||
} MetaSpaType;
|
||||
|
||||
typedef struct _MetaPipeWireSource
|
||||
{
|
||||
GSource base;
|
||||
@@ -150,13 +160,222 @@ meta_screen_cast_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc *src,
|
||||
klass->set_cursor_metadata (src, spa_meta_cursor);
|
||||
}
|
||||
|
||||
MetaSpaType *
|
||||
meta_screen_cast_stream_src_get_spa_type (MetaScreenCastStreamSrc *src)
|
||||
static gboolean
|
||||
draw_cursor_sprite_via_offscreen (MetaScreenCastStreamSrc *src,
|
||||
CoglTexture *cursor_texture,
|
||||
int bitmap_width,
|
||||
int bitmap_height,
|
||||
uint8_t *bitmap_data,
|
||||
GError **error)
|
||||
{
|
||||
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
||||
MetaScreenCastSession *session = meta_screen_cast_stream_get_session (stream);
|
||||
MetaScreenCast *screen_cast =
|
||||
meta_screen_cast_session_get_screen_cast (session);
|
||||
MetaBackend *backend = meta_screen_cast_get_backend (screen_cast);
|
||||
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
||||
CoglContext *cogl_context =
|
||||
clutter_backend_get_cogl_context (clutter_backend);
|
||||
CoglTexture2D *bitmap_texture;
|
||||
CoglOffscreen *offscreen;
|
||||
CoglFramebuffer *fb;
|
||||
CoglPipeline *pipeline;
|
||||
CoglColor clear_color;
|
||||
|
||||
bitmap_texture = cogl_texture_2d_new_with_size (cogl_context,
|
||||
bitmap_width, bitmap_height);
|
||||
cogl_primitive_texture_set_auto_mipmap (COGL_PRIMITIVE_TEXTURE (bitmap_texture),
|
||||
FALSE);
|
||||
if (!cogl_texture_allocate (COGL_TEXTURE (bitmap_texture), error))
|
||||
{
|
||||
cogl_object_unref (bitmap_texture);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (bitmap_texture));
|
||||
fb = COGL_FRAMEBUFFER (offscreen);
|
||||
cogl_object_unref (bitmap_texture);
|
||||
if (!cogl_framebuffer_allocate (fb, error))
|
||||
{
|
||||
cogl_object_unref (fb);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pipeline = cogl_pipeline_new (cogl_context);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, cursor_texture);
|
||||
cogl_pipeline_set_layer_filters (pipeline, 0,
|
||||
COGL_PIPELINE_FILTER_LINEAR,
|
||||
COGL_PIPELINE_FILTER_LINEAR);
|
||||
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
|
||||
cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
|
||||
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||
-1, 1, 1, -1);
|
||||
cogl_object_unref (pipeline);
|
||||
|
||||
cogl_framebuffer_read_pixels (fb,
|
||||
0, 0,
|
||||
bitmap_width, bitmap_height,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||
bitmap_data);
|
||||
cogl_object_unref (fb);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_screen_cast_stream_src_draw_cursor_into (MetaScreenCastStreamSrc *src,
|
||||
CoglTexture *cursor_texture,
|
||||
float scale,
|
||||
uint8_t *data,
|
||||
GError **error)
|
||||
{
|
||||
int texture_width, texture_height;
|
||||
int width, height;
|
||||
|
||||
texture_width = cogl_texture_get_width (cursor_texture);
|
||||
texture_height = cogl_texture_get_height (cursor_texture);
|
||||
width = texture_width * scale;
|
||||
height = texture_height * scale;
|
||||
|
||||
if (texture_width == width &&
|
||||
texture_height == height)
|
||||
{
|
||||
cogl_texture_get_data (cursor_texture,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||
texture_width * 4,
|
||||
data);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!draw_cursor_sprite_via_offscreen (src,
|
||||
cursor_texture,
|
||||
width,
|
||||
height,
|
||||
data,
|
||||
error))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_cast_stream_src_unset_cursor_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor)
|
||||
{
|
||||
spa_meta_cursor->id = 1;
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_cast_stream_src_set_cursor_position_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor,
|
||||
int x,
|
||||
int y)
|
||||
{
|
||||
spa_meta_cursor->id = 1;
|
||||
spa_meta_cursor->position.x = x;
|
||||
spa_meta_cursor->position.y = y;
|
||||
spa_meta_cursor->hotspot.x = 0;
|
||||
spa_meta_cursor->hotspot.y = 0;
|
||||
spa_meta_cursor->bitmap_offset = 0;
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor,
|
||||
int x,
|
||||
int y)
|
||||
{
|
||||
MetaScreenCastStreamSrcPrivate *priv =
|
||||
meta_screen_cast_stream_src_get_instance_private (src);
|
||||
MetaSpaType *spa_type = &priv->spa_type;
|
||||
struct spa_meta_bitmap *spa_meta_bitmap;
|
||||
|
||||
return &priv->spa_type;
|
||||
spa_meta_cursor->id = 1;
|
||||
spa_meta_cursor->position.x = x;
|
||||
spa_meta_cursor->position.y = y;
|
||||
|
||||
spa_meta_cursor->bitmap_offset = sizeof (struct spa_meta_cursor);
|
||||
|
||||
spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
|
||||
spa_meta_cursor->bitmap_offset,
|
||||
struct spa_meta_bitmap);
|
||||
spa_meta_bitmap->format = spa_type->video_format.RGBA;
|
||||
spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
|
||||
|
||||
spa_meta_cursor->hotspot.x = 0;
|
||||
spa_meta_cursor->hotspot.y = 0;
|
||||
|
||||
*spa_meta_bitmap = (struct spa_meta_bitmap) { 0 };
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor,
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
int x,
|
||||
int y,
|
||||
float scale)
|
||||
{
|
||||
MetaScreenCastStreamSrcPrivate *priv =
|
||||
meta_screen_cast_stream_src_get_instance_private (src);
|
||||
MetaSpaType *spa_type = &priv->spa_type;
|
||||
CoglTexture *cursor_texture;
|
||||
struct spa_meta_bitmap *spa_meta_bitmap;
|
||||
int hotspot_x, hotspot_y;
|
||||
int texture_width, texture_height;
|
||||
int bitmap_width, bitmap_height;
|
||||
uint8_t *bitmap_data;
|
||||
GError *error = NULL;
|
||||
|
||||
cursor_texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||
if (!cursor_texture)
|
||||
{
|
||||
meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (src,
|
||||
spa_meta_cursor,
|
||||
x, y);
|
||||
return;
|
||||
}
|
||||
|
||||
spa_meta_cursor->id = 1;
|
||||
spa_meta_cursor->position.x = x;
|
||||
spa_meta_cursor->position.y = y;
|
||||
|
||||
spa_meta_cursor->bitmap_offset = sizeof (struct spa_meta_cursor);
|
||||
|
||||
spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
|
||||
spa_meta_cursor->bitmap_offset,
|
||||
struct spa_meta_bitmap);
|
||||
spa_meta_bitmap->format = spa_type->video_format.RGBA;
|
||||
spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
|
||||
|
||||
meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
|
||||
spa_meta_cursor->hotspot.x = (int32_t) roundf (hotspot_x * scale);
|
||||
spa_meta_cursor->hotspot.y = (int32_t) roundf (hotspot_y * scale);
|
||||
|
||||
texture_width = cogl_texture_get_width (cursor_texture);
|
||||
texture_height = cogl_texture_get_height (cursor_texture);
|
||||
bitmap_width = texture_width * scale;
|
||||
bitmap_height = texture_height * scale;
|
||||
|
||||
spa_meta_bitmap->size.width = bitmap_width;
|
||||
spa_meta_bitmap->size.height = bitmap_height;
|
||||
spa_meta_bitmap->stride = bitmap_width * 4;
|
||||
|
||||
bitmap_data = SPA_MEMBER (spa_meta_bitmap,
|
||||
spa_meta_bitmap->offset,
|
||||
uint8_t);
|
||||
|
||||
if (!meta_screen_cast_stream_src_draw_cursor_into (src,
|
||||
cursor_texture,
|
||||
scale,
|
||||
bitmap_data,
|
||||
&error))
|
||||
{
|
||||
g_warning ("Failed to draw cursor: %s", error->message);
|
||||
g_error_free (error);
|
||||
spa_meta_cursor->id = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -35,15 +35,6 @@
|
||||
#include "cogl/cogl.h"
|
||||
#include "meta/boxes.h"
|
||||
|
||||
typedef struct _MetaSpaType
|
||||
{
|
||||
struct spa_type_media_type media_type;
|
||||
struct spa_type_media_subtype media_subtype;
|
||||
struct spa_type_format_video format_video;
|
||||
struct spa_type_video_format video_format;
|
||||
uint32_t meta_cursor;
|
||||
} MetaSpaType;
|
||||
|
||||
typedef struct _MetaScreenCastStream MetaScreenCastStream;
|
||||
|
||||
#define META_TYPE_SCREEN_CAST_STREAM_SRC (meta_screen_cast_stream_src_get_type ())
|
||||
@@ -74,6 +65,30 @@ void meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *sr
|
||||
|
||||
MetaScreenCastStream * meta_screen_cast_stream_src_get_stream (MetaScreenCastStreamSrc *src);
|
||||
|
||||
MetaSpaType * meta_screen_cast_stream_src_get_spa_type (MetaScreenCastStreamSrc *src);
|
||||
gboolean meta_screen_cast_stream_src_draw_cursor_into (MetaScreenCastStreamSrc *src,
|
||||
CoglTexture *cursor_texture,
|
||||
float scale,
|
||||
uint8_t *data,
|
||||
GError **error);
|
||||
|
||||
void meta_screen_cast_stream_src_unset_cursor_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor);
|
||||
|
||||
void meta_screen_cast_stream_src_set_cursor_position_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor,
|
||||
int x,
|
||||
int y);
|
||||
|
||||
void meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor,
|
||||
int x,
|
||||
int y);
|
||||
|
||||
void meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor,
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
int x,
|
||||
int y,
|
||||
float scale);
|
||||
|
||||
#endif /* META_SCREEN_CAST_STREAM_SRC_H */
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "backends/meta-screen-cast-window-stream-src.h"
|
||||
|
||||
#include "backends/meta-backend-private.h"
|
||||
#include "backends/meta-screen-cast-session.h"
|
||||
#include "backends/meta-screen-cast-window.h"
|
||||
#include "backends/meta-screen-cast-window-stream.h"
|
||||
#include "compositor/meta-window-actor-private.h"
|
||||
@@ -31,16 +32,34 @@ struct _MetaScreenCastWindowStreamSrc
|
||||
{
|
||||
MetaScreenCastStreamSrc parent;
|
||||
|
||||
MetaWindowActor *window_actor;
|
||||
MetaScreenCastWindow *screen_cast_window;
|
||||
|
||||
unsigned long actor_painted_handler_id;
|
||||
unsigned long actor_destroyed_handler_id;
|
||||
unsigned long screen_cast_window_before_paint_handler_id;
|
||||
unsigned long screen_cast_window_after_paint_handler_id;
|
||||
unsigned long screen_cast_window_destroyed_handler_id;
|
||||
unsigned long cursor_moved_handler_id;
|
||||
unsigned long cursor_changed_handler_id;
|
||||
|
||||
gboolean actor_was_dirty;
|
||||
gboolean cursor_bitmap_invalid;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaScreenCastWindowStreamSrc,
|
||||
meta_screen_cast_window_stream_src,
|
||||
META_TYPE_SCREEN_CAST_STREAM_SRC)
|
||||
|
||||
static MetaBackend *
|
||||
get_backend (MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
|
||||
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
|
||||
MetaScreenCastSession *session = meta_screen_cast_stream_get_session (stream);
|
||||
MetaScreenCast *screen_cast =
|
||||
meta_screen_cast_session_get_screen_cast (session);
|
||||
|
||||
return meta_screen_cast_get_backend (screen_cast);
|
||||
}
|
||||
|
||||
static MetaScreenCastWindowStream *
|
||||
get_window_stream (MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
@@ -83,20 +102,110 @@ get_stream_height (MetaScreenCastWindowStreamSrc *window_src)
|
||||
return meta_screen_cast_window_stream_get_height (window_stream);
|
||||
}
|
||||
|
||||
static void
|
||||
maybe_draw_cursor_sprite (MetaScreenCastWindowStreamSrc *window_src,
|
||||
uint8_t *data,
|
||||
MetaRectangle *stream_rect)
|
||||
{
|
||||
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
|
||||
MetaBackend *backend = get_backend (window_src);
|
||||
MetaCursorRenderer *cursor_renderer =
|
||||
meta_backend_get_cursor_renderer (backend);
|
||||
MetaCursorSprite *cursor_sprite;
|
||||
CoglTexture *cursor_texture;
|
||||
MetaScreenCastWindow *screen_cast_window;
|
||||
ClutterPoint cursor_position;
|
||||
ClutterPoint relative_cursor_position;
|
||||
cairo_surface_t *cursor_surface;
|
||||
uint8_t *cursor_surface_data;
|
||||
GError *error = NULL;
|
||||
cairo_surface_t *stream_surface;
|
||||
int width, height;
|
||||
float scale;
|
||||
int hotspot_x, hotspot_y;
|
||||
cairo_t *cr;
|
||||
|
||||
cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
|
||||
if (!cursor_sprite)
|
||||
return;
|
||||
|
||||
cursor_texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
|
||||
if (!cursor_texture)
|
||||
return;
|
||||
|
||||
screen_cast_window = window_src->screen_cast_window;
|
||||
cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
|
||||
if (!meta_screen_cast_window_transform_cursor_position (screen_cast_window,
|
||||
cursor_sprite,
|
||||
&cursor_position,
|
||||
&scale,
|
||||
&relative_cursor_position))
|
||||
return;
|
||||
|
||||
meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
|
||||
|
||||
width = cogl_texture_get_width (cursor_texture) * scale;
|
||||
height = cogl_texture_get_height (cursor_texture) * scale;
|
||||
cursor_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
||||
width, height);
|
||||
|
||||
cursor_surface_data = cairo_image_surface_get_data (cursor_surface);
|
||||
if (!meta_screen_cast_stream_src_draw_cursor_into (src,
|
||||
cursor_texture,
|
||||
scale,
|
||||
cursor_surface_data,
|
||||
&error))
|
||||
{
|
||||
g_warning ("Failed to draw cursor: %s", error->message);
|
||||
g_error_free (error);
|
||||
cairo_surface_destroy (cursor_surface);
|
||||
return;
|
||||
}
|
||||
|
||||
stream_surface =
|
||||
cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32,
|
||||
stream_rect->width,
|
||||
stream_rect->height,
|
||||
stream_rect->width * 4);
|
||||
|
||||
cr = cairo_create (stream_surface);
|
||||
cairo_surface_mark_dirty (cursor_surface);
|
||||
cairo_surface_flush (cursor_surface);
|
||||
cairo_set_source_surface (cr, cursor_surface,
|
||||
relative_cursor_position.x - hotspot_x * scale,
|
||||
relative_cursor_position.y - hotspot_y * scale);
|
||||
cairo_paint (cr);
|
||||
cairo_destroy (cr);
|
||||
cairo_surface_destroy (stream_surface);
|
||||
cairo_surface_destroy (cursor_surface);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
capture_into (MetaScreenCastWindowStreamSrc *window_src,
|
||||
uint8_t *data)
|
||||
{
|
||||
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
|
||||
MetaRectangle stream_rect;
|
||||
MetaScreenCastWindow *screen_cast_window;
|
||||
MetaScreenCastStream *stream;
|
||||
|
||||
stream_rect.x = 0;
|
||||
stream_rect.y = 0;
|
||||
stream_rect.width = get_stream_width (window_src);
|
||||
stream_rect.height = get_stream_height (window_src);
|
||||
|
||||
screen_cast_window = META_SCREEN_CAST_WINDOW (window_src->window_actor);
|
||||
meta_screen_cast_window_capture_into (screen_cast_window, &stream_rect, data);
|
||||
meta_screen_cast_window_capture_into (window_src->screen_cast_window,
|
||||
&stream_rect, data);
|
||||
|
||||
stream = meta_screen_cast_stream_src_get_stream (src);
|
||||
switch (meta_screen_cast_stream_get_cursor_mode (stream))
|
||||
{
|
||||
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
|
||||
maybe_draw_cursor_sprite (window_src, data, &stream_rect);
|
||||
break;
|
||||
case META_SCREEN_CAST_CURSOR_MODE_METADATA:
|
||||
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -121,11 +230,10 @@ meta_screen_cast_window_stream_src_get_videocrop (MetaScreenCastStreamSrc *src,
|
||||
{
|
||||
MetaScreenCastWindowStreamSrc *window_src =
|
||||
META_SCREEN_CAST_WINDOW_STREAM_SRC (src);
|
||||
MetaScreenCastWindow *screen_cast_window;
|
||||
MetaRectangle stream_rect;
|
||||
|
||||
screen_cast_window = META_SCREEN_CAST_WINDOW (window_src->window_actor);
|
||||
meta_screen_cast_window_get_frame_bounds (screen_cast_window, crop_rect);
|
||||
meta_screen_cast_window_get_frame_bounds (window_src->screen_cast_window,
|
||||
crop_rect);
|
||||
|
||||
stream_rect.x = 0;
|
||||
stream_rect.y = 0;
|
||||
@@ -141,35 +249,117 @@ static void
|
||||
meta_screen_cast_window_stream_src_stop (MetaScreenCastWindowStreamSrc *window_src)
|
||||
|
||||
{
|
||||
if (!window_src->window_actor)
|
||||
MetaBackend *backend = get_backend (window_src);
|
||||
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
|
||||
|
||||
if (!window_src->screen_cast_window)
|
||||
return;
|
||||
|
||||
if (window_src->actor_painted_handler_id)
|
||||
g_signal_handler_disconnect (window_src->window_actor,
|
||||
window_src->actor_painted_handler_id);
|
||||
window_src->actor_painted_handler_id = 0;
|
||||
if (window_src->screen_cast_window_before_paint_handler_id)
|
||||
g_signal_handler_disconnect (window_src->screen_cast_window,
|
||||
window_src->screen_cast_window_before_paint_handler_id);
|
||||
window_src->screen_cast_window_before_paint_handler_id = 0;
|
||||
|
||||
if (window_src->actor_destroyed_handler_id)
|
||||
g_signal_handler_disconnect (window_src->window_actor,
|
||||
window_src->actor_destroyed_handler_id);
|
||||
window_src->actor_destroyed_handler_id = 0;
|
||||
if (window_src->screen_cast_window_after_paint_handler_id)
|
||||
g_signal_handler_disconnect (window_src->screen_cast_window,
|
||||
window_src->screen_cast_window_after_paint_handler_id);
|
||||
window_src->screen_cast_window_after_paint_handler_id = 0;
|
||||
|
||||
if (window_src->screen_cast_window_destroyed_handler_id)
|
||||
g_signal_handler_disconnect (window_src->screen_cast_window,
|
||||
window_src->screen_cast_window_destroyed_handler_id);
|
||||
window_src->screen_cast_window_destroyed_handler_id = 0;
|
||||
|
||||
if (window_src->cursor_moved_handler_id)
|
||||
g_signal_handler_disconnect (cursor_tracker,
|
||||
window_src->cursor_moved_handler_id);
|
||||
window_src->cursor_moved_handler_id = 0;
|
||||
|
||||
if (window_src->cursor_changed_handler_id)
|
||||
g_signal_handler_disconnect (cursor_tracker,
|
||||
window_src->cursor_changed_handler_id);
|
||||
window_src->cursor_changed_handler_id = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
window_actor_painted (MetaWindowActor *actor,
|
||||
MetaScreenCastWindowStreamSrc *window_src)
|
||||
screen_cast_window_before_paint (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
window_src->actor_was_dirty =
|
||||
meta_screen_cast_window_has_damage (screen_cast_window);
|
||||
}
|
||||
|
||||
static void
|
||||
screen_cast_window_after_paint (MetaWindowActor *actor,
|
||||
MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
if (window_src->actor_was_dirty)
|
||||
{
|
||||
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
|
||||
|
||||
meta_screen_cast_stream_src_maybe_record_frame (src);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
screen_cast_window_destroyed (MetaWindowActor *actor,
|
||||
MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
meta_screen_cast_window_stream_src_stop (window_src);
|
||||
window_src->screen_cast_window = NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_cursor_in_stream (MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
MetaBackend *backend = get_backend (window_src);
|
||||
MetaCursorRenderer *cursor_renderer =
|
||||
meta_backend_get_cursor_renderer (backend);
|
||||
MetaCursorSprite *cursor_sprite;
|
||||
ClutterPoint cursor_position;
|
||||
MetaScreenCastWindow *screen_cast_window;
|
||||
|
||||
cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
|
||||
|
||||
cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
|
||||
|
||||
screen_cast_window = window_src->screen_cast_window;
|
||||
return meta_screen_cast_window_transform_cursor_position (screen_cast_window,
|
||||
cursor_sprite,
|
||||
&cursor_position,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
sync_cursor_state (MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
|
||||
|
||||
if (!is_cursor_in_stream (window_src))
|
||||
return;
|
||||
|
||||
if (meta_screen_cast_window_has_damage (window_src->screen_cast_window))
|
||||
return;
|
||||
|
||||
meta_screen_cast_stream_src_maybe_record_frame (src);
|
||||
}
|
||||
|
||||
static void
|
||||
window_actor_destroyed (MetaWindowActor *actor,
|
||||
MetaScreenCastWindowStreamSrc *window_src)
|
||||
cursor_moved (MetaCursorTracker *cursor_tracker,
|
||||
float x,
|
||||
float y,
|
||||
MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
meta_screen_cast_window_stream_src_stop (window_src);
|
||||
window_src->window_actor = NULL;
|
||||
sync_cursor_state (window_src);
|
||||
}
|
||||
|
||||
static void
|
||||
cursor_changed (MetaCursorTracker *cursor_tracker,
|
||||
MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
window_src->cursor_bitmap_invalid = TRUE;
|
||||
sync_cursor_state (window_src);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -177,25 +367,51 @@ meta_screen_cast_window_stream_src_enable (MetaScreenCastStreamSrc *src)
|
||||
{
|
||||
MetaScreenCastWindowStreamSrc *window_src =
|
||||
META_SCREEN_CAST_WINDOW_STREAM_SRC (src);
|
||||
MetaBackend *backend = get_backend (window_src);
|
||||
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
|
||||
MetaWindowActor *window_actor;
|
||||
MetaScreenCastStream *stream;
|
||||
|
||||
window_actor = meta_window_actor_from_window (get_window (window_src));
|
||||
if (!window_actor)
|
||||
return;
|
||||
|
||||
window_src->window_actor = window_actor;
|
||||
window_src->screen_cast_window = META_SCREEN_CAST_WINDOW (window_actor);
|
||||
|
||||
window_src->actor_painted_handler_id =
|
||||
g_signal_connect_after (window_src->window_actor,
|
||||
window_src->screen_cast_window_before_paint_handler_id =
|
||||
g_signal_connect (window_src->screen_cast_window,
|
||||
"paint",
|
||||
G_CALLBACK (screen_cast_window_before_paint),
|
||||
window_src);
|
||||
window_src->screen_cast_window_after_paint_handler_id =
|
||||
g_signal_connect_after (window_src->screen_cast_window,
|
||||
"paint",
|
||||
G_CALLBACK (window_actor_painted),
|
||||
G_CALLBACK (screen_cast_window_after_paint),
|
||||
window_src);
|
||||
|
||||
window_src->actor_destroyed_handler_id =
|
||||
g_signal_connect (window_src->window_actor,
|
||||
window_src->screen_cast_window_destroyed_handler_id =
|
||||
g_signal_connect (window_src->screen_cast_window,
|
||||
"destroy",
|
||||
G_CALLBACK (window_actor_destroyed),
|
||||
G_CALLBACK (screen_cast_window_destroyed),
|
||||
window_src);
|
||||
|
||||
stream = meta_screen_cast_stream_src_get_stream (src);
|
||||
switch (meta_screen_cast_stream_get_cursor_mode (stream))
|
||||
{
|
||||
case META_SCREEN_CAST_CURSOR_MODE_METADATA:
|
||||
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
|
||||
window_src->cursor_moved_handler_id =
|
||||
g_signal_connect_after (cursor_tracker, "cursor-moved",
|
||||
G_CALLBACK (cursor_moved),
|
||||
window_src);
|
||||
window_src->cursor_changed_handler_id =
|
||||
g_signal_connect_after (cursor_tracker, "cursor-changed",
|
||||
G_CALLBACK (cursor_changed),
|
||||
window_src);
|
||||
break;
|
||||
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -219,6 +435,65 @@ meta_screen_cast_window_stream_src_record_frame (MetaScreenCastStreamSrc *src,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_window_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc *src,
|
||||
struct spa_meta_cursor *spa_meta_cursor)
|
||||
{
|
||||
MetaScreenCastWindowStreamSrc *window_src =
|
||||
META_SCREEN_CAST_WINDOW_STREAM_SRC (src);
|
||||
MetaBackend *backend = get_backend (window_src);
|
||||
MetaCursorRenderer *cursor_renderer =
|
||||
meta_backend_get_cursor_renderer (backend);
|
||||
MetaScreenCastWindow *screen_cast_window = window_src->screen_cast_window;
|
||||
MetaCursorSprite *cursor_sprite;
|
||||
ClutterPoint cursor_position;
|
||||
float scale;
|
||||
ClutterPoint relative_cursor_position;
|
||||
int x, y;
|
||||
|
||||
cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
|
||||
cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
|
||||
|
||||
if (!meta_screen_cast_window_transform_cursor_position (screen_cast_window,
|
||||
cursor_sprite,
|
||||
&cursor_position,
|
||||
&scale,
|
||||
&relative_cursor_position))
|
||||
{
|
||||
meta_screen_cast_stream_src_unset_cursor_metadata (src,
|
||||
spa_meta_cursor);
|
||||
return;
|
||||
}
|
||||
|
||||
x = (int) roundf (relative_cursor_position.x);
|
||||
y = (int) roundf (relative_cursor_position.y);
|
||||
|
||||
if (window_src->cursor_bitmap_invalid)
|
||||
{
|
||||
if (cursor_sprite)
|
||||
{
|
||||
meta_screen_cast_stream_src_set_cursor_sprite_metadata (src,
|
||||
spa_meta_cursor,
|
||||
cursor_sprite,
|
||||
x, y,
|
||||
scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
meta_screen_cast_stream_src_set_empty_cursor_sprite_metadata (src,
|
||||
spa_meta_cursor,
|
||||
x, y);
|
||||
}
|
||||
window_src->cursor_bitmap_invalid = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
meta_screen_cast_stream_src_set_cursor_position_metadata (src,
|
||||
spa_meta_cursor,
|
||||
x, y);
|
||||
}
|
||||
}
|
||||
|
||||
MetaScreenCastWindowStreamSrc *
|
||||
meta_screen_cast_window_stream_src_new (MetaScreenCastWindowStream *window_stream,
|
||||
GError **error)
|
||||
@@ -231,6 +506,7 @@ meta_screen_cast_window_stream_src_new (MetaScreenCastWindowStream *window_stre
|
||||
static void
|
||||
meta_screen_cast_window_stream_src_init (MetaScreenCastWindowStreamSrc *window_src)
|
||||
{
|
||||
window_src->cursor_bitmap_invalid = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -244,4 +520,5 @@ meta_screen_cast_window_stream_src_class_init (MetaScreenCastWindowStreamSrcClas
|
||||
src_class->disable = meta_screen_cast_window_stream_src_disable;
|
||||
src_class->record_frame = meta_screen_cast_window_stream_src_record_frame;
|
||||
src_class->get_videocrop = meta_screen_cast_window_stream_src_get_videocrop;
|
||||
src_class->set_cursor_metadata = meta_screen_cast_window_stream_src_set_cursor_metadata;
|
||||
}
|
||||
|
||||
@@ -44,13 +44,22 @@ struct _MetaScreenCastWindowStream
|
||||
|
||||
int stream_width;
|
||||
int stream_height;
|
||||
int logical_width;
|
||||
int logical_height;
|
||||
|
||||
unsigned long window_unmanaged_handler_id;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MetaScreenCastWindowStream,
|
||||
meta_screen_cast_window_stream,
|
||||
META_TYPE_SCREEN_CAST_STREAM)
|
||||
static GInitableIface *initable_parent_iface;
|
||||
|
||||
static void
|
||||
meta_screen_cast_window_stream_init_initable_iface (GInitableIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (MetaScreenCastWindowStream,
|
||||
meta_screen_cast_window_stream,
|
||||
META_TYPE_SCREEN_CAST_STREAM,
|
||||
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
|
||||
meta_screen_cast_window_stream_init_initable_iface))
|
||||
|
||||
MetaWindow *
|
||||
meta_screen_cast_window_stream_get_window (MetaScreenCastWindowStream *window_stream)
|
||||
@@ -71,43 +80,20 @@ meta_screen_cast_window_stream_get_height (MetaScreenCastWindowStream *window_st
|
||||
}
|
||||
|
||||
MetaScreenCastWindowStream *
|
||||
meta_screen_cast_window_stream_new (MetaScreenCastSession *session,
|
||||
GDBusConnection *connection,
|
||||
MetaWindow *window,
|
||||
GError **error)
|
||||
meta_screen_cast_window_stream_new (MetaScreenCastSession *session,
|
||||
GDBusConnection *connection,
|
||||
MetaWindow *window,
|
||||
MetaScreenCastCursorMode cursor_mode,
|
||||
GError **error)
|
||||
{
|
||||
MetaScreenCastWindowStream *window_stream;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
int scale;
|
||||
|
||||
logical_monitor = meta_window_get_main_logical_monitor (window);
|
||||
if (!logical_monitor)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Main logical monitor not found");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
window_stream = g_initable_new (META_TYPE_SCREEN_CAST_WINDOW_STREAM,
|
||||
NULL,
|
||||
error,
|
||||
"session", session,
|
||||
"connection", connection,
|
||||
"window", window,
|
||||
NULL);
|
||||
if (!window_stream)
|
||||
return NULL;
|
||||
|
||||
window_stream->window = window;
|
||||
/* We cannot set the stream size to the exact size of the window, because
|
||||
* windows can be resized, whereas streams cannot.
|
||||
* So we set a size equals to the size of the logical monitor for the window.
|
||||
*/
|
||||
scale = (int) ceil (meta_logical_monitor_get_scale (logical_monitor));
|
||||
window_stream->stream_width = logical_monitor->rect.width * scale;
|
||||
window_stream->stream_height = logical_monitor->rect.height * scale;
|
||||
|
||||
return window_stream;
|
||||
return g_initable_new (META_TYPE_SCREEN_CAST_WINDOW_STREAM,
|
||||
NULL,
|
||||
error,
|
||||
"session", session,
|
||||
"connection", connection,
|
||||
"cursor-mode", cursor_mode,
|
||||
"window", window,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static MetaScreenCastStreamSrc *
|
||||
@@ -132,22 +118,12 @@ meta_screen_cast_window_stream_set_parameters (MetaScreenCastStream *stream,
|
||||
{
|
||||
MetaScreenCastWindowStream *window_stream =
|
||||
META_SCREEN_CAST_WINDOW_STREAM (stream);
|
||||
MetaScreenCastWindow *screen_cast_window =
|
||||
META_SCREEN_CAST_WINDOW (meta_window_actor_from_window (window_stream->window));
|
||||
MetaRectangle bounds;
|
||||
|
||||
meta_screen_cast_window_get_buffer_bounds (screen_cast_window, &bounds);
|
||||
|
||||
g_variant_builder_add (parameters_builder, "{sv}",
|
||||
"position",
|
||||
g_variant_new ("(ii)",
|
||||
bounds.x, bounds.y));
|
||||
|
||||
g_variant_builder_add (parameters_builder, "{sv}",
|
||||
"size",
|
||||
g_variant_new ("(ii)",
|
||||
bounds.width,
|
||||
bounds.height));
|
||||
window_stream->logical_width,
|
||||
window_stream->logical_height));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -175,20 +151,6 @@ on_window_unmanaged (MetaScreenCastWindowStream *window_stream)
|
||||
meta_screen_cast_stream_close (META_SCREEN_CAST_STREAM (window_stream));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_window_stream_constructed (GObject *object)
|
||||
{
|
||||
MetaScreenCastWindowStream *window_stream =
|
||||
META_SCREEN_CAST_WINDOW_STREAM (object);
|
||||
|
||||
window_stream->window_unmanaged_handler_id =
|
||||
g_signal_connect_swapped (window_stream->window, "unmanaged",
|
||||
G_CALLBACK (on_window_unmanaged),
|
||||
window_stream);
|
||||
|
||||
G_OBJECT_CLASS (meta_screen_cast_window_stream_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_window_stream_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
@@ -233,12 +195,58 @@ meta_screen_cast_window_stream_finalize (GObject *object)
|
||||
MetaScreenCastWindowStream *window_stream =
|
||||
META_SCREEN_CAST_WINDOW_STREAM (object);
|
||||
|
||||
g_signal_handler_disconnect (window_stream->window,
|
||||
window_stream->window_unmanaged_handler_id);
|
||||
if (window_stream->window_unmanaged_handler_id)
|
||||
g_signal_handler_disconnect (window_stream->window,
|
||||
window_stream->window_unmanaged_handler_id);
|
||||
|
||||
G_OBJECT_CLASS (meta_screen_cast_window_stream_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_screen_cast_window_stream_initable_init (GInitable *initable,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
MetaScreenCastWindowStream *window_stream =
|
||||
META_SCREEN_CAST_WINDOW_STREAM (initable);
|
||||
MetaWindow *window = window_stream->window;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
int scale;
|
||||
|
||||
logical_monitor = meta_window_get_main_logical_monitor (window);
|
||||
if (!logical_monitor)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Main logical monitor not found");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
window_stream->window_unmanaged_handler_id =
|
||||
g_signal_connect_swapped (window, "unmanaged",
|
||||
G_CALLBACK (on_window_unmanaged),
|
||||
window_stream);
|
||||
|
||||
/* We cannot set the stream size to the exact size of the window, because
|
||||
* windows can be resized, whereas streams cannot.
|
||||
* So we set a size equals to the size of the logical monitor for the window.
|
||||
*/
|
||||
scale = (int) ceil (meta_logical_monitor_get_scale (logical_monitor));
|
||||
window_stream->logical_width = logical_monitor->rect.width;
|
||||
window_stream->logical_height = logical_monitor->rect.height;
|
||||
window_stream->stream_width = logical_monitor->rect.width * scale;
|
||||
window_stream->stream_height = logical_monitor->rect.height * scale;
|
||||
|
||||
return initable_parent_iface->init (initable, cancellable, error);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_window_stream_init_initable_iface (GInitableIface *iface)
|
||||
{
|
||||
initable_parent_iface = g_type_interface_peek_parent (iface);
|
||||
|
||||
iface->init = meta_screen_cast_window_stream_initable_init;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_screen_cast_window_stream_init (MetaScreenCastWindowStream *window_stream)
|
||||
{
|
||||
@@ -251,7 +259,6 @@ meta_screen_cast_window_stream_class_init (MetaScreenCastWindowStreamClass *klas
|
||||
MetaScreenCastStreamClass *stream_class =
|
||||
META_SCREEN_CAST_STREAM_CLASS (klass);
|
||||
|
||||
object_class->constructed = meta_screen_cast_window_stream_constructed;
|
||||
object_class->set_property = meta_screen_cast_window_stream_set_property;
|
||||
object_class->get_property = meta_screen_cast_window_stream_get_property;
|
||||
object_class->finalize = meta_screen_cast_window_stream_finalize;
|
||||
|
||||
@@ -32,10 +32,11 @@ G_DECLARE_FINAL_TYPE (MetaScreenCastWindowStream,
|
||||
META, SCREEN_CAST_WINDOW_STREAM,
|
||||
MetaScreenCastStream)
|
||||
|
||||
MetaScreenCastWindowStream * meta_screen_cast_window_stream_new (MetaScreenCastSession *session,
|
||||
GDBusConnection *connection,
|
||||
MetaWindow *window,
|
||||
GError **error);
|
||||
MetaScreenCastWindowStream * meta_screen_cast_window_stream_new (MetaScreenCastSession *session,
|
||||
GDBusConnection *connection,
|
||||
MetaWindow *window,
|
||||
MetaScreenCastCursorMode cursor_mode,
|
||||
GError **error);
|
||||
|
||||
MetaWindow * meta_screen_cast_window_stream_get_window (MetaScreenCastWindowStream *window_stream);
|
||||
int meta_screen_cast_window_stream_get_width (MetaScreenCastWindowStream *window_stream);
|
||||
|
||||
@@ -29,14 +29,6 @@ meta_screen_cast_window_default_init (MetaScreenCastWindowInterface *iface)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_cast_window_get_buffer_bounds (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds)
|
||||
{
|
||||
META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window)->get_buffer_bounds (screen_cast_window,
|
||||
bounds);
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_cast_window_get_frame_bounds (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds)
|
||||
@@ -59,6 +51,22 @@ meta_screen_cast_window_transform_relative_position (MetaScreenCastWindow *scree
|
||||
y_out);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_screen_cast_window_transform_cursor_position (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
ClutterPoint *cursor_position,
|
||||
float *out_cursor_scale,
|
||||
ClutterPoint *out_relative_cursor_position)
|
||||
{
|
||||
MetaScreenCastWindowInterface *iface =
|
||||
META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window);
|
||||
|
||||
return iface->transform_cursor_position (screen_cast_window,
|
||||
cursor_sprite,
|
||||
cursor_position,
|
||||
out_cursor_scale,
|
||||
out_relative_cursor_position);
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_cast_window_capture_into (MetaScreenCastWindow *screen_cast_window,
|
||||
@@ -69,3 +77,12 @@ meta_screen_cast_window_capture_into (MetaScreenCastWindow *screen_cast_window,
|
||||
bounds,
|
||||
data);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_screen_cast_window_has_damage (MetaScreenCastWindow *screen_cast_window)
|
||||
{
|
||||
MetaScreenCastWindowInterface *iface =
|
||||
META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window);
|
||||
|
||||
return iface->has_damage (screen_cast_window);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <stdint.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "backends/meta-cursor.h"
|
||||
#include "meta/boxes.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
@@ -36,9 +37,6 @@ struct _MetaScreenCastWindowInterface
|
||||
{
|
||||
GTypeInterface parent_iface;
|
||||
|
||||
void (*get_buffer_bounds) (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds);
|
||||
|
||||
void (*get_frame_bounds) (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds);
|
||||
|
||||
@@ -48,13 +46,18 @@ struct _MetaScreenCastWindowInterface
|
||||
double *x_out,
|
||||
double *y_out);
|
||||
|
||||
gboolean (*transform_cursor_position) (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
ClutterPoint *cursor_position,
|
||||
float *out_cursor_scale,
|
||||
ClutterPoint *out_relative_cursor_position);
|
||||
|
||||
void (*capture_into) (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds,
|
||||
uint8_t *data);
|
||||
};
|
||||
|
||||
void meta_screen_cast_window_get_buffer_bounds (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds);
|
||||
gboolean (*has_damage) (MetaScreenCastWindow *screen_cast_window);
|
||||
};
|
||||
|
||||
void meta_screen_cast_window_get_frame_bounds (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds);
|
||||
@@ -65,10 +68,18 @@ void meta_screen_cast_window_transform_relative_position (MetaScreenCastWindow *
|
||||
double *x_out,
|
||||
double *y_out);
|
||||
|
||||
gboolean meta_screen_cast_window_transform_cursor_position (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
ClutterPoint *cursor_position,
|
||||
float *out_cursor_scale,
|
||||
ClutterPoint *out_relative_cursor_position);
|
||||
|
||||
void meta_screen_cast_window_capture_into (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds,
|
||||
uint8_t *data);
|
||||
|
||||
gboolean meta_screen_cast_window_has_damage (MetaScreenCastWindow *screen_cast_window);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* META_SCREEN_CAST_WINDOW_H */
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
#define META_SCREEN_CAST_DBUS_SERVICE "org.gnome.Mutter.ScreenCast"
|
||||
#define META_SCREEN_CAST_DBUS_PATH "/org/gnome/Mutter/ScreenCast"
|
||||
#define META_SCREEN_CAST_API_VERSION 1
|
||||
#define META_SCREEN_CAST_API_VERSION 2
|
||||
|
||||
struct _MetaScreenCast
|
||||
{
|
||||
|
||||
@@ -104,6 +104,7 @@ typedef enum _MetaCursorGbmBoState
|
||||
|
||||
typedef struct _MetaCursorNativeGpuState
|
||||
{
|
||||
MetaGpu *gpu;
|
||||
guint active_bo;
|
||||
MetaCursorGbmBoState pending_bo_state;
|
||||
struct gbm_bo *bos[HW_CURSOR_BUFFER_COUNT];
|
||||
@@ -746,10 +747,30 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer,
|
||||
!meta_cursor_sprite_get_cogl_texture (cursor_sprite));
|
||||
}
|
||||
|
||||
static void
|
||||
unset_crtc_cursor_renderer_privates (MetaGpu *gpu,
|
||||
struct gbm_bo *bo)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
for (l = meta_gpu_get_crtcs (gpu); l; l = l->next)
|
||||
{
|
||||
MetaCrtc *crtc = l->data;
|
||||
|
||||
if (bo == crtc->cursor_renderer_private)
|
||||
crtc->cursor_renderer_private = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cursor_gpu_state_free (MetaCursorNativeGpuState *cursor_gpu_state)
|
||||
{
|
||||
int i;
|
||||
struct gbm_bo *active_bo;
|
||||
|
||||
active_bo = get_active_cursor_sprite_gbm_bo (cursor_gpu_state);
|
||||
if (active_bo)
|
||||
unset_crtc_cursor_renderer_privates (cursor_gpu_state->gpu, active_bo);
|
||||
|
||||
for (i = 0; i < HW_CURSOR_BUFFER_COUNT; i++)
|
||||
g_clear_pointer (&cursor_gpu_state->bos[i], gbm_bo_destroy);
|
||||
@@ -774,6 +795,7 @@ ensure_cursor_gpu_state (MetaCursorNativePrivate *cursor_priv,
|
||||
return cursor_gpu_state;
|
||||
|
||||
cursor_gpu_state = g_new0 (MetaCursorNativeGpuState, 1);
|
||||
cursor_gpu_state->gpu = META_GPU (gpu_kms);
|
||||
g_hash_table_insert (cursor_priv->gpu_states, gpu_kms, cursor_gpu_state);
|
||||
|
||||
return cursor_gpu_state;
|
||||
|
||||
@@ -74,8 +74,6 @@ struct _MetaGpuKms
|
||||
int max_buffer_width;
|
||||
int max_buffer_height;
|
||||
|
||||
gboolean page_flips_not_supported;
|
||||
|
||||
gboolean resources_init_failed_before;
|
||||
|
||||
MetaGpuKmsFlag flags;
|
||||
@@ -199,7 +197,6 @@ invoke_flip_closure (GClosure *flip_closure,
|
||||
g_value_init (¶ms[3], G_TYPE_INT64);
|
||||
g_value_set_int64 (¶ms[3], page_flip_time_ns);
|
||||
g_closure_invoke (flip_closure, NULL, 4, params, NULL);
|
||||
g_closure_unref (flip_closure);
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -245,7 +242,7 @@ meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms,
|
||||
|
||||
closure_container = g_new0 (MetaGpuKmsFlipClosureContainer, 1);
|
||||
*closure_container = (MetaGpuKmsFlipClosureContainer) {
|
||||
.flip_closure = flip_closure,
|
||||
.flip_closure = g_closure_ref (flip_closure),
|
||||
.gpu_kms = gpu_kms,
|
||||
.crtc = crtc
|
||||
};
|
||||
@@ -256,20 +253,21 @@ meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms,
|
||||
void
|
||||
meta_gpu_kms_flip_closure_container_free (MetaGpuKmsFlipClosureContainer *closure_container)
|
||||
{
|
||||
g_closure_unref (closure_container->flip_closure);
|
||||
g_free (closure_container);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
|
||||
MetaCrtc *crtc,
|
||||
int x,
|
||||
int y,
|
||||
uint32_t fb_id,
|
||||
GClosure *flip_closure,
|
||||
gboolean *fb_in_use)
|
||||
meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
|
||||
MetaCrtc *crtc,
|
||||
uint32_t fb_id,
|
||||
GClosure *flip_closure,
|
||||
GError **error)
|
||||
{
|
||||
MetaGpu *gpu = META_GPU (gpu_kms);
|
||||
MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu);
|
||||
MetaGpuKmsFlipClosureContainer *closure_container;
|
||||
int kms_fd = meta_gpu_kms_get_fd (gpu_kms);
|
||||
uint32_t *connectors;
|
||||
unsigned int n_connectors;
|
||||
int ret = -1;
|
||||
@@ -283,42 +281,23 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
|
||||
|
||||
g_assert (fb_id != 0);
|
||||
|
||||
if (!gpu_kms->page_flips_not_supported)
|
||||
{
|
||||
MetaGpuKmsFlipClosureContainer *closure_container;
|
||||
int kms_fd = meta_gpu_kms_get_fd (gpu_kms);
|
||||
|
||||
closure_container = meta_gpu_kms_wrap_flip_closure (gpu_kms,
|
||||
crtc,
|
||||
flip_closure);
|
||||
|
||||
ret = drmModePageFlip (kms_fd,
|
||||
crtc->crtc_id,
|
||||
fb_id,
|
||||
DRM_MODE_PAGE_FLIP_EVENT,
|
||||
closure_container);
|
||||
if (ret != 0 && ret != -EACCES)
|
||||
{
|
||||
meta_gpu_kms_flip_closure_container_free (closure_container);
|
||||
g_warning ("Failed to flip: %s", strerror (-ret));
|
||||
gpu_kms->page_flips_not_supported = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (gpu_kms->page_flips_not_supported)
|
||||
{
|
||||
if (meta_gpu_kms_apply_crtc_mode (gpu_kms, crtc, x, y, fb_id))
|
||||
{
|
||||
*fb_in_use = TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
closure_container = meta_gpu_kms_wrap_flip_closure (gpu_kms,
|
||||
crtc,
|
||||
flip_closure);
|
||||
|
||||
ret = drmModePageFlip (kms_fd,
|
||||
crtc->crtc_id,
|
||||
fb_id,
|
||||
DRM_MODE_PAGE_FLIP_EVENT,
|
||||
closure_container);
|
||||
if (ret != 0)
|
||||
return FALSE;
|
||||
|
||||
*fb_in_use = TRUE;
|
||||
g_closure_ref (flip_closure);
|
||||
{
|
||||
meta_gpu_kms_flip_closure_container_free (closure_container);
|
||||
g_set_error (error, G_IO_ERROR,
|
||||
g_io_error_from_errno (-ret),
|
||||
"drmModePageFlip failed: %s", g_strerror (-ret));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -365,13 +344,6 @@ meta_gpu_kms_wait_for_flip (MetaGpuKms *gpu_kms,
|
||||
{
|
||||
drmEventContext evctx;
|
||||
|
||||
if (gpu_kms->page_flips_not_supported)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Page flips not supported");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
memset (&evctx, 0, sizeof evctx);
|
||||
evctx.version = 2;
|
||||
evctx.page_flip_handler = page_flip_handler;
|
||||
|
||||
@@ -70,13 +70,11 @@ gboolean meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms,
|
||||
gboolean meta_gpu_kms_is_boot_vga (MetaGpuKms *gpu_kms);
|
||||
gboolean meta_gpu_kms_is_platform_device (MetaGpuKms *gpu_kms);
|
||||
|
||||
gboolean meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
|
||||
MetaCrtc *crtc,
|
||||
int x,
|
||||
int y,
|
||||
uint32_t fb_id,
|
||||
GClosure *flip_closure,
|
||||
gboolean *fb_in_use);
|
||||
gboolean meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
|
||||
MetaCrtc *crtc,
|
||||
uint32_t fb_id,
|
||||
GClosure *flip_closure,
|
||||
GError **error);
|
||||
|
||||
gboolean meta_gpu_kms_wait_for_flip (MetaGpuKms *gpu_kms,
|
||||
GError **error);
|
||||
|
||||
@@ -192,6 +192,9 @@ typedef struct _MetaOnscreenNative
|
||||
int64_t pending_queue_swap_notify_frame_count;
|
||||
int64_t pending_swap_notify_frame_count;
|
||||
|
||||
GList *pending_page_flip_retries;
|
||||
GSource *retry_page_flips_source;
|
||||
|
||||
MetaRendererView *view;
|
||||
int total_pending_flips;
|
||||
} MetaOnscreenNative;
|
||||
@@ -302,6 +305,13 @@ meta_create_renderer_native_gpu_data (MetaGpuKms *gpu_kms)
|
||||
return g_new0 (MetaRendererNativeGpuData, 1);
|
||||
}
|
||||
|
||||
static MetaOnscreenNativeSecondaryGpuState *
|
||||
meta_onscreen_native_get_secondary_gpu_state (MetaOnscreenNative *onscreen_native,
|
||||
MetaGpuKms *gpu_kms)
|
||||
{
|
||||
return g_hash_table_lookup (onscreen_native->secondary_gpu_states, gpu_kms);
|
||||
}
|
||||
|
||||
static MetaOnscreenNativeSecondaryGpuState *
|
||||
get_secondary_gpu_state (CoglOnscreen *onscreen,
|
||||
MetaGpuKms *gpu_kms)
|
||||
@@ -309,7 +319,8 @@ get_secondary_gpu_state (CoglOnscreen *onscreen,
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
|
||||
|
||||
return g_hash_table_lookup (onscreen_native->secondary_gpu_states, gpu_kms);
|
||||
return meta_onscreen_native_get_secondary_gpu_state (onscreen_native,
|
||||
gpu_kms);
|
||||
}
|
||||
|
||||
static MetaEgl *
|
||||
@@ -1507,19 +1518,202 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_closure_ref (flip_closure);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* HAVE_EGL_DEVICE */
|
||||
|
||||
static gboolean
|
||||
is_timestamp_earlier_than (uint64_t ts1,
|
||||
uint64_t ts2)
|
||||
{
|
||||
if (ts1 == ts2)
|
||||
return FALSE;
|
||||
else
|
||||
return ts2 - ts1 < UINT64_MAX / 2;
|
||||
}
|
||||
|
||||
typedef struct _RetryPageFlipData
|
||||
{
|
||||
MetaCrtc *crtc;
|
||||
uint32_t fb_id;
|
||||
GClosure *flip_closure;
|
||||
uint64_t retry_time_us;
|
||||
} RetryPageFlipData;
|
||||
|
||||
static void
|
||||
meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
GClosure *flip_closure,
|
||||
MetaCrtc *crtc,
|
||||
int x,
|
||||
int y,
|
||||
gboolean *fb_in_use)
|
||||
retry_page_flip_data_free (RetryPageFlipData *retry_page_flip_data)
|
||||
{
|
||||
g_closure_unref (retry_page_flip_data->flip_closure);
|
||||
g_free (retry_page_flip_data);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
retry_page_flips (gpointer user_data)
|
||||
{
|
||||
MetaOnscreenNative *onscreen_native = user_data;
|
||||
uint64_t now_us;
|
||||
GList *l;
|
||||
|
||||
now_us = g_source_get_time (onscreen_native->retry_page_flips_source);
|
||||
|
||||
l = onscreen_native->pending_page_flip_retries;
|
||||
while (l)
|
||||
{
|
||||
RetryPageFlipData *retry_page_flip_data = l->data;
|
||||
MetaCrtc *crtc = retry_page_flip_data->crtc;
|
||||
MetaGpuKms *gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
|
||||
GList *l_next = l->next;
|
||||
g_autoptr (GError) error = NULL;
|
||||
gboolean did_flip;
|
||||
|
||||
if (is_timestamp_earlier_than (now_us,
|
||||
retry_page_flip_data->retry_time_us))
|
||||
{
|
||||
l = l_next;
|
||||
continue;
|
||||
}
|
||||
|
||||
did_flip = meta_gpu_kms_flip_crtc (gpu_kms,
|
||||
crtc,
|
||||
retry_page_flip_data->fb_id,
|
||||
retry_page_flip_data->flip_closure,
|
||||
&error);
|
||||
if (!did_flip &&
|
||||
g_error_matches (error, G_IO_ERROR, G_IO_ERROR_BUSY))
|
||||
{
|
||||
retry_page_flip_data->retry_time_us +=
|
||||
G_USEC_PER_SEC / crtc->current_mode->refresh_rate;
|
||||
l = l_next;
|
||||
continue;
|
||||
}
|
||||
|
||||
onscreen_native->pending_page_flip_retries =
|
||||
g_list_remove_link (onscreen_native->pending_page_flip_retries, l);
|
||||
|
||||
if (!did_flip)
|
||||
{
|
||||
if (!g_error_matches (error,
|
||||
G_IO_ERROR,
|
||||
G_IO_ERROR_PERMISSION_DENIED))
|
||||
g_critical ("Failed to page flip: %s", error->message);
|
||||
|
||||
if (gpu_kms != onscreen_native->render_gpu)
|
||||
{
|
||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
|
||||
|
||||
secondary_gpu_state =
|
||||
meta_onscreen_native_get_secondary_gpu_state (onscreen_native,
|
||||
gpu_kms);
|
||||
secondary_gpu_state->pending_flips--;
|
||||
}
|
||||
|
||||
onscreen_native->total_pending_flips--;
|
||||
}
|
||||
|
||||
retry_page_flip_data_free (retry_page_flip_data);
|
||||
|
||||
l = l_next;
|
||||
}
|
||||
|
||||
if (onscreen_native->pending_page_flip_retries)
|
||||
{
|
||||
GList *l;
|
||||
uint64_t earliest_retry_time_us = 0;
|
||||
|
||||
for (l = onscreen_native->pending_page_flip_retries; l; l = l->next)
|
||||
{
|
||||
RetryPageFlipData *retry_page_flip_data = l->data;
|
||||
|
||||
if (l == onscreen_native->pending_page_flip_retries ||
|
||||
is_timestamp_earlier_than (retry_page_flip_data->retry_time_us,
|
||||
earliest_retry_time_us))
|
||||
earliest_retry_time_us = retry_page_flip_data->retry_time_us;
|
||||
}
|
||||
|
||||
g_source_set_ready_time (onscreen_native->retry_page_flips_source,
|
||||
earliest_retry_time_us);
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_clear_pointer (&onscreen_native->retry_page_flips_source,
|
||||
g_source_unref);
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
retry_page_flips_source_dispatch (GSource *source,
|
||||
GSourceFunc callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
return callback (user_data);
|
||||
}
|
||||
|
||||
static GSourceFuncs retry_page_flips_source_funcs = {
|
||||
.dispatch = retry_page_flips_source_dispatch,
|
||||
};
|
||||
|
||||
static void
|
||||
schedule_retry_page_flip (MetaOnscreenNative *onscreen_native,
|
||||
MetaCrtc *crtc,
|
||||
uint32_t fb_id,
|
||||
GClosure *flip_closure)
|
||||
{
|
||||
RetryPageFlipData *retry_page_flip_data;
|
||||
uint64_t now_us;
|
||||
uint64_t retry_time_us;
|
||||
|
||||
now_us = g_get_monotonic_time ();
|
||||
retry_time_us =
|
||||
now_us + (G_USEC_PER_SEC / crtc->current_mode->refresh_rate);
|
||||
|
||||
retry_page_flip_data = g_new0 (RetryPageFlipData, 1);
|
||||
retry_page_flip_data->crtc = crtc;
|
||||
retry_page_flip_data->fb_id = fb_id;
|
||||
retry_page_flip_data->flip_closure = g_closure_ref (flip_closure);
|
||||
retry_page_flip_data->retry_time_us = retry_time_us;
|
||||
|
||||
if (!onscreen_native->retry_page_flips_source)
|
||||
{
|
||||
GSource *source;
|
||||
|
||||
source = g_source_new (&retry_page_flips_source_funcs, sizeof (GSource));
|
||||
g_source_set_callback (source, retry_page_flips, onscreen_native, NULL);
|
||||
g_source_set_ready_time (source, retry_time_us);
|
||||
g_source_attach (source, NULL);
|
||||
|
||||
onscreen_native->retry_page_flips_source = source;
|
||||
}
|
||||
else
|
||||
{
|
||||
GList *l;
|
||||
|
||||
for (l = onscreen_native->pending_page_flip_retries; l; l = l->next)
|
||||
{
|
||||
RetryPageFlipData *pending_retry_page_flip_data = l->data;
|
||||
uint64_t pending_retry_time_us =
|
||||
pending_retry_page_flip_data->retry_time_us;
|
||||
|
||||
if (is_timestamp_earlier_than (retry_time_us, pending_retry_time_us))
|
||||
{
|
||||
g_source_set_ready_time (onscreen_native->retry_page_flips_source,
|
||||
retry_time_us);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onscreen_native->pending_page_flip_retries =
|
||||
g_list_append (onscreen_native->pending_page_flip_retries,
|
||||
retry_page_flip_data);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
GClosure *flip_closure,
|
||||
MetaCrtc *crtc,
|
||||
GError **error)
|
||||
{
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
|
||||
@@ -1533,8 +1727,9 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
|
||||
if (!meta_gpu_kms_is_crtc_active (gpu_kms, crtc))
|
||||
{
|
||||
*fb_in_use = FALSE;
|
||||
return;
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Tried to flip inactive CRTC");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||
@@ -1554,11 +1749,23 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
|
||||
if (!meta_gpu_kms_flip_crtc (gpu_kms,
|
||||
crtc,
|
||||
x, y,
|
||||
fb_id,
|
||||
flip_closure,
|
||||
fb_in_use))
|
||||
return;
|
||||
error))
|
||||
{
|
||||
if (g_error_matches (*error,
|
||||
G_IO_ERROR,
|
||||
G_IO_ERROR_BUSY))
|
||||
{
|
||||
g_clear_error (error);
|
||||
schedule_retry_page_flip (onscreen_native, crtc,
|
||||
fb_id, flip_closure);
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
onscreen_native->total_pending_flips++;
|
||||
if (secondary_gpu_state)
|
||||
@@ -1570,35 +1777,30 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
if (flip_egl_stream (onscreen_native,
|
||||
flip_closure))
|
||||
onscreen_native->total_pending_flips++;
|
||||
*fb_in_use = TRUE;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
typedef struct _SetCrtcFbData
|
||||
{
|
||||
MetaGpuKms *render_gpu;
|
||||
CoglOnscreen *onscreen;
|
||||
uint32_t fb_id;
|
||||
} SetCrtcFbData;
|
||||
|
||||
static void
|
||||
set_crtc_fb (MetaLogicalMonitor *logical_monitor,
|
||||
set_crtc_fb (CoglOnscreen *onscreen,
|
||||
MetaLogicalMonitor *logical_monitor,
|
||||
MetaCrtc *crtc,
|
||||
gpointer user_data)
|
||||
uint32_t render_fb_id)
|
||||
{
|
||||
SetCrtcFbData *data = user_data;
|
||||
MetaGpuKms *render_gpu = data->render_gpu;
|
||||
CoglOnscreen *onscreen = data->onscreen;
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
|
||||
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
|
||||
MetaGpuKms *gpu_kms;
|
||||
uint32_t fb_id;
|
||||
int x, y;
|
||||
uint32_t fb_id;
|
||||
|
||||
gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
|
||||
if (gpu_kms == render_gpu)
|
||||
{
|
||||
fb_id = data->fb_id;
|
||||
fb_id = render_fb_id;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1617,6 +1819,23 @@ set_crtc_fb (MetaLogicalMonitor *logical_monitor,
|
||||
meta_gpu_kms_apply_crtc_mode (gpu_kms, crtc, x, y, fb_id);
|
||||
}
|
||||
|
||||
typedef struct _SetCrtcFbData
|
||||
{
|
||||
CoglOnscreen *onscreen;
|
||||
uint32_t fb_id;
|
||||
} SetCrtcFbData;
|
||||
|
||||
static void
|
||||
set_crtc_fb_cb (MetaLogicalMonitor *logical_monitor,
|
||||
MetaCrtc *crtc,
|
||||
gpointer user_data)
|
||||
{
|
||||
SetCrtcFbData *data = user_data;
|
||||
CoglOnscreen *onscreen = data->onscreen;
|
||||
|
||||
set_crtc_fb (onscreen, logical_monitor, crtc, data->fb_id);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_onscreen_native_set_crtc_modes (CoglOnscreen *onscreen)
|
||||
{
|
||||
@@ -1649,13 +1868,12 @@ meta_onscreen_native_set_crtc_modes (CoglOnscreen *onscreen)
|
||||
if (logical_monitor)
|
||||
{
|
||||
SetCrtcFbData data = {
|
||||
.render_gpu = render_gpu,
|
||||
.onscreen = onscreen,
|
||||
.fb_id = fb_id
|
||||
};
|
||||
|
||||
meta_logical_monitor_foreach_crtc (logical_monitor,
|
||||
set_crtc_fb,
|
||||
set_crtc_fb_cb,
|
||||
&data);
|
||||
}
|
||||
else
|
||||
@@ -1674,12 +1892,47 @@ meta_onscreen_native_set_crtc_modes (CoglOnscreen *onscreen)
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
crtc_mode_set_fallback (CoglOnscreen *onscreen,
|
||||
MetaLogicalMonitor *logical_monitor,
|
||||
MetaCrtc *crtc)
|
||||
{
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
|
||||
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
|
||||
MetaRendererNative *renderer_native;
|
||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
uint32_t fb_id;
|
||||
static gboolean warned_once = FALSE;
|
||||
|
||||
if (!warned_once)
|
||||
{
|
||||
g_warning ("Page flipping not supported by driver, "
|
||||
"relying on the clock from now on");
|
||||
warned_once = TRUE;
|
||||
}
|
||||
|
||||
renderer_native = meta_renderer_native_from_gpu (render_gpu);
|
||||
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||
render_gpu);
|
||||
if (renderer_gpu_data->mode != META_RENDERER_NATIVE_MODE_GBM)
|
||||
{
|
||||
g_warning ("Mode set fallback not handled for EGLStreams");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
fb_id = onscreen_native->gbm.next_fb_id;
|
||||
set_crtc_fb (onscreen, logical_monitor, crtc, fb_id);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
typedef struct _FlipCrtcData
|
||||
{
|
||||
CoglOnscreen *onscreen;
|
||||
GClosure *flip_closure;
|
||||
|
||||
gboolean out_fb_in_use;
|
||||
gboolean did_flip;
|
||||
gboolean did_mode_set;
|
||||
} FlipCrtcData;
|
||||
|
||||
static void
|
||||
@@ -1688,15 +1941,28 @@ flip_crtc (MetaLogicalMonitor *logical_monitor,
|
||||
gpointer user_data)
|
||||
{
|
||||
FlipCrtcData *data = user_data;
|
||||
int x, y;
|
||||
GError *error = NULL;
|
||||
|
||||
x = crtc->rect.x - logical_monitor->rect.x;
|
||||
y = crtc->rect.y - logical_monitor->rect.y;
|
||||
|
||||
meta_onscreen_native_flip_crtc (data->onscreen,
|
||||
data->flip_closure,
|
||||
crtc, x, y,
|
||||
&data->out_fb_in_use);
|
||||
if (!meta_onscreen_native_flip_crtc (data->onscreen,
|
||||
data->flip_closure,
|
||||
crtc,
|
||||
&error))
|
||||
{
|
||||
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT))
|
||||
{
|
||||
if (crtc_mode_set_fallback (data->onscreen, logical_monitor, crtc))
|
||||
data->did_mode_set = TRUE;
|
||||
}
|
||||
else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED))
|
||||
{
|
||||
g_warning ("Failed to flip onscreen: %s", error->message);
|
||||
}
|
||||
g_error_free (error);
|
||||
}
|
||||
else
|
||||
{
|
||||
data->did_flip = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1704,11 +1970,9 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
|
||||
{
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
|
||||
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
|
||||
MetaRendererView *view = onscreen_native->view;
|
||||
GClosure *flip_closure;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
gboolean fb_in_use = FALSE;
|
||||
|
||||
/*
|
||||
* Create a closure that either will be invoked or destructed.
|
||||
@@ -1728,57 +1992,20 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
|
||||
/* Either flip the CRTC's of the monitor info, if we are drawing just part
|
||||
* of the stage, or all of the CRTC's if we are drawing the whole stage.
|
||||
*/
|
||||
FlipCrtcData data = {
|
||||
.onscreen = onscreen,
|
||||
.flip_closure = flip_closure,
|
||||
};
|
||||
logical_monitor = meta_renderer_view_get_logical_monitor (view);
|
||||
if (logical_monitor)
|
||||
{
|
||||
FlipCrtcData data = {
|
||||
.onscreen = onscreen,
|
||||
.flip_closure = flip_closure,
|
||||
};
|
||||
|
||||
meta_logical_monitor_foreach_crtc (logical_monitor,
|
||||
flip_crtc,
|
||||
&data);
|
||||
fb_in_use = data.out_fb_in_use;
|
||||
}
|
||||
else
|
||||
{
|
||||
GList *l;
|
||||
|
||||
for (l = meta_gpu_get_crtcs (META_GPU (render_gpu)); l; l = l->next)
|
||||
{
|
||||
MetaCrtc *crtc = l->data;
|
||||
|
||||
meta_onscreen_native_flip_crtc (onscreen, flip_closure,
|
||||
crtc, crtc->rect.x, crtc->rect.y,
|
||||
&fb_in_use);
|
||||
}
|
||||
}
|
||||
meta_logical_monitor_foreach_crtc (logical_monitor, flip_crtc, &data);
|
||||
|
||||
/*
|
||||
* If the framebuffer is in use, but we don't have any pending flips it means
|
||||
* that flipping is not supported and we set the next framebuffer directly.
|
||||
* Since we won't receive a flip callback, lets just notify listeners
|
||||
* directly.
|
||||
* If we didn't queue a page flip, but instead directly changed the mode due
|
||||
* to the driver not supporting mode setting, wes must swap the buffers
|
||||
* directly as we won't get a page flip callback.
|
||||
*/
|
||||
if (fb_in_use && onscreen_native->total_pending_flips == 0)
|
||||
{
|
||||
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
|
||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
|
||||
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||
render_gpu);
|
||||
switch (renderer_gpu_data->mode)
|
||||
{
|
||||
case META_RENDERER_NATIVE_MODE_GBM:
|
||||
meta_onscreen_native_swap_drm_fb (onscreen);
|
||||
break;
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (!data.did_flip && data.did_mode_set)
|
||||
meta_onscreen_native_swap_drm_fb (onscreen);
|
||||
|
||||
onscreen_native->pending_queue_swap_notify = TRUE;
|
||||
|
||||
@@ -2741,6 +2968,11 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
|
||||
|
||||
onscreen_native = onscreen_egl->platform;
|
||||
|
||||
g_list_free_full (onscreen_native->pending_page_flip_retries,
|
||||
(GDestroyNotify) retry_page_flip_data_free);
|
||||
g_clear_pointer (&onscreen_native->retry_page_flips_source,
|
||||
g_source_destroy);
|
||||
|
||||
if (onscreen_egl->egl_surface != EGL_NO_SURFACE)
|
||||
{
|
||||
MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native);
|
||||
|
||||
@@ -45,7 +45,7 @@ struct _MetaStageNative
|
||||
};
|
||||
|
||||
static void
|
||||
clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
|
||||
clutter_stage_window_iface_init (ClutterStageWindowInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (MetaStageNative, meta_stage_native,
|
||||
CLUTTER_TYPE_STAGE_COGL,
|
||||
@@ -219,7 +219,7 @@ meta_stage_native_class_init (MetaStageNativeClass *klass)
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
|
||||
clutter_stage_window_iface_init (ClutterStageWindowInterface *iface)
|
||||
{
|
||||
iface->can_clip_redraws = meta_stage_native_can_clip_redraws;
|
||||
iface->get_geometry = meta_stage_native_get_geometry;
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include "backends/x11/nested/meta-renderer-x11-nested.h"
|
||||
#include "clutter/clutter-mutter.h"
|
||||
|
||||
static ClutterStageWindowIface *clutter_stage_window_parent_iface = NULL;
|
||||
static ClutterStageWindowInterface *clutter_stage_window_parent_iface = NULL;
|
||||
|
||||
struct _MetaStageX11Nested
|
||||
{
|
||||
@@ -45,7 +45,7 @@ struct _MetaStageX11Nested
|
||||
};
|
||||
|
||||
static void
|
||||
clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
|
||||
clutter_stage_window_iface_init (ClutterStageWindowInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (MetaStageX11Nested, meta_stage_x11_nested,
|
||||
CLUTTER_TYPE_STAGE_X11,
|
||||
@@ -350,7 +350,7 @@ meta_stage_x11_nested_class_init (MetaStageX11NestedClass *klass)
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
|
||||
clutter_stage_window_iface_init (ClutterStageWindowInterface *iface)
|
||||
{
|
||||
clutter_stage_window_parent_iface = g_type_interface_peek_parent (iface);
|
||||
|
||||
|
||||
@@ -299,9 +299,9 @@ meta_plugin_manager_confirm_display_change (MetaPluginManager *plugin_mgr)
|
||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||
|
||||
if (klass->confirm_display_change)
|
||||
return klass->confirm_display_change (plugin);
|
||||
klass->confirm_display_change (plugin);
|
||||
else
|
||||
return meta_plugin_complete_display_change (plugin, TRUE);
|
||||
meta_plugin_complete_display_change (plugin, TRUE);
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
||||
@@ -1278,22 +1278,10 @@ get_image_via_offscreen (MetaShapedTexture *stex,
|
||||
CoglOffscreen *offscreen;
|
||||
CoglFramebuffer *fb;
|
||||
CoglMatrix projection_matrix;
|
||||
int fb_width, fb_height;
|
||||
cairo_rectangle_int_t fallback_clip;
|
||||
CoglColor clear_color;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
if (cogl_has_feature (cogl_context, COGL_FEATURE_ID_TEXTURE_NPOT))
|
||||
{
|
||||
fb_width = stex->dst_width;
|
||||
fb_height = stex->dst_height;
|
||||
}
|
||||
else
|
||||
{
|
||||
fb_width = _cogl_util_next_p2 (stex->dst_width);
|
||||
fb_height = _cogl_util_next_p2 (stex->dst_height);
|
||||
}
|
||||
|
||||
if (!clip)
|
||||
{
|
||||
fallback_clip = (cairo_rectangle_int_t) {
|
||||
@@ -1305,7 +1293,8 @@ get_image_via_offscreen (MetaShapedTexture *stex,
|
||||
|
||||
image_texture =
|
||||
COGL_TEXTURE (cogl_texture_2d_new_with_size (cogl_context,
|
||||
fb_width, fb_height));
|
||||
stex->dst_width,
|
||||
stex->dst_height));
|
||||
cogl_primitive_texture_set_auto_mipmap (COGL_PRIMITIVE_TEXTURE (image_texture),
|
||||
FALSE);
|
||||
if (!cogl_texture_allocate (COGL_TEXTURE (image_texture), &error))
|
||||
@@ -1315,18 +1304,6 @@ get_image_via_offscreen (MetaShapedTexture *stex,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (fb_width != stex->dst_width || fb_height != stex->dst_height)
|
||||
{
|
||||
CoglSubTexture *sub_texture;
|
||||
|
||||
sub_texture = cogl_sub_texture_new (cogl_context,
|
||||
image_texture,
|
||||
0, 0,
|
||||
stex->dst_width, stex->dst_height);
|
||||
cogl_object_unref (image_texture);
|
||||
image_texture = COGL_TEXTURE (sub_texture);
|
||||
}
|
||||
|
||||
offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (image_texture));
|
||||
fb = COGL_FRAMEBUFFER (offscreen);
|
||||
cogl_object_unref (image_texture);
|
||||
|
||||
@@ -1850,20 +1850,6 @@ meta_window_actor_from_window (MetaWindow *window)
|
||||
return META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_window_actor_get_buffer_bounds (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds)
|
||||
{
|
||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
|
||||
ClutterActor *clutter_actor;
|
||||
|
||||
clutter_actor = CLUTTER_ACTOR (meta_window_actor_get_texture (window_actor));
|
||||
bounds->x = 0;
|
||||
bounds->y = 0;
|
||||
bounds->width = (int) clutter_actor_get_width (clutter_actor);
|
||||
bounds->height = (int) clutter_actor_get_height (clutter_actor);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_window_actor_get_frame_bounds (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds)
|
||||
@@ -1921,6 +1907,52 @@ meta_window_actor_transform_relative_position (MetaScreenCastWindow *screen_cast
|
||||
*y_out = (double) v2.y;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_window_actor_transform_cursor_position (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaCursorSprite *cursor_sprite,
|
||||
ClutterPoint *cursor_position,
|
||||
float *out_cursor_scale,
|
||||
ClutterPoint *out_relative_cursor_position)
|
||||
{
|
||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
|
||||
MetaWindowActorPrivate *priv =
|
||||
meta_window_actor_get_instance_private (window_actor);
|
||||
MetaWindow *window;
|
||||
|
||||
window = priv->window;
|
||||
if (!meta_window_has_pointer (window))
|
||||
return FALSE;
|
||||
|
||||
if (cursor_sprite &&
|
||||
meta_cursor_sprite_get_cogl_texture (cursor_sprite) &&
|
||||
out_cursor_scale)
|
||||
{
|
||||
MetaShapedTexture *stex;
|
||||
double actor_scale;
|
||||
float cursor_texture_scale;
|
||||
|
||||
stex = meta_surface_actor_get_texture (priv->surface);
|
||||
clutter_actor_get_scale (CLUTTER_ACTOR (stex), &actor_scale, NULL);
|
||||
cursor_texture_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite);
|
||||
|
||||
*out_cursor_scale = actor_scale / cursor_texture_scale;
|
||||
}
|
||||
|
||||
if (out_relative_cursor_position)
|
||||
{
|
||||
MetaShapedTexture *stex;
|
||||
|
||||
stex = meta_surface_actor_get_texture (priv->surface);
|
||||
clutter_actor_transform_stage_point (CLUTTER_ACTOR (stex),
|
||||
cursor_position->x,
|
||||
cursor_position->y,
|
||||
&out_relative_cursor_position->x,
|
||||
&out_relative_cursor_position->y);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_window_actor_capture_into (MetaScreenCastWindow *screen_cast_window,
|
||||
MetaRectangle *bounds,
|
||||
@@ -1975,11 +2007,18 @@ meta_window_actor_capture_into (MetaScreenCastWindow *screen_cast_window,
|
||||
cairo_surface_destroy (image);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_window_actor_has_damage (MetaScreenCastWindow *screen_cast_window)
|
||||
{
|
||||
return clutter_actor_has_damage (CLUTTER_ACTOR (screen_cast_window));
|
||||
}
|
||||
|
||||
static void
|
||||
screen_cast_window_iface_init (MetaScreenCastWindowInterface *iface)
|
||||
{
|
||||
iface->get_buffer_bounds = meta_window_actor_get_buffer_bounds;
|
||||
iface->get_frame_bounds = meta_window_actor_get_frame_bounds;
|
||||
iface->transform_relative_position = meta_window_actor_transform_relative_position;
|
||||
iface->transform_cursor_position = meta_window_actor_transform_cursor_position;
|
||||
iface->capture_into = meta_window_actor_capture_into;
|
||||
iface->has_damage = meta_window_actor_has_damage;
|
||||
}
|
||||
|
||||
@@ -203,6 +203,7 @@ struct _MetaKeyGrab {
|
||||
char *name;
|
||||
guint action;
|
||||
MetaKeyCombo combo;
|
||||
gint flags;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -834,7 +835,7 @@ rebuild_binding_table (MetaKeyBindingManager *keys,
|
||||
b = g_slice_new0 (MetaKeyBinding);
|
||||
b->name = grab->name;
|
||||
b->handler = handler;
|
||||
b->flags = handler->flags;
|
||||
b->flags = grab->flags;
|
||||
b->combo = grab->combo;
|
||||
|
||||
g_hash_table_add (keys->key_bindings, b);
|
||||
@@ -1593,8 +1594,9 @@ handle_external_grab (MetaDisplay *display,
|
||||
|
||||
|
||||
guint
|
||||
meta_display_grab_accelerator (MetaDisplay *display,
|
||||
const char *accelerator)
|
||||
meta_display_grab_accelerator (MetaDisplay *display,
|
||||
const char *accelerator,
|
||||
MetaKeyBindingFlags flags)
|
||||
{
|
||||
MetaKeyBindingManager *keys = &display->key_binding_manager;
|
||||
MetaKeyBinding *binding;
|
||||
@@ -1628,6 +1630,7 @@ meta_display_grab_accelerator (MetaDisplay *display,
|
||||
grab->action = next_dynamic_keybinding_action ();
|
||||
grab->name = meta_external_binding_name_for_action (grab->action);
|
||||
grab->combo = combo;
|
||||
grab->flags = flags;
|
||||
|
||||
g_hash_table_insert (external_grabs, grab->name, grab);
|
||||
|
||||
@@ -1636,6 +1639,7 @@ meta_display_grab_accelerator (MetaDisplay *display,
|
||||
binding->handler = HANDLER ("external-grab");
|
||||
binding->combo = combo;
|
||||
binding->resolved_combo = resolved_combo;
|
||||
binding->flags = flags;
|
||||
|
||||
g_hash_table_add (keys->key_bindings, binding);
|
||||
index_binding (keys, binding);
|
||||
|
||||
@@ -5357,7 +5357,11 @@ load_default_window_icon (int size)
|
||||
icon_name = "image-missing";
|
||||
|
||||
pixbuf = gtk_icon_theme_load_icon (theme, icon_name, size, 0, NULL);
|
||||
return gdk_cairo_surface_create_from_pixbuf (pixbuf, 1, NULL);
|
||||
|
||||
if (pixbuf != NULL)
|
||||
return gdk_cairo_surface_create_from_pixbuf (pixbuf, 1, NULL);
|
||||
|
||||
return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, size, size);
|
||||
}
|
||||
|
||||
static cairo_surface_t *
|
||||
|
||||
@@ -157,8 +157,9 @@ gboolean meta_display_remove_keybinding (MetaDisplay *display,
|
||||
const char *name);
|
||||
|
||||
META_EXPORT
|
||||
guint meta_display_grab_accelerator (MetaDisplay *display,
|
||||
const char *accelerator);
|
||||
guint meta_display_grab_accelerator (MetaDisplay *display,
|
||||
const char *accelerator,
|
||||
MetaKeyBindingFlags flags);
|
||||
|
||||
META_EXPORT
|
||||
gboolean meta_display_ungrab_accelerator (MetaDisplay *display,
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
Available @properties include:
|
||||
|
||||
* "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
|
||||
Available since API version 2.
|
||||
|
||||
Available cursor mode values:
|
||||
|
||||
@@ -92,11 +93,14 @@
|
||||
@properties: Properties used determining what window to select
|
||||
@stream_path: Path to the new stream object
|
||||
|
||||
Supported since API version 2.
|
||||
|
||||
Record a single window. The cursor will not be included.
|
||||
|
||||
Available @properties include:
|
||||
|
||||
* "window-id" (t): Id of the window to record.
|
||||
* "cursor-mode" (u): Cursor mode. Default: 'hidden' (see RecordMonitor).
|
||||
|
||||
-->
|
||||
<method name="RecordWindow">
|
||||
|
||||
@@ -5291,6 +5291,7 @@ meta_test_monitor_custom_lid_switch_config (void)
|
||||
.n_modes = 1,
|
||||
.outputs = {
|
||||
{
|
||||
.crtc = -1,
|
||||
.modes = { 0 },
|
||||
.n_modes = 1,
|
||||
.preferred_mode = 0,
|
||||
@@ -5301,6 +5302,7 @@ meta_test_monitor_custom_lid_switch_config (void)
|
||||
.is_laptop_panel = TRUE
|
||||
},
|
||||
{
|
||||
.crtc = -1,
|
||||
.modes = { 0 },
|
||||
.n_modes = 1,
|
||||
.preferred_mode = 0,
|
||||
|
||||
@@ -139,7 +139,7 @@ meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
|
||||
|
||||
buffer->egl_stream.stream = stream;
|
||||
buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_STREAM;
|
||||
buffer->texture = COGL_TEXTURE (texture);
|
||||
buffer->egl_stream.texture = COGL_TEXTURE (texture);
|
||||
buffer->is_y_inverted = meta_wayland_egl_stream_is_y_inverted (stream);
|
||||
|
||||
return TRUE;
|
||||
@@ -196,8 +196,10 @@ shm_buffer_get_cogl_pixel_format (struct wl_shm_buffer *shm_buffer,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
shm_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
GError **error)
|
||||
shm_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
CoglTexture **texture,
|
||||
gboolean *changed_texture,
|
||||
GError **error)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
||||
@@ -207,48 +209,77 @@ shm_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
CoglPixelFormat format;
|
||||
CoglTextureComponents components;
|
||||
CoglBitmap *bitmap;
|
||||
CoglTexture *texture;
|
||||
|
||||
if (buffer->texture)
|
||||
return TRUE;
|
||||
CoglTexture *new_texture;
|
||||
|
||||
shm_buffer = wl_shm_buffer_get (buffer->resource);
|
||||
stride = wl_shm_buffer_get_stride (shm_buffer);
|
||||
width = wl_shm_buffer_get_width (shm_buffer);
|
||||
height = wl_shm_buffer_get_height (shm_buffer);
|
||||
shm_buffer_get_cogl_pixel_format (shm_buffer, &format, &components);
|
||||
|
||||
if (*texture &&
|
||||
cogl_texture_get_width (*texture) == width &&
|
||||
cogl_texture_get_height (*texture) == height &&
|
||||
cogl_texture_get_components (*texture) == components &&
|
||||
_cogl_texture_get_format (*texture) == format)
|
||||
{
|
||||
buffer->is_y_inverted = TRUE;
|
||||
*changed_texture = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
cogl_clear_object (texture);
|
||||
|
||||
wl_shm_buffer_begin_access (shm_buffer);
|
||||
|
||||
shm_buffer_get_cogl_pixel_format (shm_buffer, &format, &components);
|
||||
|
||||
bitmap = cogl_bitmap_new_for_data (cogl_context,
|
||||
width, height,
|
||||
format,
|
||||
stride,
|
||||
wl_shm_buffer_get_data (shm_buffer));
|
||||
|
||||
texture = COGL_TEXTURE (cogl_texture_2d_new_from_bitmap (bitmap));
|
||||
cogl_texture_set_components (COGL_TEXTURE (texture), components);
|
||||
new_texture = COGL_TEXTURE (cogl_texture_2d_new_from_bitmap (bitmap));
|
||||
cogl_texture_set_components (new_texture, components);
|
||||
|
||||
if (!cogl_texture_allocate (new_texture, error))
|
||||
{
|
||||
g_clear_pointer (&new_texture, cogl_object_unref);
|
||||
if (g_error_matches (*error, COGL_TEXTURE_ERROR, COGL_TEXTURE_ERROR_SIZE))
|
||||
{
|
||||
CoglTexture2DSliced *texture_sliced;
|
||||
|
||||
g_clear_error (error);
|
||||
|
||||
texture_sliced =
|
||||
cogl_texture_2d_sliced_new_from_bitmap (bitmap,
|
||||
COGL_TEXTURE_MAX_WASTE);
|
||||
new_texture = COGL_TEXTURE (texture_sliced);
|
||||
cogl_texture_set_components (new_texture, components);
|
||||
|
||||
if (!cogl_texture_allocate (new_texture, error))
|
||||
g_clear_pointer (&new_texture, cogl_object_unref);
|
||||
}
|
||||
}
|
||||
|
||||
cogl_object_unref (bitmap);
|
||||
|
||||
if (!cogl_texture_allocate (COGL_TEXTURE (texture), error))
|
||||
g_clear_pointer (&texture, cogl_object_unref);
|
||||
|
||||
wl_shm_buffer_end_access (shm_buffer);
|
||||
|
||||
buffer->texture = texture;
|
||||
buffer->is_y_inverted = TRUE;
|
||||
|
||||
if (!buffer->texture)
|
||||
if (!new_texture)
|
||||
return FALSE;
|
||||
|
||||
*texture = new_texture;
|
||||
*changed_texture = TRUE;
|
||||
buffer->is_y_inverted = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
egl_image_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
GError **error)
|
||||
egl_image_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
CoglTexture **texture,
|
||||
gboolean *changed_texture,
|
||||
GError **error)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaEgl *egl = meta_backend_get_egl (backend);
|
||||
@@ -258,10 +289,15 @@ egl_image_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
int format, width, height, y_inverted;
|
||||
CoglPixelFormat cogl_format;
|
||||
EGLImageKHR egl_image;
|
||||
CoglTexture2D *texture;
|
||||
CoglTexture2D *texture_2d;
|
||||
|
||||
if (buffer->texture)
|
||||
return TRUE;
|
||||
if (buffer->egl_image.texture)
|
||||
{
|
||||
*changed_texture = *texture != buffer->egl_image.texture;
|
||||
cogl_clear_object (texture);
|
||||
*texture = cogl_object_ref (buffer->egl_image.texture);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
|
||||
EGL_TEXTURE_FORMAT, &format,
|
||||
@@ -307,26 +343,32 @@ egl_image_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
if (egl_image == EGL_NO_IMAGE_KHR)
|
||||
return FALSE;
|
||||
|
||||
texture = cogl_egl_texture_2d_new_from_image (cogl_context,
|
||||
width, height,
|
||||
cogl_format,
|
||||
egl_image,
|
||||
error);
|
||||
texture_2d = cogl_egl_texture_2d_new_from_image (cogl_context,
|
||||
width, height,
|
||||
cogl_format,
|
||||
egl_image,
|
||||
error);
|
||||
|
||||
meta_egl_destroy_image (egl, egl_display, egl_image, NULL);
|
||||
|
||||
if (!texture)
|
||||
if (!texture_2d)
|
||||
return FALSE;
|
||||
|
||||
buffer->texture = COGL_TEXTURE (texture);
|
||||
buffer->egl_image.texture = COGL_TEXTURE (texture_2d);
|
||||
buffer->is_y_inverted = !!y_inverted;
|
||||
|
||||
cogl_clear_object (texture);
|
||||
*texture = cogl_object_ref (buffer->egl_image.texture);
|
||||
*changed_texture = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef HAVE_WAYLAND_EGLSTREAM
|
||||
static gboolean
|
||||
egl_stream_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
CoglTexture **texture,
|
||||
gboolean *changed_texture,
|
||||
GError **error)
|
||||
{
|
||||
MetaWaylandEglStream *stream = buffer->egl_stream.stream;
|
||||
@@ -336,13 +378,38 @@ egl_stream_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
if (!meta_wayland_egl_stream_attach (stream, error))
|
||||
return FALSE;
|
||||
|
||||
*changed_texture = *texture != buffer->egl_stream.texture;
|
||||
cogl_clear_object (texture);
|
||||
*texture = cogl_object_ref (buffer->egl_stream.texture);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* HAVE_WAYLAND_EGLSTREAM */
|
||||
|
||||
/**
|
||||
* meta_wayland_buffer_attach:
|
||||
* @buffer: a pointer to a #MetaWaylandBuffer
|
||||
* @texture: (inout) (transfer full): a #CoglTexture representing the surface
|
||||
* content
|
||||
* @error: return location for error or %NULL
|
||||
*
|
||||
* This function should be passed a pointer to the texture used to draw the
|
||||
* surface content. The texture will either be replaced by a new texture, or
|
||||
* stay the same, in which case, it may later be updated with new content when
|
||||
* processing damage. The new texture might be newly created, or it may be a
|
||||
* reference to an already existing one.
|
||||
*
|
||||
* If replaced, the old texture will have its reference count decreased by one,
|
||||
* potentially freeing it. When a new texture is set, the caller (i.e. the
|
||||
* surface) will be the owner of one reference count. It must free it, either
|
||||
* using g_object_unref() or have it updated again using
|
||||
* meta_wayland_buffer_attach(), which also might free it, as described above.
|
||||
*/
|
||||
gboolean
|
||||
meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
GError **error)
|
||||
meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
CoglTexture **texture,
|
||||
gboolean *changed_texture,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (buffer->resource, FALSE);
|
||||
|
||||
@@ -358,15 +425,18 @@ meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
switch (buffer->type)
|
||||
{
|
||||
case META_WAYLAND_BUFFER_TYPE_SHM:
|
||||
return shm_buffer_attach (buffer, error);
|
||||
return shm_buffer_attach (buffer, texture, changed_texture, error);
|
||||
case META_WAYLAND_BUFFER_TYPE_EGL_IMAGE:
|
||||
return egl_image_buffer_attach (buffer, error);
|
||||
return egl_image_buffer_attach (buffer, texture, changed_texture, error);
|
||||
#ifdef HAVE_WAYLAND_EGLSTREAM
|
||||
case META_WAYLAND_BUFFER_TYPE_EGL_STREAM:
|
||||
return egl_stream_buffer_attach (buffer, error);
|
||||
return egl_stream_buffer_attach (buffer, texture, changed_texture, error);
|
||||
#endif
|
||||
case META_WAYLAND_BUFFER_TYPE_DMA_BUF:
|
||||
return meta_wayland_dma_buf_buffer_attach (buffer, error);
|
||||
return meta_wayland_dma_buf_buffer_attach (buffer,
|
||||
texture,
|
||||
changed_texture,
|
||||
error);
|
||||
case META_WAYLAND_BUFFER_TYPE_UNKNOWN:
|
||||
g_assert_not_reached ();
|
||||
return FALSE;
|
||||
@@ -376,12 +446,6 @@ meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
CoglTexture *
|
||||
meta_wayland_buffer_get_texture (MetaWaylandBuffer *buffer)
|
||||
{
|
||||
return buffer->texture;
|
||||
}
|
||||
|
||||
CoglSnippet *
|
||||
meta_wayland_buffer_create_snippet (MetaWaylandBuffer *buffer)
|
||||
{
|
||||
@@ -403,6 +467,7 @@ meta_wayland_buffer_is_y_inverted (MetaWaylandBuffer *buffer)
|
||||
|
||||
static gboolean
|
||||
process_shm_buffer_damage (MetaWaylandBuffer *buffer,
|
||||
CoglTexture *texture,
|
||||
cairo_region_t *region,
|
||||
GError **error)
|
||||
{
|
||||
@@ -427,7 +492,7 @@ process_shm_buffer_damage (MetaWaylandBuffer *buffer,
|
||||
bpp = _cogl_pixel_format_get_bytes_per_pixel (format);
|
||||
cairo_region_get_rectangle (region, i, &rect);
|
||||
|
||||
if (!_cogl_texture_set_region (buffer->texture,
|
||||
if (!_cogl_texture_set_region (texture,
|
||||
rect.width, rect.height,
|
||||
format,
|
||||
stride,
|
||||
@@ -448,6 +513,7 @@ process_shm_buffer_damage (MetaWaylandBuffer *buffer,
|
||||
|
||||
void
|
||||
meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer,
|
||||
CoglTexture *texture,
|
||||
cairo_region_t *region)
|
||||
{
|
||||
gboolean res = FALSE;
|
||||
@@ -458,7 +524,7 @@ meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer,
|
||||
switch (buffer->type)
|
||||
{
|
||||
case META_WAYLAND_BUFFER_TYPE_SHM:
|
||||
res = process_shm_buffer_damage (buffer, region, &error);
|
||||
res = process_shm_buffer_damage (buffer, texture, region, &error);
|
||||
break;
|
||||
case META_WAYLAND_BUFFER_TYPE_EGL_IMAGE:
|
||||
#ifdef HAVE_WAYLAND_EGLSTREAM
|
||||
@@ -487,10 +553,12 @@ meta_wayland_buffer_finalize (GObject *object)
|
||||
{
|
||||
MetaWaylandBuffer *buffer = META_WAYLAND_BUFFER (object);
|
||||
|
||||
g_clear_pointer (&buffer->texture, cogl_object_unref);
|
||||
g_clear_pointer (&buffer->egl_image.texture, cogl_object_unref);
|
||||
#ifdef HAVE_WAYLAND_EGLSTREAM
|
||||
g_clear_pointer (&buffer->egl_stream.texture, cogl_object_unref);
|
||||
g_clear_object (&buffer->egl_stream.stream);
|
||||
#endif
|
||||
g_clear_pointer (&buffer->dma_buf.texture, cogl_object_unref);
|
||||
g_clear_object (&buffer->dma_buf.dma_buf);
|
||||
|
||||
G_OBJECT_CLASS (meta_wayland_buffer_parent_class)->finalize (object);
|
||||
|
||||
@@ -51,19 +51,24 @@ struct _MetaWaylandBuffer
|
||||
struct wl_resource *resource;
|
||||
struct wl_listener destroy_listener;
|
||||
|
||||
CoglTexture *texture;
|
||||
gboolean is_y_inverted;
|
||||
|
||||
MetaWaylandBufferType type;
|
||||
|
||||
struct {
|
||||
CoglTexture *texture;
|
||||
} egl_image;
|
||||
|
||||
#ifdef HAVE_WAYLAND_EGLSTREAM
|
||||
struct {
|
||||
MetaWaylandEglStream *stream;
|
||||
CoglTexture *texture;
|
||||
} egl_stream;
|
||||
#endif
|
||||
|
||||
struct {
|
||||
MetaWaylandDmaBufBuffer *dma_buf;
|
||||
CoglTexture *texture;
|
||||
} dma_buf;
|
||||
};
|
||||
|
||||
@@ -76,11 +81,13 @@ struct wl_resource * meta_wayland_buffer_get_resource (MetaWaylandBuff
|
||||
gboolean meta_wayland_buffer_is_realized (MetaWaylandBuffer *buffer);
|
||||
gboolean meta_wayland_buffer_realize (MetaWaylandBuffer *buffer);
|
||||
gboolean meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
CoglTexture **texture,
|
||||
gboolean *changed_texture,
|
||||
GError **error);
|
||||
CoglTexture * meta_wayland_buffer_get_texture (MetaWaylandBuffer *buffer);
|
||||
CoglSnippet * meta_wayland_buffer_create_snippet (MetaWaylandBuffer *buffer);
|
||||
gboolean meta_wayland_buffer_is_y_inverted (MetaWaylandBuffer *buffer);
|
||||
void meta_wayland_buffer_process_damage (MetaWaylandBuffer *buffer,
|
||||
CoglTexture *texture,
|
||||
cairo_region_t *region);
|
||||
|
||||
#endif /* META_WAYLAND_BUFFER_H */
|
||||
|
||||
@@ -57,18 +57,17 @@ update_cursor_sprite_texture (MetaWaylandCursorSurface *cursor_surface)
|
||||
meta_wayland_cursor_surface_get_instance_private (cursor_surface);
|
||||
MetaWaylandSurface *surface =
|
||||
meta_wayland_surface_role_get_surface (META_WAYLAND_SURFACE_ROLE (cursor_surface));
|
||||
MetaWaylandBuffer *buffer = meta_wayland_surface_get_buffer (surface);
|
||||
MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (priv->cursor_sprite);
|
||||
|
||||
g_return_if_fail (!buffer || buffer->texture);
|
||||
CoglTexture *texture;
|
||||
|
||||
if (!priv->cursor_renderer)
|
||||
return;
|
||||
|
||||
if (buffer)
|
||||
texture = meta_wayland_surface_get_texture (surface);
|
||||
if (texture)
|
||||
{
|
||||
meta_cursor_sprite_set_texture (cursor_sprite,
|
||||
buffer->texture,
|
||||
texture,
|
||||
priv->hot_x * surface->scale,
|
||||
priv->hot_y * surface->scale);
|
||||
}
|
||||
@@ -170,7 +169,9 @@ meta_wayland_cursor_surface_commit (MetaWaylandSurfaceRole *surface_role,
|
||||
&pending->frame_callback_list);
|
||||
wl_list_init (&pending->frame_callback_list);
|
||||
|
||||
if (pending->newly_attached)
|
||||
if (pending->newly_attached &&
|
||||
(!cairo_region_is_empty (pending->surface_damage) ||
|
||||
!cairo_region_is_empty (pending->buffer_damage)))
|
||||
update_cursor_sprite_texture (META_WAYLAND_CURSOR_SURFACE (surface_role));
|
||||
}
|
||||
|
||||
|
||||
@@ -65,9 +65,9 @@ struct _MetaWaylandDmaBufBuffer
|
||||
|
||||
G_DEFINE_TYPE (MetaWaylandDmaBufBuffer, meta_wayland_dma_buf_buffer, G_TYPE_OBJECT);
|
||||
|
||||
gboolean
|
||||
meta_wayland_dma_buf_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
GError **error)
|
||||
static gboolean
|
||||
meta_wayland_dma_buf_realize_texture (MetaWaylandBuffer *buffer,
|
||||
GError **error)
|
||||
{
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaEgl *egl = meta_backend_get_egl (backend);
|
||||
@@ -81,7 +81,7 @@ meta_wayland_dma_buf_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
EGLint attribs[64];
|
||||
int attr_idx = 0;
|
||||
|
||||
if (buffer->texture)
|
||||
if (buffer->dma_buf.texture)
|
||||
return TRUE;
|
||||
|
||||
switch (dma_buf->drm_format)
|
||||
@@ -196,12 +196,27 @@ meta_wayland_dma_buf_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
if (!texture)
|
||||
return FALSE;
|
||||
|
||||
buffer->texture = COGL_TEXTURE (texture);
|
||||
buffer->dma_buf.texture = COGL_TEXTURE (texture);
|
||||
buffer->is_y_inverted = dma_buf->is_y_inverted;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_wayland_dma_buf_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
CoglTexture **texture,
|
||||
gboolean *changed_texture,
|
||||
GError **error)
|
||||
{
|
||||
if (!meta_wayland_dma_buf_realize_texture (buffer, error))
|
||||
return FALSE;
|
||||
|
||||
*changed_texture = *texture != buffer->dma_buf.texture;
|
||||
cogl_clear_object (texture);
|
||||
*texture = cogl_object_ref (buffer->dma_buf.texture);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
buffer_params_add (struct wl_client *client,
|
||||
struct wl_resource *resource,
|
||||
@@ -374,7 +389,7 @@ buffer_params_create_common (struct wl_client *client,
|
||||
buffer = meta_wayland_buffer_from_resource (buffer_resource);
|
||||
|
||||
meta_wayland_buffer_realize (buffer);
|
||||
if (!meta_wayland_buffer_attach (buffer, &error))
|
||||
if (!meta_wayland_dma_buf_realize_texture (buffer, &error))
|
||||
{
|
||||
if (buffer_id == 0)
|
||||
{
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <glib.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "cogl/cogl.h"
|
||||
#include "wayland/meta-wayland-types.h"
|
||||
|
||||
#define META_TYPE_WAYLAND_DMA_BUF_BUFFER (meta_wayland_dma_buf_buffer_get_type ())
|
||||
@@ -41,8 +42,10 @@ typedef struct _MetaWaylandDmaBufBuffer MetaWaylandDmaBufBuffer;
|
||||
gboolean meta_wayland_dma_buf_init (MetaWaylandCompositor *compositor);
|
||||
|
||||
gboolean
|
||||
meta_wayland_dma_buf_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
GError **error);
|
||||
meta_wayland_dma_buf_buffer_attach (MetaWaylandBuffer *buffer,
|
||||
CoglTexture **texture,
|
||||
gboolean *changed_texture,
|
||||
GError **error);
|
||||
|
||||
MetaWaylandDmaBufBuffer *
|
||||
meta_wayland_dma_buf_from_buffer (MetaWaylandBuffer *buffer);
|
||||
|
||||
@@ -169,7 +169,7 @@ meta_wayland_shell_surface_surface_commit (MetaWaylandSurfaceRole *surface_role
|
||||
return;
|
||||
|
||||
scale = meta_wayland_actor_surface_calculate_scale (actor_surface);
|
||||
texture = meta_wayland_buffer_get_texture (buffer);
|
||||
texture = meta_wayland_surface_get_texture (surface);
|
||||
|
||||
window->buffer_rect.width = cogl_texture_get_width (texture) * scale;
|
||||
window->buffer_rect.height = cogl_texture_get_height (texture) * scale;
|
||||
|
||||
@@ -245,14 +245,9 @@ get_buffer_width (MetaWaylandSurface *surface)
|
||||
MetaWaylandBuffer *buffer = meta_wayland_surface_get_buffer (surface);
|
||||
|
||||
if (buffer)
|
||||
{
|
||||
CoglTexture *texture = meta_wayland_buffer_get_texture (buffer);
|
||||
return cogl_texture_get_width (texture);
|
||||
}
|
||||
return cogl_texture_get_width (surface->texture);
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -261,14 +256,9 @@ get_buffer_height (MetaWaylandSurface *surface)
|
||||
MetaWaylandBuffer *buffer = meta_wayland_surface_get_buffer (surface);
|
||||
|
||||
if (buffer)
|
||||
{
|
||||
CoglTexture *texture = meta_wayland_buffer_get_texture (buffer);
|
||||
return cogl_texture_get_height (texture);
|
||||
}
|
||||
return cogl_texture_get_height (surface->texture);
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -283,7 +273,7 @@ surface_process_damage (MetaWaylandSurface *surface,
|
||||
cairo_region_t *transformed_region;
|
||||
cairo_region_t *viewport_region;
|
||||
ClutterRect src_rect;
|
||||
int i, n_rectangles;
|
||||
MetaSurfaceActor *actor;
|
||||
|
||||
/* If the client destroyed the buffer it attached before committing, but
|
||||
* still posted damage, or posted damage without any buffer, don't try to
|
||||
@@ -342,21 +332,23 @@ surface_process_damage (MetaWaylandSurface *surface,
|
||||
|
||||
cairo_region_intersect_rectangle (buffer_region, &buffer_rect);
|
||||
|
||||
/* First update the buffer. */
|
||||
meta_wayland_buffer_process_damage (buffer, buffer_region);
|
||||
meta_wayland_buffer_process_damage (buffer, surface->texture, buffer_region);
|
||||
|
||||
/* Now damage the actor. The actor expects damage in the unscaled texture
|
||||
* coordinate space, i.e. same as the buffer. */
|
||||
/* XXX: Should this be a signal / callback on MetaWaylandBuffer instead? */
|
||||
n_rectangles = cairo_region_num_rectangles (buffer_region);
|
||||
for (i = 0; i < n_rectangles; i++)
|
||||
actor = meta_wayland_surface_get_actor (surface);
|
||||
if (actor)
|
||||
{
|
||||
cairo_rectangle_int_t rect;
|
||||
cairo_region_get_rectangle (buffer_region, i, &rect);
|
||||
int i, n_rectangles;
|
||||
|
||||
meta_surface_actor_process_damage (meta_wayland_surface_get_actor (surface),
|
||||
rect.x, rect.y,
|
||||
rect.width, rect.height);
|
||||
n_rectangles = cairo_region_num_rectangles (buffer_region);
|
||||
for (i = 0; i < n_rectangles; i++)
|
||||
{
|
||||
cairo_rectangle_int_t rect;
|
||||
cairo_region_get_rectangle (buffer_region, i, &rect);
|
||||
|
||||
meta_surface_actor_process_damage (actor,
|
||||
rect.x, rect.y,
|
||||
rect.width, rect.height);
|
||||
}
|
||||
}
|
||||
|
||||
cairo_region_destroy (viewport_region);
|
||||
@@ -690,8 +682,6 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface *surface,
|
||||
|
||||
if (pending->newly_attached)
|
||||
{
|
||||
gboolean switched_buffer;
|
||||
|
||||
if (!surface->buffer_ref.buffer && surface->window)
|
||||
meta_window_queue (surface->window, META_QUEUE_CALC_SHOWING);
|
||||
|
||||
@@ -703,8 +693,7 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface *surface,
|
||||
if (surface->buffer_held)
|
||||
meta_wayland_surface_unref_buffer_use_count (surface);
|
||||
|
||||
switched_buffer = g_set_object (&surface->buffer_ref.buffer,
|
||||
pending->buffer);
|
||||
g_set_object (&surface->buffer_ref.buffer, pending->buffer);
|
||||
|
||||
if (pending->buffer)
|
||||
meta_wayland_surface_ref_buffer_use_count (surface);
|
||||
@@ -712,19 +701,23 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface *surface,
|
||||
if (pending->buffer)
|
||||
{
|
||||
GError *error = NULL;
|
||||
gboolean changed_texture;
|
||||
|
||||
if (!meta_wayland_buffer_attach (pending->buffer, &error))
|
||||
if (!meta_wayland_buffer_attach (pending->buffer,
|
||||
&surface->texture,
|
||||
&changed_texture,
|
||||
&error))
|
||||
{
|
||||
g_warning ("Could not import pending buffer: %s", error->message);
|
||||
wl_resource_post_error (surface->resource, WL_DISPLAY_ERROR_NO_MEMORY,
|
||||
"Failed to create a texture for surface %i: %s",
|
||||
"Failed to attach buffer to surface %i: %s",
|
||||
wl_resource_get_id (surface->resource),
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (switched_buffer && meta_wayland_surface_get_actor (surface))
|
||||
if (changed_texture && meta_wayland_surface_get_actor (surface))
|
||||
{
|
||||
MetaShapedTexture *stex;
|
||||
CoglTexture *texture;
|
||||
@@ -732,7 +725,7 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface *surface,
|
||||
gboolean is_y_inverted;
|
||||
|
||||
stex = meta_surface_actor_get_texture (meta_wayland_surface_get_actor (surface));
|
||||
texture = meta_wayland_buffer_get_texture (pending->buffer);
|
||||
texture = surface->texture;
|
||||
snippet = meta_wayland_buffer_create_snippet (pending->buffer);
|
||||
is_y_inverted = meta_wayland_buffer_is_y_inverted (pending->buffer);
|
||||
|
||||
@@ -774,9 +767,8 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface *surface,
|
||||
surface->viewport.has_dst_size = surface->viewport.dst_width > 0;
|
||||
}
|
||||
|
||||
if (meta_wayland_surface_get_actor (surface) &&
|
||||
(!cairo_region_is_empty (pending->surface_damage) ||
|
||||
!cairo_region_is_empty (pending->buffer_damage)))
|
||||
if (!cairo_region_is_empty (pending->surface_damage) ||
|
||||
!cairo_region_is_empty (pending->buffer_damage))
|
||||
surface_process_damage (surface,
|
||||
pending->surface_damage,
|
||||
pending->buffer_damage);
|
||||
@@ -1327,6 +1319,7 @@ wl_surface_destructor (struct wl_resource *resource)
|
||||
|
||||
if (surface->buffer_held)
|
||||
meta_wayland_surface_unref_buffer_use_count (surface);
|
||||
g_clear_pointer (&surface->texture, cogl_object_unref);
|
||||
g_clear_object (&surface->buffer_ref.buffer);
|
||||
|
||||
g_clear_object (&surface->pending);
|
||||
@@ -1848,6 +1841,12 @@ meta_wayland_surface_is_shortcuts_inhibited (MetaWaylandSurface *surface,
|
||||
return g_hash_table_contains (surface->shortcut_inhibited_seats, seat);
|
||||
}
|
||||
|
||||
CoglTexture *
|
||||
meta_wayland_surface_get_texture (MetaWaylandSurface *surface)
|
||||
{
|
||||
return surface->texture;
|
||||
}
|
||||
|
||||
MetaSurfaceActor *
|
||||
meta_wayland_surface_get_actor (MetaWaylandSurface *surface)
|
||||
{
|
||||
|
||||
@@ -149,6 +149,8 @@ struct _MetaWaylandSurface
|
||||
GHashTable *outputs_to_destroy_notify_id;
|
||||
MetaMonitorTransform buffer_transform;
|
||||
|
||||
CoglTexture *texture;
|
||||
|
||||
/* Buffer reference state. */
|
||||
struct {
|
||||
MetaWaylandBuffer *buffer;
|
||||
@@ -317,6 +319,8 @@ void meta_wayland_surface_restore_shortcuts (MetaWaylandSurface *
|
||||
gboolean meta_wayland_surface_is_shortcuts_inhibited (MetaWaylandSurface *surface,
|
||||
MetaWaylandSeat *seat);
|
||||
|
||||
CoglTexture * meta_wayland_surface_get_texture (MetaWaylandSurface *surface);
|
||||
|
||||
MetaSurfaceActor * meta_wayland_surface_get_actor (MetaWaylandSurface *surface);
|
||||
|
||||
void meta_wayland_surface_notify_geometry_changed (MetaWaylandSurface *surface);
|
||||
|
||||
@@ -67,6 +67,16 @@ meta_xwayland_associate_window_with_surface (MetaWindow *window,
|
||||
{
|
||||
MetaDisplay *display = window->display;
|
||||
|
||||
/* If the window has an existing surface, like if we're
|
||||
* undecorating or decorating the window, then we need
|
||||
* to detach the window from its old surface.
|
||||
*/
|
||||
if (window->surface)
|
||||
{
|
||||
meta_wayland_surface_set_window (window->surface, NULL);
|
||||
window->surface = NULL;
|
||||
}
|
||||
|
||||
if (!meta_wayland_surface_assign_role (surface,
|
||||
META_TYPE_WAYLAND_SURFACE_ROLE_XWAYLAND,
|
||||
NULL))
|
||||
@@ -97,16 +107,6 @@ associate_window_with_surface_id (MetaXWaylandManager *manager,
|
||||
{
|
||||
struct wl_resource *resource;
|
||||
|
||||
/* If the window has an existing surface, like if we're
|
||||
* undecorating or decorating the window, then we need
|
||||
* to detach the window from its old surface.
|
||||
*/
|
||||
if (window->surface)
|
||||
{
|
||||
meta_wayland_surface_set_window (window->surface, NULL);
|
||||
window->surface = NULL;
|
||||
}
|
||||
|
||||
resource = wl_client_get_object (manager->client, surface_id);
|
||||
if (resource)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user