Handle mouse wheel
authorHardening <rdp.effort@gmail.com>
Mon, 3 Jun 2013 20:55:47 +0000 (22:55 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 4 Jun 2013 04:10:19 +0000 (00:10 -0400)
The RDP compositor was ignoring mouse wheel events, this patch adds
support for it.

src/compositor-rdp.c

index e855ba6..b81d789 100644 (file)
@@ -42,6 +42,7 @@
 #include "pixman-renderer.h"
 
 #define MAX_FREERDP_FDS 32
+#define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int(10)
 
 struct rdp_compositor_config {
        int width;
@@ -758,7 +759,7 @@ xf_peer_activate(freerdp_peer *client)
 
 static void
 xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y) {
-       wl_fixed_t wl_x, wl_y;
+       wl_fixed_t wl_x, wl_y, axis;
        RdpPeerContext *peerContext = (RdpPeerContext *)input->context;
        struct rdp_output *output;
        uint32_t button = 0;
@@ -785,6 +786,22 @@ xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y) {
                        (flags & PTR_FLAGS_DOWN) ? WL_POINTER_BUTTON_STATE_PRESSED : WL_POINTER_BUTTON_STATE_RELEASED
                );
        }
+
+       if (flags & PTR_FLAGS_WHEEL) {
+               /* DEFAULT_AXIS_STEP_DISTANCE is stolen from compositor-x11.c
+                * The RDP specs says the lower bits of flags contains the "the number of rotation
+                * units the mouse wheel was rotated".
+                *
+                * http://blogs.msdn.com/b/oldnewthing/archive/2013/01/23/10387366.aspx explains the 120 value
+                */
+               axis = (DEFAULT_AXIS_STEP_DISTANCE * (flags & 0xff)) / 120;
+               if (flags & PTR_FLAGS_WHEEL_NEGATIVE)
+                       axis = -axis;
+
+               notify_axis(&peerContext->item.seat, weston_compositor_get_time(),
+                                           WL_POINTER_AXIS_VERTICAL_SCROLL,
+                                           axis);
+       }
 }
 
 static void