aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-05-18 21:31:35 -0400
committerJesse Luehrs <doy@tozt.net>2014-07-04 22:39:07 -0400
commitaf8dd428a3e2d5c24ea2141a3c2bcd8a0398e736 (patch)
treea08ed3cf074757a763e6b21c13403c5a02e3edfa
parenta516f21b1f2bb25ae31ceebba9664e0eb0ebc37f (diff)
downloadrunes-af8dd428a3e2d5c24ea2141a3c2bcd8a0398e736.tar.gz
runes-af8dd428a3e2d5c24ea2141a3c2bcd8a0398e736.zip
draw the selected region as inverse
-rw-r--r--src/display.c9
-rw-r--r--src/screen.c36
-rw-r--r--src/screen.h1
-rw-r--r--src/window-xlib.c4
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(