[PATCH 1/6] dix: add ScrollInfo to DeviceChangedEvents

Peter Hutterer peter.hutterer at who-t.net
Wed Oct 19 23:25:41 PDT 2011


3304bbff9b4ed63f1a47410a5320a136420ba2c6 added smooth scrolling support for
pointer events and for XIQueryDevice but didn't add the matching parts to
XIDeviceChangedEvents.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 dix/eventconvert.c               |   53 ++++++++++++++++++++++++++++++++++++++
 dix/getevents.c                  |    1 +
 include/eventstr.h               |    1 +
 test/xi2/protocol-eventconvert.c |   20 ++++++++++++++
 4 files changed, 75 insertions(+), 0 deletions(-)

diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 189cb85..fe65b0d 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -43,6 +43,7 @@
 #include "inputstr.h"
 #include "misc.h"
 #include "eventstr.h"
+#include "exevents.h"
 #include "exglobals.h"
 #include "eventconvert.h"
 #include "xiquerydevice.h"
@@ -482,6 +483,41 @@ appendValuatorInfo(DeviceChangedEvent *dce, xXIValuatorInfo *info, int axisnumbe
 }
 
 static int
+appendScrollInfo(DeviceChangedEvent *dce, xXIScrollInfo *info, int axisnumber)
+{
+    if (dce->valuators[axisnumber].scroll.type == SCROLL_TYPE_NONE)
+        return 0;
+
+    info->type = XIScrollClass;
+    info->length = sizeof(xXIScrollInfo)/4;
+    info->number = axisnumber;
+    switch(dce->valuators[axisnumber].scroll.type)
+    {
+        case SCROLL_TYPE_VERTICAL:
+            info->scroll_type = XIScrollTypeVertical;
+            break;
+        case SCROLL_TYPE_HORIZONTAL:
+            info->scroll_type = XIScrollTypeHorizontal;
+            break;
+        default:
+            ErrorF("[Xi] Unknown scroll type %d. This is a bug.\n", dce->valuators[axisnumber].scroll.type);
+            break;
+    }
+    info->increment.integral = (int)dce->valuators[axisnumber].scroll.increment;
+    info->increment.frac = (unsigned int)dce->valuators[axisnumber].scroll.increment * (1UL << 16) * (1UL << 16);
+    info->sourceid = dce->sourceid;
+
+    info->flags = 0;
+
+    if (dce->valuators[axisnumber].scroll.flags & SCROLL_FLAG_DONT_EMULATE)
+        info->flags |= XIScrollFlagNoEmulation;
+    if (dce->valuators[axisnumber].scroll.flags & SCROLL_FLAG_PREFERRED)
+        info->flags |= XIScrollFlagPreferred;
+
+    return info->length * 4;
+}
+
+static int
 eventToDeviceChanged(DeviceChangedEvent *dce, xEvent **xi)
 {
     xXIDeviceChangedEvent *dcce;
@@ -496,8 +532,16 @@ eventToDeviceChanged(DeviceChangedEvent *dce, xEvent **xi)
         len += pad_to_int32(bits_to_bytes(dce->buttons.num_buttons));
     }
     if (dce->num_valuators)
+    {
+        int i;
+
         len += sizeof(xXIValuatorInfo) * dce->num_valuators;
 
+        for (i = 0; i < dce->num_valuators; i++)
+            if (dce->valuators[i].scroll.type != SCROLL_TYPE_NONE)
+                len += sizeof(xXIScrollInfo);
+    }
+
     nkeys = (dce->keys.max_keycode > 0) ?
                 dce->keys.max_keycode - dce->keys.min_keycode + 1 : 0;
     if (nkeys > 0)
@@ -543,6 +587,15 @@ eventToDeviceChanged(DeviceChangedEvent *dce, xEvent **xi)
         dcce->num_classes += dce->num_valuators;
         for (i = 0; i < dce->num_valuators; i++)
             ptr += appendValuatorInfo(dce, (xXIValuatorInfo*)ptr, i);
+
+        for (i = 0; i < dce->num_valuators; i++)
+        {
+            if (dce->valuators[i].scroll.type != SCROLL_TYPE_NONE)
+            {
+                dcce->num_classes++;
+                ptr += appendScrollInfo(dce, (xXIScrollInfo*)ptr, i);
+            }
+        }
     }
 
     *xi = (xEvent*)dcce;
diff --git a/dix/getevents.c b/dix/getevents.c
index 7be39dc..31c69bf 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -243,6 +243,7 @@ CreateClassesChangedEvent(InternalEvent* event,
             dce->valuators[i].resolution = slave->valuator->axes[i].resolution;
             dce->valuators[i].mode = slave->valuator->axes[i].mode;
             dce->valuators[i].name = slave->valuator->axes[i].label;
+            dce->valuators[i].scroll = slave->valuator->axes[i].scroll;
         }
     }
     if (slave->key)
diff --git a/include/eventstr.h b/include/eventstr.h
index 2de077f..4d836fb 100644
--- a/include/eventstr.h
+++ b/include/eventstr.h
@@ -153,6 +153,7 @@ struct _DeviceChangedEvent
         uint32_t resolution;    /**< Resolution counts/m */
         uint8_t mode;           /**< Relative or Absolute */
         Atom name;              /**< Axis name */
+        ScrollInfo scroll;      /**< Smooth scrolling info */
     } valuators[MAX_VALUATORS];
 
     struct {
diff --git a/test/xi2/protocol-eventconvert.c b/test/xi2/protocol-eventconvert.c
index bfa23b5..41a3001 100644
--- a/test/xi2/protocol-eventconvert.c
+++ b/test/xi2/protocol-eventconvert.c
@@ -748,6 +748,26 @@ static void test_values_XIDeviceChangedEvent(DeviceChangedEvent *in,
 
                 }
                 break;
+            case XIScrollClass:
+                {
+                    xXIScrollInfo *s = (xXIScrollInfo*)any;
+                    assert(s->length ==
+                             bytes_to_int32(sizeof(xXIScrollInfo)));
+
+                    assert(s->sourceid == in->sourceid);
+                    assert(s->number < in->num_valuators);
+                    switch(s->type)
+                    {
+                        case XIScrollTypeVertical:
+                            assert(in->valuators[s->number].scroll.type == SCROLL_TYPE_VERTICAL);
+                            break;
+                        case XIScrollTypeHorizontal:
+                            assert(in->valuators[s->number].scroll.type == SCROLL_TYPE_HORIZONTAL);
+                            break;
+                    }
+                    if (s->flags & XIScrollFlagPreferred)
+                        assert(in->valuators[s->number].scroll.flags & SCROLL_FLAG_PREFERRED);
+                }
             default:
                 printf("Invalid class type.\n\n");
                 assert(1);
-- 
1.7.6.4



More information about the xorg-devel mailing list