media: fix replay on stop bug in tycat

even if stop button in media control has been clicked, media is not stopped but is replayed in tycat

Fixes T1560
This commit is contained in:
Wonguk Jeong 2014-09-15 12:01:22 +02:00
parent f8429209bb
commit 6c8af4f82c
3 changed files with 53 additions and 7 deletions

View File

@ -1326,9 +1326,15 @@ media_play_set(Evas_Object *obj, Eina_Bool play)
if ((!sd) || (sd->type != TYPE_MOV)) return;
emotion_object_play_set(sd->o_img, play);
if (play)
edje_object_signal_emit(sd->o_ctrl, "play,set", "terminology");
{
evas_object_smart_callback_call(obj, "play", NULL);
edje_object_signal_emit(sd->o_ctrl, "play,set", "terminology");
}
else
edje_object_signal_emit(sd->o_ctrl, "pause,set", "terminology");
{
evas_object_smart_callback_call(obj, "pause", NULL);
edje_object_signal_emit(sd->o_ctrl, "pause,set", "terminology");
}
}
Eina_Bool
@ -1344,6 +1350,7 @@ media_stop(Evas_Object *obj)
{
Media *sd = evas_object_smart_data_get(obj);
if ((!sd) || (sd->type != TYPE_MOV)) return;
evas_object_smart_callback_call(obj, "stop", NULL);
evas_object_del(obj);
}

View File

@ -1287,6 +1287,36 @@ _smart_media_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *info E
if (blk->obj == obj) blk->obj = NULL;
}
static void
_smart_media_play(void *data, Evas_Object *obj, void *info EINA_UNUSED)
{
Termblock *blk = data;
if (blk->obj != obj) return;
blk->mov_state = MOVIE_STATE_PLAY;
}
static void
_smart_media_pause(void *data, Evas_Object *obj, void *info EINA_UNUSED)
{
Termblock *blk = data;
if (blk->obj != obj) return;
blk->mov_state = MOVIE_STATE_PAUSE;
}
static void
_smart_media_stop(void *data, Evas_Object *obj, void *info EINA_UNUSED)
{
Termblock *blk = data;
if (blk->obj != obj) return;
blk->mov_state = MOVIE_STATE_STOP;
}
static void
_block_edje_signal_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *sig, const char *src)
{
@ -1779,12 +1809,18 @@ _block_media_activate(Evas_Object *obj, Termblock *blk)
else if (blk->scale_fill) media = MEDIA_BG;
else if (blk->thumb) media = MEDIA_THUMB;
// media = MEDIA_POP;
if (!blk->was_active_before) media |= MEDIA_SAVE;
else media |= MEDIA_RECOVER | MEDIA_SAVE;
if (!blk->was_active_before || blk->mov_state == MOVIE_STATE_STOP)
media |= MEDIA_SAVE;
else
media |= MEDIA_RECOVER | MEDIA_SAVE;
blk->obj = media_add(obj, blk->path, sd->config, media, &type);
if (type == TYPE_MOV) media_play_set(blk->obj, !blk->mov_paused);
if (type == TYPE_MOV)
media_play_set(blk->obj, blk->mov_state == MOVIE_STATE_PLAY);
evas_object_event_callback_add
(blk->obj, EVAS_CALLBACK_DEL, _smart_media_del, blk);
evas_object_smart_callback_add(blk->obj, "play", _smart_media_play, blk);
evas_object_smart_callback_add(blk->obj, "pause", _smart_media_pause, blk);
evas_object_smart_callback_add(blk->obj, "stop", _smart_media_stop, blk);
blk->type = type;
evas_object_smart_member_add(blk->obj, obj);
mctrl = media_control_get(blk->obj);
@ -1822,7 +1858,6 @@ _block_obj_del(Termblock *blk)
{
if (!blk->obj) return;
blk->mov_paused = !media_play_get(blk->obj);
evas_object_event_callback_del_full
(blk->obj, EVAS_CALLBACK_DEL,
_smart_media_del, blk);

View File

@ -45,6 +45,10 @@ typedef struct _Termexp Termexp;
// Only for testing purpose
//#define SUPPORT_80_132_COLUMNS 1
#define MOVIE_STATE_PLAY 0
#define MOVIE_STATE_PAUSE 1
#define MOVIE_STATE_STOP 2
struct _Termatt
{
unsigned char fg, bg;
@ -203,7 +207,7 @@ struct _Termblock
unsigned char was_active : 1;
unsigned char was_active_before : 1;
unsigned char mov_paused : 1; // movie paused state marker
unsigned char mov_state : 2; // movie state marker
};
struct _Termexp