[gpm] [PATCH 9/18] better-button-multiplex.patch
Dmitry Torokhov
dtor_core@ameritech.net
Tue Aug 10 08:56:24 CEST 2004
===================================================================
ChangeSet@1.13, 2004-08-10 00:53:14-05:00, dtor_core@ameritech.net
Correctly multiplex button events from several mice.
gpm.c | 36 ++++++++++++++++++++++++++++++++++--
headers/gpmInt.h | 3 ++-
2 files changed, 36 insertions(+), 3 deletions(-)
===================================================================
diff -Nru a/src/gpm.c b/src/gpm.c
--- a/src/gpm.c 2004-08-10 01:17:59 -05:00
+++ b/src/gpm.c 2004-08-10 01:17:59 -05:00
@@ -259,6 +259,38 @@
return FD_ISSET(fd, &fdSet);
}
+static int multiplex_buttons(struct micetab *mouse, int new_buttons)
+{
+ static int left_btn_clicks, mid_btn_clicks, right_btn_clicks;
+ int mask;
+ int muxed_buttons = 0;
+
+ new_buttons =
+ (mouse->options.sequence[new_buttons & 7] & 7) | (new_buttons & ~7);
+ mask = new_buttons ^ mouse->buttons;
+ mouse->buttons = new_buttons;
+
+ if (mask & GPM_B_LEFT) {
+ if (new_buttons & GPM_B_LEFT) left_btn_clicks++;
+ else left_btn_clicks--;
+ }
+ if (left_btn_clicks) muxed_buttons |= GPM_B_LEFT;
+
+ if (mask & GPM_B_MIDDLE) {
+ if (new_buttons & GPM_B_MIDDLE) mid_btn_clicks++;
+ else mid_btn_clicks--;
+ }
+ if (mid_btn_clicks) muxed_buttons |= GPM_B_MIDDLE;
+
+ if (mask & GPM_B_RIGHT) {
+ if (new_buttons & GPM_B_RIGHT) right_btn_clicks++;
+ else right_btn_clicks--;
+ }
+ if (right_btn_clicks) muxed_buttons |= GPM_B_RIGHT;
+
+ return muxed_buttons;
+}
+
/*-------------------------------------------------------------------
* call getMouseData to get hardware device data, call mouse device's fun()
* to retrieve the hardware independent event data, then optionally repeat
@@ -303,8 +335,8 @@
event->modifiers = nEvent.modifiers; /* propagate modifiers */
/* propagate buttons */
- nEvent.buttons = (opt->sequence[nEvent.buttons & 7] & 7) |
- (nEvent.buttons & ~7); /* change the order */
+ nEvent.buttons = multiplex_buttons(mouse, nEvent.buttons);
+
if (!i) event->buttons = nEvent.buttons;
if (oldB != nEvent.buttons) {
diff -Nru a/src/headers/gpmInt.h b/src/headers/gpmInt.h
--- a/src/headers/gpmInt.h 2004-08-10 01:17:59 -05:00
+++ b/src/headers/gpmInt.h 2004-08-10 01:17:59 -05:00
@@ -162,7 +162,8 @@
struct miceopt options;
Gpm_Type *type;
char *device;
-};
+ int buttons; /* mouse's button state from last read */
+};
struct options {
int autodetect; /* -u [aUtodetect..'A' is not available] */
More information about the gpm
mailing list