* events.c: Windows DirectX video output events handler
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: events.c,v 1.21 2003/07/29 21:46:44 gbazin Exp $
+ * $Id: events.c,v 1.24 2003/10/17 16:40:09 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
static long FAR PASCAL DirectXEventProc ( HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam );
+static void DirectXPopupMenu( event_thread_t *p_event, vlc_bool_t b_open )
+{
+ playlist_t *p_playlist =
+ vlc_object_find( p_event, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+ if( p_playlist != NULL )
+ {
+ vlc_value_t val;
+ val.b_bool = b_open;
+ var_Set( p_playlist, "intf-popupmenu", val );
+ vlc_object_release( p_playlist );
+ }
+}
+
/*****************************************************************************
* DirectXEventThread: Create video window & handle its messages
*****************************************************************************
/* Main loop */
/* GetMessage will sleep if there's no message in the queue */
- while( !p_event->b_die
- && GetMessage( &msg, p_event->p_vout->p_sys->hwnd, 0, 0 ) )
+ while( !p_event->b_die && ( p_event->p_vout->p_sys->hparent ||
+ GetMessage( &msg, p_event->p_vout->p_sys->hwnd, 0, 0 ) ) )
{
/* Check if we are asked to exit */
if( p_event->b_die )
break;
+ if( p_event->p_vout->p_sys->hparent ) msleep( INTF_IDLE_SLEEP );
+
switch( msg.message )
{
var_Get( p_event->p_vout, "mouse-button-down", &val );
val.i_int |= 1;
var_Set( p_event->p_vout, "mouse-button-down", val );
+ DirectXPopupMenu( p_event, VLC_FALSE );
break;
case WM_LBUTTONUP:
var_Get( p_event->p_vout, "mouse-button-down", &val );
val.i_int |= 2;
var_Set( p_event->p_vout, "mouse-button-down", val );
+ DirectXPopupMenu( p_event, VLC_FALSE );
break;
case WM_MBUTTONUP:
var_Get( p_event->p_vout, "mouse-button-down", &val );
val.i_int |= 4;
var_Set( p_event->p_vout, "mouse-button-down", val );
+ DirectXPopupMenu( p_event, VLC_FALSE );
break;
case WM_RBUTTONUP:
var_Get( p_event->p_vout, "mouse-button-down", &val );
val.i_int &= ~4;
var_Set( p_event->p_vout, "mouse-button-down", val );
- {
- playlist_t *p_playlist =
- vlc_object_find( p_event, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist != NULL )
- {
- vlc_value_t val;
- val.b_bool = VLC_TRUE; /* make compiler happy */
- var_Set( p_playlist, "intf-popupmenu", val );
- vlc_object_release( p_playlist );
- }
- }
+ DirectXPopupMenu( p_event, VLC_TRUE );
break;
case WM_KEYDOWN:
break;
case VK_LEFT:
- /* input_Seek( p_event->p_vout, -5,
- INPUT_SEEK_SECONDS | INPUT_SEEK_CUR ); */
- val.psz_string = "LEFT";
- var_Set( p_event->p_vout, "key-pressed", val );
+ if( GetKeyState(VK_CONTROL) & 0x8000 )
+ {
+ input_Seek( p_event->p_vout, -60,
+ INPUT_SEEK_SECONDS | INPUT_SEEK_CUR );
+ }
+ else
+ {
+ val.psz_string = "LEFT";
+ var_Set( p_event->p_vout, "key-pressed", val );
+ }
break;
case VK_RIGHT:
- /* input_Seek( p_event->p_vout, 5,
- INPUT_SEEK_SECONDS | INPUT_SEEK_CUR ); */
- val.psz_string = "RIGHT";
- var_Set( p_event->p_vout, "key-pressed", val );
+ if( GetKeyState(VK_CONTROL) & 0x8000 )
+ {
+ input_Seek( p_event->p_vout, 60,
+ INPUT_SEEK_SECONDS | INPUT_SEEK_CUR );
+ }
+ else
+ {
+ val.psz_string = "RIGHT";
+ var_Set( p_event->p_vout, "key-pressed", val );
+ }
break;
case VK_UP:
- /* input_Seek( p_event->p_vout, 60,
- INPUT_SEEK_SECONDS | INPUT_SEEK_CUR ); */
val.psz_string = "UP";
var_Set( p_event->p_vout, "key-pressed", val );
break;
case VK_DOWN:
- /* input_Seek( p_event->p_vout, -60,
- INPUT_SEEK_SECONDS | INPUT_SEEK_CUR ); */
val.psz_string = "DOWN";
var_Set( p_event->p_vout, "key-pressed", val );
break;
{
DestroyWindow( p_vout->p_sys->hwnd );
}
+ else if( p_vout->p_sys->hparent )
+ {
+ /* We don't want our windowproc to be called anymore */
+ SetWindowLong( p_vout->p_sys->hwnd,
+ GWL_WNDPROC, (LONG)p_vout->p_sys->pf_wndproc );
+
+ /* Blam! Erase everything that might have been there. */
+ InvalidateRect( p_vout->p_sys->hwnd, NULL, TRUE );
+ }
p_vout->p_sys->hwnd = NULL;