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