=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/tty-keys.c,v retrieving revision 1.32 retrieving revision 1.33 diff -c -r1.32 -r1.33 *** src/usr.bin/tmux/tty-keys.c 2011/01/01 02:16:25 1.32 --- src/usr.bin/tmux/tty-keys.c 2011/01/03 23:35:22 1.33 *************** *** 1,4 **** ! /* $OpenBSD: tty-keys.c,v 1.32 2011/01/01 02:16:25 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: tty-keys.c,v 1.33 2011/01/03 23:35:22 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 38,44 **** struct tty_key *, const char *, size_t, size_t *); struct tty_key *tty_keys_find(struct tty *, const char *, size_t, size_t *); void tty_keys_callback(int, short, void *); ! int tty_keys_mouse( const char *, size_t, size_t *, struct mouse_event *); struct tty_key_ent { --- 38,44 ---- struct tty_key *, const char *, size_t, size_t *); struct tty_key *tty_keys_find(struct tty *, const char *, size_t, size_t *); void tty_keys_callback(int, short, void *); ! int tty_keys_mouse(struct tty *, const char *, size_t, size_t *, struct mouse_event *); struct tty_key_ent { *************** *** 462,468 **** } /* Is this a mouse key press? */ ! switch (tty_keys_mouse(buf, len, &size, &mouse)) { case 0: /* yes */ evbuffer_drain(tty->event->input, size); key = KEYC_MOUSE; --- 462,468 ---- } /* Is this a mouse key press? */ ! switch (tty_keys_mouse(tty, buf, len, &size, &mouse)) { case 0: /* yes */ evbuffer_drain(tty->event->input, size); key = KEYC_MOUSE; *************** *** 584,627 **** * (probably a mouse sequence but need more data). */ int ! tty_keys_mouse(const char *buf, size_t len, size_t *size, struct mouse_event *m) { /* ! * Mouse sequences are \033[M followed by three characters indicating ! * buttons, X and Y, all based at 32 with 1,1 top-left. */ *size = 0; if (buf[0] != '\033') return (-1); if (len == 1) return (1); - if (buf[1] != '[') return (-1); if (len == 2) return (1); - if (buf[2] != 'M') return (-1); if (len == 3) return (1); ! if (len < 6) ! return (1); ! *size = 6; ! log_debug( ! "mouse input: %.6s (%hhu,%hhu/%hhu)", buf, buf[4], buf[5], buf[3]); ! m->b = buf[3]; ! m->x = buf[4]; ! m->y = buf[5]; if (m->b < 32 || m->x < 33 || m->y < 33) return (-1); m->b -= 32; m->x -= 33; m->y -= 33; return (0); } --- 584,657 ---- * (probably a mouse sequence but need more data). */ int ! tty_keys_mouse(struct tty *tty, ! const char *buf, size_t len, size_t *size, struct mouse_event *m) { + struct utf8_data utf8data; + u_int i, value; + /* ! * Standard mouse sequences are \033[M followed by three characters ! * indicating buttons, X and Y, all based at 32 with 1,1 top-left. ! * ! * UTF-8 mouse sequences are similar but the three are expressed as ! * UTF-8 characters. */ *size = 0; + /* First three bytes are always \033[M. */ if (buf[0] != '\033') return (-1); if (len == 1) return (1); if (buf[1] != '[') return (-1); if (len == 2) return (1); if (buf[2] != 'M') return (-1); if (len == 3) return (1); ! /* Read the three inputs. */ ! *size = 3; ! for (i = 0; i < 3; i++) { ! if (len < *size) ! return (1); ! if (tty->mode & MODE_MOUSE_UTF8) { ! if (utf8_open(&utf8data, buf[*size])) { ! if (utf8data.size != 2) ! return (-1); ! (*size)++; ! if (len < *size) ! return (1); ! utf8_append(&utf8data, buf[*size]); ! value = utf8_combine(&utf8data); ! } else ! value = buf[*size]; ! (*size)++; ! } else { ! value = buf[*size]; ! (*size)++; ! } ! if (i == 0) ! m->b = value; ! else if (i == 1) ! m->x = value; ! else ! m->y = value; ! } ! log_debug("mouse input: %.*s", (int) *size, buf); ! ! /* Check and return the mouse input. */ if (m->b < 32 || m->x < 33 || m->y < 33) return (-1); m->b -= 32; m->x -= 33; m->y -= 33; + log_debug("mouse position: x=%u y=%u b=%u", m->x, m->y, m->b); return (0); }