summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2014-12-11 20:12:51 +0100
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2014-12-11 20:12:51 +0100
commit99f0ec76d8cce7d794d4a5940f819910a82783f0 (patch)
treed26bfe3e22970e19f5f7142d8a167cfb69fc06df
parent8f18d89c7d98c5a046b93491ff87b6116a74cd71 (diff)
downloadclutter-wip/mir-keepsurface.tar.gz
mir: keep a reference to the mir surface and update it on size changeswip/mir-keepsurface
-rw-r--r--clutter/mir/clutter-stage-mir.c46
-rw-r--r--clutter/mir/clutter-stage-mir.h1
2 files changed, 32 insertions, 15 deletions
diff --git a/clutter/mir/clutter-stage-mir.c b/clutter/mir/clutter-stage-mir.c
index 33ca5062a..fa899f507 100644
--- a/clutter/mir/clutter-stage-mir.c
+++ b/clutter/mir/clutter-stage-mir.c
@@ -55,7 +55,19 @@ on_stage_resized (CoglOnscreen *onscreen,
int height,
void *user_data)
{
- clutter_actor_set_size (CLUTTER_ACTOR (user_data), width, height);
+ ClutterStageWindow *stage_window = user_data;
+ ClutterStageMir *stage_mir = CLUTTER_STAGE_MIR (stage_window);
+ ClutterActor *actor = _clutter_stage_window_get_wrapper (stage_window);
+ MirSurface *surface = cogl_mir_onscreen_get_surface (onscreen);
+
+ if (stage_mir->surface != surface)
+ {
+ /* Mir surfaces could be recreated on resize, so we need to update our
+ * internal reference. */
+ stage_mir->surface = surface;
+ }
+
+ clutter_actor_set_size (actor, width, height);
}
static gboolean
@@ -77,10 +89,12 @@ clutter_stage_mir_realize (ClutterStageWindow *stage_window)
return FALSE;
}
+ stage_mir->surface = mir_surface;
+
if (!stage_mir->foreign_mir_surface)
{
cogl_onscreen_add_resize_callback (stage_cogl->onscreen, on_stage_resized,
- stage_cogl->wrapper, NULL);
+ stage_window, NULL);
}
if (stage_mir->surface_state == mir_surface_state_fullscreen)
@@ -123,16 +137,14 @@ clutter_stage_mir_set_cursor_visible (ClutterStageWindow *stage_window,
gboolean cursor_visible)
{
ClutterStageMir *stage_mir = CLUTTER_STAGE_MIR (stage_window);
- ClutterActor *actor = _clutter_stage_window_get_wrapper (stage_window);
- MirSurface *surface = clutter_mir_stage_get_mir_surface ((ClutterStage *) actor);
MirCursorConfiguration *cursor_conf;
- if (mir_surface_is_valid (surface))
+ if (mir_surface_is_valid (stage_mir->surface))
{
cursor_conf = mir_cursor_configuration_from_name (cursor_visible ?
mir_default_cursor_name :
mir_disabled_cursor_name);
- mir_surface_configure_cursor (surface, cursor_conf);
+ mir_surface_configure_cursor (stage_mir->surface, cursor_conf);
mir_cursor_configuration_destroy (cursor_conf);
}
@@ -144,10 +156,8 @@ clutter_stage_mir_set_fullscreen (ClutterStageWindow *stage_window,
gboolean fullscreen)
{
ClutterStageMir *stage_mir = CLUTTER_STAGE_MIR (stage_window);
- ClutterActor *actor = _clutter_stage_window_get_wrapper (stage_window);
- MirSurface *surface = clutter_mir_stage_get_mir_surface ((ClutterStage *) actor);
- if (!mir_surface_is_valid (surface))
+ if (!mir_surface_is_valid (stage_mir->surface))
{
stage_mir->surface_state = fullscreen ?
mir_surface_state_fullscreen :
@@ -157,15 +167,15 @@ clutter_stage_mir_set_fullscreen (ClutterStageWindow *stage_window,
{
if (fullscreen)
{
- stage_mir->surface_state = mir_surface_get_state (surface);
+ stage_mir->surface_state = mir_surface_get_state (stage_mir->surface);
if (stage_mir->surface_state != mir_surface_state_fullscreen)
- mir_wait_for (mir_surface_set_state (surface,
+ mir_wait_for (mir_surface_set_state (stage_mir->surface,
mir_surface_state_fullscreen));
}
- else if (mir_surface_get_state (surface) == mir_surface_state_fullscreen)
+ else if (mir_surface_get_state (stage_mir->surface) == mir_surface_state_fullscreen)
{
- mir_wait_for (mir_surface_set_state (surface, stage_mir->surface_state));
+ mir_wait_for (mir_surface_set_state (stage_mir->surface, stage_mir->surface_state));
}
}
}
@@ -235,8 +245,9 @@ clutter_mir_stage_get_mir_surface (ClutterStage *stage)
{
ClutterStageWindow *stage_window = _clutter_stage_get_window (stage);
ClutterStageCogl *stage_cogl;
+ ClutterStageMir *stage_mir;
- if (!CLUTTER_IS_STAGE_COGL (stage_window))
+ if (!CLUTTER_IS_STAGE_MIR (stage_window))
return NULL;
stage_cogl = CLUTTER_STAGE_COGL (stage_window);
@@ -244,7 +255,12 @@ clutter_mir_stage_get_mir_surface (ClutterStage *stage)
if (!cogl_is_onscreen (stage_cogl->onscreen))
return NULL;
- return cogl_mir_onscreen_get_surface (stage_cogl->onscreen);
+ stage_mir = CLUTTER_STAGE_MIR (stage_window);
+
+ if (!mir_surface_is_valid (stage_mir->surface))
+ return NULL;
+
+ return stage_mir->surface;
}
/**
diff --git a/clutter/mir/clutter-stage-mir.h b/clutter/mir/clutter-stage-mir.h
index 187322b65..9c266bdda 100644
--- a/clutter/mir/clutter-stage-mir.h
+++ b/clutter/mir/clutter-stage-mir.h
@@ -47,6 +47,7 @@ struct _ClutterStageMir
{
ClutterStageCogl parent_instance;
+ MirSurface *surface;
MirSurfaceState surface_state;
MirMotionButton button_state;