diff options
author | Andrés <andmarti@gmail.com> | 2021-03-14 15:26:28 -0300 |
---|---|---|
committer | Andrés <andmarti@gmail.com> | 2021-03-14 15:26:28 -0300 |
commit | 50ea88259e22270e9ff0c2f3e3b5b0c863fa276b (patch) | |
tree | 9421ca6e4a5220b76c795edc3bd4d2f5b5e27a7c | |
parent | 326105427d4b48ed8141293299b661793304680b (diff) |
Added mouse support for virtual terminals. Define macro MOUSE un Makefile for its use
-rwxr-xr-x | src/Makefile | 2 | ||||
-rw-r--r-- | src/input.c | 12 | ||||
-rw-r--r-- | src/tui.c | 61 | ||||
-rw-r--r-- | src/tui.h | 3 |
4 files changed, 77 insertions, 1 deletions
diff --git a/src/Makefile b/src/Makefile index 1a1c887..fadf0b5 100755 --- a/src/Makefile +++ b/src/Makefile @@ -50,6 +50,8 @@ CFLAGS += -DUNDO CFLAGS += -DMAXROWS=65536 # Used for date formatting with C-d shortcut using you local d_fmt CFLAGS += -DUSELOCALE +# Comment out to enable mouse support on virtual terminal. +CFLAGS += -DMOUSE # Clipboard support is OS dependent. # diff --git a/src/input.c b/src/input.c index 6368f1b..716be6c 100644 --- a/src/input.c +++ b/src/input.c @@ -89,6 +89,9 @@ void handle_input(struct block * buffer) { cmd_multiplier = 0; cmd_pending = 0; +#ifdef MOUSE + MEVENT event; // mouse event +#endif while ( ! has_cmd(buffer, msec) && msec <= CMDTIMEOUT ) { // if command pending, refresh 'ef' only. Multiplier and cmd pending @@ -100,7 +103,14 @@ void handle_input(struct block * buffer) { // Read new character from stdin return_value = ui_getch(&wd); d = wd; - if ( d == OKEY_ESC || d == ctl('g')) { +#ifdef MOUSE + if (d == KEY_MOUSE) { + getmouse (&event); + ui_handle_mouse(event); + return; + } else +#endif + if ( d == OKEY_ESC || d == ctl('g')) { break_waitcmd_loop(buffer); ui_print_mult_pend(); return; @@ -140,6 +140,10 @@ void ui_start_screen() { noecho(); curs_set(0); + // Mouse support + mmask_t old; + mousemask (ALL_MOUSE_EVENTS, &old); + #ifndef NETBSD if ((char *) getenv ("ESCDELAY") == NULL) set_escdelay(ESC_DELAY); #endif @@ -1474,3 +1478,60 @@ void ui_mv_bottom_bar() { mvwin(input_win, atoi(get_conf_value("input_bar_bottom")) ? LINES-RESROW : 0, 0); return; } + +#ifdef MOUSE +void ui_handle_mouse(MEVENT event) { + int i, r = 0, c = 0; + if ( event.x < RESCOL || ( atoi(get_conf_value("input_bar_bottom")) && (event.y == 0 || event.y >= LINES - RESROW)) || + ( !atoi(get_conf_value("input_bar_bottom")) && (event.y <= RESROW))) return; + + if (event.bstate & BUTTON4_PRESSED || // scroll up + event.bstate & BUTTON5_PRESSED) { // scroll down + int n = LINES - RESROW - 1; + if (atoi(get_conf_value("half_page_scroll"))) n = n / 2; + lastcol = curcol; + lastrow = currow; + currow = event.bstate & BUTTON5_PRESSED ? forw_row(n)->row : back_row(n)->row; + unselect_ranges(); + if (event.bstate & BUTTON5_PRESSED) scroll_down(n); + else scroll_up(n); + unselect_ranges(); + ui_update(TRUE); + return; + } + + // not single click + if (! (event.bstate & BUTTON1_CLICKED)) return; + + c = event.x - RESCOL; + r = event.y - RESROW + (atoi(get_conf_value("input_bar_bottom")) ? 1 : - 1); + + + int mxcol = offscr_sc_cols + calc_offscr_sc_cols() - 1; + int col = 0; + int freeze = freeze_ranges && (freeze_ranges->type == 'c' || freeze_ranges->type == 'a') ? 1 : 0; + + for (i = 0; i <= mxcol; i++) { + if (i >= maxcols) { + sc_error("i >= maxcols in ui_show_sc_col_headings. please check calc_offscr_sc_cols."); + break; + } + //if (i < offscr_sc_cols && !(freeze && i >= freeze_ranges->tl->col && i <= freeze_ranges->br->col)) continue; + + if (col_hidden[i]) continue; + + // skip center_hidden_cols + if (freeze && (( + i > freeze_ranges->br->col && i <= freeze_ranges->br->col + center_hidden_cols) || ( + i < freeze_ranges->tl->col && i >= freeze_ranges->tl->col - center_hidden_cols))) continue; + + +// sc_debug("i:%d off%d mxcol:%d col:%d c:%d", i, offscr_sc_cols, mxcol, col, c); + col += fwidth[i]; + if (col > c + 1) break; + } + currow = r; + curcol = i; + ui_update(TRUE); +} +#endif @@ -99,3 +99,6 @@ void ui_pause(); void ui_resume(); wchar_t ui_query_opt(wchar_t * initial_msg, wchar_t * valid); void ui_mv_bottom_bar(); +#ifdef MOUSE +void ui_handle_mouse(MEVENT event); +#endif |