aboutsummaryrefslogtreecommitdiffstats
path: root/unix
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2024-11-18 13:22:13 +0100
committerPierre Ossman <ossman@cendio.se>2024-11-18 13:22:13 +0100
commit581698685b9cc3155aed5f5c6c1b293dee44144a (patch)
tree26762adbf7ce6d36771e55556b0c1e199bbf3d77 /unix
parent0959ce953e3578d16e3922a9326968f3cf449fb2 (diff)
parentc40d8a4debbfbf98045ef25fcac91672f0cc1049 (diff)
downloadtigervnc-581698685b9cc3155aed5f5c6c1b293dee44144a.tar.gz
tigervnc-581698685b9cc3155aed5f5c6c1b293dee44144a.zip
Merge branch 'mouse-button-support' of https://github.com/CendioHalim/tigervnc
Diffstat (limited to 'unix')
-rw-r--r--unix/x0vncserver/XDesktop.cxx8
-rw-r--r--unix/x0vncserver/XDesktop.h4
-rw-r--r--unix/xserver/hw/vnc/XserverDesktop.cc2
-rw-r--r--unix/xserver/hw/vnc/XserverDesktop.h2
-rw-r--r--unix/xserver/hw/vnc/vncInput.c19
5 files changed, 26 insertions, 9 deletions
diff --git a/unix/x0vncserver/XDesktop.cxx b/unix/x0vncserver/XDesktop.cxx
index b4e795ef..40d84c03 100644
--- a/unix/x0vncserver/XDesktop.cxx
+++ b/unix/x0vncserver/XDesktop.cxx
@@ -247,9 +247,9 @@ void XDesktop::init(VNCServer* vs)
void XDesktop::start()
{
// Determine actual number of buttons of the X pointer device.
- unsigned char btnMap[8];
- int numButtons = XGetPointerMapping(dpy, btnMap, 8);
- maxButtons = (numButtons > 8) ? 8 : numButtons;
+ unsigned char btnMap[9];
+ int numButtons = XGetPointerMapping(dpy, btnMap, 9);
+ maxButtons = (numButtons > 9) ? 9 : numButtons;
vlog.info("Enabling %d button%s of X pointer device",
maxButtons, (maxButtons != 1) ? "s" : "");
@@ -347,7 +347,7 @@ void XDesktop::queryConnection(network::Socket* sock,
queryConnectDialog->map();
}
-void XDesktop::pointerEvent(const Point& pos, uint8_t buttonMask) {
+void XDesktop::pointerEvent(const Point& pos, uint16_t buttonMask) {
#ifdef HAVE_XTEST
if (!haveXtest) return;
XTestFakeMotionEvent(dpy, DefaultScreen(dpy),
diff --git a/unix/x0vncserver/XDesktop.h b/unix/x0vncserver/XDesktop.h
index cadc695f..a27a1eae 100644
--- a/unix/x0vncserver/XDesktop.h
+++ b/unix/x0vncserver/XDesktop.h
@@ -63,7 +63,7 @@ public:
bool isRunning();
void queryConnection(network::Socket* sock,
const char* userName) override;
- void pointerEvent(const rfb::Point& pos, uint8_t buttonMask) override;
+ void pointerEvent(const rfb::Point& pos, uint16_t buttonMask) override;
void keyEvent(uint32_t keysym, uint32_t xtcode, bool down) override;
unsigned int setScreenLayout(int fb_width, int fb_height,
const rfb::ScreenSet& layout) override;
@@ -90,7 +90,7 @@ protected:
QueryConnectDialog* queryConnectDialog;
network::Socket* queryConnectSock;
XSelection selection;
- uint8_t oldButtonMask;
+ uint16_t oldButtonMask;
bool haveXtest;
bool haveDamage;
int maxButtons;
diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc
index 9c4486c8..f0ab87ab 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.cc
+++ b/unix/xserver/hw/vnc/XserverDesktop.cc
@@ -462,7 +462,7 @@ void XserverDesktop::terminate()
kill(getpid(), SIGTERM);
}
-void XserverDesktop::pointerEvent(const Point& pos, uint8_t buttonMask)
+void XserverDesktop::pointerEvent(const Point& pos, uint16_t buttonMask)
{
vncPointerMove(pos.x + vncGetScreenX(screenIndex),
pos.y + vncGetScreenY(screenIndex));
diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h
index d287b72f..8c543db7 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.h
+++ b/unix/xserver/hw/vnc/XserverDesktop.h
@@ -95,7 +95,7 @@ public:
void terminate() override;
void queryConnection(network::Socket* sock,
const char* userName) override;
- void pointerEvent(const rfb::Point& pos, uint8_t buttonMask) override;
+ void pointerEvent(const rfb::Point& pos, uint16_t buttonMask) override;
void keyEvent(uint32_t keysym, uint32_t keycode, bool down) override;
unsigned int setScreenLayout(int fb_width, int fb_height,
const rfb::ScreenSet& layout) override;
diff --git a/unix/xserver/hw/vnc/vncInput.c b/unix/xserver/hw/vnc/vncInput.c
index 1de41430..a705a85a 100644
--- a/unix/xserver/hw/vnc/vncInput.c
+++ b/unix/xserver/hw/vnc/vncInput.c
@@ -50,7 +50,7 @@ extern const unsigned int code_map_qnum_to_xorgevdev_len;
extern const unsigned short code_map_qnum_to_xorgkbd[];
extern const unsigned int code_map_qnum_to_xorgkbd_len;
-#define BUTTONS 7
+#define BUTTONS 9
DeviceIntPtr vncKeyboardDev;
DeviceIntPtr vncPointerDev;
@@ -207,6 +207,23 @@ static int vncPointerProc(DeviceIntPtr pDevice, int onoff)
btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
+ /*
+ * The labels BTN_LABEL_PROP_BTN_SIDE and BTN_LABEL_PROP_BTN_EXTRA
+ * represent the side buttons on mice that are typically used to
+ * navigate back/forward respectively in web browsers.
+ *
+ * In X11, these labels are mapped to the BTN_SIDE and BTN_EXTRA
+ * input codes, which are mapped in the Linux HID driver. These
+ * are not to be confused with the BTN_FORWARD and BTN_BACK input
+ * codes, which some applications also use for back/forward
+ * navigation.
+ *
+ * It seems like most mice have their side buttons mapped to
+ * BTN_SIDE and BTN_EXTRA.
+ */
+ btn_labels[7] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_SIDE);
+ btn_labels[8] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_EXTRA);
+
axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);