break;
case SelectionClear:
- selection_clear ();
+ display->set_selection_owner (0);
break;
case SelectionNotify:
rxvt_display::rxvt_display (const char *name)
: x_watcher (this, &rxvt_display::x_event)
+, selection_owner (0)
{
this->name = STRDUP (name);
}
xw[w->active - 1] = 0;
}
+void rxvt_display::set_selection_owner (rxvt_term *owner)
+{
+ if (selection_owner && selection_owner != owner)
+ selection_owner->selection_clear ();
+
+ selection_owner = owner;
+}
+
/////////////////////////////////////////////////////////////////////////////
rxvt_displays displays;
#include "callback.h"
-struct rxvt_vars;
+struct rxvt_term;
struct xevent_watcher;
struct rxvt_display {
int referenced;
char *name;
+
+ rxvt_term *selection_owner;
io_manager_vec<xevent_watcher> xw;
io_watcher x_watcher; void x_event (io_watcher &w, short revents);
rxvt_display (const char *name);
~rxvt_display ();
+
+ void set_selection_owner (rxvt_term *owner);
};
struct xevent_watcher : watcher, callback1<void, XEvent &> {
selection.text = new_selection_text;
- XSetSelectionOwner(display->display, XA_PRIMARY, TermWin.vt, tm);
- if (XGetSelectionOwner(display->display, XA_PRIMARY) != TermWin.vt)
+ XSetSelectionOwner (display->display, XA_PRIMARY, TermWin.vt, tm);
+ if (XGetSelectionOwner (display->display, XA_PRIMARY) == TermWin.vt)
+ display->set_selection_owner (this);
+ else
rxvt_print_error("can't get primary selection");
-
{
XTextProperty ct;
char *cl = (char *)selection.text;