diff options
author | Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> | 2014-09-19 10:13:16 +0900 |
---|---|---|
committer | Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp> | 2014-10-28 12:08:52 +0900 |
commit | 84851cbada5b562204c216509b62032809a42195 (patch) | |
tree | 21a2f6da15cb4c58aa405c8dcef0c10b8bfc4b7f | |
parent | 9211925127bb583ddfb5f4f733b41ba0a86b09ac (diff) | |
download | weston-84851cbada5b562204c216509b62032809a42195.tar.gz |
ivi-layout: Add configured signal in ivi_layout_surface
Signed-off-by: Nobuhiko Tanibata <NOBUHIKO_TANIBATA@xddp.denso.co.jp>
-rw-r--r-- | ivi-shell/ivi-layout-private.h | 2 | ||||
-rw-r--r-- | ivi-shell/ivi-layout-transition.c | 21 | ||||
-rw-r--r-- | ivi-shell/ivi-layout-transition.h | 3 | ||||
-rw-r--r-- | ivi-shell/ivi-layout.c | 45 | ||||
-rw-r--r-- | ivi-shell/ivi-layout.h | 6 |
5 files changed, 76 insertions, 1 deletions
diff --git a/ivi-shell/ivi-layout-private.h b/ivi-shell/ivi-layout-private.h index f05f8e95..812a3d49 100644 --- a/ivi-shell/ivi-layout-private.h +++ b/ivi-shell/ivi-layout-private.h @@ -61,6 +61,8 @@ struct ivi_layout_surface { ivi_controller_surface_content_callback callback; void* userdata; } content_observer; + + struct wl_signal configured; }; struct ivi_layout_layer { diff --git a/ivi-shell/ivi-layout-transition.c b/ivi-shell/ivi-layout-transition.c index 1f1e8464..ce369f91 100644 --- a/ivi-shell/ivi-layout-transition.c +++ b/ivi-shell/ivi-layout-transition.c @@ -80,6 +80,21 @@ get_transition_from_type_and_id(enum ivi_layout_inner_transition_type type, void return NULL; } +WL_EXPORT int32_t +is_surface_transition(struct ivi_layout_surface* surface) +{ + struct ivi_layout* layout = get_instance(); + struct transition_node *node=NULL; + wl_list_for_each(node, &layout->transitions->transition_list, link){ + if ( node->transition->type == IVI_LAYOUT_INNER_TRANSITION_VIEW_MOVE_RESIZE || + node->transition->type == IVI_LAYOUT_INNER_TRANSITION_VIEW_RESIZE) + if ( node->transition->id_func(node->transition->private_data, surface)) + return 1; /* true */ + } + + return 0; /* false */ +} + static void tick_transition(struct ivi_layout_transition *transition, uint32_t timestamp) { @@ -246,6 +261,12 @@ struct move_resize_view_data { static void transition_move_resize_view_destroy(struct ivi_layout_transition* transition) { + struct move_resize_view_data* data = + (struct move_resize_view_data*)transition->private_data; + struct ivi_layout_surface* layout_surface = data->surface; + + wl_signal_emit(&layout_surface->configured, layout_surface); + if(transition->private_data){ free(transition->private_data); transition->private_data = NULL; diff --git a/ivi-shell/ivi-layout-transition.h b/ivi-shell/ivi-layout-transition.h index e8e55090..2c556ede 100644 --- a/ivi-shell/ivi-layout-transition.h +++ b/ivi-shell/ivi-layout-transition.h @@ -74,4 +74,7 @@ ivi_layout_transition_layer_render_order(struct ivi_layout_layer* layer, uint32_t surface_num, uint32_t duration); +WL_EXPORT int32_t +is_surface_transition(struct ivi_layout_surface* surface); + #endif diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c index 5ed55131..f7789635 100644 --- a/ivi-shell/ivi-layout.c +++ b/ivi-shell/ivi-layout.c @@ -838,14 +838,32 @@ commit_list_surface(struct ivi_layout *layout) ivi_layout_transition_visibility_off(ivisurf, ivisurf->pending.prop.transitionDuration); } + int32_t configured = 0; + if (ivisurf->prop.destWidth != ivisurf->pending.prop.destWidth || + ivisurf->prop.destHeight != ivisurf->pending.prop.destHeight) { + configured = 1; + } + ivisurf->prop = ivisurf->pending.prop; ivisurf->prop.transitionType = IVI_LAYOUT_TRANSITION_NONE; ivisurf->pending.prop.transitionType = IVI_LAYOUT_TRANSITION_NONE; + + if (configured && !is_surface_transition(ivisurf)) + wl_signal_emit(&ivisurf->configured, ivisurf); } else{ + int32_t configured = 0; + if (ivisurf->prop.destWidth != ivisurf->pending.prop.destWidth || + ivisurf->prop.destHeight != ivisurf->pending.prop.destHeight) { + configured = 1; + } + ivisurf->prop = ivisurf->pending.prop; ivisurf->prop.transitionType = IVI_LAYOUT_TRANSITION_NONE; ivisurf->pending.prop.transitionType = IVI_LAYOUT_TRANSITION_NONE; + + if (configured && !is_surface_transition(ivisurf)) + wl_signal_emit(&ivisurf->configured, ivisurf); } } } @@ -3079,6 +3097,7 @@ ivi_layout_surfaceCreate(struct weston_surface *wl_surface, wl_list_init(&ivisurf->link); wl_signal_init(&ivisurf->property_changed); + wl_signal_init(&ivisurf->configured); wl_list_init(&ivisurf->list_layer); ivisurf->id_surface = id_surface; ivisurf->layout = layout; @@ -3170,11 +3189,35 @@ ivi_layout_initWithCompositor(struct weston_compositor *ec) } +static void +ivi_layout_surfaceAddConfiguredListener(struct ivi_layout_surface* ivisurf, + struct wl_listener* listener) +{ + wl_signal_add(&ivisurf->configured, listener); +} + +static void +ivi_layout_surfaceRemoveConfiguredListener(struct ivi_layout_surface* ivisurf, + struct wl_listener* target) +{ + struct wl_listener *listener = NULL; + struct wl_listener *next = NULL; + + wl_list_for_each_safe(listener, next, &ivisurf->configured.listener_list, link) { + if (target == listener) { + wl_list_remove(&listener->link); + } + } +} + WL_EXPORT struct ivi_layout_interface ivi_layout_interface = { .get_weston_view = ivi_layout_get_weston_view, .surfaceConfigure = ivi_layout_surfaceConfigure, .surfaceSetNativeContent = ivi_layout_surfaceSetNativeContent, .surfaceCreate = ivi_layout_surfaceCreate, .initWithCompositor = ivi_layout_initWithCompositor, - .emitWarningSignal = ivi_layout_emitWarningSignal + .emitWarningSignal = ivi_layout_emitWarningSignal, + .get_surface_dimension = ivi_layout_surfaceGetDimension, + .add_surface_configured_listener = ivi_layout_surfaceAddConfiguredListener, + .remove_surface_configured_listener = ivi_layout_surfaceRemoveConfiguredListener }; diff --git a/ivi-shell/ivi-layout.h b/ivi-shell/ivi-layout.h index 8cca33ca..4622a46f 100644 --- a/ivi-shell/ivi-layout.h +++ b/ivi-shell/ivi-layout.h @@ -135,6 +135,12 @@ struct ivi_layout_interface { void (*initWithCompositor)(struct weston_compositor *ec); void (*emitWarningSignal)(uint32_t id_surface, enum ivi_layout_warning_flag flag); + int32_t (*get_surface_dimension)(struct ivi_layout_surface *ivisurf, + int32_t *pDimension); + void (*add_surface_configured_listener)(struct ivi_layout_surface *ivisurf, + struct wl_listener* listener); + void (*remove_surface_configured_listener)(struct ivi_layout_surface *ivisurf, + struct wl_listener* listener); }; WL_EXPORT struct ivi_layout_interface ivi_layout_interface; |