aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2013-07-25 16:19:19 -0700
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2013-09-13 19:49:25 +0200
commiteae31a532e1c3249abe3fe0dbce286cac263832f (patch)
tree01097b6e7c3129d1d2a3a7f11e453eee598edce6
parentcc2ea3147accc342f4d411b42c8cae5b883b1224 (diff)
downloadst-patched-eae31a532e1c3249abe3fe0dbce286cac263832f.tar.bz2
st-patched-eae31a532e1c3249abe3fe0dbce286cac263832f.tar.xz
st-patched-eae31a532e1c3249abe3fe0dbce286cac263832f.zip
Fix some bugs in mouse tracking logic
* Button number in X10 mode: I believe the button - 1 came from "C b is button - 1" from [0]. However, above this section, it states "Normally, parameters (such as pointer poisition and button number) for all mouse tracking escape sequences generated by xterm encode numeric parameters in a single character as value+32. For example, ! specifies the value 1." Also, from the description of SGR, "The encoded button value in this case does not add 32 since that was useful only in the X10 scheme for ensuring that the byte containing the button value is a printable code." This suggests that we should still add 32 to the button value when in MODE_MOUSEX10. * No button release reporting in X10 mode: "X10 compatibility mode sends an escape sequence only on button press, encoding the location and the mouse button pressed." * Fix MODE_MOUSEMOTION: Currently, motion reporting is skipped when oldbutton == 3 (corresponding to no button being pressed). However, oldbutton is only set on a button press, which will never be 3. [0]: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
-rw-r--r--st.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/st.c b/st.c
index 4a91073..3321c31 100644
--- a/st.c
+++ b/st.c
@@ -823,18 +823,23 @@ mousereport(XEvent *e) {
823 button = oldbutton + 32; 823 button = oldbutton + 32;
824 ox = x; 824 ox = x;
825 oy = y; 825 oy = y;
826 } else if(!IS_SET(MODE_MOUSESGR)
827 && (e->xbutton.type == ButtonRelease
828 || button == AnyButton)) {
829 button = 3;
830 } else { 826 } else {
831 button -= Button1; 827 if(!IS_SET(MODE_MOUSESGR) && e->xbutton.type == ButtonRelease) {
832 if(button >= 3) 828 button = 3;
833 button += 64 - 3; 829 } else {
830 button -= Button1;
831 if(button >= 3)
832 button += 64 - 3;
833 }
834 if(e->xbutton.type == ButtonPress) { 834 if(e->xbutton.type == ButtonPress) {
835 oldbutton = button; 835 oldbutton = button;
836 ox = x; 836 ox = x;
837 oy = y; 837 oy = y;
838 } else if(e->xbutton.type == ButtonRelease) {
839 oldbutton = 3;
840 /* MODE_MOUSEX10: no button release reporting */
841 if(IS_SET(MODE_MOUSEX10))
842 return;
838 } 843 }
839 } 844 }
840 845
@@ -851,8 +856,7 @@ mousereport(XEvent *e) {
851 e->xbutton.type == ButtonRelease ? 'm' : 'M'); 856 e->xbutton.type == ButtonRelease ? 'm' : 'M');
852 } else if(x < 223 && y < 223) { 857 } else if(x < 223 && y < 223) {
853 len = snprintf(buf, sizeof(buf), "\033[M%c%c%c", 858 len = snprintf(buf, sizeof(buf), "\033[M%c%c%c",
854 IS_SET(MODE_MOUSEX10)? button-1 : 32+button, 859 32+button, 32+x+1, 32+y+1);
855 32+x+1, 32+y+1);
856 } else { 860 } else {
857 return; 861 return;
858 } 862 }