[vlc-devel] commit: Centralized mouse event handling. (Laurent Aimar )

git version control git at videolan.org
Sat Sep 26 13:58:31 CEST 2009


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Thu Sep 24 20:24:37 2009 +0200| [fbedc7c617208aa2bdb5c02ddfc0f9d2d59194a8] | committer: Laurent Aimar 

Centralized mouse event handling.

There is no functionnal changes but it will be needed to reduce locking time
when vout display are allowed to emit events from their own thread.

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

 src/video_output/display.c |  126 +++++++++++++++++++++++---------------------
 1 files changed, 66 insertions(+), 60 deletions(-)

diff --git a/src/video_output/display.c b/src/video_output/display.c
index 538f6ef..4bfe485 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -421,67 +421,24 @@ static void VoutDisplayResetRender(vout_display_t *vd)
     VoutDisplayDestroyRender(vd);
     VoutDisplayCreateRender(vd);
 }
-static void VoutDisplayEventMouse(vout_display_t *vd, const vlc_mouse_t *mouse)
+static void VoutDisplayEventMouse(vout_display_t *vd, int event, va_list args)
 {
     vout_display_owner_sys_t *osys = vd->owner.sys;
 
     /* */
-    vlc_mouse_t m = *mouse;
-
-    /* Emulate double-click if needed */
-    if (!vd->info.has_double_click &&
-        vlc_mouse_HasPressed(&osys->mouse.state, &m, MOUSE_BUTTON_LEFT)) {
-        const mtime_t i_date = mdate();
-
-        if (i_date - osys->mouse.last_pressed < osys->mouse.double_click_timeout ) {
-            m.b_double_click = true;
-            osys->mouse.last_pressed = 0;
-        } else {
-            osys->mouse.last_pressed = mdate();
-        }
-    }
-
-    /* */
-    osys->mouse.state = m;
-
-    vout_SendDisplayEventMouse(osys->vout, &m);
-
-    /* */
-    osys->mouse.is_hidden = false;
-    if (!vd->info.has_hide_mouse)
-        osys->mouse.last_moved = mdate();
-    vout_SendEventMouseVisible(osys->vout);
-}
-
-static void VoutDisplayEvent(vout_display_t *vd, int event, va_list args)
-{
-    vout_display_owner_sys_t *osys = vd->owner.sys;
+    vlc_mouse_t m = osys->mouse.state;
+    bool is_ignored = false;
 
     switch (event) {
-    case VOUT_DISPLAY_EVENT_CLOSE: {
-        msg_Dbg(vd, "VoutDisplayEvent 'close'");
-        vout_SendEventClose(osys->vout);
-        break;
-    }
-    case VOUT_DISPLAY_EVENT_KEY: {
-        const int key = (int)va_arg(args, int);
-        msg_Dbg(vd, "VoutDisplayEvent 'key' 0x%2.2x", key);
-        vout_SendEventKey(osys->vout, key);
-        break;
-    }
     case VOUT_DISPLAY_EVENT_MOUSE_STATE: {
         const int x = (int)va_arg(args, int);
         const int y = (int)va_arg(args, int);
         const int button_mask = (int)va_arg(args, int);
 
-        vlc_mouse_t m;
-
         vlc_mouse_Init(&m);
         m.i_x = x;
         m.i_y = y;
         m.i_pressed = button_mask;
-
-        VoutDisplayEventMouse(vd, &m);
         break;
     }
     case VOUT_DISPLAY_EVENT_MOUSE_MOVED: {
@@ -490,13 +447,11 @@ static void VoutDisplayEvent(vout_display_t *vd, int event, va_list args)
         if (x != osys->mouse.state.i_x || y != osys->mouse.state.i_y) {
             msg_Dbg(vd, "VoutDisplayEvent 'mouse' @%d,%d", x, y);
 
-            /* */
-            vlc_mouse_t m = osys->mouse.state;
             m.i_x = x;
             m.i_y = y;
             m.b_double_click = false;
-
-            VoutDisplayEventMouse(vd, &m);
+        } else {
+            is_ignored = true;
         }
         break;
     }
@@ -505,33 +460,84 @@ static void VoutDisplayEvent(vout_display_t *vd, int event, va_list args)
         const int button = (int)va_arg(args, int);
         const int button_mask = 1 << button;
 
-        /* Ignore inconistent event */
-        if (event == VOUT_DISPLAY_EVENT_MOUSE_PRESSED && (osys->mouse.state.i_pressed & button_mask))
-            break;
-        if (event == VOUT_DISPLAY_EVENT_MOUSE_RELEASED && !(osys->mouse.state.i_pressed & button_mask))
+        /* Ignore inconsistent event */
+        if ((event == VOUT_DISPLAY_EVENT_MOUSE_PRESSED  &&  (osys->mouse.state.i_pressed & button_mask)) ||
+            (event == VOUT_DISPLAY_EVENT_MOUSE_RELEASED && !(osys->mouse.state.i_pressed & button_mask))) {
+            is_ignored = true;
             break;
+        }
 
         /* */
         msg_Dbg(vd, "VoutDisplayEvent 'mouse button' %d t=%d", button, event);
 
-        vlc_mouse_t m = osys->mouse.state;
         m.b_double_click = false;
         if (event == VOUT_DISPLAY_EVENT_MOUSE_PRESSED)
             m.i_pressed |= button_mask;
         else
             m.i_pressed &= ~button_mask;
-
-        VoutDisplayEventMouse(vd, &m);
         break;
     }
-    case VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK: {
+    case VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK:
         msg_Dbg(vd, "VoutDisplayEvent 'double click'");
 
-        vlc_mouse_t m = osys->mouse.state;
         m.b_double_click = true;
-        VoutDisplayEventMouse(vd, &m);
+        break;
+    default:
+        assert(0);
+    }
+
+    if (is_ignored)
+        return;
+
+    /* Emulate double-click if needed */
+    if (!vd->info.has_double_click &&
+        vlc_mouse_HasPressed(&osys->mouse.state, &m, MOUSE_BUTTON_LEFT)) {
+        const mtime_t i_date = mdate();
+
+        if (i_date - osys->mouse.last_pressed < osys->mouse.double_click_timeout ) {
+            m.b_double_click = true;
+            osys->mouse.last_pressed = 0;
+        } else {
+            osys->mouse.last_pressed = mdate();
+        }
+    }
+
+    /* */
+    osys->mouse.state = m;
+
+    /* */
+    osys->mouse.is_hidden = false;
+    if (!vd->info.has_hide_mouse)
+        osys->mouse.last_moved = mdate();
+
+    /* */
+    vout_SendEventMouseVisible(osys->vout);
+    vout_SendDisplayEventMouse(osys->vout, &m);
+}
+
+static void VoutDisplayEvent(vout_display_t *vd, int event, va_list args)
+{
+    vout_display_owner_sys_t *osys = vd->owner.sys;
+
+    switch (event) {
+    case VOUT_DISPLAY_EVENT_CLOSE: {
+        msg_Dbg(vd, "VoutDisplayEvent 'close'");
+        vout_SendEventClose(osys->vout);
         break;
     }
+    case VOUT_DISPLAY_EVENT_KEY: {
+        const int key = (int)va_arg(args, int);
+        msg_Dbg(vd, "VoutDisplayEvent 'key' 0x%2.2x", key);
+        vout_SendEventKey(osys->vout, key);
+        break;
+    }
+    case VOUT_DISPLAY_EVENT_MOUSE_STATE:
+    case VOUT_DISPLAY_EVENT_MOUSE_MOVED:
+    case VOUT_DISPLAY_EVENT_MOUSE_PRESSED:
+    case VOUT_DISPLAY_EVENT_MOUSE_RELEASED:
+    case VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK:
+        VoutDisplayEventMouse(vd, event, args);
+        break;
 
     case VOUT_DISPLAY_EVENT_FULLSCREEN: {
         const int is_fullscreen = (int)va_arg(args, int);




More information about the vlc-devel mailing list