From a0ee633a74748b70cac10b3de4829c86018c7298 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Sun, 16 Feb 2014 16:40:45 +0000 Subject: [PATCH] Stop sending release events for mouse wheel 'buttons' in X mouse mode. On Windows (X mouse reporting of the mouse wheel isn't currently done by the Unix front end, though I'm shortly about to fix that too) a mouse wheel event is translated into a virtual button, and we send both a press and a release of that button to terminal.c, which encodes both in X mouse reporting escape sequences and passes them on to the server. This isn't consistent with what xterm does - scroll-wheel events are encoded _like_ button presses, but differ semantically in that they don't have matching releases. So we're updating to match xterm. git-svn-id: http://svn.tartarus.org/sgt/putty@10138 cda61777-01e9-0310-a592-d414129be87e --- terminal.c | 22 ++++++++++++++++++---- windows/window.c | 4 ---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/terminal.c b/terminal.c index 71b3bec6..ee88974b 100644 --- a/terminal.c +++ b/terminal.c @@ -5896,7 +5896,7 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked, */ if (raw_mouse && (term->selstate != ABOUT_TO) && (term->selstate != DRAGGING)) { - int encstate = 0, r, c; + int encstate = 0, r, c, wheel; char abuf[32]; int len = 0; @@ -5905,22 +5905,35 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked, switch (braw) { case MBT_LEFT: encstate = 0x00; /* left button down */ + wheel = FALSE; break; case MBT_MIDDLE: encstate = 0x01; + wheel = FALSE; break; case MBT_RIGHT: encstate = 0x02; + wheel = FALSE; break; case MBT_WHEEL_UP: encstate = 0x40; + wheel = TRUE; break; case MBT_WHEEL_DOWN: encstate = 0x41; + wheel = TRUE; break; - default: break; /* placate gcc warning about enum use */ + default: + return; } - switch (a) { + if (wheel) { + /* For mouse wheel buttons, we only ever expect to see + * MA_CLICK actions, and we don't try to keep track of + * the buttons being 'pressed' (since without matching + * click/release pairs that's pointless). */ + if (a != MA_CLICK) + return; + } else switch (a) { case MA_DRAG: if (term->xterm_mouse == 1) return; @@ -5937,7 +5950,8 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked, return; term->mouse_is_down = braw; break; - default: break; /* placate gcc warning about enum use */ + default: + return; } if (shift) encstate += 0x04; diff --git a/windows/window.c b/windows/window.c index bf8d651e..6ee53434 100644 --- a/windows/window.c +++ b/windows/window.c @@ -3248,10 +3248,6 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, TO_CHR_X(p.x), TO_CHR_Y(p.y), shift_pressed, control_pressed, is_alt_pressed()); - term_mouse(term, b, translate_button(b), - MA_RELEASE, TO_CHR_X(p.x), - TO_CHR_Y(p.y), shift_pressed, - control_pressed, is_alt_pressed()); } /* else: not sure when this can fail */ } else { /* trigger a scroll */ -- 2.45.2