diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-04-21 00:55:57 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-04-21 00:55:57 -0400 |
commit | e2ffcc4228f248f584e28945f2198860338c5e6f (patch) | |
tree | a26aa17d78ffb65f1a88051143db7651fef89b5f | |
parent | e92508954a910d703f1cc1d9c99e866b012afb25 (diff) | |
download | runes-e2ffcc4228f248f584e28945f2198860338c5e6f.tar.gz runes-e2ffcc4228f248f584e28945f2198860338c5e6f.zip |
support basic mouse events
-rw-r--r-- | src/parser.c | 14 | ||||
-rw-r--r-- | src/parser.l | 12 | ||||
-rw-r--r-- | src/term.h | 2 | ||||
-rw-r--r-- | src/window-xlib.c | 59 |
4 files changed, 87 insertions, 0 deletions
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); @@ -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; |