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
* 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 $

23
TODO
View File

@ -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

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>
@ -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;

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>
@ -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;

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>
@ -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;