[PATCH] Improvements to mb-desktop-xine-0.4
Terry Barnaby <[email protected]> Mon, 20 Jun 2005 16:52:35 +0100
| Newsgroups | gmane.comp.handhelds.matchbox |
|---|---|
| Message-ID | <[email protected]> |
Hi, I have started using matchbox as the basis for a simple in-car multimedia systems GUI. Thanks to every one involed in devloping Matchbox, this is now working well for me. I had to do some mods to mb-desktop-xine-0.4 to get it to work well on my system and I enclose a patch with the mods I made in case they are usefull to someone. The mods do the following: 1. Add support for Videos greater than 2GByte in size. 2. Add support for mouse/touch-screen operation. The screen is divided into 9 rectangular areas (0 - 8) which when clicked/touched will perform a function. The functions so far defined: 0: Stop 1: VolumeUp 2: Stop 3: Left (GoBack) 4: Stop 5: Right(GoForward); 6: Stop 7: VolumeDown 8: Stop 3. Changed default view to VIEW_ICON rather than VIEW_LIST so more videos can be seen on screen. 4. Fixed aspect ratio bug. 5. Added support for *.mp4 files Terry _______________________________________________ Matchbox mailing list [email protected] https://handhelds.org/mailman/listinfo/matchbox
mb-desktop-xine-beam-1.patch
(text/x-patch, 18 KB)
diff -u -r mb-desktop-xine-0.4/xinebrowser.c svn/mb-desktop-xine-0.4/xinebrowser.c
--- mb-desktop-xine-0.4/xinebrowser.c 2004-02-07 19:11:08.000000000 +0000
+++ svn/mb-desktop-xine-0.4/xinebrowser.c 2005-06-20 16:32:31.000000000 +0100
@@ -18,6 +18,11 @@
/* Xine callbacks */
+typedef enum _XBCommand { XB_COMMAND_HOME, XB_COMMAND_INFO, XB_COMMAND_QUIT, XB_COMMAND_MUTE,
+ XB_COMMAND_VOLUME_UP, XB_COMMAND_VOLUME_DOWN, XB_COMMAND_UP, XB_COMMAND_DOWN,
+ XB_COMMAND_LEFT, XB_COMMAND_RIGHT, XB_COMMAND_SELECT, XB_COMMAND_PAUSE, XB_COMMAND_FAST } XBCommand;
+
+
static void
dest_size_cb(void *user_data, int video_width, int video_height,
double video_pixel_aspect, int *dest_width,
@@ -220,7 +225,7 @@
res_h = (DisplayWidth(display, screen) * 1000 / DisplayWidthMM(display,
screen));
res_v = (DisplayHeight(display, screen) * 1000 / DisplayHeightMM(display,
- screen));
+ screen));
XSync(display, False);
XUnlockDisplay(display);
@@ -231,7 +236,7 @@
vis.dest_size_cb = dest_size_cb;
vis.frame_output_cb = frame_output_cb;
vis.user_data = (void *)data;
- data->pixel_aspect = res_v / res_h;
+ data->pixel_aspect = (double)res_v / res_h;
/* Assume we get fullscreen */
data->width = DisplayWidth(display, screen);
@@ -403,12 +408,182 @@
}
void
+xinebrowser_command (MBDesktop *mb, BrowserData *data, XBCommand cmd)
+{
+ Bool old_show;
+ Bool playing_fast = False;
+ int pos_stream; /* 0..65535 */
+ int pos_time; /* milliseconds */
+ int length_time;/* milliseconds */
+
+ switch (cmd)
+ {
+ case XB_COMMAND_HOME:
+ if (data->current_mode == MBX_MODE_MOVIE_DVD)
+ {
+ xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_MENU1);
+ }
+ break;
+ case XB_COMMAND_INFO:
+ if (data->showing_info)
+ {
+ data->showing_info = False;
+ xine_osd_hide(data->osd, 0);
+ }
+ else
+ data->showing_info = True;
+ break;
+ case XB_COMMAND_QUIT:
+ data->running = 0;
+ break;
+ case XB_COMMAND_MUTE:
+ xinebrowser_volume_change (mb, data, MBX_VOLUME_TOGGLE_MUTE);
+ break;
+ case XB_COMMAND_VOLUME_UP:
+ xinebrowser_volume_change (mb, data, MBX_VOLUME_INC);
+ break;
+ case XB_COMMAND_VOLUME_DOWN:
+ xinebrowser_volume_change (mb, data, MBX_VOLUME_DEC);
+ break;
+ case XB_COMMAND_UP:
+ if (data->current_mode == MBX_MODE_MOVIE_DVD)
+ {
+ xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_UP);
+ }
+ else xinebrowser_volume_change (mb, data, MBX_VOLUME_INC);
+ break;
+
+ case XB_COMMAND_DOWN:
+ if (data->current_mode == MBX_MODE_MOVIE_DVD)
+ {
+ xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_DOWN);
+ }
+ else xinebrowser_volume_change (mb, data, MBX_VOLUME_DEC);
+ break;
+
+ case XB_COMMAND_RIGHT:
+ old_show = data->showing_info;
+ data->showing_info = False;
+ data->last_osd_show_time = 0;
+ xine_osd_hide(data->osd, 0);
+ if (data->current_mode == MBX_MODE_MUSIC_FILE)
+ {
+ data->current_item
+ = xinebrowser_get_next_item(mb, data, data->current_item);
+ xinebrowser_play(mb, data,
+ mbdesktop_item_get_extended_name(mb, data->current_item));
+ xinebrowser_show_info (mb, data, MBX_INFO_TIMEOUT);
+ }
+ else if (data->current_mode == MBX_MODE_MUSIC_CD)
+ {
+ if (++data->cd_idx == data->cd_num_mrls)
+ data->cd_idx = 0;
+
+ /* Play next track */
+ if((!xine_open(data->stream, data->cd_mrls[data->cd_idx]))
+ || (!xine_play(data->stream, 0, 0)))
+ return; /* Failed to play */
+
+ xinebrowser_show_info (mb, data, MBX_INFO_TIMEOUT);
+ }
+ else if (data->current_mode == MBX_MODE_MOVIE_DVD)
+ {
+ xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_RIGHT);
+ /* XINE_EVENT_INPUT_NEXT ? */
+ }
+ else
+ {
+ if (xine_get_pos_length (data->stream, &pos_stream,
+ &pos_time, &length_time))
+ {
+ if (!xine_play (data->stream, pos_stream+1000, 0 ))
+ {
+ fprintf(stderr, "mbdesktop-xine: seek failed\n");
+ }
+ }
+ }
+ data->showing_info = old_show;
+ break;
+ case XB_COMMAND_LEFT:
+ old_show = data->showing_info;
+ data->showing_info = False;
+ xine_osd_hide(data->osd, 0);
+ if (data->current_mode == MBX_MODE_MUSIC_FILE)
+ {
+ data->current_item
+ = xinebrowser_get_prev_item(mb, data, data->current_item);
+ xinebrowser_play(mb, data, mbdesktop_item_get_extended_name(mb, data->current_item));
+ xinebrowser_show_info (mb, data, MBX_INFO_TIMEOUT);
+ }
+ else if (data->current_mode == MBX_MODE_MUSIC_CD)
+ {
+ if (--data->cd_idx < 0)
+ data->cd_idx = 0;
+
+ /* Play next track */
+ if((!xine_open(data->stream, data->cd_mrls[data->cd_idx]))
+ || (!xine_play(data->stream, 0, 0)))
+ return; /* Failed to play */
+
+ xinebrowser_show_info (mb, data, MBX_INFO_TIMEOUT);
+ }
+ else if (data->current_mode == MBX_MODE_MOVIE_DVD)
+ {
+ xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_LEFT);
+ /* XINE_EVENT_INPUT_PREV ? */
+ }
+ else
+ {
+ if (xine_get_pos_length (data->stream, &pos_stream,
+ &pos_time, &length_time))
+ {
+ if (!xine_play (data->stream,
+ (pos_stream-1000 > 0) ? pos_stream-1000 : 0,
+ 0 ))
+ {
+ fprintf(stderr, "mbdesktop-xine: seek failed\n");
+ }
+ }
+ }
+ data->showing_info = old_show;
+ break;
+
+ case XB_COMMAND_PAUSE:
+ if(xine_get_param(data->stream, XINE_PARAM_SPEED) != XINE_SPEED_PAUSE)
+ xine_set_param(data->stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
+ else
+ xine_set_param(data->stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL);
+ break;
+ case XB_COMMAND_FAST:
+ if (playing_fast)
+ {
+ playing_fast = False;
+ xine_set_param(data->stream, XINE_PARAM_SPEED,
+ XINE_SPEED_NORMAL );
+ } else {
+ playing_fast = True;
+ xine_set_param(data->stream, XINE_PARAM_SPEED,
+ XINE_SPEED_FAST_4 );
+ }
+
+ break;
+ case XB_COMMAND_SELECT:
+ if (data->current_mode == MBX_MODE_MOVIE_DVD)
+ {
+ xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_SELECT);
+ }
+ else data->running = 0; /* Quit - func mainly for handhelds */
+ break;
+ }
+}
+
+void
xinebrowser_win_event_loop (MBDesktop *mb, BrowserData *data)
{
Display *display = data->display;
int screen = mbdesktop_xscreen(mb);
+ KeySym ksym;
Bool old_show;
- Bool playing_fast = False;
data->running = 1;
data->showing_info = False;
@@ -421,206 +596,78 @@
XNextEvent(display, &xevent);
switch(xevent.type) {
-
+ case ButtonPress:
+ {
+ int pos = 0;
+ int displayWidth = DisplayWidth(display, screen);
+ int displayHeight = DisplayHeight(display, screen);
+
+// printf("BEAM Button press: (%d,%d)\n", xevent.xbutton.x, xevent.xbutton.y);
+ pos = xevent.xbutton.x / (displayWidth / 3);
+ pos = pos + 3 * (xevent.xbutton.y / (displayHeight / 3));
+// printf("BEAM Button Pos: %d\n", pos);
+
+ switch(pos){
+ case 1: xinebrowser_command(mb, data, XB_COMMAND_UP); break;
+ case 7: xinebrowser_command(mb, data, XB_COMMAND_DOWN); break;
+ case 3: xinebrowser_command(mb, data, XB_COMMAND_LEFT); break;
+ case 5: xinebrowser_command(mb, data, XB_COMMAND_RIGHT); break;
+
+ case 4:
+ default:
+ xinebrowser_command(mb, data, XB_COMMAND_SELECT);
+ break;
+ }
+ }
case KeyPress:
{
XKeyEvent kevent;
- KeySym ksym;
char kbuf[256];
int len;
- int pos_stream; /* 0..65535 */
- int pos_time; /* milliseconds */
- int length_time;/* milliseconds */
kevent = xevent.xkey;
-
+
XLockDisplay(display);
len = XLookupString(&kevent, kbuf, sizeof(kbuf), &ksym, NULL);
XUnlockDisplay(display);
switch (ksym)
{
- case XK_Home:
- if (data->current_mode == MBX_MODE_MOVIE_DVD)
- {
- xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_MENU1);
- }
- break;
- /*
- also
-
- case BVW_DVD_TITLE_MENU:
- event.type = XINE_EVENT_INPUT_MENU2;
- break;
- case BVW_DVD_SUBPICTURE_MENU:
- event.type = XINE_EVENT_INPUT_MENU4;
- break;
- case BVW_DVD_AUDIO_MENU:
- event.type = XINE_EVENT_INPUT_MENU5;
- break;
- case BVW_DVD_ANGLE_MENU:
- event.type = XINE_EVENT_INPUT_MENU6;
- break;
- case BVW_DVD_CHAPTER_MENU:
- event.type = XINE_EVENT_INPUT_MENU7;
- break;
-
- */
- case XK_i:
- if (data->showing_info)
- {
- data->showing_info = False;
- xine_osd_hide(data->osd, 0);
- }
- else
- data->showing_info = True;
- break;
- case XK_q:
- case XK_Q:
- data->running = 0;
- break;
- case XK_m:
- case XK_M:
- xinebrowser_volume_change (mb, data, MBX_VOLUME_TOGGLE_MUTE);
- break;
- case XK_plus:
- xinebrowser_volume_change (mb, data, MBX_VOLUME_INC);
- break;
- case XK_minus:
- xinebrowser_volume_change (mb, data, MBX_VOLUME_DEC);
- break;
- case XK_Up:
- if (data->current_mode == MBX_MODE_MOVIE_DVD)
- {
- xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_UP);
- }
- else xinebrowser_volume_change (mb, data, MBX_VOLUME_INC);
- break;
-
- case XK_Down:
- if (data->current_mode == MBX_MODE_MOVIE_DVD)
- {
- xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_DOWN);
- }
- else xinebrowser_volume_change (mb, data, MBX_VOLUME_DEC);
- break;
-
- case XK_Right:
- old_show = data->showing_info;
- data->showing_info = False;
- data->last_osd_show_time = 0;
- xine_osd_hide(data->osd, 0);
- if (data->current_mode == MBX_MODE_MUSIC_FILE)
- {
- data->current_item
- = xinebrowser_get_next_item(mb, data, data->current_item);
- xinebrowser_play(mb, data,
- mbdesktop_item_get_extended_name(mb, data->current_item));
- xinebrowser_show_info (mb, data, MBX_INFO_TIMEOUT);
- }
- else if (data->current_mode == MBX_MODE_MUSIC_CD)
- {
- if (++data->cd_idx == data->cd_num_mrls)
- data->cd_idx = 0;
-
- /* Play next track */
- if((!xine_open(data->stream, data->cd_mrls[data->cd_idx]))
- || (!xine_play(data->stream, 0, 0)))
- return; /* Failed to play */
-
- xinebrowser_show_info (mb, data, MBX_INFO_TIMEOUT);
- }
- else if (data->current_mode == MBX_MODE_MOVIE_DVD)
- {
- xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_RIGHT);
- /* XINE_EVENT_INPUT_NEXT ? */
- }
- else
- {
- if (xine_get_pos_length (data->stream, &pos_stream,
- &pos_time, &length_time))
- {
- if (!xine_play (data->stream, pos_stream+1000, 0 ))
- {
- fprintf(stderr, "mbdesktop-xine: seek failed\n");
- }
- }
- }
- data->showing_info = old_show;
- break;
- case XK_Left:
- old_show = data->showing_info;
- data->showing_info = False;
- xine_osd_hide(data->osd, 0);
- if (data->current_mode == MBX_MODE_MUSIC_FILE)
- {
- data->current_item
- = xinebrowser_get_prev_item(mb, data, data->current_item);
- xinebrowser_play(mb, data, mbdesktop_item_get_extended_name(mb, data->current_item));
- xinebrowser_show_info (mb, data, MBX_INFO_TIMEOUT);
- }
- else if (data->current_mode == MBX_MODE_MUSIC_CD)
- {
- if (--data->cd_idx < 0)
- data->cd_idx = 0;
-
- /* Play next track */
- if((!xine_open(data->stream, data->cd_mrls[data->cd_idx]))
- || (!xine_play(data->stream, 0, 0)))
- return; /* Failed to play */
-
- xinebrowser_show_info (mb, data, MBX_INFO_TIMEOUT);
- }
- else if (data->current_mode == MBX_MODE_MOVIE_DVD)
- {
- xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_LEFT);
- /* XINE_EVENT_INPUT_PREV ? */
- }
- else
- {
- if (xine_get_pos_length (data->stream, &pos_stream,
- &pos_time, &length_time))
- {
- if (!xine_play (data->stream,
- (pos_stream-1000 > 0) ? pos_stream-1000 : 0,
- 0 ))
- {
- fprintf(stderr, "mbdesktop-xine: seek failed\n");
- }
- }
- }
- data->showing_info = old_show;
- break;
-
- case XK_space:
- if(xine_get_param(data->stream, XINE_PARAM_SPEED) != XINE_SPEED_PAUSE)
- xine_set_param(data->stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
- else
- xine_set_param(data->stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL);
- break;
- case XK_f:
- if (playing_fast)
- {
- playing_fast = False;
- xine_set_param(data->stream, XINE_PARAM_SPEED,
- XINE_SPEED_NORMAL );
- } else {
- playing_fast = True;
- xine_set_param(data->stream, XINE_PARAM_SPEED,
- XINE_SPEED_FAST_4 );
- }
-
- break;
- case XK_Return:
- case XK_KP_Enter:
- if (data->current_mode == MBX_MODE_MOVIE_DVD)
- {
- xinebrowser_dvd_send_event (mb, data, XINE_EVENT_INPUT_SELECT);
- }
- else data->running = 0; /* Quit - func mainly for handhelds */
- break;
-
-
+ case XK_Home: xinebrowser_command(mb, data, XB_COMMAND_HOME); break;
+ case XK_i: xinebrowser_command(mb, data, XB_COMMAND_INFO); break;
+ case XK_Q:
+ case XK_q: xinebrowser_command(mb, data, XB_COMMAND_QUIT); break;
+ case XK_M:
+ case XK_m: xinebrowser_command(mb, data, XB_COMMAND_MUTE); break;
+ case XK_plus: xinebrowser_command(mb, data, XB_COMMAND_VOLUME_UP); break;
+ case XK_minus: xinebrowser_command(mb, data, XB_COMMAND_VOLUME_DOWN); break;
+ case XK_Up: xinebrowser_command(mb, data, XB_COMMAND_UP); break;
+ case XK_Down: xinebrowser_command(mb, data, XB_COMMAND_DOWN); break;
+ case XK_Right: xinebrowser_command(mb, data, XB_COMMAND_RIGHT); break;
+ case XK_Left: xinebrowser_command(mb, data, XB_COMMAND_LEFT); break;
+ case XK_space: xinebrowser_command(mb, data, XB_COMMAND_PAUSE); break;
+ case XK_f: xinebrowser_command(mb, data, XB_COMMAND_FAST); break;
+ case XK_KP_Enter:
+ case XK_Return: xinebrowser_command(mb, data, XB_COMMAND_SELECT); break;
+ /*
+ also
+
+ case BVW_DVD_TITLE_MENU:
+ event.type = XINE_EVENT_INPUT_MENU2;
+ break;
+ case BVW_DVD_SUBPICTURE_MENU:
+ event.type = XINE_EVENT_INPUT_MENU4;
+ break;
+ case BVW_DVD_AUDIO_MENU:
+ event.type = XINE_EVENT_INPUT_MENU5;
+ break;
+ case BVW_DVD_ANGLE_MENU:
+ event.type = XINE_EVENT_INPUT_MENU6;
+ break;
+ case BVW_DVD_CHAPTER_MENU:
+ event.type = XINE_EVENT_INPUT_MENU7;
+ break;
+ */
}
}
break;
@@ -691,11 +738,8 @@
data->showing_info = old_show;
data->running = 1;
-
}
}
-
-
}
static void
@@ -1115,7 +1159,7 @@
mbdesktop_item_set_user_data (mb, folder, (void *)data);
mbdesktop_item_set_extended_name(mb, folder, data->BrowserFolderName);
- mbdesktop_item_folder_set_view (mb, folder, VIEW_LIST);
+ mbdesktop_item_folder_set_view (mb, folder, VIEW_ICONS);
mbdesktop_items_append_to_top_level (mb, folder);
mbdesktop_item_set_activate_callback (mb, folder,
@@ -1146,7 +1190,7 @@
data->BrowserMusicFolderName,
"mbmusicfolder.png");
- mbdesktop_item_folder_set_view (mb, folder, VIEW_LIST);
+ mbdesktop_item_folder_set_view (mb, folder, VIEW_ICONS);
mbdesktop_item_set_user_data (mb, folder, (void *)data);
mbdesktop_item_set_extended_name(mb, folder,
data->BrowserMusicFolderName);
@@ -1161,7 +1205,7 @@
mbdesktop_item_set_extended_name(mb, subitem,
data->BrowserMusicFolderName);
- mbdesktop_item_folder_set_view (mb, subitem, VIEW_LIST);
+ mbdesktop_item_folder_set_view (mb, subitem, VIEW_ICONS);
mbdesktop_item_set_user_data (mb, subitem, (void *)data);
mbdesktop_items_append_to_folder(mb, folder, subitem );
@@ -1230,7 +1274,7 @@
data->BrowserRadioFolderName,
"mbmusicfolder.png");
- mbdesktop_item_folder_set_view (mb, subitem, VIEW_LIST);
+ mbdesktop_item_folder_set_view (mb, subitem, VIEW_ICONS);
mbdesktop_item_set_user_data (mb, subitem, (void *)data);
mbdesktop_item_set_extended_name(mb, subitem, "Radio");
diff -u -r mb-desktop-xine-0.4/xinebrowser_callbacks.c svn/mb-desktop-xine-0.4/xinebrowser_callbacks.c
--- mb-desktop-xine-0.4/xinebrowser_callbacks.c 2004-02-07 19:11:22.000000000 +0000
+++ svn/mb-desktop-xine-0.4/xinebrowser_callbacks.c 2005-06-20 16:31:48.000000000 +0100
@@ -13,6 +13,9 @@
GNU General Public License for more details.
*/
+/* BEAM add support for bigger files */
+#define _FILE_OFFSET_BITS 64
+
#include "xinebrowser.h"
static void
@@ -243,7 +246,7 @@
if (mbdesktop_item_folder_has_contents(mb, item_folder))
mbdesktop_item_folder_contents_free(mb, item_folder);
- if (regcomp(&re, ".*(avi|mpg|mpeg|wmv|asf|mov)$",
+ if (regcomp(&re, ".*(avi|mpg|mpeg|wmv|asf|mov|mp4)$",
REG_EXTENDED|REG_ICASE|REG_NOSUB) != 0)
{
fprintf(stderr, "mbdesktop-filebrowser: failed to compile regexp\n");
@@ -309,7 +312,7 @@
mbdesktop_items_append_to_folder (mb, item_folder, subfolder);
- mbdesktop_item_folder_set_view (mb, subfolder, VIEW_LIST);
+ mbdesktop_item_folder_set_view (mb, subfolder, VIEW_ICONS);
mbdesktop_item_set_activate_callback (mb, subfolder,
xinebrowser_movie_open_cb);
@@ -375,7 +378,7 @@
}
mbdesktop_item_set_extended_name (mb, item_new, full_path);
-
+
if (mod_data->use_video_thumbnails)
mbdesktop_item_cache(mb, item_new, full_path);
@@ -550,7 +553,7 @@
mbdesktop_item_set_extended_name (mb, subfolder, subfolderlongname);
mbdesktop_item_set_user_data (mb, subfolder, (void *)mod_data);
- mbdesktop_item_folder_set_view (mb, subfolder, VIEW_LIST);
+ mbdesktop_item_folder_set_view (mb, subfolder, VIEW_ICONS);
mbdesktop_items_append_to_folder (mb, item_folder, subfolder);
mbdesktop_item_set_activate_callback (mb, subfolder,