summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorUlf Brosziewski <bru@cvs.openbsd.org>2019-03-24 17:59:20 +0000
committerUlf Brosziewski <bru@cvs.openbsd.org>2019-03-24 17:59:20 +0000
commita8feb0ab4d205f8de2d46f8b8fbcdb7bad969ca0 (patch)
tree8b428670e69d3a90ee9bc2668158bcfa246c7ad4 /driver
parentc7cbd9c089e8aa883a2749f1e9f4eec1755d7b0b (diff)
Add support for precision scrolling.
Diffstat (limited to 'driver')
-rw-r--r--driver/xf86-input-ws/src/ws.c41
-rw-r--r--driver/xf86-input-ws/src/ws.h8
2 files changed, 47 insertions, 2 deletions
diff --git a/driver/xf86-input-ws/src/ws.c b/driver/xf86-input-ws/src/ws.c
index 369a66032..77abeb60d 100644
--- a/driver/xf86-input-ws/src/ws.c
+++ b/driver/xf86-input-ws/src/ws.c
@@ -13,7 +13,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $OpenBSD: ws.c,v 1.63 2017/12/31 23:31:41 guenther Exp $ */
+/* $OpenBSD: ws.c,v 1.64 2019/03/24 17:59:19 bru Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -363,6 +363,10 @@ wsDeviceInit(DeviceIntPtr pWS)
axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
}
+ axes_labels[HSCROLL_AXIS] =
+ XIGetKnownProperty(AXIS_LABEL_PROP_REL_HSCROLL);
+ axes_labels[VSCROLL_AXIS] =
+ XIGetKnownProperty(AXIS_LABEL_PROP_REL_VSCROLL);
if (!InitValuatorClassDeviceStruct(pWS,
NAXES, axes_labels, GetMotionHistorySize(),
priv->type == WSMOUSE_TYPE_TPANEL ? Absolute : Relative))
@@ -382,6 +386,25 @@ wsDeviceInit(DeviceIntPtr pWS)
priv->type == WSMOUSE_TYPE_TPANEL ? Absolute : Relative);
xf86InitValuatorDefaults(pWS, 1);
+ xf86InitValuatorAxisStruct(pWS, HSCROLL_AXIS,
+ axes_labels[HSCROLL_AXIS], 0, -1, 0, 0, 0, Relative);
+ xf86InitValuatorAxisStruct(pWS, VSCROLL_AXIS,
+ axes_labels[VSCROLL_AXIS], 0, -1, 0, 0, 0, Relative);
+ priv->scroll_mask = valuator_mask_new(MAX_VALUATORS);
+ if (!priv->scroll_mask) {
+ free(axes_labels);
+ return !Success;
+ }
+
+ /*
+ * The value of an HSCROLL or VSCROLL event is the fraction
+ * motion_delta / scroll_distance
+ * in [*.12] fixed-point format. The 'increment' attribute of the
+ * scroll axes is constant:
+ */
+ SetScrollValuator(pWS, HSCROLL_AXIS, SCROLL_TYPE_HORIZONTAL, 4096, 0);
+ SetScrollValuator(pWS, VSCROLL_AXIS, SCROLL_TYPE_VERTICAL, 4096, 0);
+
pWS->public.on = FALSE;
if (wsOpen(pInfo) != Success) {
return !Success;
@@ -579,6 +602,14 @@ wsReadHwState(InputInfoPtr pInfo, wsHwState *hw)
case WSCONS_EVENT_SYNC:
DBG(4, ErrorF("Sync\n"));
return TRUE;
+ case WSCONS_EVENT_HSCROLL:
+ hw->hscroll = event->value;
+ DBG(4, ErrorF("Horiz. Scrolling %d\n", event->value));
+ return TRUE;
+ case WSCONS_EVENT_VSCROLL:
+ hw->vscroll = event->value;
+ DBG(4, ErrorF("Vert. Scrolling %d\n", event->value));
+ return TRUE;
default:
xf86IDrvMsg(pInfo, X_WARNING,
"bad wsmouse event type=%d\n", event->type);
@@ -624,6 +655,14 @@ wsReadInput(InputInfoPtr pInfo)
DBG(4, ErrorF("W -> button %d (%d)\n", wbutton, abs(hw.dw)));
wsButtonClicks(pInfo, wbutton, abs(hw.dw));
}
+ if (hw.hscroll || hw.vscroll) {
+ valuator_mask_zero(priv->scroll_mask);
+ valuator_mask_set_double(priv->scroll_mask,
+ HSCROLL_AXIS, (double) hw.hscroll);
+ valuator_mask_set_double(priv->scroll_mask,
+ VSCROLL_AXIS, (double) hw.vscroll);
+ xf86PostMotionEventM(pInfo->dev, FALSE, priv->scroll_mask);
+ }
if (priv->lastButtons != hw.buttons) {
/* button event */
wsSendButtons(pInfo, hw.buttons);
diff --git a/driver/xf86-input-ws/src/ws.h b/driver/xf86-input-ws/src/ws.h
index aeac5f258..b4a7db145 100644
--- a/driver/xf86-input-ws/src/ws.h
+++ b/driver/xf86-input-ws/src/ws.h
@@ -26,7 +26,10 @@ extern int ws_debug_level;
# define DBG(lvl, f)
#endif
-#define NAXES 2 /* X and Y axes only */
+#define NAXES 4 /* X, Y, horizontal and vertical scrolling */
+#define HSCROLL_AXIS 2
+#define VSCROLL_AXIS 3
+
#define NBUTTONS 32 /* max theoretical buttons */
#define DFLTBUTTONS 3 /* default number of buttons */
@@ -45,6 +48,7 @@ typedef struct {
unsigned int buttons;
int dx, dy, dz, dw;
int ax, ay;
+ int hscroll, vscroll;
} wsHwState;
typedef struct WSDevice {
@@ -87,6 +91,8 @@ typedef struct WSDevice {
Time timeout;
} emulateWheel;
+ ValuatorMask *scroll_mask;
+
OsTimerPtr remove_timer; /* Callback for removal on EIO */
struct wscons_event events[NWSEVENTS];