Preliminary mouse support.

This commit is contained in:
Nicholas Marriott 2007-11-27 23:28:51 +00:00
parent f47ab8f13f
commit 043514a834
5 changed files with 49 additions and 5 deletions

View File

@ -1,5 +1,7 @@
27 November 2007 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 * 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 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 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 (including mutt, emacs). No status bar yet and no key remapping or other
customisation. 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 $

23
TODO
View File

@ -65,3 +65,26 @@
- anything which uses cmd_{send,recv}_string will break if the string is - anything which uses cmd_{send,recv}_string will break if the string is
split. string length should be part of the command size split. string length should be part of the command size
- echo \\033[35\;46m\\033[2J last line quirk (with C-b r) - 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

10
input.c
View File

@ -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> * 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; s->mode |= MODE_CURSOR;
input_write(ictx, TTY_CURSORON); input_write(ictx, TTY_CURSORON);
break; break;
case 1000:
s->mode |= MODE_MOUSE;
input_write(ictx, TTY_MOUSEON);
break;
default: default:
log_debug("unknown SM [%hhu]: %u", ictx->private, n); log_debug("unknown SM [%hhu]: %u", ictx->private, n);
break; break;
@ -954,6 +958,10 @@ input_handle_sequence_rm(struct input_ctx *ictx)
s->mode &= ~MODE_CURSOR; s->mode &= ~MODE_CURSOR;
input_write(ictx, TTY_CURSOROFF); input_write(ictx, TTY_CURSOROFF);
break; break;
case 1000:
s->mode &= ~MODE_MOUSE;
input_write(ictx, TTY_MOUSEOFF);
break;
default: default:
log_debug("unknown RM [%hhu]: %u", ictx->private, n); log_debug("unknown RM [%hhu]: %u", ictx->private, n);
break; break;

7
tmux.h
View File

@ -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> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -282,6 +282,8 @@ struct buffer {
#define TTY_KKEYPADOFF 22 #define TTY_KKEYPADOFF 22
#define TTY_KKEYPADON 23 #define TTY_KKEYPADON 23
#define TTY_TITLE 24 #define TTY_TITLE 24
#define TTY_MOUSEON 25
#define TTY_MOUSEOFF 26 /* XXX merge allon/off into 1 arg? */
/* Message codes. */ /* Message codes. */
enum hdrtype { enum hdrtype {
@ -343,6 +345,7 @@ struct msg_resize_data {
#define MODE_HIDDEN 0x020 #define MODE_HIDDEN 0x020
#define MODE_BACKGROUND 0x040 #define MODE_BACKGROUND 0x040
#define MODE_BGCURSOR 0x080 #define MODE_BGCURSOR 0x080
#define MODE_MOUSE 0x100
/* /*
* Virtual screen. This is stored as three blocks of 8-bit values, one for * 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_TERMINAL 0x1
#define CLIENT_PREFIX 0x2 #define CLIENT_PREFIX 0x2
#define CLIENT_ATTACHED 0x4 #define CLIENT_MOUSE 0x4
int flags; int flags;
struct session *session; struct session *session;

10
tty.c
View File

@ -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> * 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: case TTY_KKEYPADON:
if (keypad_xmit != NULL) if (keypad_xmit != NULL)
tty_puts(tty, keypad_xmit); tty_puts(tty, keypad_xmit);
break;
#endif #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; break;
case TTY_TITLE: case TTY_TITLE:
break; break;