x11-screen: Fix selection handling (cut/paste between X windows).
authorMatt Birkholz <puck@birchwood-abbey.net>
Sun, 31 Jul 2016 18:56:31 +0000 (11:56 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Sun, 7 Aug 2016 17:56:27 +0000 (10:56 -0700)
Cut/paste should now work with two minor fixes (typos, really), and
one kludge keeping non-unique alien objects in a weak-eq-hash-table.
The original xds (fixnums) are held as strongly as the new interned
symbols.

The xds were intended to be x-displays?  Interned x-display objects
would be more appropriate keys for a weak-eq-hash-table.

src/x11-screen/x11-screen.scm
src/x11/x11base.scm

index f1cff4602f89a798678a29dbc8f92b70b769ecc9..506bc1511533c1e1b1853793a9acf7579847a392 100644 (file)
@@ -841,14 +841,15 @@ USA.
       table)))
 
 (define display/cached-atoms-tables
+  ;; This table needs replacing.  It holds interned symbols strongly!
   (let ((table (make-weak-eq-hash-table)))
     (lambda (display)
-      (or (hash-table/get table display #f)
-         (let ((result
-                (cons (make-strong-eq-hash-table)
-                      (make-strong-eqv-hash-table))))
-           (hash-table/put! table display result)
-           result)))))
+      (let ((key (intern (alien/address-string display))))
+       (or (hash-table/get table key #f)
+           (let ((result (cons (make-strong-eq-hash-table)
+                               (make-strong-eqv-hash-table))))
+             (hash-table/put! table key result)
+             result))))))
 \f
 ;;;; Properties
 
@@ -1018,12 +1019,14 @@ In either case, it is copied to the primary selection."
         #t)))
 
 (define display/selection-records
+  ;; This table needs replacing.  It holds interned symbols strongly.
   (let ((table (make-weak-eq-hash-table)))
     (lambda (display)
-      (or (hash-table/get table display #f)
-         (let ((result (make-strong-eq-hash-table)))
-           (hash-table/put! table display result)
-           result)))))
+      (let ((key (intern (alien/address-string display))))
+       (or (hash-table/get table key #f)
+           (let ((result (make-strong-eq-hash-table)))
+             (hash-table/put! table key result)
+             result))))))
 
 ;;; In the next two procedures, we must allow TIME to be 0, even
 ;;; though the ICCCM forbids this, because existing clients use that
index 52ce079e71a410bc5c5f7d19c628eb4c66cda8c5..84c0739ca9d67b7eadb1e6dcdd84022147cef03a 100644 (file)
@@ -840,7 +840,7 @@ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
          (case format
            ((8)
             (guarantee-string data 'x-change-property)
-            data)
+            (prop-data-8->bytes.length data))
            ((16)
             (guarantee-vector data 'x-change-property)
             (prop-data-16->bytes.length data))
@@ -854,7 +854,8 @@ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
                  (car bytes.length) (cdr bytes.length))))
     (free (car bytes.length))
     (if (not (zero? code))
-       (error "XChangeProperty failed:" property))))
+       (error "XChangeProperty failed:" property))
+    code))
 
 (define (prop-data-32->bytes.length vector)
   (let* ((nitems (vector-length vector))
@@ -934,7 +935,7 @@ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 ;;; Guarantors
 
 (declare (integrate-operator guarantee-Atom))
-(define guarantee-Atom guarantee-exact-positive-integer)
+(define guarantee-Atom guarantee-exact-nonnegative-integer)
 
 (declare (integrate-operator guarantee-Window))
 (define guarantee-Window guarantee-exact-positive-integer)