;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-;; $Id: gdk.lisp,v 1.36 2007/05/04 07:28:25 espen Exp $
+;; $Id: gdk.lisp,v 1.41 2007/06/18 14:27:02 espen Exp $
(in-package "GDK")
(defbinding display-close (&optional (display (display-get-default))) nil
(display display))
+(defbinding flush () nil)
+
(defbinding display-get-event
(&optional (display (display-get-default))) event
(display display))
(display display))
(defun find-display (name)
- (find name (list-displays) :key #'display-name :test #'string=))
+ (if (not name)
+ (display-get-default)
+ (find name (list-displays) :key #'display-name :test #'string=)))
(defun ensure-display (display)
(etypecase display
(null (display-get-default))
(display display)
- (string
- (or
- (find display (list-displays) :key #'display-name :test #'string=)
- (display-open display)))))
+ (string (or (find-display display) (display-open display)))))
;;; Display manager
(dy int))
(defbinding region-intersect (source1 source2) nil
- ((ensure-region source1) region :return)
+ ((ensure-region source1) region :in/return)
((ensure-region source2) region))
(defbinding region-union (source1 source2) nil
- ((ensure-region source1) region :return)
+ ((ensure-region source1) region :in/return)
((ensure-region source2) region))
(defbinding region-subtract (source1 source2) nil
- ((ensure-region source1) region :return)
+ ((ensure-region source1) region :in/return)
((ensure-region source2) region))
(defbinding region-xor (source1 source2) nil
- ((ensure-region source1) region :return)
+ ((ensure-region source1) region :in/return)
((ensure-region source2) region))
;; (cr cairo:context)
;; (region region))
- (defbinding (cairo-xlib-surface-get-window
- "clg_gdk_cairo_xlib_surface_get_window") () window
- (surface cairo:xlib-surface))
+ (defbinding (cairo-surface-get-window "clg_gdk_cairo_surface_get_window") () window
+ (surface cairo:surface))
)
;;; Multi-threading support
-#+sbcl
+#+sb-thread
(progn
- (defvar *global-lock* (sb-thread:make-mutex :name "global GDK lock"))
- (let ((recursive-level 0))
- (defun threads-enter ()
- (if (eq (sb-thread:mutex-value *global-lock*) sb-thread:*current-thread*)
- (incf recursive-level)
- (sb-thread:get-mutex *global-lock*)))
-
- (defun threads-leave (&optional flush-p)
+ (defvar *global-lock* nil)
+
+ (defun %global-lock-p ()
+ (eq (car (sb-thread:mutex-value *global-lock*)) sb-thread:*current-thread*))
+
+ (defun threads-enter ()
+ (when *global-lock*
+ (if (%global-lock-p)
+ (incf (cdr (sb-thread:mutex-value *global-lock*)))
+ (sb-thread:get-mutex *global-lock* (cons sb-thread:*current-thread* 0)))))
+
+ (defun threads-leave (&optional flush-p)
+ (when *global-lock*
+ (assert (%global-lock-p))
(cond
- ((zerop recursive-level)
+ ((zerop (cdr (sb-thread:mutex-value *global-lock*)))
(when flush-p
- (display-flush))
+ (flush))
(sb-thread:release-mutex *global-lock*))
- (t (decf recursive-level)))))
+ (t (decf (cdr (sb-thread:mutex-value *global-lock*)))))))
(define-callback %enter-fn nil ()
(threads-enter))
(define-callback %leave-fn nil ()
(threads-leave))
- (defbinding threads-set-lock-functions (&optional) nil
+ (defbinding %threads-set-lock-functions (&optional) nil
(%enter-fn callback)
(%leave-fn callback))
+ (defun threads-init ()
+ (%threads-set-lock-functions)
+ (setq *global-lock* (sb-thread:make-mutex :name "global GDK lock")))
+
(defmacro with-global-lock (&body body)
`(progn
(threads-enter)
(unwind-protect
- ,@body
- (threads-leave t)))))
+ (progn ,@body)
+ (threads-leave t))))
+
+ (defun timeout-add-with-lock (interval function &optional (priority +priority-default+))
+ (timeout-add interval
+ #'(lambda ()
+ (with-global-lock (funcall function)))
+ priority))
+
+ (defun idle-add-with-lock (function &optional (priority +priority-default-idle+))
+ (idle-add
+ #'(lambda ()
+ (with-global-lock (funcall function)))
+ priority)))
+
+
+#-sb-thread
+(progn
+ (defmacro with-global-lock (&body body)
+ `(progn ,@body))
+
+ (defun timeout-add-with-lock (interval function &optional (priority +priority-default+))
+ (timeout-add interval function priority))
+
+ (defun idle-add-with-lock (funcation &optional (priority +priority-default-idle+))
+ (idle-add function priority)))
+
+