diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2007-11-27 23:28:51 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2007-11-27 23:28:51 +0000 |
commit | 043514a834a2605b2635f9121071a5e53951915d (patch) | |
tree | 0848bee4f6b75f4cf9bb3ccaf8c47018e352a112 | |
parent | f47ab8f13fd76cb1761c74d1384ce7695ebbea44 (diff) |
Preliminary mouse support.
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | TODO | 23 | ||||
-rw-r--r-- | input.c | 10 | ||||
-rw-r--r-- | tmux.h | 7 | ||||
-rw-r--r-- | tty.c | 10 |
5 files changed, 49 insertions, 5 deletions
@@ -1,5 +1,7 @@ 27 November 2007 +* Enable/disable mouse when asked, if terminal claims to support it. Mouse + sequences are just passed through unaltered for the moment. * Big internal reorganisation. Rather than leaving control of the tty solely in the client and piping all data through a socket to it, change so that the server opens the tty again and reads and writes to it directly. This avoids @@ -283,4 +285,4 @@ (including mutt, emacs). No status bar yet and no key remapping or other customisation. -$Id: CHANGES,v 1.87 2007-11-27 19:23:32 nicm Exp $ +$Id: CHANGES,v 1.88 2007-11-27 23:28:51 nicm Exp $ @@ -65,3 +65,26 @@ - anything which uses cmd_{send,recv}_string will break if the string is split. string length should be part of the command size - echo \\033[35\;46m\\033[2J last line quirk (with C-b r) + +-------- +kmous -- \E[M + +mouse init: putp("\033[?1000h"); +mouse deinit: putp("\033[?1000l"); + +\e[M CbCxCy + * On button press or release, xterm sends ESC [ M CbCxCy. + * The low two bits of Cb encode button information: 0=MB1 + * pressed, 1=MB2 pressed, 2=MB3 pressed, 3=release. The + * upper bits encode what modifiers were down when the + * button was pressed and are added together. 4=Shift, + * 8=Meta, 16=Control. Cx and Cy are the x and y coordinates + * of the mouse event. The upper left corner is (1,1). + + + get_mouse getm Gm Curses should get + button events + key_mouse kmous Km Mouse event has + occurred + mouse_info minfo Mi Mouse status + information @@ -1,4 +1,4 @@ -/* $Id: input.c,v 1.41 2007-11-27 23:01:27 nicm Exp $ */ +/* $Id: input.c,v 1.42 2007-11-27 23:28:51 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -913,6 +913,10 @@ input_handle_sequence_sm(struct input_ctx *ictx) s->mode |= MODE_CURSOR; input_write(ictx, TTY_CURSORON); break; + case 1000: + s->mode |= MODE_MOUSE; + input_write(ictx, TTY_MOUSEON); + break; default: log_debug("unknown SM [%hhu]: %u", ictx->private, n); break; @@ -954,6 +958,10 @@ input_handle_sequence_rm(struct input_ctx *ictx) s->mode &= ~MODE_CURSOR; input_write(ictx, TTY_CURSOROFF); break; + case 1000: + s->mode &= ~MODE_MOUSE; + input_write(ictx, TTY_MOUSEOFF); + break; default: log_debug("unknown RM [%hhu]: %u", ictx->private, n); break; @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.105 2007-11-27 23:01:27 nicm Exp $ */ +/* $Id: tmux.h,v 1.106 2007-11-27 23:28:51 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -282,6 +282,8 @@ struct buffer { #define TTY_KKEYPADOFF 22 #define TTY_KKEYPADON 23 #define TTY_TITLE 24 +#define TTY_MOUSEON 25 +#define TTY_MOUSEOFF 26 /* XXX merge allon/off into 1 arg? */ /* Message codes. */ enum hdrtype { @@ -343,6 +345,7 @@ struct msg_resize_data { #define MODE_HIDDEN 0x020 #define MODE_BACKGROUND 0x040 #define MODE_BGCURSOR 0x080 +#define MODE_MOUSE 0x100 /* * Virtual screen. This is stored as three blocks of 8-bit values, one for @@ -558,7 +561,7 @@ struct client { #define CLIENT_TERMINAL 0x1 #define CLIENT_PREFIX 0x2 -#define CLIENT_ATTACHED 0x4 +#define CLIENT_MOUSE 0x4 int flags; struct session *session; @@ -1,4 +1,4 @@ -/* $Id: tty.c,v 1.6 2007-11-27 23:01:27 nicm Exp $ */ +/* $Id: tty.c,v 1.7 2007-11-27 23:28:51 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -324,7 +324,15 @@ tty_vwrite(struct tty *tty, int cmd, va_list ap) case TTY_KKEYPADON: if (keypad_xmit != NULL) tty_puts(tty, keypad_xmit); + break; #endif + case TTY_MOUSEOFF: + if (key_mouse != NULL) + tty_puts(tty, "\e[?1000l"); + break; + case TTY_MOUSEON: + if (key_mouse != NULL) + tty_puts(tty, "\e[?1000h"); break; case TTY_TITLE: break; |