You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

370 lines
11 KiB

/*****************************************************************************
* win32_run.cpp:
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: win32_run.cpp,v 1.16 2003/05/12 17:33:19 gbazin Exp $
*
* Authors: Olivier Teulière <ipkiss@via.ecp.fr>
* Emmanuel Puig <karibu@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111,
* USA.
*****************************************************************************/
#ifdef WIN32
//--- VLC -------------------------------------------------------------------
#include <vlc/vlc.h>
#include <vlc/intf.h>
//--- GENERAL ---------------------------------------------------------------
#ifndef BASIC_SKINS
#ifdef WIN32 /* mingw32 hack */
# undef Yield
# undef CreateDialog
#endif
/* Let vlc take care of the i18n stuff */
#define WXINTL_NO_GETTEXT_MACRO
#include <wx/wx.h>
#endif
#include <windows.h>
//--- SKIN ------------------------------------------------------------------
#include "../os_api.h"
#include "../src/event.h"
#include "../os_event.h"
#include "../src/banks.h"
#include "../src/window.h"
#include "../os_window.h"
#include "../src/theme.h"
#include "../os_theme.h"
#include "../src/skin_common.h"
#include "../src/vlcproc.h"
#ifndef BASIC_SKINS
#include "../../wxwindows/wxwindows.h"
#include "share/vlc32x32.xpm" // include the graphic icon
#endif
//---------------------------------------------------------------------------
// Specific method
//---------------------------------------------------------------------------
bool IsVLCEvent( unsigned int msg );
int SkinManage( intf_thread_t *p_intf );
#ifndef BASIC_SKINS
//---------------------------------------------------------------------------
// Local classes declarations.
//---------------------------------------------------------------------------
class Instance: public wxApp
{
public:
Instance();
Instance( intf_thread_t *_p_intf );
bool OnInit();
int OnExit();
OpenDialog *open;
private:
intf_thread_t *p_intf;
};
class ExitTimer: public wxTimer
{
public:
ExitTimer( intf_thread_t *_p_intf );
void Notify();
private:
intf_thread_t *p_intf;
};
//---------------------------------------------------------------------------
// Implementation of Instance class
//---------------------------------------------------------------------------
Instance::Instance( )
{
}
Instance::Instance( intf_thread_t *_p_intf )
{
// Initialization
p_intf = _p_intf;
}
IMPLEMENT_APP_NO_MAIN(Instance)
bool Instance::OnInit()
{
p_intf->p_sys->p_icon = new wxIcon( vlc_xpm );
// Create all the dialog boxes
p_intf->p_sys->OpenDlg = new OpenDialog( p_intf, NULL, FILE_ACCESS );
p_intf->p_sys->MessagesDlg = new Messages( p_intf, NULL );
p_intf->p_sys->SoutDlg = new SoutDialog( p_intf, NULL );
p_intf->p_sys->PrefsDlg = new PrefsDialog( p_intf, NULL );
p_intf->p_sys->InfoDlg = new FileInfo( p_intf, NULL );
// Start a timer checking if we must exit the main loop
p_intf->p_sys->b_wx_die = 0;
p_intf->p_sys->p_kludgy_timer = new ExitTimer( p_intf );
p_intf->p_sys->p_kludgy_timer->Start( 100 );
// OK, initialization is over, now the other thread can go on working...
vlc_mutex_lock( &p_intf->p_sys->init_lock );
vlc_cond_signal( &p_intf->p_sys->init_cond );
vlc_mutex_unlock( &p_intf->p_sys->init_lock );
return TRUE;
}
int Instance::OnExit()
{
// Delete evertything
delete p_intf->p_sys->p_kludgy_timer;
delete p_intf->p_sys->InfoDlg;
delete p_intf->p_sys->PrefsDlg;
delete p_intf->p_sys->SoutDlg;
delete p_intf->p_sys->MessagesDlg;
delete p_intf->p_sys->OpenDlg;
delete p_intf->p_sys->p_icon;
return 0;
}
//---------------------------------------------------------------------------
// Implementation of ExitTimer class
// This timer is only there to call wxApp::ExitMainLoop() from the wxWindows
// thread (otherwise we never exit from the wxEntry call).
//---------------------------------------------------------------------------
ExitTimer::ExitTimer( intf_thread_t *_p_intf ) : wxTimer()
{
p_intf = _p_intf;
}
void ExitTimer::Notify()
{
if( p_intf->p_sys->b_wx_die )
wxTheApp->ExitMainLoop();
}
//---------------------------------------------------------------------------
#if !defined(__BUILTIN__) && defined( WIN32 )
HINSTANCE hInstance = 0;
extern "C" BOOL WINAPI
DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
hInstance = (HINSTANCE)hModule;
return TRUE;
}
#endif
//---------------------------------------------------------------------------
// Thread callback
// We create all wxWindows dialogs in a separate thread because we don't want
// any interaction with our own message loop
//---------------------------------------------------------------------------
void SkinsDialogsThread( intf_thread_t *p_intf )
{
/* Hack to pass the p_intf pointer to the new wxWindow Instance object */
wxTheApp = new Instance( p_intf );
#if defined( WIN32 )
#if !defined(__BUILTIN__)
wxEntry( hInstance/*GetModuleHandle(NULL)*/, NULL, NULL, SW_SHOW, TRUE );
#else
wxEntry( GetModuleHandle( NULL ), NULL, NULL, SW_SHOW, TRUE );
#endif
#else
wxEntry( 1, p_args );
#endif
return;
}
#endif // WX_SKINS
//---------------------------------------------------------------------------
// Refresh Timer Callback
//---------------------------------------------------------------------------
void CALLBACK RefreshTimer( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
{
intf_thread_t *p_intf = (intf_thread_t *)GetWindowLongPtr( hwnd,
GWLP_USERDATA );
SkinManage( p_intf );
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Win32 interface
//---------------------------------------------------------------------------
void OSRun( intf_thread_t *p_intf )
{
VlcProc *Proc = new VlcProc( p_intf );
MSG msg;
list<SkinWindow *>::const_iterator win;
Event *ProcessEvent;
int KeyModifier = 0;
#ifndef BASIC_SKINS
// Create a new thread for wxWindows
if( vlc_thread_create( p_intf, "Skins Dialogs Thread", SkinsDialogsThread,
0, 0 ) )
{
msg_Err( p_intf, "cannot create SkinsDialogsThread" );
// Don't even enter the main loop
return;
}
vlc_mutex_lock( &p_intf->p_sys->init_lock );
vlc_cond_wait( &p_intf->p_sys->init_cond, &p_intf->p_sys->init_lock );
vlc_mutex_unlock( &p_intf->p_sys->init_lock );
#endif
// Create refresh timer
SetTimer( ((OSTheme *)p_intf->p_sys->p_theme)->GetParentWindow(), 42, 200,
(TIMERPROC)RefreshTimer );
// Compute windows message list
while( GetMessage( &msg, NULL, 0, 0 ) )
{
for( win = p_intf->p_sys->p_theme->WindowList.begin();
win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
{
if( msg.hwnd == NULL ||
msg.hwnd == ((Win32Window*)(*win))->GetHandle() )
{
break;
}
}
if( win == p_intf->p_sys->p_theme->WindowList.end() )
{
// DispatchMessage( &msg );
// DefWindowProc( msg.hwnd, msg.message, msg.wParam, msg.lParam );
}
// Translate keys
TranslateMessage( &msg );
// Create event
ProcessEvent = (Event *)new OSEvent( p_intf, msg.hwnd, msg.message,
msg.wParam, msg.lParam );
/*****************************
* Process keyboard shortcuts *
*****************************/
if( msg.message == WM_KEYUP )
{
msg_Err( p_intf, "Key : %i (%i)", msg.wParam, KeyModifier );
// If key is CTRL
if( msg.wParam == 17 )
KeyModifier = 0;
else if( KeyModifier == 0 )
{
p_intf->p_sys->p_theme->EvtBank->TestShortcut(
msg.wParam, 0 );
}
}
else if( msg.message == WM_KEYDOWN )
{
// If key is control
if( msg.wParam == 17 )
KeyModifier = 2;
else if( KeyModifier > 0 )
{
p_intf->p_sys->p_theme->EvtBank->TestShortcut(
msg.wParam, KeyModifier );
}
}
else if( msg.message == WM_SYSKEYDOWN )
{
// If key is ALT
if( msg.wParam == 18 )
KeyModifier = 1;
}
else if( msg.message == WM_SYSKEYUP )
{
// If key is a system key
KeyModifier = 0;
}
/************************
* Process timer message *
************************/
else if( msg.message == WM_TIMER )
{
DispatchMessage( &msg );
}
/***********************
* VLC specific message *
***********************/
else if( IsVLCEvent( msg.message ) )
{
if( !Proc->EventProc( ProcessEvent ) )
break; // Exit VLC !
}
/**********************
* Broadcasted message *
**********************/
else if( msg.hwnd == NULL )
{
for( win = p_intf->p_sys->p_theme->WindowList.begin();
win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
{
(*win)->ProcessEvent( ProcessEvent );
}
}
/***********************
* Process window event *
***********************/
else
{
DispatchMessage( &msg );
}
// Delete event
ProcessEvent->DestructParameters();
delete (OSEvent *)ProcessEvent;
// Check if vlc is closing
Proc->IsClosing();
}
#ifndef BASIC_SKINS
// Tell wxWindows it's time to exit
p_intf->p_sys->b_wx_die = 1;
#endif
}
//---------------------------------------------------------------------------
bool IsVLCEvent( unsigned int msg )
{
return( msg > VLC_MESSAGE && msg < VLC_WINDOW );
}
//---------------------------------------------------------------------------
#endif