00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <vlc/vlc.h>
00029 #include <vlc/intf.h>
00030
00031 #if defined( UNDER_CE ) && defined(__MINGW32__)
00032
00033 #define _off_t long
00034 #endif
00035
00036 #include "wince.h"
00037
00038 #include <objbase.h>
00039
00040
00041
00042
00043 static int Open ( vlc_object_t * );
00044 static void Close ( vlc_object_t * );
00045 static void Run ( intf_thread_t * );
00046
00047 static int OpenDialogs( vlc_object_t * );
00048
00049 static void MainLoop ( intf_thread_t * );
00050 static void ShowDialog( intf_thread_t *, int, int, intf_dialog_args_t * );
00051
00052
00053
00054
00055 #define EMBED_TEXT N_("Embed video in interface")
00056 #define EMBED_LONGTEXT N_("Embed the video inside the interface instead " \
00057 "of having it in a separate window.")
00058
00059 vlc_module_begin();
00060 set_description( (char *) _("WinCE interface module") );
00061 set_capability( "interface", 100 );
00062 set_callbacks( Open, Close );
00063 add_shortcut( "wince" );
00064 set_program( "wcevlc" );
00065
00066 add_bool( "wince-embed", 1, NULL,
00067 EMBED_TEXT, EMBED_LONGTEXT, VLC_FALSE );
00068
00069 add_submodule();
00070 set_description( _("WinCE dialogs provider") );
00071 set_capability( "dialogs provider", 10 );
00072 set_callbacks( OpenDialogs, Close );
00073 vlc_module_end();
00074
00075 HINSTANCE hInstance = 0;
00076
00077 #if !defined(__BUILTIN__)
00078 extern "C" BOOL WINAPI
00079 DllMain( HANDLE hModule, DWORD fdwReason, LPVOID lpReserved )
00080 {
00081 hInstance = (HINSTANCE)hModule;
00082 return TRUE;
00083 }
00084 #endif
00085
00086
00087 wchar_t pwsz_mbtow_wince[2048];
00088 char psz_wtomb_wince[2048];
00089
00090
00091
00092
00093 static int Open( vlc_object_t *p_this )
00094 {
00095 intf_thread_t *p_intf = (intf_thread_t *)p_this;
00096
00097
00098
00099 HWND hwndMain = FindWindow( _T("VLC WinCE"), _T("VLC media player") );
00100 if( hwndMain )
00101 {
00102 SetForegroundWindow( hwndMain );
00103 return VLC_EGENERIC;
00104 }
00105
00106
00107 p_intf->p_sys = (intf_sys_t *)malloc( sizeof( intf_sys_t ) );
00108 if( p_intf->p_sys == NULL )
00109 {
00110 msg_Err( p_intf, "out of memory" );
00111 return VLC_EGENERIC;
00112 }
00113
00114
00115 p_intf->p_sys->p_sub = msg_Subscribe( p_intf );
00116
00117
00118 p_intf->p_sys->p_audio_menu = NULL;
00119 p_intf->p_sys->p_video_menu = NULL;
00120 p_intf->p_sys->p_navig_menu = NULL;
00121 p_intf->p_sys->p_settings_menu = NULL;
00122
00123 p_intf->pf_run = Run;
00124 p_intf->pf_show_dialog = NULL;
00125
00126 p_intf->p_sys->p_input = NULL;
00127 p_intf->p_sys->b_playing = 0;
00128 p_intf->p_sys->i_playing = -1;
00129 p_intf->p_sys->b_slider_free = 1;
00130 p_intf->p_sys->i_slider_pos = p_intf->p_sys->i_slider_oldpos = 0;
00131
00132 return VLC_SUCCESS;
00133 }
00134
00135 static int OpenDialogs( vlc_object_t *p_this )
00136 {
00137 intf_thread_t *p_intf = (intf_thread_t *)p_this;
00138 int i_ret = Open( p_this );
00139
00140 p_intf->pf_show_dialog = ShowDialog;
00141
00142 return i_ret;
00143 }
00144
00145
00146
00147
00148 static void Close( vlc_object_t *p_this )
00149 {
00150 intf_thread_t *p_intf = (intf_thread_t *)p_this;
00151
00152 if( p_intf->p_sys->p_input )
00153 {
00154 vlc_object_release( p_intf->p_sys->p_input );
00155 }
00156
00157 MenuItemExt::ClearList( p_intf->p_sys->p_video_menu );
00158 delete p_intf->p_sys->p_video_menu;
00159 MenuItemExt::ClearList( p_intf->p_sys->p_audio_menu );
00160 delete p_intf->p_sys->p_audio_menu;
00161 MenuItemExt::ClearList( p_intf->p_sys->p_settings_menu );
00162 delete p_intf->p_sys->p_settings_menu;
00163 MenuItemExt::ClearList( p_intf->p_sys->p_navig_menu );
00164 delete p_intf->p_sys->p_navig_menu;
00165
00166 if( p_intf->pf_show_dialog )
00167 {
00168
00169 #if 0
00170 wxCommandEvent event( wxEVT_DIALOG, INTF_DIALOG_EXIT );
00171 p_intf->p_sys->p_wxwindow->AddPendingEvent( event );
00172 #endif
00173 vlc_thread_join( p_intf );
00174 }
00175
00176
00177 msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub );
00178
00179
00180 free( p_intf->p_sys );
00181 }
00182
00183
00184
00185
00186 static void Run( intf_thread_t *p_intf )
00187 {
00188 if( p_intf->pf_show_dialog )
00189 {
00190
00191
00192
00193 if( vlc_thread_create( p_intf, "Skins Dialogs Thread",
00194 MainLoop, 0, VLC_TRUE ) )
00195 {
00196 msg_Err( p_intf, "cannot create Skins Dialogs Thread" );
00197 p_intf->pf_show_dialog = NULL;
00198 }
00199 }
00200 else
00201 {
00202
00203 MainLoop( p_intf );
00204 }
00205 }
00206
00207 static void MainLoop( intf_thread_t *p_intf )
00208 {
00209 MSG msg;
00210 Interface *intf = 0;
00211
00212 if( !hInstance ) hInstance = GetModuleHandle(NULL);
00213
00214
00215 WNDCLASS wc;
00216 wc.style = CS_HREDRAW | CS_VREDRAW ;
00217 wc.lpfnWndProc = (WNDPROC)CBaseWindow::BaseWndProc;
00218 wc.cbClsExtra = 0;
00219 wc.cbWndExtra = 0;
00220 wc.hIcon = NULL;
00221 wc.hInstance = hInstance;
00222 wc.hCursor = NULL;
00223 wc.hbrBackground = (HBRUSH)(COLOR_MENU+1);
00224 wc.lpszMenuName = NULL;
00225 wc.lpszClassName = _T("VLC WinCE");
00226 RegisterClass( &wc );
00227
00228 #ifndef UNDER_CE
00229
00230 CoInitialize( 0 );
00231 #endif
00232
00233 if( !p_intf->pf_show_dialog )
00234 {
00235
00236 p_intf->p_sys->p_window = intf = new Interface( p_intf, 0, hInstance );
00237
00238
00239 if( !intf->InitInstance() ) goto end;
00240 }
00241
00242
00243 p_intf->p_sys->p_window =
00244 CreateDialogsProvider( p_intf, p_intf->pf_show_dialog ?
00245 NULL : p_intf->p_sys->p_window, hInstance );
00246
00247 p_intf->p_sys->pf_show_dialog = ShowDialog;
00248
00249
00250 vlc_thread_ready( p_intf );
00251
00252
00253 if( !p_intf->pf_show_dialog && p_intf->b_play )
00254 {
00255 playlist_t *p_playlist =
00256 (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
00257 FIND_ANYWHERE );
00258 if( p_playlist )
00259 {
00260 playlist_Play( p_playlist );
00261 vlc_object_release( p_playlist );
00262 }
00263 }
00264
00265
00266 while( GetMessage( &msg, NULL, 0, 0 ) > 0 )
00267 {
00268 TranslateMessage( &msg );
00269 DispatchMessage( &msg );
00270 }
00271
00272 end:
00273 if( intf ) delete intf;
00274
00275 #ifndef UNDER_CE
00276
00277 CoUninitialize();
00278 #endif
00279 }
00280
00281
00282
00283
00284 LRESULT CALLBACK CBaseWindow::BaseWndProc( HWND hwnd, UINT msg, WPARAM wParam,
00285 LPARAM lParam )
00286 {
00287 CBaseWindow *p_obj;
00288
00289
00290 if( msg == WM_CREATE )
00291 {
00292 p_obj = (CBaseWindow *)(((LPCREATESTRUCT)lParam)->lpCreateParams);
00293 SetWindowLong( hwnd, GWL_USERDATA,
00294 (LONG)((LPCREATESTRUCT)lParam)->lpCreateParams );
00295
00296 p_obj->hWnd = hwnd;
00297 }
00298
00299 if( msg == WM_INITDIALOG )
00300 {
00301 p_obj = (CBaseWindow *)lParam;
00302 SetWindowLong( hwnd, GWL_USERDATA, lParam );
00303 p_obj->hWnd = hwnd;
00304 }
00305
00306
00307 p_obj = (CBaseWindow *)GetWindowLong( hwnd, GWL_USERDATA );
00308
00309 if( !p_obj ) return DefWindowProc( hwnd, msg, wParam, lParam );
00310
00311
00312 return p_obj->WndProc( hwnd, msg, wParam, lParam );
00313 }
00314
00315 int CBaseWindow::CreateDialogBox( HWND hwnd, CBaseWindow *p_obj )
00316 {
00317 uint8_t p_buffer[sizeof(DLGTEMPLATE) + sizeof(WORD) * 4];
00318 DLGTEMPLATE *p_dlg_template = (DLGTEMPLATE *)p_buffer;
00319 memset( p_dlg_template, 0, sizeof(DLGTEMPLATE) + sizeof(WORD) * 4 );
00320
00321
00322 p_dlg_template->x = 0; p_dlg_template->y = 0;
00323 p_dlg_template->cx = 300; p_dlg_template->cy = 300;
00324 p_dlg_template->style =
00325 DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX;
00326
00327 return DialogBoxIndirectParam( GetModuleHandle(0), p_dlg_template, hwnd,
00328 (DLGPROC)p_obj->BaseWndProc, (LPARAM)p_obj);
00329 }
00330
00331
00332
00333
00334 static void ShowDialog( intf_thread_t *p_intf, int i_dialog_event, int i_arg,
00335 intf_dialog_args_t *p_arg )
00336 {
00337 SendMessage( p_intf->p_sys->p_window->GetHandle(), WM_CANCELMODE, 0, 0 );
00338 if( i_dialog_event == INTF_DIALOG_POPUPMENU && i_arg == 0 ) return;
00339
00340
00341
00342 #if 0
00343 if( i_dialog_event != INTF_DIALOG_POPUPMENU ||
00344 !p_intf->p_sys->p_popup_menu )
00345 #endif
00346 {
00347 SendMessage( p_intf->p_sys->p_window->GetHandle(),
00348 WM_APP + i_dialog_event, (WPARAM)i_arg, (LPARAM)p_arg );
00349 }
00350 }