[mcclim-cvs] CVS update: mcclim/Backends/CLX/port.lisp

Christophe Rhodes crhodes at common-lisp.net
Sat Apr 2 22:18:26 UTC 2005


Update of /project/mcclim/cvsroot/mcclim/Backends/CLX
In directory common-lisp.net:/tmp/cvs-serv9380/Backends/CLX

Modified Files:
	port.lisp 
Log Message:
Fix clim-over-ssh-x-fails, by parsing $DISPLAY more correctly.

Date: Sun Apr  3 00:18:21 2005
Author: crhodes

Index: mcclim/Backends/CLX/port.lisp
diff -u mcclim/Backends/CLX/port.lisp:1.109 mcclim/Backends/CLX/port.lisp:1.110
--- mcclim/Backends/CLX/port.lisp:1.109	Tue Mar 22 13:31:22 2005
+++ mcclim/Backends/CLX/port.lisp	Sun Apr  3 00:18:20 2005
@@ -170,16 +170,33 @@
 
 (defun parse-clx-server-path (path)
   (pop path)
-  (let* ((s (get-environment-variable "DISPLAY"))
-	 (colon (position #\: s))
-	 (dot (position #\. s :start colon))
-	 (host-name (subseq s 0 colon))
-	 (display-number (parse-integer s :start (1+ colon) :end dot))
-	 (screen-number (if dot (parse-integer s :start (1+ dot)) 0)))
+  (let* ((name (get-environment-variable "DISPLAY"))
+	 ;; this code courtesy telent-clx.
+         (slash-i (or (position #\/ name) -1))
+         (colon-i (position #\: name :start (1+ slash-i)))
+         (decnet-colon-p (eql (elt name (1+ colon-i)) #\:))
+         (host (subseq name (1+ slash-i) colon-i))
+         (dot-i (and colon-i (position #\. name :start colon-i)))
+         (display (when colon-i
+                    (parse-integer name
+                                   :start (if decnet-colon-p
+                                              (+ colon-i 2)
+					      (1+ colon-i))
+                                   :end dot-i)))
+         (screen (when dot-i
+                   (parse-integer name :start (1+ dot-i))))
+         (protocol
+          (cond ((or (string= host "") (string-equal host "unix")) :local)
+                (decnet-colon-p :decnet)
+                ((> slash-i -1) (intern
+                                 (string-upcase (subseq name 0 slash-i))
+                                 :keyword))
+                (t :internet))))
     (list :clx
-	  :host (getf path :host host-name)
-	  :display-id (getf path :display-id display-number)
-	  :screen-id (getf path :screen-id screen-number))))
+	  :host (getf path :host host)
+	  :display-id (getf path :display-id display)
+	  :screen-id (getf path :screen-id screen)
+	  :protocol protocol)))
 
 (setf (get :x11 :port-type) 'clx-port)
 (setf (get :x11 :server-path-parser) 'parse-clx-server-path)
@@ -251,7 +268,7 @@
 (defmethod initialize-clx ((port clx-port))
   (let ((options (cdr (port-server-path port))))
     (setf (clx-port-display port)
-	  (xlib:open-display (getf options :host "") :display (getf options :display-id 0)))
+	  (xlib:open-display (getf options :host "") :display (getf options :display-id 0) :protocol (getf options :protocol :local)))
     (progn
       (setf (xlib:display-error-handler (clx-port-display port))
         #'clx-error-handler)




More information about the Mcclim-cvs mailing list