From 1bacad0c4ae2cfac6bca888569e73bc18bf9268a Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 11 Feb 2017 13:28:56 -0500 Subject: only clear the selection if the contents changed --- src/display.c | 17 ++++++++++++++++- src/display.h | 1 + src/window-xlib.c | 12 +----------- 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; -- cgit v1.2.3