forked from enlightenment/rage
break up main.c into logical elements as separate files
This commit is contained in:
parent
f2cb079642
commit
bb5f5b5487
1
TODO
1
TODO
|
@ -17,5 +17,4 @@
|
||||||
* loop all option
|
* loop all option
|
||||||
* show busy anim until opened cb or failure
|
* show busy anim until opened cb or failure
|
||||||
* quality option (smooth)
|
* quality option (smooth)
|
||||||
* make Home/End/Insert/Delete/Tab/Pause do something vaguely sensible
|
|
||||||
* add button/control top-left next to audio to do fullscreen/normal toggle
|
* add button/control top-left next to audio to do fullscreen/normal toggle
|
||||||
|
|
|
@ -10,5 +10,10 @@ rage_CPPFLAGS = -I. \
|
||||||
rage_LDADD = @RAGE_LIBS@
|
rage_LDADD = @RAGE_LIBS@
|
||||||
|
|
||||||
rage_SOURCES = \
|
rage_SOURCES = \
|
||||||
|
controls.c controls.h \
|
||||||
|
dnd.c dnd.h \
|
||||||
|
key.c key.h \
|
||||||
main.c main.h \
|
main.c main.h \
|
||||||
video.c video.h
|
video.c video.h \
|
||||||
|
winvid.c winvid.h \
|
||||||
|
win.c win.h
|
||||||
|
|
|
@ -0,0 +1,147 @@
|
||||||
|
#include <Elementary.h>
|
||||||
|
#include "main.h"
|
||||||
|
#include "win.h"
|
||||||
|
#include "video.h"
|
||||||
|
#include "controls.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_drag(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(data, "inf");
|
||||||
|
double pos = 0.0;
|
||||||
|
|
||||||
|
edje_object_part_drag_value_get(elm_layout_edje_get(inf->lay),
|
||||||
|
"rage.dragable.pos", &pos, NULL);
|
||||||
|
video_position_set(inf->vid, pos * video_length_get(inf->vid));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_pos_prev(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
||||||
|
{
|
||||||
|
win_do_prev(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_pos_next(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
||||||
|
{
|
||||||
|
win_do_next(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_pos_play(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
||||||
|
{
|
||||||
|
win_do_play(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_pos_pause(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
||||||
|
{
|
||||||
|
win_do_pause(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_options(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
||||||
|
{
|
||||||
|
// win_do_options(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_time_print(double t, double max, int size, char *buf, Eina_Bool subsec)
|
||||||
|
{
|
||||||
|
double tsf;
|
||||||
|
long long tl;
|
||||||
|
int ts, tm, th;
|
||||||
|
|
||||||
|
tl = t;
|
||||||
|
ts = tl % 60;
|
||||||
|
tm = (tl / 60) % 60;
|
||||||
|
th = (tl / (60 * 60));
|
||||||
|
tsf = fmod(t, 60.0);
|
||||||
|
if (subsec)
|
||||||
|
{
|
||||||
|
if (tsf < 10.0)
|
||||||
|
{
|
||||||
|
if (max >= (60 * 60))
|
||||||
|
snprintf(buf, size, "%i:%02i:0%1.02f", th, tm, tsf);
|
||||||
|
else if (max >= 60)
|
||||||
|
snprintf(buf, size, "%i:0%1.02f", tm, tsf);
|
||||||
|
else
|
||||||
|
snprintf(buf, size, "%1.02f", tsf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (max >= (60 * 60))
|
||||||
|
snprintf(buf, size, "%i:%02i:%2.02f", th, tm, tsf);
|
||||||
|
else if (max >= 60)
|
||||||
|
snprintf(buf, size, "%i:%2.02f", tm, tsf);
|
||||||
|
else
|
||||||
|
snprintf(buf, size, "%2.02f", tsf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (max >= (60 * 60))
|
||||||
|
snprintf(buf, size, "%i:%02i:%02i", th, tm, ts);
|
||||||
|
else if (max >= 60)
|
||||||
|
snprintf(buf, size, "%i:%02i", tm, ts);
|
||||||
|
else
|
||||||
|
snprintf(buf, size, "%i", ts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
controls_init(Evas_Object *win, Evas_Object *lay)
|
||||||
|
{
|
||||||
|
Evas_Object *o;
|
||||||
|
Evas_Coord sz;
|
||||||
|
|
||||||
|
elm_layout_signal_callback_add(lay, "drag", "rage.dragable.pos",
|
||||||
|
_cb_drag, win);
|
||||||
|
elm_layout_signal_callback_add(lay, "pos,action,prev", "rage",
|
||||||
|
_cb_pos_prev, win);
|
||||||
|
elm_layout_signal_callback_add(lay, "pos,action,next", "rage",
|
||||||
|
_cb_pos_next, win);
|
||||||
|
elm_layout_signal_callback_add(lay, "pos,action,play", "rage",
|
||||||
|
_cb_pos_play, win);
|
||||||
|
elm_layout_signal_callback_add(lay, "pos,action,pause", "rage",
|
||||||
|
_cb_pos_pause, win);
|
||||||
|
elm_layout_signal_callback_add(lay, "pos,action,options", "rage",
|
||||||
|
_cb_options, win);
|
||||||
|
sz = 0;
|
||||||
|
elm_coords_finger_size_adjust(1, &sz, 1, &sz);
|
||||||
|
|
||||||
|
#define FINGER_SIZE(_nam) \
|
||||||
|
o = evas_object_rectangle_add(evas_object_evas_get(win)); \
|
||||||
|
evas_object_color_set(o, 0, 0, 0, 0); \
|
||||||
|
evas_object_pass_events_set(o, EINA_TRUE); \
|
||||||
|
evas_object_size_hint_min_set(o, sz, sz); \
|
||||||
|
elm_object_part_content_set(lay, _nam, o)
|
||||||
|
|
||||||
|
FINGER_SIZE("rage.pos.swallow");
|
||||||
|
FINGER_SIZE("rage.vol.swallow");
|
||||||
|
FINGER_SIZE("rage.options.swallow");
|
||||||
|
FINGER_SIZE("rage.pos.prev.swallow");
|
||||||
|
FINGER_SIZE("rage.pos.play.swallow");
|
||||||
|
FINGER_SIZE("rage.pos.next.swallow");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
controls_update(Evas_Object *lay, Evas_Object *vid)
|
||||||
|
{
|
||||||
|
char buf[256];
|
||||||
|
double p;
|
||||||
|
|
||||||
|
_time_print(video_position_get(vid), video_length_get(vid),
|
||||||
|
sizeof(buf), buf, EINA_TRUE);
|
||||||
|
elm_object_part_text_set(lay, "rage.pos", buf);
|
||||||
|
_time_print(video_length_get(vid), video_length_get(vid),
|
||||||
|
sizeof(buf), buf, EINA_FALSE);
|
||||||
|
elm_object_part_text_set(lay, "rage.length", buf);
|
||||||
|
elm_layout_signal_emit(lay, "action,frame", "rage");
|
||||||
|
|
||||||
|
if (video_length_get(vid) > 0.0)
|
||||||
|
p = video_position_get(vid) / video_length_get(vid);
|
||||||
|
else p = 0.0;
|
||||||
|
edje_object_part_drag_value_set(elm_layout_edje_get(lay),
|
||||||
|
"rage.dragable.pos", p, 0.0);
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef _CONTROLS_H__
|
||||||
|
#define _CONTROLS_H__ 1
|
||||||
|
|
||||||
|
void controls_init(Evas_Object *win, Evas_Object *lay);
|
||||||
|
void controls_update(Evas_Object *lay, Evas_Object *vid);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,92 @@
|
||||||
|
#include <Elementary.h>
|
||||||
|
#include "main.h"
|
||||||
|
#include "win.h"
|
||||||
|
#include "winvid.h"
|
||||||
|
#include "dnd.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
_cb_drag_enter(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("dnd enter\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cb_drag_leave(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("dnd leave\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_cb_drag_pos(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, Evas_Coord x, Evas_Coord y, Elm_Xdnd_Action action)
|
||||||
|
{
|
||||||
|
printf("dnd at %i %i act:%i\n", x, y, action);
|
||||||
|
}
|
||||||
|
|
||||||
|
Eina_Bool
|
||||||
|
_cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
|
||||||
|
{
|
||||||
|
Evas_Object *win = data;
|
||||||
|
Eina_Bool inserted = EINA_FALSE;
|
||||||
|
|
||||||
|
if (!ev->data) return EINA_TRUE;
|
||||||
|
if (strchr(ev->data, '\n'))
|
||||||
|
{
|
||||||
|
char *p, *p2, *p3, *tb;
|
||||||
|
|
||||||
|
tb = malloc(strlen(ev->data) + 1);
|
||||||
|
if (tb)
|
||||||
|
{
|
||||||
|
for (p = ev->data; p;)
|
||||||
|
{
|
||||||
|
p2 = strchr(p, '\n');
|
||||||
|
p3 = strchr(p, '\r');
|
||||||
|
if (p2 && p3)
|
||||||
|
{
|
||||||
|
if (p3 < p2) p2 = p3;
|
||||||
|
}
|
||||||
|
else if (!p2) p3 = p2;
|
||||||
|
if (p2)
|
||||||
|
{
|
||||||
|
strncpy(tb, p, p2 - p);
|
||||||
|
tb[p2 - p] = 0;
|
||||||
|
p = p2;
|
||||||
|
while ((*p) && (isspace(*p))) p++;
|
||||||
|
if (strlen(tb) > 0)
|
||||||
|
{
|
||||||
|
win_video_insert(win, tb);
|
||||||
|
inserted = EINA_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(tb, p);
|
||||||
|
if (strlen(tb) > 0)
|
||||||
|
{
|
||||||
|
win_video_insert(win, tb);
|
||||||
|
inserted = EINA_TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(tb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
win_video_insert(win, ev->data);
|
||||||
|
inserted = EINA_TRUE;
|
||||||
|
}
|
||||||
|
if (inserted) win_video_next(win);
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dnd_init(Evas_Object *win, Evas_Object *tgt)
|
||||||
|
{
|
||||||
|
elm_drop_target_add(tgt,
|
||||||
|
ELM_SEL_FORMAT_TEXT | ELM_SEL_FORMAT_IMAGE,
|
||||||
|
_cb_drag_enter, win,
|
||||||
|
_cb_drag_leave, win,
|
||||||
|
_cb_drag_pos, win,
|
||||||
|
_cb_drop, win);
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef _DND_H__
|
||||||
|
#define _DND_H__ 1
|
||||||
|
|
||||||
|
void dnd_init(Evas_Object *win, Evas_Object *tgt);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,274 @@
|
||||||
|
#include <Elementary.h>
|
||||||
|
#include "main.h"
|
||||||
|
#include "win.h"
|
||||||
|
#include "video.h"
|
||||||
|
#include "key.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
key_handle(Evas_Object *win, Evas_Event_Key_Down *ev)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
|
||||||
|
printf("%s | %s\n", ev->key, ev->keyname);
|
||||||
|
if ((!strcmp(ev->key, "Left")) ||
|
||||||
|
(!strcmp(ev->key, "bracketleft")))
|
||||||
|
{
|
||||||
|
if ((video_spu_button_count(inf->vid) > 0) &&
|
||||||
|
(!strcmp(ev->key, "Left")))
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_LEFT);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double pos = video_position_get(inf->vid);
|
||||||
|
|
||||||
|
if (!inf->last_action_rwind)
|
||||||
|
{
|
||||||
|
double t = ecore_time_get();
|
||||||
|
if ((t - inf->last_action) < 1.0) inf->jump *= 1.2;
|
||||||
|
else inf->jump = -5.0;
|
||||||
|
inf->last_action = t;
|
||||||
|
}
|
||||||
|
else inf->jump = -5.0;
|
||||||
|
if (inf->jump < -300.0) inf->jump = -300.0;
|
||||||
|
inf->last_action_rwind = EINA_FALSE;
|
||||||
|
pos += inf->jump;
|
||||||
|
if (pos < 0.0) pos = 0.0;
|
||||||
|
video_position_set(inf->vid, pos);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,rewind", "rage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "Right")) ||
|
||||||
|
(!strcmp(ev->key, "bracketright")))
|
||||||
|
{
|
||||||
|
double pos = video_position_get(inf->vid);
|
||||||
|
double len = video_length_get(inf->vid);
|
||||||
|
|
||||||
|
if ((video_spu_button_count(inf->vid) > 0) &&
|
||||||
|
(!strcmp(ev->key, "Right")))
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_RIGHT);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (inf->last_action_rwind)
|
||||||
|
{
|
||||||
|
double t = ecore_time_get();
|
||||||
|
if ((t - inf->last_action) < 1.0) inf->jump *= 1.2;
|
||||||
|
else inf->jump = 5.0;
|
||||||
|
inf->last_action = t;
|
||||||
|
}
|
||||||
|
else inf->jump = 5.0;
|
||||||
|
if (inf->jump > 300.0) inf->jump = 300.0;
|
||||||
|
inf->last_action_rwind = EINA_TRUE;
|
||||||
|
pos += inf->jump;
|
||||||
|
if (pos < (len - 1.0)) video_position_set(inf->vid, pos);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,forward", "rage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "Up")) ||
|
||||||
|
(!strcmp(ev->key, "plus")) ||
|
||||||
|
(!strcmp(ev->key, "equal")))
|
||||||
|
{
|
||||||
|
if ((video_spu_button_count(inf->vid) > 0) &&
|
||||||
|
(!strcmp(ev->key, "Up")))
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_UP);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double vol = video_volume_get(inf->vid) + 0.05;
|
||||||
|
if (vol > 1.0) vol = 1.0;
|
||||||
|
video_volume_set(inf->vid, vol);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,volume_up", "rage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "Down")) ||
|
||||||
|
(!strcmp(ev->key, "minus")))
|
||||||
|
{
|
||||||
|
if ((video_spu_button_count(inf->vid) > 0) &&
|
||||||
|
(!strcmp(ev->key, "Down")))
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_DOWN);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double vol = video_volume_get(inf->vid) - 0.05;
|
||||||
|
if (vol < 0.0) vol = 0.0;
|
||||||
|
video_volume_set(inf->vid, vol);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,volume_down", "rage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "space")) ||
|
||||||
|
(!strcmp(ev->key, "Pause")) ||
|
||||||
|
(!strcmp(ev->keyname, "p")) ||
|
||||||
|
(!strcmp(ev->key, "XF86AudioPlay")))
|
||||||
|
{
|
||||||
|
printf("ch: %i/%i [%s]\n", video_chapter_get(inf->vid), video_chapter_count(inf->vid), video_chapter_name_get(inf->vid, video_chapter_get(inf->vid)));
|
||||||
|
printf("ti: %s\n", video_title_get(inf->vid));
|
||||||
|
printf("au: %i/%i [%s]\n", video_audio_channel_get(inf->vid), video_audio_channel_count(inf->vid), video_audio_channel_name_get(inf->vid, video_audio_channel_get(inf->vid)));
|
||||||
|
printf("vi: %i/%i [%s]\n", video_video_channel_get(inf->vid), video_video_channel_count(inf->vid), video_video_channel_name_get(inf->vid, video_video_channel_get(inf->vid)));
|
||||||
|
printf("sp: %i/%i [%s]\n", video_spu_channel_get(inf->vid), video_spu_channel_count(inf->vid), video_spu_channel_name_get(inf->vid, video_spu_channel_get(inf->vid)));
|
||||||
|
|
||||||
|
win_do_play_pause(win);
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->keyname, "s")) ||
|
||||||
|
(!strcmp(ev->key, "XF86AudioStop")))
|
||||||
|
{
|
||||||
|
video_stop(inf->vid);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,stop", "rage");
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "Prior")) ||
|
||||||
|
(!strcmp(ev->key, "XF86AudioPrev")))
|
||||||
|
{
|
||||||
|
win_do_prev(win);
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "Next")) ||
|
||||||
|
(!strcmp(ev->key, "XF86AudioNext")))
|
||||||
|
{
|
||||||
|
win_do_next(win);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "Home"))
|
||||||
|
{
|
||||||
|
if (win_video_have_prev(win)) win_video_first(win);
|
||||||
|
else win_video_prev(win);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "End"))
|
||||||
|
{
|
||||||
|
if (win_video_have_next(win)) win_video_last(win);
|
||||||
|
else win_video_next(win);
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->keyname, "m")) ||
|
||||||
|
(!strcmp(ev->key, "XF86AudioMute")))
|
||||||
|
{
|
||||||
|
video_mute_set(inf->vid, !video_mute_get(inf->vid));
|
||||||
|
if (video_mute_get(inf->vid))
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,mute", "rage");
|
||||||
|
else
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,unmute", "rage");
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->keyname, "l"))
|
||||||
|
{
|
||||||
|
video_loop_set(inf->vid, !video_loop_get(inf->vid));
|
||||||
|
if (video_loop_get(inf->vid))
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,loop", "rage");
|
||||||
|
else
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,sequential", "rage");
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->keyname, "q")) ||
|
||||||
|
(!strcmp(ev->key, "Escape")))
|
||||||
|
{
|
||||||
|
elm_exit();
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->keyname, "f")) ||
|
||||||
|
(!strcmp(ev->key, "F11")))
|
||||||
|
{
|
||||||
|
elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win));
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->keyname, "n"))
|
||||||
|
{
|
||||||
|
int w, h;
|
||||||
|
|
||||||
|
video_ratio_size_get(inf->vid, &w, &h);
|
||||||
|
if ((w > 1) && (h > 1)) evas_object_resize(win, w, h);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->keyname, "z"))
|
||||||
|
{
|
||||||
|
if (inf->zoom_mode == 0) inf->zoom_mode = 1;
|
||||||
|
else inf->zoom_mode = 0;
|
||||||
|
win_aspect_adjust(win);
|
||||||
|
if (inf->zoom_mode == 1)
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,zoom_fill", "rage");
|
||||||
|
else
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,zoom_fit", "rage");
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->keyname, "e"))
|
||||||
|
{
|
||||||
|
video_eject(inf->vid);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,eject", "rage");
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "Return")) ||
|
||||||
|
(!strcmp(ev->key, "KP_Enter")))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_SELECT);
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "comman")) ||
|
||||||
|
(!strcmp(ev->key, "less")))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_ANGLE_PREV);
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "period")) ||
|
||||||
|
(!strcmp(ev->key, "greater")))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_ANGLE_NEXT);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "Tab"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_FORCE);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "0"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_0);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "1"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_1);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "2"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_2);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "3"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_3);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "4"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_4);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "5"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_5);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "6"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_6);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "7"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_7);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "8"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_8);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "9"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_9);
|
||||||
|
}
|
||||||
|
else if ((!strcmp(ev->key, "grave")) ||
|
||||||
|
(!strcmp(ev->key, "asciitilde")))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_10);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "F1"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_MENU1);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "F2"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_MENU2);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "F3"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_MENU3);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "F4"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_MENU4);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "F5"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_MENU5);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "F6"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_MENU6);
|
||||||
|
}
|
||||||
|
else if (!strcmp(ev->key, "F7"))
|
||||||
|
{
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_MENU7);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef _KEY_H__
|
||||||
|
#define _KEY_H__ 1
|
||||||
|
|
||||||
|
void key_handle(Evas_Object *win, Evas_Event_Key_Down *ev);
|
||||||
|
|
||||||
|
#endif
|
960
src/bin/main.c
960
src/bin/main.c
|
@ -1,963 +1,7 @@
|
||||||
#include <Elementary.h>
|
#include <Elementary.h>
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "video.h"
|
#include "win.h"
|
||||||
|
#include "winvid.h"
|
||||||
typedef struct _Inf Inf;
|
|
||||||
|
|
||||||
struct _Inf
|
|
||||||
{
|
|
||||||
Evas_Object *vid, *lay, *event;
|
|
||||||
Eina_List *file_list, *file_cur;
|
|
||||||
Ecore_Job *next_job;
|
|
||||||
Ecore_Timer *show_timeout;
|
|
||||||
double last_action;
|
|
||||||
double jump;
|
|
||||||
int zoom_mode;
|
|
||||||
Eina_Bool sized : 1;
|
|
||||||
Eina_Bool last_action_rwind : 1;
|
|
||||||
Eina_Bool playing : 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void win_video_next(Evas_Object *win);
|
|
||||||
static void win_video_insert(Evas_Object *win, const char *file);
|
|
||||||
static Eina_Bool win_video_have_next(Evas_Object *win);
|
|
||||||
static Eina_Bool win_video_have_prev(Evas_Object *win);
|
|
||||||
static void win_video_prev(Evas_Object *win);
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_fullscreen(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(obj, "inf");
|
|
||||||
elm_layout_signal_emit(inf->lay, "state,win,fullscreen", "rage");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_unfullscreen(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(obj, "inf");
|
|
||||||
elm_layout_signal_emit(inf->lay, "state,win,normal", "rage");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_drag_enter(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED)
|
|
||||||
{
|
|
||||||
printf("dnd enter\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_drag_leave(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED)
|
|
||||||
{
|
|
||||||
printf("dnd leave\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_drag_pos(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, Evas_Coord x, Evas_Coord y, Elm_Xdnd_Action action)
|
|
||||||
{
|
|
||||||
printf("dnd at %i %i act:%i\n", x, y, action);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Eina_Bool
|
|
||||||
_cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
|
|
||||||
{
|
|
||||||
Evas_Object *win = data;
|
|
||||||
Eina_Bool inserted = EINA_FALSE;
|
|
||||||
|
|
||||||
if (!ev->data) return EINA_TRUE;
|
|
||||||
if (strchr(ev->data, '\n'))
|
|
||||||
{
|
|
||||||
char *p, *p2, *p3, *tb;
|
|
||||||
|
|
||||||
tb = malloc(strlen(ev->data) + 1);
|
|
||||||
if (tb)
|
|
||||||
{
|
|
||||||
for (p = ev->data; p;)
|
|
||||||
{
|
|
||||||
p2 = strchr(p, '\n');
|
|
||||||
p3 = strchr(p, '\r');
|
|
||||||
if (p2 && p3)
|
|
||||||
{
|
|
||||||
if (p3 < p2) p2 = p3;
|
|
||||||
}
|
|
||||||
else if (!p2) p3 = p2;
|
|
||||||
if (p2)
|
|
||||||
{
|
|
||||||
strncpy(tb, p, p2 - p);
|
|
||||||
tb[p2 - p] = 0;
|
|
||||||
p = p2;
|
|
||||||
while ((*p) && (isspace(*p))) p++;
|
|
||||||
if (strlen(tb) > 0)
|
|
||||||
{
|
|
||||||
win_video_insert(win, tb);
|
|
||||||
inserted = EINA_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strcpy(tb, p);
|
|
||||||
if (strlen(tb) > 0)
|
|
||||||
{
|
|
||||||
win_video_insert(win, tb);
|
|
||||||
inserted = EINA_TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(tb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
win_video_insert(win, ev->data);
|
|
||||||
inserted = EINA_TRUE;
|
|
||||||
}
|
|
||||||
if (inserted) win_video_next(win);
|
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_win_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *ev EINA_UNUSED)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(obj, "inf");
|
|
||||||
const char *f;
|
|
||||||
|
|
||||||
if (inf->next_job) ecore_job_del(inf->next_job);
|
|
||||||
if (inf->show_timeout) ecore_timer_del(inf->show_timeout);
|
|
||||||
EINA_LIST_FREE(inf->file_list, f) eina_stringshare_del(f);
|
|
||||||
free(inf);
|
|
||||||
evas_object_data_del(obj, "inf");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_do_play(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
|
|
||||||
video_play_set(inf->vid, EINA_TRUE);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,play", "rage");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_do_pause(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
|
|
||||||
video_play_set(inf->vid, EINA_FALSE);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,pause", "rage");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_do_play_pause(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
|
|
||||||
video_play_set(inf->vid, !video_play_get(inf->vid));
|
|
||||||
if (video_play_get(inf->vid))
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,play", "rage");
|
|
||||||
else
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,pause", "rage");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_do_prev(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
|
|
||||||
if (video_spu_button_count(inf->vid) > 0)
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_PREV);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// if we have chapters - send prev event to jump chapters
|
|
||||||
if (video_chapter_count(inf->vid) > 0)
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_PREV);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
double pos = video_position_get(inf->vid);
|
|
||||||
|
|
||||||
if ((pos < 5.0) && win_video_have_prev(win)) win_video_prev(win);
|
|
||||||
else video_position_set(inf->vid, 0.0);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,prev", "rage");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_do_next(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
|
|
||||||
if (video_spu_button_count(inf->vid) > 0)
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_NEXT);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// if we have chapters - send next event to jump chapters
|
|
||||||
if (video_chapter_count(inf->vid) > 0)
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_NEXT);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!win_video_have_next(win))
|
|
||||||
{
|
|
||||||
double pos = video_position_get(inf->vid);
|
|
||||||
double len = video_length_get(inf->vid);
|
|
||||||
|
|
||||||
if ((len - pos) > 5.0)
|
|
||||||
{
|
|
||||||
video_position_set(inf->vid, len - 5.0);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,next", "rage");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
win_video_next(win);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,next", "rage");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_drag(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(data, "inf");
|
|
||||||
double pos = 0.0;
|
|
||||||
|
|
||||||
edje_object_part_drag_value_get(elm_layout_edje_get(inf->lay),
|
|
||||||
"rage.dragable.pos", &pos, NULL);
|
|
||||||
video_position_set(inf->vid, pos * video_length_get(inf->vid));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_pos_prev(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
|
||||||
{
|
|
||||||
win_do_prev(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_pos_next(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
|
||||||
{
|
|
||||||
win_do_next(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_pos_play(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
|
||||||
{
|
|
||||||
win_do_play(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_pos_pause(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
|
||||||
{
|
|
||||||
win_do_pause(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_options(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
|
|
||||||
{
|
|
||||||
// win_do_options(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Evas_Object *
|
|
||||||
win_add(void)
|
|
||||||
{
|
|
||||||
Evas_Object *win, *o;
|
|
||||||
char buf[4096];
|
|
||||||
Evas_Coord sz;
|
|
||||||
Inf *inf = calloc(1, sizeof(Inf));
|
|
||||||
|
|
||||||
win = elm_win_add(NULL, "Rage", ELM_WIN_BASIC);
|
|
||||||
elm_win_title_set(win, "Rage");
|
|
||||||
elm_win_autodel_set(win, EINA_TRUE);
|
|
||||||
|
|
||||||
evas_object_data_set(win, "inf", inf);
|
|
||||||
evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cb_win_del, NULL);
|
|
||||||
|
|
||||||
evas_object_smart_callback_add(win, "fullscreen", _cb_fullscreen, NULL);
|
|
||||||
evas_object_smart_callback_add(win, "unfullscreen", _cb_unfullscreen, NULL);
|
|
||||||
evas_object_smart_callback_add(win, "normal", _cb_unfullscreen, NULL);
|
|
||||||
|
|
||||||
o = evas_object_image_add(evas_object_evas_get(win));
|
|
||||||
snprintf(buf, sizeof(buf), "%s/images/rage.png", elm_app_data_dir_get());
|
|
||||||
evas_object_image_file_set(o, buf, NULL);
|
|
||||||
elm_win_icon_object_set(win, o);
|
|
||||||
|
|
||||||
o = elm_layout_add(win);
|
|
||||||
snprintf(buf, sizeof(buf), "%s/themes/default.edj", elm_app_data_dir_get());
|
|
||||||
elm_layout_file_set(o, buf, "rage/core");
|
|
||||||
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
||||||
elm_win_resize_object_add(win, o);
|
|
||||||
evas_object_show(o);
|
|
||||||
inf->lay = o;
|
|
||||||
|
|
||||||
elm_layout_signal_callback_add(o, "drag", "rage.dragable.pos",
|
|
||||||
_cb_drag, win);
|
|
||||||
elm_layout_signal_callback_add(o, "pos,action,prev", "rage",
|
|
||||||
_cb_pos_prev, win);
|
|
||||||
elm_layout_signal_callback_add(o, "pos,action,next", "rage",
|
|
||||||
_cb_pos_next, win);
|
|
||||||
elm_layout_signal_callback_add(o, "pos,action,play", "rage",
|
|
||||||
_cb_pos_play, win);
|
|
||||||
elm_layout_signal_callback_add(o, "pos,action,pause", "rage",
|
|
||||||
_cb_pos_pause, win);
|
|
||||||
elm_layout_signal_callback_add(o, "pos,action,options", "rage",
|
|
||||||
_cb_options, win);
|
|
||||||
|
|
||||||
sz = 0;
|
|
||||||
elm_coords_finger_size_adjust(1, &sz, 1, &sz);
|
|
||||||
|
|
||||||
#define FINGER_SIZE(_nam) \
|
|
||||||
o = evas_object_rectangle_add(evas_object_evas_get(win)); \
|
|
||||||
evas_object_color_set(o, 0, 0, 0, 0); \
|
|
||||||
evas_object_pass_events_set(o, EINA_TRUE); \
|
|
||||||
evas_object_size_hint_min_set(o, sz, sz); \
|
|
||||||
elm_object_part_content_set(inf->lay, _nam, o)
|
|
||||||
|
|
||||||
FINGER_SIZE("rage.pos.swallow");
|
|
||||||
FINGER_SIZE("rage.vol.swallow");
|
|
||||||
FINGER_SIZE("rage.options.swallow");
|
|
||||||
FINGER_SIZE("rage.pos.prev.swallow");
|
|
||||||
FINGER_SIZE("rage.pos.play.swallow");
|
|
||||||
FINGER_SIZE("rage.pos.next.swallow");
|
|
||||||
|
|
||||||
o = evas_object_rectangle_add(evas_object_evas_get(win));
|
|
||||||
elm_win_resize_object_add(win, o);
|
|
||||||
evas_object_color_set(o, 0, 0, 0, 0);
|
|
||||||
evas_object_repeat_events_set(o, EINA_TRUE);
|
|
||||||
evas_object_show(o);
|
|
||||||
inf->event = o;
|
|
||||||
|
|
||||||
elm_drop_target_add(o, ELM_SEL_FORMAT_TEXT | ELM_SEL_FORMAT_IMAGE,
|
|
||||||
_cb_drag_enter, win,
|
|
||||||
_cb_drag_leave, win,
|
|
||||||
_cb_drag_pos, win,
|
|
||||||
_cb_drop, win);
|
|
||||||
return win;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_title_update(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
const char *file;
|
|
||||||
|
|
||||||
if (!inf->file_cur)
|
|
||||||
{
|
|
||||||
elm_win_title_set(win, "Rage");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
file = inf->file_cur->data;
|
|
||||||
if (!file)
|
|
||||||
{
|
|
||||||
elm_win_title_set(win, "Rage");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (video_title_get(inf->vid))
|
|
||||||
elm_win_title_set(win, video_title_get(inf->vid));
|
|
||||||
else
|
|
||||||
elm_win_title_set(win, ecore_file_file_get(file));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_show(Evas_Object *win, int w, int h)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
if (!inf->sized)
|
|
||||||
{
|
|
||||||
inf->sized = EINA_TRUE;
|
|
||||||
evas_object_resize(win, w, h);
|
|
||||||
if (inf->show_timeout)
|
|
||||||
{
|
|
||||||
ecore_timer_del(inf->show_timeout);
|
|
||||||
inf->show_timeout = NULL;
|
|
||||||
}
|
|
||||||
evas_object_show(win);
|
|
||||||
}
|
|
||||||
if (!video_has_video_get(inf->vid))
|
|
||||||
elm_layout_signal_emit(inf->lay, "state,novideo", "rage");
|
|
||||||
else
|
|
||||||
elm_layout_signal_emit(inf->lay, "state,video", "rage");
|
|
||||||
if (!video_has_audio_get(inf->vid))
|
|
||||||
elm_layout_signal_emit(inf->lay, "state,noaudio", "rage");
|
|
||||||
else
|
|
||||||
elm_layout_signal_emit(inf->lay, "state,audio", "rage");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_aspect_adjust(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
int w = 1, h = 1;
|
|
||||||
|
|
||||||
video_ratio_size_get(inf->vid, &w, &h);
|
|
||||||
if (inf->zoom_mode == 1)
|
|
||||||
evas_object_size_hint_aspect_set(inf->vid, EVAS_ASPECT_CONTROL_NEITHER, w, h);
|
|
||||||
else
|
|
||||||
evas_object_size_hint_aspect_set(inf->vid, EVAS_ASPECT_CONTROL_BOTH, w, h);
|
|
||||||
if (((w > 1) && (h > 1)) ||
|
|
||||||
((!video_has_video_get(inf->vid)) && (video_has_audio_get(inf->vid))))
|
|
||||||
{
|
|
||||||
if ((!video_has_video_get(inf->vid)) && (video_has_audio_get(inf->vid)))
|
|
||||||
w = h = 160;
|
|
||||||
win_show(win, w, h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_time_print(double t, double max, int size, char *buf, Eina_Bool subsec)
|
|
||||||
{
|
|
||||||
double tsf;
|
|
||||||
long long tl;
|
|
||||||
int ts, tm, th;
|
|
||||||
|
|
||||||
tl = t;
|
|
||||||
ts = tl % 60;
|
|
||||||
tm = (tl / 60) % 60;
|
|
||||||
th = (tl / (60 * 60));
|
|
||||||
tsf = fmod(t, 60.0);
|
|
||||||
if (subsec)
|
|
||||||
{
|
|
||||||
if (tsf < 10.0)
|
|
||||||
{
|
|
||||||
if (max >= (60 * 60))
|
|
||||||
snprintf(buf, size, "%i:%02i:0%1.02f", th, tm, tsf);
|
|
||||||
else if (max >= 60)
|
|
||||||
snprintf(buf, size, "%i:0%1.02f", tm, tsf);
|
|
||||||
else
|
|
||||||
snprintf(buf, size, "%1.02f", tsf);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (max >= (60 * 60))
|
|
||||||
snprintf(buf, size, "%i:%02i:%2.02f", th, tm, tsf);
|
|
||||||
else if (max >= 60)
|
|
||||||
snprintf(buf, size, "%i:%2.02f", tm, tsf);
|
|
||||||
else
|
|
||||||
snprintf(buf, size, "%2.02f", tsf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (max >= (60 * 60))
|
|
||||||
snprintf(buf, size, "%i:%02i:%02i", th, tm, ts);
|
|
||||||
else if (max >= 60)
|
|
||||||
snprintf(buf, size, "%i:%02i", tm, ts);
|
|
||||||
else
|
|
||||||
snprintf(buf, size, "%i", ts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_frame_decode(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
char buf[256];
|
|
||||||
double p;
|
|
||||||
|
|
||||||
_time_print(video_position_get(inf->vid), video_length_get(inf->vid),
|
|
||||||
sizeof(buf), buf, EINA_TRUE);
|
|
||||||
elm_object_part_text_set(inf->lay, "rage.pos", buf);
|
|
||||||
_time_print(video_length_get(inf->vid), video_length_get(inf->vid),
|
|
||||||
sizeof(buf), buf, EINA_FALSE);
|
|
||||||
elm_object_part_text_set(inf->lay, "rage.length", buf);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,frame", "rage");
|
|
||||||
if (video_length_get(inf->vid) > 0.0)
|
|
||||||
p = video_position_get(inf->vid) / video_length_get(inf->vid);
|
|
||||||
else p = 0.0;
|
|
||||||
edje_object_part_drag_value_set(elm_layout_edje_get(inf->lay),
|
|
||||||
"rage.dragable.pos", p, 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_resize(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
win_aspect_adjust(data);
|
|
||||||
win_title_update(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_decode(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
win_frame_decode(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_video_next(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
Eina_List *l;
|
|
||||||
const char *file;
|
|
||||||
|
|
||||||
if (!inf->file_list) return;
|
|
||||||
if (!inf->file_cur) l = inf->file_list;
|
|
||||||
else l = inf->file_cur->next;
|
|
||||||
if (!l)
|
|
||||||
{
|
|
||||||
elm_exit();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
file = l->data;
|
|
||||||
inf->file_cur = l;
|
|
||||||
video_position_set(inf->vid, 0.0);
|
|
||||||
video_play_set(inf->vid, EINA_FALSE);
|
|
||||||
video_file_set(inf->vid, file);
|
|
||||||
video_position_set(inf->vid, 0.0);
|
|
||||||
video_play_set(inf->vid, EINA_TRUE);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,newvid", "rage");
|
|
||||||
win_aspect_adjust(win);
|
|
||||||
win_title_update(win);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_video_prev(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
Eina_List *l;
|
|
||||||
const char *file;
|
|
||||||
|
|
||||||
if (!inf->file_list) return;
|
|
||||||
if (!inf->file_cur) l = eina_list_last(inf->file_list);
|
|
||||||
else l = inf->file_cur->prev;
|
|
||||||
if (!l) return;
|
|
||||||
file = l->data;
|
|
||||||
inf->file_cur = l;
|
|
||||||
video_position_set(inf->vid, 0.0);
|
|
||||||
video_play_set(inf->vid, EINA_FALSE);
|
|
||||||
video_file_set(inf->vid, file);
|
|
||||||
video_position_set(inf->vid, 0.0);
|
|
||||||
video_play_set(inf->vid, EINA_TRUE);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,newvid", "rage");
|
|
||||||
win_aspect_adjust(win);
|
|
||||||
win_title_update(win);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Eina_Bool
|
|
||||||
win_video_have_next(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
Eina_List *l;
|
|
||||||
|
|
||||||
if (!inf->file_list) return EINA_FALSE;
|
|
||||||
if (!inf->file_cur) return EINA_FALSE;
|
|
||||||
else l = inf->file_cur->next;
|
|
||||||
if (!l) return EINA_FALSE;
|
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Eina_Bool
|
|
||||||
win_video_have_prev(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
Eina_List *l;
|
|
||||||
|
|
||||||
if (!inf->file_list) return EINA_FALSE;
|
|
||||||
if (!inf->file_cur) return EINA_FALSE;
|
|
||||||
else l = inf->file_cur->prev;
|
|
||||||
if (!l) return EINA_FALSE;
|
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_video_insert(Evas_Object *win, const char *file)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
|
|
||||||
inf->file_list = eina_list_append_relative_list
|
|
||||||
(inf->file_list, eina_stringshare_add(file), inf->file_cur);
|
|
||||||
evas_object_data_set(win, "file_list", inf->file_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_key_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
||||||
{
|
|
||||||
Evas_Event_Key_Down *ev = event_info;
|
|
||||||
Evas_Object *win = data;
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
|
|
||||||
printf("%s | %s\n", ev->key, ev->keyname);
|
|
||||||
if ((!strcmp(ev->key, "Left")) ||
|
|
||||||
(!strcmp(ev->key, "bracketleft")))
|
|
||||||
{
|
|
||||||
if ((video_spu_button_count(inf->vid) > 0) &&
|
|
||||||
(!strcmp(ev->key, "Left")))
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_LEFT);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
double pos = video_position_get(inf->vid);
|
|
||||||
|
|
||||||
if (!inf->last_action_rwind)
|
|
||||||
{
|
|
||||||
double t = ecore_time_get();
|
|
||||||
if ((t - inf->last_action) < 1.0) inf->jump *= 1.2;
|
|
||||||
else inf->jump = -5.0;
|
|
||||||
inf->last_action = t;
|
|
||||||
}
|
|
||||||
else inf->jump = -5.0;
|
|
||||||
if (inf->jump < -300.0) inf->jump = -300.0;
|
|
||||||
inf->last_action_rwind = EINA_FALSE;
|
|
||||||
pos += inf->jump;
|
|
||||||
if (pos < 0.0) pos = 0.0;
|
|
||||||
video_position_set(inf->vid, pos);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,rewind", "rage");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "Right")) ||
|
|
||||||
(!strcmp(ev->key, "bracketright")))
|
|
||||||
{
|
|
||||||
double pos = video_position_get(inf->vid);
|
|
||||||
double len = video_length_get(inf->vid);
|
|
||||||
|
|
||||||
if ((video_spu_button_count(inf->vid) > 0) &&
|
|
||||||
(!strcmp(ev->key, "Right")))
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_RIGHT);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (inf->last_action_rwind)
|
|
||||||
{
|
|
||||||
double t = ecore_time_get();
|
|
||||||
if ((t - inf->last_action) < 1.0) inf->jump *= 1.2;
|
|
||||||
else inf->jump = 5.0;
|
|
||||||
inf->last_action = t;
|
|
||||||
}
|
|
||||||
else inf->jump = 5.0;
|
|
||||||
if (inf->jump > 300.0) inf->jump = 300.0;
|
|
||||||
inf->last_action_rwind = EINA_TRUE;
|
|
||||||
pos += inf->jump;
|
|
||||||
if (pos < (len - 1.0)) video_position_set(inf->vid, pos);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,forward", "rage");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "Up")) ||
|
|
||||||
(!strcmp(ev->key, "plus")) ||
|
|
||||||
(!strcmp(ev->key, "equal")))
|
|
||||||
{
|
|
||||||
if ((video_spu_button_count(inf->vid) > 0) &&
|
|
||||||
(!strcmp(ev->key, "Up")))
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_UP);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
double vol = video_volume_get(inf->vid) + 0.05;
|
|
||||||
if (vol > 1.0) vol = 1.0;
|
|
||||||
video_volume_set(inf->vid, vol);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,volume_up", "rage");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "Down")) ||
|
|
||||||
(!strcmp(ev->key, "minus")))
|
|
||||||
{
|
|
||||||
if ((video_spu_button_count(inf->vid) > 0) &&
|
|
||||||
(!strcmp(ev->key, "Down")))
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_DOWN);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
double vol = video_volume_get(inf->vid) - 0.05;
|
|
||||||
if (vol < 0.0) vol = 0.0;
|
|
||||||
video_volume_set(inf->vid, vol);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,volume_down", "rage");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "space")) ||
|
|
||||||
(!strcmp(ev->keyname, "p")) ||
|
|
||||||
(!strcmp(ev->key, "XF86AudioPlay")))
|
|
||||||
{
|
|
||||||
printf("ch: %i/%i [%s]\n", video_chapter_get(inf->vid), video_chapter_count(inf->vid), video_chapter_name_get(inf->vid, video_chapter_get(inf->vid)));
|
|
||||||
printf("ti: %s\n", video_title_get(inf->vid));
|
|
||||||
printf("au: %i/%i [%s]\n", video_audio_channel_get(inf->vid), video_audio_channel_count(inf->vid), video_audio_channel_name_get(inf->vid, video_audio_channel_get(inf->vid)));
|
|
||||||
printf("vi: %i/%i [%s]\n", video_video_channel_get(inf->vid), video_video_channel_count(inf->vid), video_video_channel_name_get(inf->vid, video_video_channel_get(inf->vid)));
|
|
||||||
printf("sp: %i/%i [%s]\n", video_spu_channel_get(inf->vid), video_spu_channel_count(inf->vid), video_spu_channel_name_get(inf->vid, video_spu_channel_get(inf->vid)));
|
|
||||||
|
|
||||||
win_do_play_pause(win);
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->keyname, "s")) ||
|
|
||||||
(!strcmp(ev->key, "XF86AudioStop")))
|
|
||||||
{
|
|
||||||
video_stop(inf->vid);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,stop", "rage");
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "Prior")) ||
|
|
||||||
(!strcmp(ev->key, "XF86AudioPrev")))
|
|
||||||
{
|
|
||||||
win_do_prev(win);
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "Next")) ||
|
|
||||||
(!strcmp(ev->key, "XF86AudioNext")))
|
|
||||||
{
|
|
||||||
win_do_next(win);
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->keyname, "m")) ||
|
|
||||||
(!strcmp(ev->key, "XF86AudioMute")))
|
|
||||||
{
|
|
||||||
video_mute_set(inf->vid, !video_mute_get(inf->vid));
|
|
||||||
if (video_mute_get(inf->vid))
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,mute", "rage");
|
|
||||||
else
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,unmute", "rage");
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->keyname, "l"))
|
|
||||||
{
|
|
||||||
video_loop_set(inf->vid, !video_loop_get(inf->vid));
|
|
||||||
if (video_loop_get(inf->vid))
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,loop", "rage");
|
|
||||||
else
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,sequential", "rage");
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->keyname, "q")) ||
|
|
||||||
(!strcmp(ev->key, "Escape")))
|
|
||||||
{
|
|
||||||
elm_exit();
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->keyname, "f")) ||
|
|
||||||
(!strcmp(ev->key, "F11")))
|
|
||||||
{
|
|
||||||
elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win));
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->keyname, "n"))
|
|
||||||
{
|
|
||||||
int w, h;
|
|
||||||
|
|
||||||
video_ratio_size_get(inf->vid, &w, &h);
|
|
||||||
if ((w > 1) && (h > 1)) evas_object_resize(win, w, h);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->keyname, "z"))
|
|
||||||
{
|
|
||||||
if (inf->zoom_mode == 0) inf->zoom_mode = 1;
|
|
||||||
else inf->zoom_mode = 0;
|
|
||||||
win_aspect_adjust(win);
|
|
||||||
if (inf->zoom_mode == 1)
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,zoom_fill", "rage");
|
|
||||||
else
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,zoom_fit", "rage");
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->keyname, "e"))
|
|
||||||
{
|
|
||||||
video_eject(inf->vid);
|
|
||||||
elm_layout_signal_emit(inf->lay, "action,eject", "rage");
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "Return")) ||
|
|
||||||
(!strcmp(ev->key, "KP_Enter")))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_SELECT);
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "comman")) ||
|
|
||||||
(!strcmp(ev->key, "less")))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_ANGLE_PREV);
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "period")) ||
|
|
||||||
(!strcmp(ev->key, "greater")))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_ANGLE_NEXT);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "Tab"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_FORCE);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "0"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_0);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "1"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_1);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "2"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_2);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "3"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_3);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "4"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_4);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "5"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_5);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "6"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_6);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "7"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_7);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "8"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_8);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "9"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_9);
|
|
||||||
}
|
|
||||||
else if ((!strcmp(ev->key, "grave")) ||
|
|
||||||
(!strcmp(ev->key, "asciitilde")))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_10);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "F1"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_MENU1);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "F2"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_MENU2);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "F3"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_MENU3);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "F4"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_MENU4);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "F5"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_MENU5);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "F6"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_MENU6);
|
|
||||||
}
|
|
||||||
else if (!strcmp(ev->key, "F7"))
|
|
||||||
{
|
|
||||||
video_event_send(inf->vid, EMOTION_EVENT_MENU7);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_stop_next(void *data)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(data, "inf");
|
|
||||||
inf->next_job = NULL;
|
|
||||||
win_video_next(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(data, "inf");
|
|
||||||
printf("stop\n");
|
|
||||||
if (win_video_have_next(data))
|
|
||||||
{
|
|
||||||
if (inf->next_job) ecore_job_del(inf->next_job);
|
|
||||||
inf->next_job = ecore_job_add(_cb_stop_next, data);
|
|
||||||
}
|
|
||||||
else elm_exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_opened(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
printf("opened\n");
|
|
||||||
win_aspect_adjust(data);
|
|
||||||
win_frame_decode(data);
|
|
||||||
win_title_update(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_length(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
printf("len\n");
|
|
||||||
win_frame_decode(data);
|
|
||||||
win_title_update(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_title(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
printf("title\n");
|
|
||||||
win_title_update(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_audio(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
printf("audio\n");
|
|
||||||
win_title_update(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_channels(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
printf("channels\n");
|
|
||||||
win_title_update(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_play_start(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(data, "inf");
|
|
||||||
printf("play start\n");
|
|
||||||
win_aspect_adjust(data);
|
|
||||||
win_frame_decode(data);
|
|
||||||
win_title_update(data);
|
|
||||||
inf->playing = EINA_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_play_finish(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(data, "inf");
|
|
||||||
printf("play finish\n");
|
|
||||||
if (!inf->playing) win_show(data, 160, 160);
|
|
||||||
inf->playing = EINA_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_button_num(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
printf("button num\n");
|
|
||||||
win_title_update(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cb_button(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
|
||||||
{
|
|
||||||
printf("button\n");
|
|
||||||
win_title_update(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_video_init(Evas_Object *win)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
Evas_Object *o;
|
|
||||||
|
|
||||||
o = video_add(win);
|
|
||||||
video_fill_set(o, EINA_TRUE);
|
|
||||||
inf->vid = o;
|
|
||||||
evas_object_smart_callback_add(o, "frame_resize", _cb_resize, win);
|
|
||||||
evas_object_smart_callback_add(o, "frame_decode", _cb_decode, win);
|
|
||||||
evas_object_smart_callback_add(o, "stop", _cb_stop, win);
|
|
||||||
evas_object_smart_callback_add(o, "opened", _cb_opened, win);
|
|
||||||
evas_object_smart_callback_add(o, "length", _cb_length, win);
|
|
||||||
evas_object_smart_callback_add(o, "title", _cb_title, win);
|
|
||||||
evas_object_smart_callback_add(o, "audio", _cb_audio, win);
|
|
||||||
evas_object_smart_callback_add(o, "channels", _cb_channels, win);
|
|
||||||
evas_object_smart_callback_add(o, "play_start", _cb_play_start, win);
|
|
||||||
evas_object_smart_callback_add(o, "play_finish", _cb_play_finish, win);
|
|
||||||
evas_object_smart_callback_add(o, "button_num", _cb_button_num, win);
|
|
||||||
evas_object_smart_callback_add(o, "button", _cb_button, win);
|
|
||||||
elm_object_part_content_set(inf->lay, "rage.content", o);
|
|
||||||
evas_object_show(o);
|
|
||||||
|
|
||||||
evas_object_event_callback_add(win, EVAS_CALLBACK_KEY_DOWN, _cb_key_down, win);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
win_video_file_list_set(Evas_Object *win, Eina_List *list)
|
|
||||||
{
|
|
||||||
Inf *inf = evas_object_data_get(win, "inf");
|
|
||||||
Eina_List *l, *list2 = NULL;
|
|
||||||
const char *f;
|
|
||||||
|
|
||||||
EINA_LIST_FOREACH(list, l, f)
|
|
||||||
{
|
|
||||||
list2 = eina_list_append(list2, eina_stringshare_add(f));
|
|
||||||
}
|
|
||||||
inf->file_list = list2;
|
|
||||||
win_video_next(win);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_cb_show_timeout(void *data)
|
_cb_show_timeout(void *data)
|
||||||
|
|
|
@ -0,0 +1,363 @@
|
||||||
|
#include <Elementary.h>
|
||||||
|
#include "main.h"
|
||||||
|
#include "win.h"
|
||||||
|
#include "winvid.h"
|
||||||
|
#include "video.h"
|
||||||
|
#include "dnd.h"
|
||||||
|
#include "key.h"
|
||||||
|
#include "controls.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_fullscreen(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(obj, "inf");
|
||||||
|
elm_layout_signal_emit(inf->lay, "state,win,fullscreen", "rage");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_unfullscreen(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(obj, "inf");
|
||||||
|
elm_layout_signal_emit(inf->lay, "state,win,normal", "rage");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_win_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *ev EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(obj, "inf");
|
||||||
|
const char *f;
|
||||||
|
|
||||||
|
if (inf->next_job) ecore_job_del(inf->next_job);
|
||||||
|
if (inf->show_timeout) ecore_timer_del(inf->show_timeout);
|
||||||
|
EINA_LIST_FREE(inf->file_list, f) eina_stringshare_del(f);
|
||||||
|
evas_object_data_del(obj, "inf");
|
||||||
|
free(inf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_key_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
||||||
|
{
|
||||||
|
key_handle(data, event_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_do_play(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
|
||||||
|
video_play_set(inf->vid, EINA_TRUE);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,play", "rage");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_do_pause(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
|
||||||
|
video_play_set(inf->vid, EINA_FALSE);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,pause", "rage");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_do_play_pause(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
|
||||||
|
video_play_set(inf->vid, !video_play_get(inf->vid));
|
||||||
|
if (video_play_get(inf->vid))
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,play", "rage");
|
||||||
|
else
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,pause", "rage");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_do_prev(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
|
||||||
|
if (video_spu_button_count(inf->vid) > 0)
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_PREV);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if we have chapters - send prev event to jump chapters
|
||||||
|
if (video_chapter_count(inf->vid) > 0)
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_PREV);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double pos = video_position_get(inf->vid);
|
||||||
|
|
||||||
|
if ((pos < 5.0) && win_video_have_prev(win)) win_video_prev(win);
|
||||||
|
else video_position_set(inf->vid, 0.0);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,prev", "rage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_do_next(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
|
||||||
|
if (video_spu_button_count(inf->vid) > 0)
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_NEXT);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if we have chapters - send next event to jump chapters
|
||||||
|
if (video_chapter_count(inf->vid) > 0)
|
||||||
|
video_event_send(inf->vid, EMOTION_EVENT_NEXT);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!win_video_have_next(win))
|
||||||
|
{
|
||||||
|
double pos = video_position_get(inf->vid);
|
||||||
|
double len = video_length_get(inf->vid);
|
||||||
|
|
||||||
|
if ((len - pos) > 5.0)
|
||||||
|
{
|
||||||
|
video_position_set(inf->vid, len - 5.0);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,next", "rage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
win_video_next(win);
|
||||||
|
elm_layout_signal_emit(inf->lay, "action,next", "rage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_restart_vid(Evas_Object *win, Evas_Object *lay, Evas_Object *vid, const char *file)
|
||||||
|
{
|
||||||
|
video_position_set(vid, 0.0);
|
||||||
|
video_play_set(vid, EINA_FALSE);
|
||||||
|
video_file_set(vid, file);
|
||||||
|
video_position_set(vid, 0.0);
|
||||||
|
video_play_set(vid, EINA_TRUE);
|
||||||
|
elm_layout_signal_emit(lay, "action,newvid", "rage");
|
||||||
|
win_aspect_adjust(win);
|
||||||
|
win_title_update(win);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_video_next(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
if (!inf->file_list) return;
|
||||||
|
if (!inf->file_cur) l = inf->file_list;
|
||||||
|
else l = inf->file_cur->next;
|
||||||
|
if (!l)
|
||||||
|
{
|
||||||
|
elm_exit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
inf->file_cur = l;
|
||||||
|
_restart_vid(win, inf->lay, inf->vid, l->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_video_prev(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
if (!inf->file_list) return;
|
||||||
|
if (!inf->file_cur) l = eina_list_last(inf->file_list);
|
||||||
|
else l = inf->file_cur->prev;
|
||||||
|
if (!l) return;
|
||||||
|
inf->file_cur = l;
|
||||||
|
_restart_vid(win, inf->lay, inf->vid, l->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_video_first(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
if (!inf->file_list) return;
|
||||||
|
l = inf->file_list;
|
||||||
|
inf->file_cur = l;
|
||||||
|
_restart_vid(win, inf->lay, inf->vid, l->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_video_last(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
if (!inf->file_list) return;
|
||||||
|
l = eina_list_last(inf->file_list);
|
||||||
|
if (!l) return;
|
||||||
|
inf->file_cur = l;
|
||||||
|
_restart_vid(win, inf->lay, inf->vid, l->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
Eina_Bool
|
||||||
|
win_video_have_next(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
if (!inf->file_list) return EINA_FALSE;
|
||||||
|
if (!inf->file_cur) return EINA_FALSE;
|
||||||
|
else l = inf->file_cur->next;
|
||||||
|
if (!l) return EINA_FALSE;
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Eina_Bool
|
||||||
|
win_video_have_prev(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
if (!inf->file_list) return EINA_FALSE;
|
||||||
|
if (!inf->file_cur) return EINA_FALSE;
|
||||||
|
else l = inf->file_cur->prev;
|
||||||
|
if (!l) return EINA_FALSE;
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Evas_Object *
|
||||||
|
win_add(void)
|
||||||
|
{
|
||||||
|
Evas_Object *win, *o;
|
||||||
|
char buf[4096];
|
||||||
|
Inf *inf = calloc(1, sizeof(Inf));
|
||||||
|
|
||||||
|
if (!inf) return NULL;
|
||||||
|
|
||||||
|
win = elm_win_add(NULL, "Rage", ELM_WIN_BASIC);
|
||||||
|
if (!win) return NULL;
|
||||||
|
|
||||||
|
elm_win_title_set(win, "Rage");
|
||||||
|
elm_win_autodel_set(win, EINA_TRUE);
|
||||||
|
|
||||||
|
evas_object_data_set(win, "inf", inf);
|
||||||
|
evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cb_win_del, NULL);
|
||||||
|
evas_object_smart_callback_add(win, "fullscreen", _cb_fullscreen, NULL);
|
||||||
|
evas_object_smart_callback_add(win, "unfullscreen", _cb_unfullscreen, NULL);
|
||||||
|
evas_object_smart_callback_add(win, "normal", _cb_unfullscreen, NULL);
|
||||||
|
|
||||||
|
o = evas_object_image_add(evas_object_evas_get(win));
|
||||||
|
snprintf(buf, sizeof(buf), "%s/images/rage.png", elm_app_data_dir_get());
|
||||||
|
evas_object_image_file_set(o, buf, NULL);
|
||||||
|
elm_win_icon_object_set(win, o);
|
||||||
|
|
||||||
|
o = elm_layout_add(win);
|
||||||
|
snprintf(buf, sizeof(buf), "%s/themes/default.edj", elm_app_data_dir_get());
|
||||||
|
elm_layout_file_set(o, buf, "rage/core");
|
||||||
|
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||||
|
elm_win_resize_object_add(win, o);
|
||||||
|
evas_object_show(o);
|
||||||
|
inf->lay = o;
|
||||||
|
controls_init(win, o);
|
||||||
|
|
||||||
|
o = evas_object_rectangle_add(evas_object_evas_get(win));
|
||||||
|
elm_win_resize_object_add(win, o);
|
||||||
|
evas_object_color_set(o, 0, 0, 0, 0);
|
||||||
|
evas_object_repeat_events_set(o, EINA_TRUE);
|
||||||
|
evas_object_show(o);
|
||||||
|
inf->event = o;
|
||||||
|
dnd_init(win, o);
|
||||||
|
|
||||||
|
evas_object_event_callback_add(win, EVAS_CALLBACK_KEY_DOWN,
|
||||||
|
_cb_key_down, win);
|
||||||
|
return win;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_title_update(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
const char *file, *s;
|
||||||
|
char buf[4096];
|
||||||
|
|
||||||
|
if (!inf->file_cur)
|
||||||
|
{
|
||||||
|
elm_win_title_set(win, "Rage");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
file = inf->file_cur->data;
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
elm_win_title_set(win, "Rage");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
s = video_title_get(inf->vid);
|
||||||
|
if (s)
|
||||||
|
{
|
||||||
|
snprintf(buf, sizeof(buf), "Rage: %s", s);
|
||||||
|
elm_win_title_set(win, buf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s = ecore_file_file_get(file);
|
||||||
|
if ((s) && (s[0] != 0))
|
||||||
|
snprintf(buf, sizeof(buf), "Rage: %s", s);
|
||||||
|
else
|
||||||
|
snprintf(buf, sizeof(buf), "Rage: %s", file);
|
||||||
|
elm_win_title_set(win, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_show(Evas_Object *win, int w, int h)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
if (!inf->sized)
|
||||||
|
{
|
||||||
|
inf->sized = EINA_TRUE;
|
||||||
|
evas_object_resize(win, w, h);
|
||||||
|
if (inf->show_timeout)
|
||||||
|
{
|
||||||
|
ecore_timer_del(inf->show_timeout);
|
||||||
|
inf->show_timeout = NULL;
|
||||||
|
}
|
||||||
|
evas_object_show(win);
|
||||||
|
}
|
||||||
|
if (!video_has_video_get(inf->vid))
|
||||||
|
elm_layout_signal_emit(inf->lay, "state,novideo", "rage");
|
||||||
|
else
|
||||||
|
elm_layout_signal_emit(inf->lay, "state,video", "rage");
|
||||||
|
if (!video_has_audio_get(inf->vid))
|
||||||
|
elm_layout_signal_emit(inf->lay, "state,noaudio", "rage");
|
||||||
|
else
|
||||||
|
elm_layout_signal_emit(inf->lay, "state,audio", "rage");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_aspect_adjust(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
int w = 1, h = 1;
|
||||||
|
|
||||||
|
video_ratio_size_get(inf->vid, &w, &h);
|
||||||
|
if (inf->zoom_mode == 1)
|
||||||
|
evas_object_size_hint_aspect_set(inf->vid, EVAS_ASPECT_CONTROL_NEITHER,
|
||||||
|
w, h);
|
||||||
|
else
|
||||||
|
evas_object_size_hint_aspect_set(inf->vid, EVAS_ASPECT_CONTROL_BOTH,
|
||||||
|
w, h);
|
||||||
|
if (((w > 1) && (h > 1)) ||
|
||||||
|
((!video_has_video_get(inf->vid)) && (video_has_audio_get(inf->vid))))
|
||||||
|
{
|
||||||
|
if ((!video_has_video_get(inf->vid)) &&
|
||||||
|
(video_has_audio_get(inf->vid)))
|
||||||
|
w = h = 160;
|
||||||
|
win_show(win, w, h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_frame_decode(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
|
||||||
|
controls_update(inf->lay, inf->vid);
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
#ifndef _WIN_H__
|
||||||
|
#define _WIN_H__ 1
|
||||||
|
|
||||||
|
typedef struct _Inf Inf;
|
||||||
|
|
||||||
|
struct _Inf
|
||||||
|
{
|
||||||
|
Evas_Object *vid, *lay, *event;
|
||||||
|
Eina_List *file_list, *file_cur;
|
||||||
|
Ecore_Job *next_job;
|
||||||
|
Ecore_Timer *show_timeout;
|
||||||
|
double last_action;
|
||||||
|
double jump;
|
||||||
|
int zoom_mode;
|
||||||
|
Eina_Bool sized : 1;
|
||||||
|
Eina_Bool last_action_rwind : 1;
|
||||||
|
Eina_Bool playing : 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ui high level controls
|
||||||
|
void win_do_play(Evas_Object *win);
|
||||||
|
void win_do_pause(Evas_Object *win);
|
||||||
|
void win_do_play_pause(Evas_Object *win);
|
||||||
|
void win_do_prev(Evas_Object *win);
|
||||||
|
void win_do_next(Evas_Object *win);
|
||||||
|
|
||||||
|
// lower level controls
|
||||||
|
void win_video_next(Evas_Object *win);
|
||||||
|
void win_video_prev(Evas_Object *win);
|
||||||
|
void win_video_first(Evas_Object *win);
|
||||||
|
void win_video_last(Evas_Object *win);
|
||||||
|
Eina_Bool win_video_have_next(Evas_Object *win);
|
||||||
|
Eina_Bool win_video_have_prev(Evas_Object *win);
|
||||||
|
Evas_Object *win_add(void);
|
||||||
|
void win_title_update(Evas_Object *win);
|
||||||
|
void win_show(Evas_Object *win, int w, int h);
|
||||||
|
void win_aspect_adjust(Evas_Object *win);
|
||||||
|
void win_frame_decode(Evas_Object *win);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,161 @@
|
||||||
|
#include <Elementary.h>
|
||||||
|
#include "main.h"
|
||||||
|
#include "win.h"
|
||||||
|
#include "video.h"
|
||||||
|
#include "winvid.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_resize(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
win_aspect_adjust(data);
|
||||||
|
win_title_update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_decode(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
win_frame_decode(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_stop_next(void *data)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(data, "inf");
|
||||||
|
inf->next_job = NULL;
|
||||||
|
win_video_next(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(data, "inf");
|
||||||
|
printf("stop\n");
|
||||||
|
if (win_video_have_next(data))
|
||||||
|
{
|
||||||
|
if (inf->next_job) ecore_job_del(inf->next_job);
|
||||||
|
inf->next_job = ecore_job_add(_cb_stop_next, data);
|
||||||
|
}
|
||||||
|
else elm_exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_opened(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("opened\n");
|
||||||
|
win_aspect_adjust(data);
|
||||||
|
win_frame_decode(data);
|
||||||
|
win_title_update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_length(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("len\n");
|
||||||
|
win_frame_decode(data);
|
||||||
|
win_title_update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_title(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("title\n");
|
||||||
|
win_title_update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_audio(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("audio\n");
|
||||||
|
win_title_update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_channels(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("channels\n");
|
||||||
|
win_title_update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_play_start(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(data, "inf");
|
||||||
|
printf("play start\n");
|
||||||
|
win_aspect_adjust(data);
|
||||||
|
win_frame_decode(data);
|
||||||
|
win_title_update(data);
|
||||||
|
inf->playing = EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_play_finish(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(data, "inf");
|
||||||
|
printf("play finish\n");
|
||||||
|
if (!inf->playing) win_show(data, 160, 160);
|
||||||
|
inf->playing = EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_button_num(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("button num\n");
|
||||||
|
win_title_update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_button(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
|
{
|
||||||
|
printf("button\n");
|
||||||
|
win_title_update(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_video_init(Evas_Object *win)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
Evas_Object *o;
|
||||||
|
|
||||||
|
o = video_add(win);
|
||||||
|
video_fill_set(o, EINA_TRUE);
|
||||||
|
inf->vid = o;
|
||||||
|
evas_object_smart_callback_add(o, "frame_resize", _cb_resize, win);
|
||||||
|
evas_object_smart_callback_add(o, "frame_decode", _cb_decode, win);
|
||||||
|
evas_object_smart_callback_add(o, "stop", _cb_stop, win);
|
||||||
|
evas_object_smart_callback_add(o, "opened", _cb_opened, win);
|
||||||
|
evas_object_smart_callback_add(o, "length", _cb_length, win);
|
||||||
|
evas_object_smart_callback_add(o, "title", _cb_title, win);
|
||||||
|
evas_object_smart_callback_add(o, "audio", _cb_audio, win);
|
||||||
|
evas_object_smart_callback_add(o, "channels", _cb_channels, win);
|
||||||
|
evas_object_smart_callback_add(o, "play_start", _cb_play_start, win);
|
||||||
|
evas_object_smart_callback_add(o, "play_finish", _cb_play_finish, win);
|
||||||
|
evas_object_smart_callback_add(o, "button_num", _cb_button_num, win);
|
||||||
|
evas_object_smart_callback_add(o, "button", _cb_button, win);
|
||||||
|
elm_object_part_content_set(inf->lay, "rage.content", o);
|
||||||
|
evas_object_show(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_video_file_list_set(Evas_Object *win, Eina_List *list)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
Eina_List *l, *list2 = NULL;
|
||||||
|
const char *f;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(list, l, f)
|
||||||
|
{
|
||||||
|
list2 = eina_list_append(list2, eina_stringshare_add(f));
|
||||||
|
}
|
||||||
|
inf->file_list = list2;
|
||||||
|
win_video_next(win);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
win_video_insert(Evas_Object *win, const char *file)
|
||||||
|
{
|
||||||
|
Inf *inf = evas_object_data_get(win, "inf");
|
||||||
|
|
||||||
|
inf->file_list = eina_list_append_relative_list
|
||||||
|
(inf->file_list, eina_stringshare_add(file), inf->file_cur);
|
||||||
|
evas_object_data_set(win, "file_list", inf->file_list);
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef _WINVID_H__
|
||||||
|
#define _WINVID_H__ 1
|
||||||
|
|
||||||
|
void win_video_init(Evas_Object *win);
|
||||||
|
void win_video_file_list_set(Evas_Object *win, Eina_List *list);
|
||||||
|
void win_video_insert(Evas_Object *win, const char *file);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue