On Sat, 9 Feb 2013 17:26:04 +0530 Arvind R <[email protected]> said:
cedric - comments?
> Hi,
> I needed to "swallow" an elm_player in my clip preparation program. In
> the process, I completed the mouse support for the player widget.
> 1. Modified in player.edc:
> incorporated a volume attenuator using a diskelector.
> added a check-box for mute
> added a label widget 'billboard' to display length-time_remaing info
> 2. Modified in elm_widget_player.h:
> instance data
> 3. Modified in elc_player.c:
> The stop button now opens a fileselector. Cancel continues with
> the current media and a selection switches media.
> Enabled label for slider to numerically indicate play position
> Placed to the right of forward button - a 'billboard', volume
> attenuator, mute checkbox.
> Tested (r83733) the player widget to be complete w.r.t. to mouse
> control - load a new file, seek forward/backward, rewind, lower
> volume, mute and a blinking billboard.
> Not touched is the keyboard interface - which seems to be duplicated
> in the video widget. The "space" button used to play/pause media gets
> confused with the selection of currently focused widget.
> Problem not resolved (no clue) is that when the player is left in play
> mode and I switch to the VT, play stops after some seconds with
> gstreamer/xine engines. E17 vanishes off 'top'. Resuming X causes a
> rush of frames before stablising.
> Patch, applicable after the '3 small corrections' set posted to r83733
> follows.
>
> Arvind
> ---
> diff -uprN a/data/themes/widgets/player.edc b/data/themes/widgets/player.edc
> --- a/data/themes/widgets/player.edc 2012-07-25 16:41:51.000000000
> +0530 +++ b/data/themes/widgets/player.edc 2013-02-06
> 12:24:53.000000000 +0530 @@ -4,12 +4,26 @@ group {
> min: 20 10;
>
> parts {
> + part { name: "media_player/background"; type: RECT;
> + description { state: "default" 0.0;
> + color: 240 255 240 64;
> + rel1 {
> + relative: 0.0 0.0;
> + offset: 2 2;
> + }
> + rel2 {
> + relative: 1.0 1.0;
> + offset: -2 -2;
> + }
> + }
> + }
> part { name: "media_player/slider"; type: SWALLOW;
> description { state: "default" 0.0;
> fixed: 0 1;
> + rel1.relative: 0.1 0.0;
> rel1.offset: 2 2;
> - rel2.offset: 2 -3;
> - rel2.relative: 1.0 0.0;
> + rel2.offset: -2 -3;
> + rel2.relative: 0.90 0.0;
> align: 0.5 0.0;
> }
> }
> @@ -19,13 +33,13 @@ group {
> min: BSZ BSZ;
> align: 0.0 1.0;
> rel1 {
> - to_y: "media_player/slider";
> - offset: 2 2;
> + to: "media_player/slider";
> + offset: -20 -4;
> relative: 0.0 1.0;
> }
> rel2 {
> relative: 0.0 1.0;
> - offset: 2 -3;
> + offset: 42 -3;
> }
> }
> }
> @@ -125,13 +139,61 @@ group {
> }
> part { name: "media_player/forward"; type: SWALLOW;
> description { state: "default" 0.0;
> + fixed: 1 1;
> min: BSZ BSZ;
> align: 0.0 1.0;
> rel1 { to: "media_player/next";
> offset: 2 0;
> relative: 1.0 0.0;
> }
> - rel2.offset: -3 -3;
> + rel2 { to: "media_player/next";
> + offset: 2 -1;
> + relative: 1.0 1.0;
> + }
> + }
> + }
> + part { name: "media_player/billboard"; type: SWALLOW;
> + description { state: "default" 0.0;
> + fixed: 1 1;
> + rel1 {
> + to_x: "media_player/volume";
> + offset: -140 0;
> + relative: 0.0 0.5;
> + }
> + rel2 { to_x: "media_player/volume";
> + offset: -40 -3;
> + relative: 0.0 1.0;
> + }
> + }
> + }
> + part { name: "media_player/volume"; type: SWALLOW;
> + description { state: "default" 0.0;
> + fixed: 0 1;
> + rel1 {
> + to_y: "media_player/slider";
> + offset: 10 -3;
> + relative: 0.60 1.0;
> + }
> + rel2 {
> + to_x: "media_player/mute";
> + offset: -15 -3;
> + relative: 0.0 1.0;
> + }
> + align: 0.5 0.0;
> + }
> + }
> + part { name: "media_player/mute"; type: SWALLOW;
> + description { state: "default" 0.0;
> + fixed: 1 1;
> + align: 0.5 0.0;
> + rel1 { to_y: "media_player/slider";
> + offset: -65 -3;
> + relative: 0.95 1.0;
> + }
> + rel2 {
> + offset: -25 -3;
> + relative: 0.95 1.0;
> + }
> }
> }
> }
> @@ -142,6 +204,11 @@ group {
> after: "pause/0";
> }
> program {
> + signal: "elm,player,stop";
> + source: "elm";
> + after: "play/0";
> + }
> + program {
> signal: "elm,player,play";
> source: "elm";
> after: "play/0";
> diff -uprN a/src/lib/elc_player.c b/src/lib/elc_player.c
> --- a/src/lib/elc_player.c 2013-02-06 23:22:03.000000000 +0530
> +++ b/src/lib/elc_player.c 2013-02-06 22:48:22.000000000 +0530
> @@ -34,6 +34,15 @@ static const Evas_Smart_Cb_Description _
> };
>
> #ifdef HAVE_EMOTION
> +static void _stop(void *, Evas_Object *, void *);
> +static void _pause(void *, Evas_Object *, void *);
> +static void _play(void *, Evas_Object *, void *);
> +static void _forward(void *, Evas_Object *, void *);
> +static void _prev(void *, Evas_Object *, void *);
> +static void _rewind(void *, Evas_Object *, void *);
> +static void _next(void *, Evas_Object *, void *);
> +static void _mute_audio(void *, Evas_Object *, void *);
> +
> static void
> _elm_player_smart_event(Eo *obj, void *_pd, va_list *list)
> {
> @@ -47,60 +56,72 @@ _elm_player_smart_event(Eo *obj, void *_
> Evas_Event_Key_Down *ev = event_info;
>
> Elm_Player_Smart_Data *sd = _pd;
> + Elm_Object_Item *itm;
>
> if (elm_widget_disabled_get(obj)) return;
> if (type != EVAS_CALLBACK_KEY_DOWN) return;
> if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
> if (!sd->video) return;
>
> + if ((!strcmp(ev->keyname, "Up")) ||
> + ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
> + {
> + itm = elm_diskselector_selected_item_get(sd->volume);
> + itm = elm_diskselector_item_prev_get(itm);
> + if (itm)
> + elm_diskselector_item_selected_set(itm, EINA_TRUE);
> + } else
> + if ((!strcmp(ev->keyname, "Down")) ||
> + ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
> + {
> + itm = elm_diskselector_selected_item_get(sd->volume);
> + itm = elm_diskselector_item_next_get(itm);
> + if (itm)
> + elm_diskselector_item_selected_set(itm, EINA_TRUE);
> + } else
> if ((!strcmp(ev->keyname, "Left")) ||
> ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
> {
> - double current, last;
> -
> - current = elm_video_play_position_get(sd->video);
> - last = elm_video_play_length_get(sd->video);
> -
> - if (current < last)
> - {
> - current -= last / 100;
> - elm_video_play_position_set(sd->video, current);
> - }
> -
> - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> - if (ret) *ret = EINA_TRUE;
> - return;
> - }
> + _prev(obj, NULL, NULL);
> + } else
> if ((!strcmp(ev->keyname, "Right")) ||
> ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
> {
> - double current, last;
> -
> - current = elm_video_play_position_get(sd->video);
> - last = elm_video_play_length_get(sd->video);
> -
> - if (current > 0)
> - {
> - current += last / 100;
> - if (current < 0) current = 0;
> - elm_video_play_position_set(sd->video, current);
> - }
> -
> - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> - if (ret) *ret = EINA_TRUE;
> - return;
> - }
> - if (!strcmp(ev->keyname, "space"))
> + _forward(obj, NULL, NULL);
> + } else
> + if (!strcmp(ev->keyname, "p")) /* somebody is processing "space" */
> {
> if (elm_video_is_playing_get(sd->video))
> - elm_video_pause(sd->video);
> + _pause(obj, NULL, NULL);
> else
> - elm_video_play(sd->video);
> - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> - if (ret) *ret = EINA_TRUE;
> - return;
> + _play(obj, NULL, NULL);
> + } else
> + if (!strcmp(ev->keyname, "m"))
> + {
> + elm_check_state_set(sd->mute,
> + !elm_check_state_get(sd->mute));
> + _mute_audio(obj, NULL, NULL);
> + } else
> + if (!strcmp(ev->keyname, "s") || /* for Stop */
> + !strcmp(ev->keyname, "f") || /* for File */
> + !strcmp(ev->keyname, "n")) /* for Next */
> + {
> + _stop(obj, NULL, NULL);
> + } else
> + if (!strcmp(ev->keyname, "bracketleft"))
> + {
> + _rewind(obj, NULL, NULL);
> + } else
> + if (!strcmp(ev->keyname, "bracketright"))
> + {
> + _next(obj, NULL, NULL);
> + } else {
> + fprintf(stderr, "keyname: '%s' not handled\n", ev->keyname);
> + return;
> }
> - fprintf(stderr, "keyname: '%s' not handle\n", ev->keyname);
> + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> + if (ret) *ret = EINA_TRUE;
> + fprintf(stderr, "keyname: '%s' handled\n", ev->keyname);
> }
>
>
> @@ -153,6 +174,53 @@ _elm_player_smart_sizing_eval(Eo *obj, v
> }
>
> static void
> +_update_volume(void *data,
> + Evas_Object *disksel __UNUSED__,
> + void *event_info)
> +{
> + Elm_Object_Item *item = event_info;
> + const char *key;
> + const double *pval;
> +
> + ELM_PLAYER_DATA_GET(data, sd);
> +
> + key = elm_object_item_part_text_get(item, NULL);
> + pval = eina_hash_find(sd->volume_vals, key);
> + elm_video_audio_level_set (sd->video, *pval);
> +}
> +
> +static void
> +_mute_audio(void *data,
> + Evas_Object *obj __UNUSED__,
> + void *event_info __UNUSED__)
> +{
> + ELM_PLAYER_DATA_GET(data, sd);
> + elm_video_audio_mute_set
> + (sd->video, elm_check_state_get(sd->mute));
> +}
> +
> +static char * _double_to_time(double);
> +
> +static void
> +_show_billboard(void *data,
> + Evas_Object *obj __UNUSED__,
> + void *event_info __UNUSED__)
> +{
> + char *msg;
> +
> + ELM_PLAYER_DATA_GET(data, sd);
> +
> + strcpy(sd->msg, _double_to_time(sd->length));
> + msg = strrchr(sd->msg, '.');
> + *msg = 0;
> + if (sd->frames == 30) {
> + strcat(msg, " ");
> + strcat(msg, _double_to_time(sd->length - sd->pos));
> + }
> + elm_object_text_set(sd->billboard, sd->msg);
> +}
> +
> +static void
> _update_slider(void *data,
> Evas_Object *obj __UNUSED__,
> void *event_info __UNUSED__)
> @@ -163,12 +231,38 @@ _update_slider(void *data,
> ELM_PLAYER_DATA_GET(data, sd);
>
> seekable = elm_video_is_seekable_get(sd->video);
> + if (seekable == sd->disabled)
> + elm_object_disabled_set(sd->slider, !seekable);
> +
> length = elm_video_play_length_get(sd->video);
> - pos = elm_video_play_position_get(sd->video);
>
> - elm_object_disabled_set(sd->slider, !seekable);
> - elm_slider_min_max_set(sd->slider, 0, length);
> - elm_slider_value_set(sd->slider, pos);
> + if (sd->length != length) {
> + sd->length = length;
> + elm_slider_min_max_set(sd->slider, 0, length);
> + }
> +
> + if (sd->frames < 0) {
> + pos = elm_video_play_position_get(sd->video);
> + if (fabs(sd->pos - pos) >= 0.1) {
> + sd->pos = pos;
> + sd->frames = 30;
> + elm_slider_value_set(sd->slider, pos);
> + }
> + }
> +
> + if(sd->frames == 10 || sd->frames == 30)
> + _show_billboard(data, NULL, NULL);
> +}
> +
> +static void
> +_frame_decoded_cb(void *data,
> + Evas_Object *obj __UNUSED__,
> + void *event_info __UNUSED__)
> +{
> + ELM_PLAYER_DATA_GET(data, sd);
> + /* do not update slider on every frame */
> + if (--sd->frames < 0)
> + _update_slider(data, obj, event_info);
> }
>
> static void
> @@ -176,9 +270,24 @@ _update_position(void *data,
> Evas_Object *obj __UNUSED__,
> void *event_info __UNUSED__)
> {
> + /*
> + * called wnenever the value of the slider is changed.
> + * - irespective of user drags
> + * or
> + * internal increments larger than the slider resolution.
> + * the 2nd case causes an inadvertent repositioning of stream
> + * which some engines respond to (xine).
> + * This is a feedback loop that needs to be broken.
> + */
> + double pos;
> +
> ELM_PLAYER_DATA_GET(data, sd);
>
> - elm_video_play_position_set(sd->video, elm_slider_value_get(sd->slider));
> + pos = elm_slider_value_get(sd->slider);
> + if (fabs(sd->pos - pos) >= 0.1) {
> + elm_video_play_position_set(sd->video, pos);
> + sd->pos = pos;
> + }
> }
>
> static void
> @@ -240,6 +349,8 @@ _pause(void *data,
>
> elm_layout_signal_emit(data, "elm,button,pause", "elm");
> evas_object_smart_callback_call(data, SIG_PAUSE_CLICKED, NULL);
> + sd->frames = 30;
> + _show_billboard(data, NULL, NULL);
> }
>
> static void
> @@ -285,12 +396,86 @@ _rewind(void *data,
> }
>
> static void
> +_file_chosen(void *data,
> + Evas_Object *obj __UNUSED__,
> + void *event_info)
> +{
> + const char *file = (const char *) event_info;
> + Evas_Object *del;
> +
> + ELM_PLAYER_DATA_GET(data, sd);
> +
> + if (file) {
> + eina_stringshare_replace(&sd->path, file);
> + elm_video_file_set(sd->video, file);
> + elm_video_play_position_set(sd->video, 0);
> + }
> + elm_video_play(sd->video);
> +
> + if (sd->inwin) {
> + evas_object_hide(sd->filesel_win);
> + evas_object_lower(sd->filesel_win);
> + }
> + else {
> + del = sd->filesel_win;
> + sd->filesel_win = NULL;
> + sd->filesel = NULL;
> + evas_object_del(del);
> + }
> +}
> +
> +static void
> +_new_fileselector(Evas_Object *obj)
> +{
> + ELM_PLAYER_DATA_GET(obj, sd);
> +
> + sd->filesel = elm_fileselector_add(sd->filesel_win);
> + elm_fileselector_is_save_set(sd->filesel, EINA_FALSE);
> + elm_fileselector_mode_set(sd->filesel, ELM_FILESELECTOR_LIST); /*
> GRID is unprintable */
> + elm_fileselector_buttons_ok_cancel_set(sd->filesel, EINA_TRUE);
> + elm_fileselector_path_set(sd->filesel, eina_stringshare_add(sd->path));
> + evas_object_size_hint_weight_set(sd->filesel, EVAS_HINT_EXPAND,
> EVAS_HINT_EXPAND);
> + evas_object_size_hint_align_set(sd->filesel, EVAS_HINT_FILL,
> EVAS_HINT_FILL);
> + evas_object_smart_callback_add(sd->filesel, "done", _file_chosen, obj);
> +}
> +
> +static void
> +_new_win(Evas_Object *obj)
> +{
> + Evas_Object *bg;
> +
> + ELM_PLAYER_DATA_GET(obj, sd);
> + sd->filesel_win = elm_win_add(NULL, "player_fileselector",
> ELM_WIN_DIALOG_BASIC);
> + elm_win_title_set(sd->filesel_win, "Clip Selection");
> + elm_win_autodel_set(sd->filesel_win, EINA_TRUE);
> + evas_object_smart_callback_add(sd->filesel_win, "delete,request",
> _file_chosen, obj);
> +
> + bg = elm_bg_add(sd->filesel_win);
> + elm_win_resize_object_add(sd->filesel_win, bg);
> + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
> + evas_object_show(bg);
> +
> + evas_object_resize(sd->filesel_win, 400, 400);
> + _new_fileselector(obj);
> +}
> +
> +static void
> _stop(void *data,
> Evas_Object *obj __UNUSED__,
> void *event_info __UNUSED__)
> {
> + ELM_PLAYER_DATA_GET(data, sd);
> +
> elm_layout_signal_emit(data, "elm,button,stop", "elm");
> evas_object_smart_callback_call(data, SIG_STOP_CLICKED, NULL);
> +
> + if (sd->inwin)
> + elm_win_inwin_activate(sd->filesel_win);
> + else {
> + _new_win(data);
> + elm_win_resize_object_add(sd->filesel_win, sd->filesel);
> + }
> + elm_object_text_set(sd->billboard, "Play Stopped");
> }
>
> static void
> @@ -307,11 +492,15 @@ _play_finished(void *data,
> void *event_info __UNUSED__)
> {
> elm_layout_signal_emit(data, "elm,player,pause", "elm");
> + ELM_PLAYER_DATA_GET(data, sd);
> + elm_object_text_set(sd->billboard, "Play Finished");
> }
>
> static void
> _on_video_del(Elm_Player_Smart_Data *sd)
> {
> + elm_object_disabled_set(sd->mute, EINA_TRUE);
> + elm_object_disabled_set(sd->volume, EINA_TRUE);
> elm_object_disabled_set(sd->slider, EINA_TRUE);
> elm_object_disabled_set(sd->forward, EINA_TRUE);
> elm_object_disabled_set(sd->info, EINA_TRUE);
> @@ -367,22 +556,23 @@ static char *
> _double_to_time(double value)
> {
> char buf[256];
> - int ph, pm, ps, pf;
> + unsigned ph, pm, ps;
> + signed pf;
>
> - ph = value / 3600;
> - pm = value / 60 - (ph * 60);
> - ps = value - (pm * 60);
> - pf = value * 100 - (ps * 100) - (pm * 60 * 100) - (ph * 60 * 60 * 100);
> + ps = value;
> + ph = ps / 3600;
> + ps = ps - (ph * 3600);
> + pm = ps / 60;
> + ps = ps - (pm * 60);
> + pf = (value * 10) - (10 * ((ph * 3600) + (pm * 60) + ps));
> + if (pf < 0 )
> + pf = 0;
> + else
> + if (pf >= 10) /* over/under flows do occur */
> + pf = 9;
>
> - if (ph)
> - snprintf(buf, sizeof(buf), "%i:%02i:%02i.%02i",
> + snprintf(buf, sizeof(buf), "%u:%02u:%02u.%i",
> ph, pm, ps, pf);
> - else if (pm)
> - snprintf(buf, sizeof(buf), "%02i:%02i.%02i",
> - pm, ps, pf);
> - else
> - snprintf(buf, sizeof(buf), "%02i.%02i",
> - ps, pf);
>
> return (char *)eina_stringshare_add(buf);
> }
> @@ -393,6 +583,28 @@ _str_free(char *data)
> eina_stringshare_del(data);
> }
>
> +static void
> +_new_fileselector_inwin(Elm_Player_Smart_Data *pd, Eo *obj)
> +{
> + Evas_Object *parent;
> +
> + parent = pd->video;
> + while((parent) && (strcmp(elm_widget_type_get(parent), "elm_win")))
> + parent = elm_object_parent_widget_get(parent);
> + if (parent) {
> + pd->inwin = EINA_TRUE;
> + pd->filesel_win = elm_win_inwin_add(parent);
> + evas_object_hide(pd->filesel_win);
> + evas_object_lower(pd->filesel_win);
> + _new_fileselector(obj);
> + elm_win_inwin_content_set(pd->filesel_win, pd->filesel);
> + }
> + else {
> + pd->inwin = EINA_FALSE;
> + pd->filesel_win = NULL;
> + }
> +}
> +
> /* a video object is never parented by a player one, just tracked.
> * treating this special case here and delegating other objects to own
> * layout */
> @@ -427,6 +639,7 @@ _elm_player_smart_content_set(Eo *obj, v
>
> if (!content) goto end;
>
> + _new_fileselector_inwin(sd, obj);
> elm_object_disabled_set(sd->slider, EINA_FALSE);
> elm_object_disabled_set(sd->forward, EINA_FALSE);
> elm_object_disabled_set(sd->info, EINA_FALSE);
> @@ -436,6 +649,7 @@ _elm_player_smart_content_set(Eo *obj, v
> elm_object_disabled_set(sd->prev, EINA_FALSE);
> elm_object_disabled_set(sd->rewind, EINA_FALSE);
> elm_object_disabled_set(sd->next, EINA_FALSE);
> + elm_object_disabled_set(sd->stop, EINA_FALSE);
>
> sd->emotion = elm_video_emotion_get(sd->video);
> emotion_object_priority_set(sd->emotion, EINA_TRUE);
> @@ -455,7 +669,7 @@ _elm_player_smart_content_set(Eo *obj, v
> else elm_layout_signal_emit(obj, "elm,player,pause", "elm");
>
> evas_object_smart_callback_add(sd->emotion, "frame_decode",
> - _update_slider, obj);
> + _frame_decoded_cb, obj);
> evas_object_smart_callback_add(sd->emotion, "frame_resize",
> _update_slider, obj);
> evas_object_smart_callback_add(sd->emotion, "length_change",
> @@ -475,6 +689,13 @@ end:
> static void
> _elm_player_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
> {
> +#define ATTENUATOR_SIZE 6
> + static const char *att_keys[ATTENUATOR_SIZE] =
> + {"0dB", "-1.5dB", "-3dB", "-6dB", "-12dB", "-20dB"};
> + static const double att_vals[ATTENUATOR_SIZE] =
> + {1.0, 0.840896, 0.707107, 0.5, 0.353553, 0.1};
> + int i;
> +
> eo_do_super(obj, evas_obj_smart_add());
>
> Elm_Player_Smart_Data *priv = _pd;
> @@ -490,12 +711,18 @@ _elm_player_smart_add(Eo *obj, void *_pd
> priv->rewind = _player_button_add(obj, "media_player/rewind", _rewind);
> priv->stop = _player_button_add(obj, "media_player/stop", _stop);
>
> + priv->disabled = EINA_TRUE;
> + priv->length = 0.0;
> + priv->frames = 0;
> + priv->pos = 0.0;
> +
> priv->slider = elm_slider_add(obj);
> elm_slider_indicator_format_function_set
> (priv->slider, _double_to_time, _str_free);
> elm_slider_units_format_function_set
> (priv->slider, _double_to_time, _str_free);
> - elm_slider_min_max_set(priv->slider, 0, 0);
> + elm_slider_unit_format_set(priv->slider, "%s");
> + elm_slider_min_max_set(priv->slider, 0, 1);
> elm_slider_value_set(priv->slider, 0);
> elm_object_disabled_set(priv->slider, EINA_TRUE);
> evas_object_size_hint_align_set(priv->slider, EVAS_HINT_FILL, 0.5);
> @@ -506,6 +733,38 @@ _elm_player_smart_add(Eo *obj, void *_pd
> evas_object_smart_callback_add
> (priv->slider, "changed", _update_position, obj);
>
> + priv->volume = elm_diskselector_add(obj);
> + elm_diskselector_round_enabled_set(priv->volume, EINA_FALSE);
> + elm_diskselector_side_text_max_length_set(priv->volume, 5);
> + elm_object_disabled_set(priv->volume, EINA_FALSE);
> + evas_object_size_hint_align_set(priv->volume, EVAS_HINT_FILL, 0.5);
> + evas_object_size_hint_weight_set
> + (priv->volume, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
> + priv->volume_vals = eina_hash_string_small_new(NULL);
> + for (i = 0; i < ATTENUATOR_SIZE; i++) {
> + eina_hash_direct_add(priv->volume_vals, att_keys[i], &att_vals
> [i]);
> + elm_diskselector_item_append(priv->volume, att_keys[i], NULL,
> _update_volume, obj);
> + }
> + elm_layout_content_set(obj, "media_player/volume", priv->volume);
> +
> + priv->mute = elm_check_add(obj);
> + elm_object_text_set(priv->mute, "Mute");
> + elm_check_state_set(priv->mute, EINA_FALSE);
> + elm_layout_content_set(obj, "media_player/mute", priv->mute);
> + evas_object_smart_callback_add
> + (priv->mute, "changed", _mute_audio, obj);
> +
> + priv->billboard = elm_label_add(obj);
> + elm_label_line_wrap_set(priv->billboard, ELM_WRAP_NONE);
> + evas_object_size_hint_align_set(priv->billboard, EVAS_HINT_FILL,
> EVAS_HINT_FILL);
> + evas_object_size_hint_weight_set(priv->billboard,
> EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
> + elm_object_text_set(priv->billboard, "No Media");
> + elm_layout_content_set(obj, "media_player/billboard", priv->billboard);
> +
> + priv->path = eina_stringshare_add("/");
> + priv->inwin = EINA_FALSE;
> + priv->filesel_win = NULL;
> +
> elm_layout_sizing_eval(obj);
> elm_widget_can_focus_set(obj, EINA_TRUE);
> }
> diff -uprN a/src/lib/elm_widget_player.h b/src/lib/elm_widget_player.h
> --- a/src/lib/elm_widget_player.h 2012-11-26 12:02:53.000000000 +0530
> +++ b/src/lib/elm_widget_player.h 2013-02-06 11:17:07.000000000 +0530
> @@ -33,6 +33,20 @@ struct _Elm_Player_Smart_Data
> Evas_Object *rewind;
> Evas_Object *stop;
> Evas_Object *slider;
> + Evas_Object *volume;
> + Evas_Object *mute;
> + Evas_Object *billboard;
> + Evas_Object *filesel;
> + Evas_Object *filesel_win;
> +
> + Eina_Hash *volume_vals; /* volume attenutator presets */
> + Eina_Bool disabled; /* used for only-when-must changes */
> + double length; /* --- ditto --- */
> + short frames; /* used to reduce update frequency */
> + double pos; /* inter-callback communication to
> break slider feedback loop */
> + Eina_Bool inwin; /* inwin mode for filesel */
> + const char *path; /* chosen file */
> + char msg[32]; /* buffer for billboard */
> };
>
> /**
>
> ------------------------------------------------------------------------------
> Free Next-Gen Firewall Hardware Offer
> Buy your Sophos next-gen firewall before the end March 2013
> and get the hardware for free! Learn more.
> http://p.sf.net/sfu/sophos-d2d-feb
> _______________________________________________
> enlightenment-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/enlightenment-users
>
--
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler) [email protected]
------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
enlightenment-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-users