From 4f746c9c85e39015f8cfe8882e7aad944fe8e02f Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Wed, 12 Aug 2015 15:59:42 -0400 Subject: [PATCH] express: Add support for popup media in a channel Signed-off-by: Chris Michael --- src/bin/channel.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/src/bin/channel.c b/src/bin/channel.c index 6668aa8..7be2383 100644 --- a/src/bin/channel.c +++ b/src/bin/channel.c @@ -6,6 +6,8 @@ #include "grid.h" #include "utils.h" #include "commands.h" +#include "dbus.h" +#include "media.h" struct _Channel { @@ -23,6 +25,7 @@ struct _Channel Evas_Object *o_tabregion_base; Evas_Object *o_img; Evas_Object *o_entry; + Evas_Object *o_popmedia; struct { @@ -59,16 +62,125 @@ struct _Channel int min_w, min_h; int req_w, req_h; + Eina_List *popmedia_queue; + Eina_Bool active : 1; Eina_Bool size_done : 1; Eina_Bool translucent : 1; Eina_Bool focused : 1; Eina_Bool unswallowed : 1; Eina_Bool missed : 1; + Eina_Bool popmedia_deleted : 1; Express_Network *net; }; +static void _channel_popmedia(Channel *chl, const char *src); + +static void +_cb_popmedia_loop(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + Channel *chl; + + chl = data; + if (chl->popmedia_queue) + { + if (chl->o_popmedia) _media_play_set(chl->o_popmedia, EINA_FALSE); + edje_object_signal_emit(chl->o_bg, "popmedia,off", PACKAGE_NAME); + } +} + +static void +_cb_popmedia_del(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + Channel *chl; + + chl = data; + chl->o_popmedia = NULL; + chl->popmedia_deleted = EINA_TRUE; + edje_object_signal_emit(chl->o_bg, "popmedia,off", PACKAGE_NAME); +} + +static void +_channel_popmedia_queue_process(Channel *chl) +{ + const char *src; + + if (!chl->popmedia_queue) return; + src = chl->popmedia_queue->data; + chl->popmedia_queue = + eina_list_remove_list(chl->popmedia_queue, chl->popmedia_queue); + if (!src) return; + _channel_popmedia(chl, src); + eina_stringshare_del(src); +} + +static void +_cb_popmedia_done(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *src EINA_UNUSED) +{ + Channel *chl; + + chl = data; + if ((chl->o_popmedia) || (chl->popmedia_deleted)) + { + if (chl->o_popmedia) + { + evas_object_event_callback_del(chl->o_popmedia, EVAS_CALLBACK_DEL, + _cb_popmedia_del); + evas_object_del(chl->o_popmedia); + chl->o_popmedia = NULL; + } + chl->popmedia_deleted = EINA_FALSE; + _channel_popmedia_queue_process(chl); + } +} + +static void +_channel_popmedia_show(Channel *chl, const char *src, Media_Type type) +{ + _dbus_link_hide(); + + if (chl->o_popmedia) + { + const char *s; + + EINA_LIST_FREE(chl->popmedia_queue, s) + eina_stringshare_del(s); + + chl->popmedia_queue = + eina_list_append(chl->popmedia_queue, eina_stringshare_add(src)); + + edje_object_signal_emit(chl->o_bg, "popmedia,off", PACKAGE_NAME); + + return; + } + + chl->o_popmedia = _media_add(chl->o_win, src, MEDIA_POP, type); + chl->popmedia_deleted = EINA_FALSE; + evas_object_smart_callback_add(chl->o_popmedia, "loop", + _cb_popmedia_loop, chl); + evas_object_event_callback_add(chl->o_popmedia, EVAS_CALLBACK_DEL, + _cb_popmedia_del, chl); + edje_object_part_swallow(chl->o_bg, "express.popmedia", chl->o_popmedia); + evas_object_show(chl->o_popmedia); + + edje_object_signal_emit(chl->o_bg, "popmedia,on", PACKAGE_NAME); +} + +static void +_channel_popmedia(Channel *chl, const char *src) +{ + Media_Type type; + + type = _media_src_type_get(src); + if (type == MEDIA_TYPE_UNKNOWN) + { + + } + else + _channel_popmedia_show(chl, src, type); +} + static void _cb_theme_reload(Channel *chl) { @@ -138,6 +250,19 @@ _cb_next(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) } } +static void +_cb_popup(void *data, Evas_Object *obj EINA_UNUSED, void *event) +{ + Channel *chl; + const char *src; + + chl = data; + src = event; + if (!src) src = _grid_link_get(chl->o_grid); + if (!src) return; + _channel_popmedia(chl, src); +} + static void _cb_count_go(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *source EINA_UNUSED) { @@ -646,6 +771,7 @@ _channel_create(Evas *evas, Evas_Object *win, const char *name, const char *serv evas_object_smart_callback_add(chl->o_grid, "options", _cb_options, chl); evas_object_smart_callback_add(chl->o_grid, "prev", _cb_prev, chl); evas_object_smart_callback_add(chl->o_grid, "next", _cb_next, chl); + evas_object_smart_callback_add(chl->o_grid, "popup", _cb_popup, chl); /* swallow parts */ edje_object_part_swallow(chl->o_base, "channel.content", chl->o_grid); @@ -658,6 +784,8 @@ _channel_create(Evas *evas, Evas_Object *win, const char *name, const char *serv _cb_count_prev, chl); edje_object_signal_callback_add(chl->o_bg, "chlcount,next", PACKAGE_NAME, _cb_count_next, chl); + edje_object_signal_callback_add(chl->o_bg, "popmedia,done", PACKAGE_NAME, + _cb_popmedia_done, chl); /* add handlers for userlist signals */ edje_object_signal_callback_add(chl->o_bg, "userlist,go", PACKAGE_NAME, @@ -688,6 +816,7 @@ _channel_destroy(Channel *chl) if (chl->userlist.o_frame) evas_object_del(chl->userlist.o_frame); /* delete channel objects */ + if (chl->o_popmedia) evas_object_del(chl->o_popmedia); if (chl->o_img) evas_object_del(chl->o_img); if (chl->o_spacer) evas_object_del(chl->o_spacer); if (chl->o_entry) evas_object_del(chl->o_entry);