aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2017-02-11 13:28:56 -0500
committerJesse Luehrs <doy@tozt.net>2017-02-11 13:28:56 -0500
commit1bacad0c4ae2cfac6bca888569e73bc18bf9268a (patch)
tree16d66b028cef21b76121779f680db5a9bcd689eb
parent6fe0eaf08492e5c99d6b1a457b41db6667c933c5 (diff)
downloadrunes-1bacad0c4ae2cfac6bca888569e73bc18bf9268a.tar.gz
runes-1bacad0c4ae2cfac6bca888569e73bc18bf9268a.zip
only clear the selection if the contents changed
-rw-r--r--src/display.c17
-rw-r--r--src/display.h1
-rw-r--r--src/window-xlib.c12
3 files changed, 18 insertions, 12 deletions
diff --git a/src/display.c b/src/display.c
index f3b14de..7246819 100644
--- a/src/display.c
+++ b/src/display.c
@@ -69,7 +69,7 @@ void runes_display_draw_screen(RunesTerm *t)
if (t->scr->dirty || display->dirty) {
if (t->scr->dirty) {
- display->has_selection = 0;
+ runes_display_maybe_clear_selection(t);
}
cairo_push_group(display->cr);
@@ -202,6 +202,21 @@ void runes_display_set_selection(
t->display->dirty = 1;
}
+void runes_display_maybe_clear_selection(RunesTerm *t)
+{
+ RunesDisplay *display = t->display;
+ char *contents;
+ size_t len;
+
+ vt100_screen_get_string_plaintext(
+ t->scr, &display->selection_start, &display->selection_end,
+ &contents, &len);
+ if (len != display->selection_len
+ || memcmp(contents, display->selection_contents, len)) {
+ display->has_selection = 0;
+ }
+}
+
void runes_display_delete(RunesDisplay *display)
{
cairo_pattern_destroy(display->buffer);
diff --git a/src/display.h b/src/display.h
index 135a71e..5f79948 100644
--- a/src/display.h
+++ b/src/display.h
@@ -33,6 +33,7 @@ void runes_display_draw_screen(RunesTerm *t);
void runes_display_draw_cursor(RunesTerm *t);
void runes_display_set_selection(
RunesTerm *t, struct vt100_loc *start, struct vt100_loc *end);
+void runes_display_maybe_clear_selection(RunesTerm *t);
void runes_display_delete(RunesDisplay *display);
#endif
diff --git a/src/window-xlib.c b/src/window-xlib.c
index 2dbcbca..20258f3 100644
--- a/src/window-xlib.c
+++ b/src/window-xlib.c
@@ -119,7 +119,6 @@ static void runes_window_update_selection(
static void runes_window_update_selection_loc(
RunesTerm *t, struct vt100_loc *end, Time time);
static void runes_window_acquire_selection(RunesTerm *t, Time time);
-static void runes_window_clear_selection(RunesTerm *t);
static void runes_window_handle_key_event(RunesTerm *t, XKeyEvent *e);
static void runes_window_handle_button_event(RunesTerm *t, XButtonEvent *e);
static void runes_window_handle_motion_event(RunesTerm *t, XMotionEvent *e);
@@ -519,7 +518,7 @@ static void runes_window_resize_window(
cairo_xlib_surface_set_size(
cairo_get_target(w->backend_cr), dwidth, dheight);
runes_term_set_window_size(t, dwidth, dheight);
- runes_window_clear_selection(t);
+ runes_display_maybe_clear_selection(t);
}
}
@@ -745,15 +744,6 @@ static void runes_window_acquire_selection(RunesTerm *t, Time time)
}
}
-static void runes_window_clear_selection(RunesTerm *t)
-{
- RunesWindow *w = t->w;
-
- XSetSelectionOwner(w->wb->dpy, XA_PRIMARY, None, CurrentTime);
- t->display->has_selection = 0;
- w->owns_selection = 0;
-}
-
static void runes_window_handle_key_event(RunesTerm *t, XKeyEvent *e)
{
RunesWindow *w = t->w;