[vlc-commits] commit: Fixed mouse buttons state for msw vouts (close #3519). ( Laurent Aimar )

git at videolan.org git at videolan.org
Sun Jun 13 01:07:38 CEST 2010


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sun Jun 13 00:44:31 2010 +0200| [2a1f2f0bf5f14963417fb758910db478ac407a62] | committer: Laurent Aimar 

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

Used SetCapture/ReleaseCapture to emulate what x11 seems to do by default.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2a1f2f0bf5f14963417fb758910db478ac407a62
---

 modules/video_output/msw/events.c |   49 +++++++++++++++++++++++++++++++-----
 1 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/modules/video_output/msw/events.c b/modules/video_output/msw/events.c
index dd606b2..b3d6718 100644
--- a/modules/video_output/msw/events.c
+++ b/modules/video_output/msw/events.c
@@ -103,6 +103,7 @@ struct event_thread_t
     bool is_cursor_hidden;
     HCURSOR cursor_arrow;
     HCURSOR cursor_empty;
+    unsigned button_pressed;
 
     /* Title */
     char *psz_title;
@@ -161,7 +162,12 @@ static void UpdateCursor( event_thread_t *p_event, bool b_show )
     GetCursorPos(&p);
     HWND hwnd = WindowFromPoint(p);
     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 )
@@ -184,6 +190,21 @@ static HCURSOR EmptyCursor( HINSTANCE instance )
     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
  *****************************************************************************
@@ -321,27 +342,27 @@ static void *EventThread( void *p_this )
             break;
 
         case WM_LBUTTONDOWN:
-            vout_display_SendEventMousePressed(vd, MOUSE_BUTTON_LEFT);
+            MousePressed( p_event, msg.hwnd, MOUSE_BUTTON_LEFT );
             break;
         case WM_LBUTTONUP:
-            vout_display_SendEventMouseReleased(vd, MOUSE_BUTTON_LEFT);
+            MouseReleased( p_event, MOUSE_BUTTON_LEFT );
             break;
         case WM_LBUTTONDBLCLK:
             vout_display_SendEventMouseDoubleClick(vd);
             break;
 
         case WM_MBUTTONDOWN:
-            vout_display_SendEventMousePressed(vd, MOUSE_BUTTON_CENTER);
+            MousePressed( p_event, msg.hwnd, MOUSE_BUTTON_CENTER );
             break;
         case WM_MBUTTONUP:
-            vout_display_SendEventMouseReleased(vd, MOUSE_BUTTON_CENTER);
+            MouseReleased( p_event, MOUSE_BUTTON_CENTER );
             break;
 
         case WM_RBUTTONDOWN:
-            vout_display_SendEventMousePressed(vd, MOUSE_BUTTON_RIGHT);
+            MousePressed( p_event, msg.hwnd, MOUSE_BUTTON_RIGHT );
             break;
         case WM_RBUTTONUP:
-            vout_display_SendEventMouseReleased(vd, MOUSE_BUTTON_RIGHT);
+            MouseReleased( p_event, MOUSE_BUTTON_RIGHT );
             break;
 
         case WM_KEYDOWN:
@@ -746,6 +767,19 @@ static long FAR PASCAL DirectXEventProc( HWND hwnd, UINT message,
         return 1;
     }
 #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 )
     {
 #ifdef MODULE_NAME_IS_directx
@@ -1041,6 +1075,7 @@ event_thread_t *EventThreadCreate( vout_display_t *vd)
     vlc_cond_init( &p_event->wait );
 
     p_event->is_cursor_hidden = false;
+    p_event->button_pressed = 0;
     p_event->psz_title = NULL;
     p_event->source = vd->source;
     vout_display_PlacePicture(&p_event->place, &vd->source, vd->cfg, false);



More information about the vlc-commits mailing list