aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-21 00:55:57 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-21 00:55:57 -0400
commite2ffcc4228f248f584e28945f2198860338c5e6f (patch)
treea26aa17d78ffb65f1a88051143db7651fef89b5f
parente92508954a910d703f1cc1d9c99e866b012afb25 (diff)
downloadrunes-e2ffcc4228f248f584e28945f2198860338c5e6f.tar.gz
runes-e2ffcc4228f248f584e28945f2198860338c5e6f.zip
support basic mouse events
-rw-r--r--src/parser.c14
-rw-r--r--src/parser.l12
-rw-r--r--src/term.h2
-rw-r--r--src/window-xlib.c59
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);
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;