wince.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:11k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * wince.cpp: WinCE gui plugin for VLC
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: 1a6928ce81ff66b75ad0474a27b4a7f71ee50837 $
  6.  *
  7.  * Author: Gildas Bazin <gbazin@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111,
  22.  * USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #ifdef HAVE_CONFIG_H
  28. # include "config.h"
  29. #endif
  30. #include <vlc_common.h>
  31. #include <vlc_plugin.h>
  32. #include <vlc_interface.h>
  33. #include <vlc_input.h>
  34. #if defined( UNDER_CE ) && defined(__MINGW32__)
  35. /* This is a gross hack for the wince gcc cross-compiler */
  36. #define _off_t long
  37. #endif
  38. #include "wince.h"
  39. #include <objbase.h>
  40. /*****************************************************************************
  41.  * Local prototypes.
  42.  *****************************************************************************/
  43. static int  Open   ( vlc_object_t * );
  44. static void Close  ( vlc_object_t * );
  45. static void Run    ( intf_thread_t * );
  46. static int  OpenDialogs( vlc_object_t * );
  47. static void* MainLoop  ( vlc_object_t * );
  48. static void ShowDialog( intf_thread_t *, int, int, intf_dialog_args_t * );
  49. /*****************************************************************************
  50.  * Module descriptor
  51.  *****************************************************************************/
  52. #define EMBED_TEXT N_("Embed video in interface")
  53. #define EMBED_LONGTEXT N_("Embed the video inside the interface instead " 
  54.     "of having it in a separate window.")
  55. vlc_module_begin ()
  56.     set_shortname( "WinCE" )
  57.     set_description( (char *) _("WinCE interface") )
  58.     set_capability( "interface", 100 )
  59.     set_callbacks( Open, Close )
  60.     add_shortcut( "wince" )
  61.     set_category( CAT_INTERFACE )
  62.     set_subcategory( SUBCAT_INTERFACE_MAIN )
  63.     add_bool( "wince-embed", 1, NULL,
  64.               EMBED_TEXT, EMBED_LONGTEXT, false )
  65.     add_submodule ()
  66.     set_description( N_("WinCE dialogs provider") )
  67.     set_capability( "dialogs provider", 10 )
  68.     set_callbacks( OpenDialogs, Close )
  69. vlc_module_end ()
  70. HINSTANCE hInstance = 0;
  71. #if !defined(__BUILTIN__)
  72. extern "C" BOOL WINAPI
  73. DllMain( HANDLE hModule, DWORD fdwReason, LPVOID lpReserved )
  74. {
  75.     hInstance = (HINSTANCE)hModule;
  76.     return TRUE;
  77. }
  78. #endif
  79. /* Global variables used by _TOMB() / _FROMB() */
  80. wchar_t pwsz_mbtow_wince[2048];
  81. char psz_wtomb_wince[2048];
  82. /*****************************************************************************
  83.  * Open: initialize interface
  84.  *****************************************************************************/
  85. static int Open( vlc_object_t *p_this )
  86. {
  87.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  88.     // Check if the application is running.
  89.     // If it's running then focus its window and bail out.
  90.     HWND hwndMain = FindWindow( _T("VLC WinCE"), _T("VLC media player") );
  91.     if( hwndMain )
  92.     {
  93.         SetForegroundWindow( hwndMain );
  94.         return VLC_EGENERIC;
  95.     }
  96.     // Allocate instance and initialize some members
  97.     p_intf->p_sys = (intf_sys_t *)malloc( sizeof( intf_sys_t ) );
  98.     if( p_intf->p_sys == NULL )
  99.         return VLC_ENOMEM;
  100.     // Misc init
  101.     p_intf->p_sys->p_audio_menu = NULL;
  102.     p_intf->p_sys->p_video_menu = NULL;
  103.     p_intf->p_sys->p_navig_menu = NULL;
  104.     p_intf->p_sys->p_settings_menu = NULL;
  105.     p_intf->pf_run = Run;
  106.     p_intf->pf_show_dialog = NULL;
  107.     p_intf->p_sys->p_input = NULL;
  108.     p_intf->p_sys->b_playing = 0;
  109.     p_intf->p_sys->i_playing = -1;
  110.     p_intf->p_sys->b_slider_free = 1;
  111.     p_intf->p_sys->i_slider_pos = p_intf->p_sys->i_slider_oldpos = 0;
  112.     return VLC_SUCCESS;
  113. }
  114. static int OpenDialogs( vlc_object_t *p_this )
  115. {
  116.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  117.     int i_ret = Open( p_this );
  118.     p_intf->pf_show_dialog = ShowDialog;
  119.     return i_ret;
  120. }
  121. /*****************************************************************************
  122.  * Close: destroy interface
  123.  *****************************************************************************/
  124. static void Close( vlc_object_t *p_this )
  125. {
  126.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  127.     intf_sys_t    *p_sys = p_intf->p_sys;
  128.     if( p_sys->p_input )
  129.     {
  130.         vlc_object_release( p_sys->p_input );
  131.     }
  132.     MenuItemExt::ClearList( p_intf->p_sys->p_video_menu );
  133.     delete p_intf->p_sys->p_video_menu;
  134.     MenuItemExt::ClearList( p_intf->p_sys->p_audio_menu );
  135.     delete p_intf->p_sys->p_audio_menu;
  136.     MenuItemExt::ClearList( p_intf->p_sys->p_settings_menu );
  137.     delete p_intf->p_sys->p_settings_menu;
  138.     MenuItemExt::ClearList( p_intf->p_sys->p_navig_menu );
  139.     delete p_intf->p_sys->p_navig_menu;
  140.     if( p_intf->pf_show_dialog )
  141.     {
  142.         /* We must destroy the dialogs thread */
  143. #if 0
  144.         wxCommandEvent event( wxEVT_DIALOG, INTF_DIALOG_EXIT );
  145.         p_intf->p_sys->p_wxwindow->AddPendingEvent( event );
  146. #endif
  147.         vlc_thread_join( p_intf );
  148.     }
  149.     // Destroy structure
  150.     free( p_intf->p_sys );
  151. }
  152. /*****************************************************************************
  153.  * Run: main loop
  154.  *****************************************************************************/
  155. static void Run( intf_thread_t *p_intf )
  156. {
  157.     if( p_intf->pf_show_dialog )
  158.     {
  159.         /* The module is used in dialog provider mode */
  160.         /* Create a new thread for the dialogs provider */
  161.         p_intf->p_sys->thread_ready = CreateEvent (NULL, TRUE, FALSE, NULL);
  162.         if( vlc_thread_create( p_intf, "WinCE Dialogs Thread", MainLoop, 0 ) )
  163.         {
  164.             msg_Err( p_intf, "cannot create WinCE Dialogs Thread" );
  165.             p_intf->pf_show_dialog = NULL;
  166.         }
  167.         else
  168.             WaitForSingleObject (p_intf->p_sys->thread_ready, INFINITE);
  169.         CloseHandle (p_intf->p_sys->thread_ready);
  170.     }
  171.     else
  172.     {
  173.         int canc = vlc_savecancel();
  174.         /* The module is used in interface mode */
  175.         MainLoop( VLC_OBJECT(p_intf) );
  176.         vlc_restorecancel( canc );
  177.     }
  178. }
  179. static void* MainLoop( vlc_object_t * p_this )
  180. {
  181.     intf_thread_t *p_intf = (intf_thread_t*)p_this;
  182.     MSG msg;
  183.     Interface *intf = 0;
  184.     int canc = vlc_savecancel ();
  185.     if( !hInstance ) hInstance = GetModuleHandle(NULL);
  186.     // Register window class
  187.     WNDCLASS wc;
  188.     wc.style = CS_HREDRAW | CS_VREDRAW ;
  189.     wc.lpfnWndProc = (WNDPROC)CBaseWindow::BaseWndProc;
  190.     wc.cbClsExtra = 0;
  191.     wc.cbWndExtra = 0;
  192.     wc.hIcon = NULL;
  193.     wc.hInstance = hInstance;
  194.     wc.hCursor = NULL;
  195.     wc.hbrBackground = (HBRUSH)(COLOR_MENU+1);
  196.     wc.lpszMenuName = NULL;
  197.     wc.lpszClassName = _T("VLC WinCE");
  198.     RegisterClass( &wc );
  199. #ifndef UNDER_CE
  200.     /* Initialize OLE/COM */
  201.     CoInitialize( 0 );
  202. #endif
  203.     if( !p_intf->pf_show_dialog )
  204.     {
  205.         /* The module is used in interface mode */
  206.         p_intf->p_sys->p_window = intf = new Interface( p_intf, 0, hInstance );
  207.         /* Create/Show the interface */
  208.         if( !intf->InitInstance() ) goto end;
  209.     }
  210.     /* Creates the dialogs provider */
  211.     p_intf->p_sys->p_window =
  212.         CreateDialogsProvider( p_intf, p_intf->pf_show_dialog ?
  213.                                NULL : p_intf->p_sys->p_window, hInstance );
  214.     p_intf->p_sys->pf_show_dialog = ShowDialog;
  215.     /* OK, initialization is over */
  216.     SetEvent( p_intf->p_sys->thread_ready );
  217.     // Main message loop
  218.     while( GetMessage( &msg, NULL, 0, 0 ) > 0 )
  219.     {
  220.         TranslateMessage( &msg );
  221.         DispatchMessage( &msg );
  222.     }
  223.  end:
  224.     delete intf;
  225. #ifndef UNDER_CE
  226.     /* Uninitialize OLE/COM */
  227.     CoUninitialize();
  228. #endif
  229.     vlc_restorecancel (canc);
  230.     return NULL;
  231. }
  232. /*****************************************************************************
  233.  * CBaseWindow Implementation
  234.  *****************************************************************************/
  235. LRESULT CALLBACK CBaseWindow::BaseWndProc( HWND hwnd, UINT msg, WPARAM wParam,
  236.                                            LPARAM lParam )
  237. {
  238.     CBaseWindow *p_obj;
  239.     // check to see if a copy of the 'this' pointer needs to be saved
  240.     if( msg == WM_CREATE )
  241.     {
  242.         p_obj = (CBaseWindow *)(((LPCREATESTRUCT)lParam)->lpCreateParams);
  243.         SetWindowLong( hwnd, GWL_USERDATA,
  244.                        (LONG)((LPCREATESTRUCT)lParam)->lpCreateParams );
  245.         p_obj->hWnd = hwnd;
  246.     }
  247.     if( msg == WM_INITDIALOG )
  248.     {
  249.         p_obj = (CBaseWindow *)lParam;
  250.         SetWindowLong( hwnd, GWL_USERDATA, lParam );
  251.         p_obj->hWnd = hwnd;
  252.     }
  253.     // Retrieve the pointer
  254.     p_obj = (CBaseWindow *)GetWindowLong( hwnd, GWL_USERDATA );
  255.     if( !p_obj ) return DefWindowProc( hwnd, msg, wParam, lParam );
  256.     // Filter message through child classes
  257.     return p_obj->WndProc( hwnd, msg, wParam, lParam );
  258. }
  259. int CBaseWindow::CreateDialogBox( HWND hwnd, CBaseWindow *p_obj )
  260. {
  261.     uint8_t p_buffer[sizeof(DLGTEMPLATE) + sizeof(WORD) * 4];
  262.     DLGTEMPLATE *p_dlg_template = (DLGTEMPLATE *)p_buffer;
  263.     memset( p_dlg_template, 0, sizeof(DLGTEMPLATE) + sizeof(WORD) * 4 );
  264.     // these values are arbitrary, they won't be used normally anyhow
  265.     p_dlg_template->x  = 0; p_dlg_template->y  = 0;
  266.     p_dlg_template->cx = 300; p_dlg_template->cy = 300;
  267.     p_dlg_template->style =
  268.         DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX;
  269.     return DialogBoxIndirectParam( GetModuleHandle(0), p_dlg_template, hwnd,
  270.                                    (DLGPROC)p_obj->BaseWndProc, (LPARAM)p_obj);
  271. }
  272. /*****************************************************************************
  273.  * ShowDialog
  274.  *****************************************************************************/
  275. static void ShowDialog( intf_thread_t *p_intf, int i_dialog_event, int i_arg,
  276.                         intf_dialog_args_t *p_arg )
  277. {
  278.     SendMessage( p_intf->p_sys->p_window->GetHandle(), WM_CANCELMODE, 0, 0 );
  279.     if( i_dialog_event == INTF_DIALOG_POPUPMENU && i_arg == 0 ) return;
  280.     /* Hack to prevent popup events to be enqueued when
  281.      * one is already active */
  282. #if 0
  283.     if( i_dialog_event != INTF_DIALOG_POPUPMENU ||
  284.         !p_intf->p_sys->p_popup_menu )
  285. #endif
  286.     {
  287.         SendMessage( p_intf->p_sys->p_window->GetHandle(),
  288.                      WM_APP + i_dialog_event, (WPARAM)i_arg, (LPARAM)p_arg );
  289.     }
  290. }