From e2ffcc4228f248f584e28945f2198860338c5e6f Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 21 Apr 2014 00:55:57 -0400 Subject: support basic mouse events --- src/parser.c | 14 +++++++++++++ src/parser.l | 12 +++++++++++ src/term.h | 2 ++ src/window-xlib.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) diff --git a/src/parser.c b/src/parser.c index 205b796..9a04535 100644 --- a/src/parser.c +++ b/src/parser.c @@ -2591,9 +2591,16 @@ static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len) case 1: t->application_cursor = 1; break; + case 9: + t->mouse_reporting_press = 1; + break; case 25: runes_display_show_cursor(t); break; + case 1000: + t->mouse_reporting_press_release = 1; + break; + case 47: case 1049: runes_display_use_alternate_buffer(t); break; @@ -2626,9 +2633,16 @@ static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len) case 1: t->application_cursor = 0; break; + case 9: + t->mouse_reporting_press = 0; + break; case 25: runes_display_hide_cursor(t); break; + case 1000: + t->mouse_reporting_press_release = 0; + break; + case 47: case 1049: runes_display_use_normal_buffer(t); break; diff --git a/src/parser.l b/src/parser.l index 9a071ed..d1bfb10 100644 --- a/src/parser.l +++ b/src/parser.l @@ -467,9 +467,15 @@ static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len) case 1: t->application_cursor = 1; break; + case 9: + t->mouse_reporting_press = 1; + break; case 25: runes_display_show_cursor(t); break; + case 1000: + t->mouse_reporting_press_release = 1; + break; case 47: case 1049: runes_display_use_alternate_buffer(t); @@ -503,9 +509,15 @@ static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len) case 1: t->application_cursor = 0; break; + case 9: + t->mouse_reporting_press = 0; + break; case 25: runes_display_hide_cursor(t); break; + case 1000: + t->mouse_reporting_press_release = 0; + break; case 47: case 1049: runes_display_use_normal_buffer(t); diff --git a/src/term.h b/src/term.h index c083eb2..89a0c54 100644 --- a/src/term.h +++ b/src/term.h @@ -56,6 +56,8 @@ struct runes_term { char application_keypad; char application_cursor; + char mouse_reporting_press; + char mouse_reporting_press_release; }; void runes_term_init(RunesTerm *t, int argc, char *argv[]); diff --git a/src/window-xlib.c b/src/window-xlib.c index b747915..4873545 100644 --- a/src/window-xlib.c +++ b/src/window-xlib.c @@ -402,6 +402,65 @@ static void runes_window_backend_process_event(uv_work_t *req, int status) free(buf); break; } + case ButtonPress: + case ButtonRelease: + if (t->mouse_reporting_press_release) { + char response[7]; + char status = 0; + + if (e->type == ButtonPress || e->xbutton.button <= 3) { + if (e->type == ButtonRelease) { + status = 3; + } + else { + switch (e->xbutton.button) { + case Button1: + status = 0; + break; + case Button2: + status = 1; + break; + case Button3: + status = 2; + break; + case Button4: + status = 64; + break; + case Button5: + status = 65; + break; + } + } + + if (e->xbutton.state & ShiftMask) { + status |= 4; + } + if (e->xbutton.state & Mod1Mask) { + status |= 8; + } + if (e->xbutton.state & ControlMask) { + status |= 16; + } + + sprintf( + response, "\e[M%c%c%c", + ' ' + (status), + ' ' + (e->xbutton.x / t->fontx + 1), + ' ' + (e->xbutton.y / t->fonty + 1)); + runes_pty_backend_write(t, response, 6); + } + } + else if (t->mouse_reporting_press && e->type == ButtonPress) { + char response[7]; + + sprintf( + response, "\e[M%c%c%c", + ' ' + (e->xbutton.button - 1), + ' ' + (e->xbutton.x / t->fontx + 1), + ' ' + (e->xbutton.y / t->fonty + 1)); + runes_pty_backend_write(t, response, 6); + } + break; case Expose: runes_window_backend_flush(t); break; -- cgit v1.2.3-54-g00ecf