X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/f1900d3393222adada302ebe09ecd70c034aceb3..d1b6a54e578ad5b6980545e9132f90e3f3ebc95f:/gtk/gtk.lisp diff --git a/gtk/gtk.lisp b/gtk/gtk.lisp index 6077eb1..8191110 100644 --- a/gtk/gtk.lisp +++ b/gtk/gtk.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gtk.lisp,v 1.86 2007-12-30 18:37:12 espen Exp $ +;; $Id: gtk.lisp,v 1.94 2008-05-06 00:04:42 espen Exp $ (in-package "GTK") @@ -45,13 +45,17 @@ (defun gtk-version () (format nil "Gtk+ v~A.~A.~A" major minor micro)))) (defun clg-version () - "clg 0.93") + "clg 0.94") ;;;; Initalization and display handling -(defparameter *event-poll-interval* 10000) ; in microseconds +(defparameter *event-polling-interval* 0.01) +#?(or (featurep :clisp) (featurep :cmu) (and (sbcl>= 1 0 6) (sbcl< 1 0 15 6))) +(defun decompose-time (time) + (multiple-value-bind (sec subsec) (truncate *event-polling-interval*) + (values sec (truncate (* subsec 1e6))))) (defbinding (gtk-init "gtk_parse_args") () boolean "Initializes the library without opening the display." @@ -80,7 +84,7 @@ (defun clg-init-with-threading (&optional display) (clg-init display t)) -#?(sbcl>= 1 0 6) +#?(and (sbcl>= 1 0 6) (sbcl< 1 0 15 6)) ;; A very minimal implementation of CLISP's socket-status (defun socket-status (socket seconds microseconds) (sb-alien:with-alien ((read-fds (sb-alien:struct sb-unix:fd-set))) @@ -98,14 +102,15 @@ (defun socket-status (socket seconds microseconds) :eof)))))) (defun %init-async-event-handling (display) - (let ((style #?(or (featurep :cmu) (sbcl< 1 0 6)) :fd-handler - #?-(or (featurep :cmu) (sbcl< 1 0 6)) nil)) + (let ((style + #?(or (featurep :cmu) (sbcl< 1 0 6) (sbcl>= 1 0 15 6)) :fd-handler + #?-(or (featurep :cmu) (sbcl< 1 0 6) (sbcl>= 1 0 15 6)) nil)) (when (and (find-package "SWANK") (not (eq (symbol-value (find-symbol "*COMMUNICATION-STYLE*" "SWANK")) style))) - (error "When running clg in Slime, the communication style ~S must be used in combination with asynchronous event handling on this platform. See the README file and for more information." style))) + (error "When running clg in Slime, the communication style ~S must be used in combination with asynchronous event handling on this platform. See the README file and for more information." style))) - #?(or (featurep :cmu) (sbcl< 1 0 6)) + #?(or (featurep :cmu) (sbcl< 1 0 6) (sbcl>= 1 0 15 6)) (progn (signal-connect (gdk:display-manager) 'display-opened #'(lambda (display) @@ -119,25 +124,34 @@ (defun %init-async-event-handling (display) (declare (ignore is-error-p)) (remove-fd-handler handler)))))))) (setq *periodic-polling-function* #'main-iterate-all) - (setq *max-event-to-sec* 0) - (setq *max-event-to-usec* *event-poll-interval*)) + #?(or (featurep :cmu) (sbcl< 1 0 6)) + (multiple-value-setq (*max-event-to-sec* *max-event-to-usec*) + (decompose-time *event-polling-interval*)) + #?(sbcl>= 1 0 15 6) + (setq *periodic-polling-period* *event-polling-interval*)) #+(and clisp readline) ;; Readline will call the event hook at most ten times per second (setf readline:event-hook #'main-iterate-all) - #?-(or (featurep :cmu) (sbcl< 1 0 6)) + #?(or (featurep :clisp) (and (sbcl>= 1 0 6) (sbcl< 1 0 15 6))) ;; When running in Slime we need to hook into the Swank server ;; to handle events asynchronously. - (if (find-package "SWANK") - (let ((read-from-emacs (symbol-function (find-symbol "READ-FROM-EMACS" "SWANK"))) - (stream (funcall (find-symbol "CONNECTION.SOCKET-IO" "SWANK") (symbol-value (find-symbol "*EMACS-CONNECTION*" "SWANK"))))) - (setf (symbol-function (find-symbol "READ-FROM-EMACS" "SWANK")) - #'(lambda () - (loop - (case (socket-status (cons stream :input) 0 *event-poll-interval*) - ((:input :eof) (return (funcall read-from-emacs))) - (otherwise (main-iterate-all))))))) + (unless (and + (find-package "SWANK") + (let ((connection (symbol-value (find-symbol "*EMACS-CONNECTION*" "SWANK")))) + (when connection + (let ((read-from-emacs (symbol-function (find-symbol "READ-FROM-EMACS" "SWANK"))) + (stream (funcall (find-symbol "CONNECTION.SOCKET-IO" "SWANK") connection))) + (multiple-value-bind (sec usec) + (decompose-time *event-polling-interval*) + (setf + (symbol-function (find-symbol "READ-FROM-EMACS" "SWANK")) + #'(lambda () + (loop + (case (socket-status (cons stream :input) sec usec) + ((:input :eof) (return (funcall read-from-emacs))) + (otherwise (main-iterate-all))))))))))) #-(and clisp readline) (warn "Asynchronous event handling not supported on this platform. An explicit main loop has to be started.")) @@ -588,8 +602,8 @@ (defun (setf bin-child) (child bin) (defmethod compute-signal-function ((bin bin) signal function object args) (declare (ignore signal)) (if (eq object :child) - #'(lambda (&rest emission-args) - (apply function (bin-child bin) (nconc (rest emission-args) args))) + #'(lambda (bin &rest emission-args) + (apply function (bin-child bin) (nconc emission-args args))) (call-next-method))) @@ -706,10 +720,13 @@ (defbinding check-menu-item-toggled () nil ;;; Color selection -(defbinding (color-selection-is-adjusting-p - "gtk_color_selection_is_adjusting") () boolean +(defbinding color-selection-is-adjusting-p () boolean (colorsel color-selection)) +(defbinding (color-selection-previous-color + "gtk_color_selection_get_previous_color") () nil + (colorsel color-selection) + ((make-instance 'gdk:color) gdk:color :in/return)) ;;; Color selection dialog -- no functions @@ -972,6 +989,10 @@ (defbinding entry-completion-set-match-func (completion function) nil (defbinding entry-completion-complete () nil (completion entry-completion)) +#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.12.0") +(defbinding entry-completion-get-completion-prefix () string + (completion entry-completion)) + #?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0") (defbinding entry-completion-insert-prefix () nil (completion entry-completion)) @@ -1665,7 +1686,7 @@ (defun (setf window-default-icon-list) (icons) icons) (defbinding %window-set-default-icon () nil - (icons (glist gdk:pixbuf))) + (icon gdk:pixbuf)) (defgeneric (setf window-default-icon) (icon)) @@ -2375,7 +2396,7 @@ (defbinding %spin-button-spin () nil (defun spin-button-spin (spin-button value) (etypecase value - (real (%spin-button-spin spin-button :spin-user-defined value)) + (real (%spin-button-spin spin-button :user-defined value)) (spin-type (%spin-button-spin spin-button value 0))))