*** empty log message ***
authorpcg <pcg>
Tue, 10 Feb 2004 00:40:39 +0000 (00:40 +0000)
committerpcg <pcg>
Tue, 10 Feb 2004 00:40:39 +0000 (00:40 +0000)
src/command.C
src/rxvtcolor.C
src/rxvtcolor.h
src/screen.C

index c7d93c4787ab69f708ccc1606f83a523a6598518..a8c900a1fdfeaf17fc37371a076a2d835269e322 100644 (file)
@@ -1362,7 +1362,7 @@ rxvt_term::x_cb (XEvent &ev)
         break;
 
       case SelectionClear:
-        selection_clear ();
+        display->set_selection_owner (0);
         break;
 
       case SelectionNotify:
index 61331132468a6fefd5a7929b95b22526a0e67c1f..9e9287edb652fb56b87c250f2db345a90b5791fb 100644 (file)
@@ -9,6 +9,7 @@
 
 rxvt_display::rxvt_display (const char *name)
 : x_watcher (this, &rxvt_display::x_event)
+, selection_owner (0)
 {
   this->name = STRDUP (name);
 }
@@ -91,6 +92,14 @@ void rxvt_display::unreg (xevent_watcher *w)
     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;
index ad0eb02e3b908a2e4b31ccfa08013e7a23a80385..b9110d7530f635cd534f338d8247331f0a11a1c2 100644 (file)
 
 #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);
@@ -41,6 +43,8 @@ struct rxvt_display {
 
   rxvt_display (const char *name);
   ~rxvt_display ();
+
+  void set_selection_owner (rxvt_term *owner);
 };
 
 struct xevent_watcher : watcher, callback1<void, XEvent &> {
index 8133f7e58c07ee2dfcbcd5b94f8e8d948224b269..2b782940083f0f1afdfa09741aa6ceaad54fc2cc 100644 (file)
@@ -2833,11 +2833,12 @@ rxvt_term::selection_make (Time tm)
 
   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;