aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTatsuya Kinoshita <tats@debian.org>2013-04-08 12:36:33 +0000
committerTatsuya Kinoshita <tats@debian.org>2013-04-08 12:36:33 +0000
commita342af3d63b304dd630f3cbde242f7266739bbaa (patch)
tree104e3a5b451875124f2d1584cb592a5d471aaacd
parentMerge from upstream on 2012-05-22 (diff)
downloadw3m-a342af3d63b304dd630f3cbde242f7266739bbaa.tar.gz
w3m-a342af3d63b304dd630f3cbde242f7266739bbaa.zip
Support SGR 1006 mouse reporting
Patch to support SGR 1006 mouse reporting, from [w3m-dev 04466] on 2012-07-15, provided by Hayaki Saito.
Diffstat (limited to '')
-rw-r--r--keybind.c2
-rw-r--r--main.c52
-rw-r--r--proto.h1
-rw-r--r--terms.c4
4 files changed, 56 insertions, 3 deletions
diff --git a/keybind.c b/keybind.c
index a490962..fec0c65 100644
--- a/keybind.c
+++ b/keybind.c
@@ -91,7 +91,7 @@ unsigned char EscBKeymap[128] = {
/* 0 1 2 3 4 5 6 7 */
nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
/* 8 9 : ; < = > ? */
- nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
+ nulcmd, nulcmd, nulcmd, nulcmd, sgrmouse, nulcmd, nulcmd, nulcmd,
/* @ A B C D E F G */
nulcmd, movU, movD, movR, movL, nulcmd, goLineL, pgFore,
/* H I J K L M N O */
diff --git a/main.c b/main.c
index b421943..35f2f39 100644
--- a/main.c
+++ b/main.c
@@ -5398,6 +5398,58 @@ DEFUN(mouse, MOUSE, "mouse operation")
process_mouse(btn, x, y);
}
+DEFUN(sgrmouse, SGRMOUSE, "SGR 1006 mouse operation")
+{
+ int btn = 0, x = 0, y = 0;
+ unsigned char c;
+
+ do {
+ c = getch();
+ if (IS_DIGIT(c))
+ btn = btn * 10 + c - '0';
+ else if (c == ';')
+ break;
+ else
+ return;
+ } while (1);
+
+#if defined(__CYGWIN__) && CYGWIN_VERSION_DLL_MAJOR < 1005
+ if (cygwin_mouse_btn_swapped) {
+ if (btn == MOUSE_BTN2_DOWN)
+ btn = MOUSE_BTN3_DOWN;
+ else if (btn == MOUSE_BTN3_DOWN)
+ btn = MOUSE_BTN2_DOWN;
+ };
+#endif
+
+ do {
+ c = getch();
+ if (IS_DIGIT(c))
+ x = x * 10 + c - '0';
+ else if (c == ';')
+ break;
+ else
+ return;
+ } while (1);
+
+ do {
+ c = getch();
+ if (IS_DIGIT(c))
+ y = y * 10 + c - '0';
+ else if (c == 'M')
+ break;
+ else if (c == 'm') {
+ btn |= 3;
+ break;
+ } else
+ return;
+ } while (1);
+
+ if (x < 0 || x >= COLS || y < 0 || y > LASTLINE)
+ return;
+ process_mouse(btn, x, y);
+}
+
#ifdef USE_GPM
int
gpm_process_mouse(Gpm_Event * event, void *data)
diff --git a/proto.h b/proto.h
index f8a7345..980d522 100644
--- a/proto.h
+++ b/proto.h
@@ -683,6 +683,7 @@ extern void reMark(void);
#ifdef USE_MOUSE
extern void mouse(void);
+extern void sgrmouse(void);
extern void mouse_init(void);
extern void mouse_end(void);
extern void mouse_active(void);
diff --git a/terms.c b/terms.c
index 7a3c987..8d928a2 100644
--- a/terms.c
+++ b/terms.c
@@ -2027,8 +2027,8 @@ sleep_till_anykey(int sec, int purge)
#ifdef USE_MOUSE
-#define XTERM_ON {fputs("\033[?1001s\033[?1000h",ttyf); flush_tty();}
-#define XTERM_OFF {fputs("\033[?1000l\033[?1001r",ttyf); flush_tty();}
+#define XTERM_ON {fputs("\033[?1001s\033[?1000h\033[?1006h",ttyf); flush_tty();}
+#define XTERM_OFF {fputs("\033[?1006l\033[?1000l\033[?1001r",ttyf); flush_tty();}
#define CYGWIN_ON {fputs("\033[?1000h",ttyf); flush_tty();}
#define CYGWIN_OFF {fputs("\033[?1000l",ttyf); flush_tty();}