From af8dd428a3e2d5c24ea2141a3c2bcd8a0398e736 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 18 May 2014 21:31:35 -0400 Subject: draw the selected region as inverse --- src/display.c | 9 +++++++-- src/screen.c | 36 ++++++++++++++++++++++++++++++++++++ src/screen.h | 1 + src/window-xlib.c | 4 ++++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/display.c b/src/display.c index d5556d6..8c9d909 100644 --- a/src/display.c +++ b/src/display.c @@ -190,9 +190,14 @@ static void runes_display_recalculate_font_metrics(RunesTerm *t) static int runes_display_draw_cell(RunesTerm *t, int row, int col) { RunesDisplay *display = &t->display; - struct runes_cell *cell = &t->scr.grid->rows[row + t->scr.grid->row_top - display->row_visible_offset].cells[col]; + struct runes_loc loc = { + row + t->scr.grid->row_top - display->row_visible_offset, col }; + struct runes_cell *cell = &t->scr.grid->rows[loc.row].cells[loc.col]; cairo_pattern_t *bg = NULL, *fg = NULL; int bg_is_custom = 0, fg_is_custom = 0; + int selected; + + selected = runes_screen_loc_is_selected(t, loc); switch (cell->attrs.bgcolor.type) { case RUNES_COLOR_DEFAULT: @@ -232,7 +237,7 @@ static int runes_display_draw_cell(RunesTerm *t, int row, int col) break; } - if (cell->attrs.inverse) { + if (cell->attrs.inverse ^ selected) { if (cell->attrs.fgcolor.id == cell->attrs.bgcolor.id) { fg = t->config.bgdefault; bg = t->config.fgdefault; diff --git a/src/screen.c b/src/screen.c index f9124ce..423c12b 100644 --- a/src/screen.c +++ b/src/screen.c @@ -10,6 +10,9 @@ static struct runes_cell *runes_screen_cell_at(RunesTerm *t, int row, int col); static void runes_screen_scroll_down(RunesTerm *t, int count); static void runes_screen_scroll_up(RunesTerm *t, int count); static int runes_screen_scroll_region_is_active(RunesTerm *t); +static int runes_screen_loc_is_between( + RunesTerm *t, struct runes_loc loc, + struct runes_loc start, struct runes_loc end); void runes_screen_init(RunesTerm *t) { @@ -95,6 +98,18 @@ void runes_screen_process_string(RunesTerm *t, char *buf, size_t len) runes_parser_yy_delete_buffer(scr->state, scr->scanner); } +int runes_screen_loc_is_selected(RunesTerm *t, struct runes_loc loc) +{ + RunesScreen *scr = &t->scr; + + if (!scr->has_selection) { + return 0; + } + + return runes_screen_loc_is_between( + t, loc, scr->grid->selection_start, scr->grid->selection_end); +} + void runes_screen_get_string( RunesTerm *t, struct runes_loc *start, struct runes_loc *end, char **strp, size_t *lenp) @@ -945,3 +960,24 @@ static int runes_screen_scroll_region_is_active(RunesTerm *t) return scr->grid->scroll_top != 0 || scr->grid->scroll_bottom != scr->grid->max.row - 1; } + +static int runes_screen_loc_is_between( + RunesTerm *t, struct runes_loc loc, + struct runes_loc start, struct runes_loc end) +{ + UNUSED(t); + + if (loc.row < start.row || loc.row > end.row) { + return 0; + } + + if (loc.row == start.row && loc.col < start.col) { + return 0; + } + + if (loc.row == end.row && loc.col >= end.col) { + return 0; + } + + return 1; +} diff --git a/src/screen.h b/src/screen.h index 8e94fce..2e6a298 100644 --- a/src/screen.h +++ b/src/screen.h @@ -114,6 +114,7 @@ struct runes_screen { void runes_screen_init(RunesTerm *t); void runes_screen_set_window_size(RunesTerm *t); void runes_screen_process_string(RunesTerm *t, char *buf, size_t len); +int runes_screen_loc_is_selected(RunesTerm *t, struct runes_loc loc); void runes_screen_get_string( RunesTerm *t, struct runes_loc *start, struct runes_loc *end, char **strp, size_t *lenp); diff --git a/src/window-xlib.c b/src/window-xlib.c index e497d34..7b135c2 100644 --- a/src/window-xlib.c +++ b/src/window-xlib.c @@ -877,6 +877,8 @@ static void runes_window_backend_stop_selection( XSetSelectionOwner(w->dpy, XA_PRIMARY, w->w, time); t->scr.has_selection = (XGetSelectionOwner(w->dpy, XA_PRIMARY) == w->w); } + t->scr.dirty = 1; + runes_window_backend_flush(t); } static struct runes_loc runes_window_backend_get_mouse_position( @@ -986,6 +988,8 @@ static void runes_window_backend_handle_selection_clear_event( UNUSED(e); t->scr.has_selection = 0; + t->scr.dirty = 1; + runes_window_backend_flush(t); } static void runes_window_backend_handle_selection_request_event( -- cgit v1.2.3-54-g00ecf