Commit 0e9bb2b6 authored by Laurent Aimar's avatar Laurent Aimar Committed by Jean-Baptiste Kempf

Fixed mouse buttons state for msw vouts (close #3519).

Used SetCapture/ReleaseCapture to emulate what x11 seems to do by default.
(cherry picked from commit 2a1f2f0b)
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent d460c80b
...@@ -103,6 +103,7 @@ struct event_thread_t ...@@ -103,6 +103,7 @@ struct event_thread_t
bool is_cursor_hidden; bool is_cursor_hidden;
HCURSOR cursor_arrow; HCURSOR cursor_arrow;
HCURSOR cursor_empty; HCURSOR cursor_empty;
unsigned button_pressed;
/* Title */ /* Title */
char *psz_title; char *psz_title;
...@@ -161,7 +162,12 @@ static void UpdateCursor( event_thread_t *p_event, bool b_show ) ...@@ -161,7 +162,12 @@ static void UpdateCursor( event_thread_t *p_event, bool b_show )
GetCursorPos(&p); GetCursorPos(&p);
HWND hwnd = WindowFromPoint(p); HWND hwnd = WindowFromPoint(p);
if( hwnd == p_event->hvideownd || hwnd == p_event->hwnd ) if( hwnd == p_event->hvideownd || hwnd == p_event->hwnd )
SetCursorPos(p.x, p.y); {
if( b_show )
SetCursor( cursor );
else
SetCursorPos( p.x, p.y );
}
} }
static HCURSOR EmptyCursor( HINSTANCE instance ) static HCURSOR EmptyCursor( HINSTANCE instance )
...@@ -184,6 +190,21 @@ static HCURSOR EmptyCursor( HINSTANCE instance ) ...@@ -184,6 +190,21 @@ static HCURSOR EmptyCursor( HINSTANCE instance )
return cursor; return cursor;
} }
static void MousePressed( event_thread_t *p_event, HWND hwnd, unsigned button )
{
if( !p_event->button_pressed )
SetCapture( hwnd );
p_event->button_pressed |= 1 << button;
vout_display_SendEventMousePressed( p_event->vd, button );
}
static void MouseReleased( event_thread_t *p_event, unsigned button )
{
p_event->button_pressed &= ~(1 << button);
if( !p_event->button_pressed )
ReleaseCapture();
vout_display_SendEventMouseReleased( p_event->vd, button );
}
/***************************************************************************** /*****************************************************************************
* EventThread: Create video window & handle its messages * EventThread: Create video window & handle its messages
***************************************************************************** *****************************************************************************
...@@ -321,27 +342,27 @@ static void *EventThread( void *p_this ) ...@@ -321,27 +342,27 @@ static void *EventThread( void *p_this )
break; break;
case WM_LBUTTONDOWN: case WM_LBUTTONDOWN:
vout_display_SendEventMousePressed(vd, MOUSE_BUTTON_LEFT); MousePressed( p_event, msg.hwnd, MOUSE_BUTTON_LEFT );
break; break;
case WM_LBUTTONUP: case WM_LBUTTONUP:
vout_display_SendEventMouseReleased(vd, MOUSE_BUTTON_LEFT); MouseReleased( p_event, MOUSE_BUTTON_LEFT );
break; break;
case WM_LBUTTONDBLCLK: case WM_LBUTTONDBLCLK:
vout_display_SendEventMouseDoubleClick(vd); vout_display_SendEventMouseDoubleClick(vd);
break; break;
case WM_MBUTTONDOWN: case WM_MBUTTONDOWN:
vout_display_SendEventMousePressed(vd, MOUSE_BUTTON_CENTER); MousePressed( p_event, msg.hwnd, MOUSE_BUTTON_CENTER );
break; break;
case WM_MBUTTONUP: case WM_MBUTTONUP:
vout_display_SendEventMouseReleased(vd, MOUSE_BUTTON_CENTER); MouseReleased( p_event, MOUSE_BUTTON_CENTER );
break; break;
case WM_RBUTTONDOWN: case WM_RBUTTONDOWN:
vout_display_SendEventMousePressed(vd, MOUSE_BUTTON_RIGHT); MousePressed( p_event, msg.hwnd, MOUSE_BUTTON_RIGHT );
break; break;
case WM_RBUTTONUP: case WM_RBUTTONUP:
vout_display_SendEventMouseReleased(vd, MOUSE_BUTTON_RIGHT); MouseReleased( p_event, MOUSE_BUTTON_RIGHT );
break; break;
case WM_KEYDOWN: case WM_KEYDOWN:
...@@ -746,6 +767,19 @@ static long FAR PASCAL DirectXEventProc( HWND hwnd, UINT message, ...@@ -746,6 +767,19 @@ static long FAR PASCAL DirectXEventProc( HWND hwnd, UINT message,
return 1; return 1;
} }
#endif #endif
if( message == WM_CAPTURECHANGED )
{
for( int button = 0; p_event->button_pressed; button++ )
{
unsigned m = 1 << button;
if( p_event->button_pressed & m )
vout_display_SendEventMouseReleased( p_event->vd, button );
p_event->button_pressed &= ~m;
}
p_event->button_pressed = 0;
return 0;
}
if( hwnd == p_event->hvideownd ) if( hwnd == p_event->hvideownd )
{ {
#ifdef MODULE_NAME_IS_directx #ifdef MODULE_NAME_IS_directx
...@@ -1041,6 +1075,7 @@ event_thread_t *EventThreadCreate( vout_display_t *vd) ...@@ -1041,6 +1075,7 @@ event_thread_t *EventThreadCreate( vout_display_t *vd)
vlc_cond_init( &p_event->wait ); vlc_cond_init( &p_event->wait );
p_event->is_cursor_hidden = false; p_event->is_cursor_hidden = false;
p_event->button_pressed = 0;
p_event->psz_title = NULL; p_event->psz_title = NULL;
p_event->source = vd->source; p_event->source = vd->source;
vout_display_PlacePicture(&p_event->place, &vd->source, vd->cfg, true); vout_display_PlacePicture(&p_event->place, &vd->source, vd->cfg, true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment