chiark / gitweb /
User data mechanism protected by locking
[clg] / glib / gboxed.lisp
CommitLineData
55212af1 1;; Common Lisp bindings for GTK+ v2.x
cb143608 2;; Copyright 2001-2006 Espen S. Johnsen <espen@users.sf.net>
b44caf77 3;;
55212af1 4;; Permission is hereby granted, free of charge, to any person obtaining
5;; a copy of this software and associated documentation files (the
6;; "Software"), to deal in the Software without restriction, including
7;; without limitation the rights to use, copy, modify, merge, publish,
8;; distribute, sublicense, and/or sell copies of the Software, and to
9;; permit persons to whom the Software is furnished to do so, subject to
10;; the following conditions:
b44caf77 11;;
55212af1 12;; The above copyright notice and this permission notice shall be
13;; included in all copies or substantial portions of the Software.
b44caf77 14;;
55212af1 15;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
cb143608 23;; $Id: gboxed.lisp,v 1.21 2006/04/25 21:55:42 espen Exp $
b44caf77 24
25(in-package "GLIB")
26
27
ce63ad97 28(defclass boxed (struct)
6baf860c 29 ()
30 (:metaclass struct-class))
b44caf77 31
29933e83 32(defmethod instance-finalizer ((instance boxed))
7ce0497d 33 (let ((location (foreign-location instance))
29933e83 34 (type-number (type-number-of instance)))
35 #'(lambda ()
29933e83 36 (%boxed-free type-number location))))
37
b44caf77 38
39;;;; Metaclass for boxed classes
40
41(eval-when (:compile-toplevel :load-toplevel :execute)
6baf860c 42 (defclass boxed-class (struct-class)
935a783c 43 ())
b44caf77 44
6baf860c 45 (defmethod validate-superclass ((class boxed-class) (super standard-class))
46 (subtypep (class-name super) 'boxed)))
b44caf77 47
b44caf77 48
29933e83 49(defbinding %boxed-copy () pointer
50 (type-number type-number)
6baf860c 51 (location pointer))
52
29933e83 53(defbinding %boxed-free () nil
54 (type-number type-number)
6baf860c 55 (location pointer))
56
cb143608 57(defmethod shared-initialize ((class boxed-class) names
58 &key name gtype ref unref)
59 (declare (ignore names))
60 (let* ((class-name (or name (class-name class)))
61 (type-number
62 (register-type class-name
63 (or
64 (first gtype)
65 (default-type-init-name class-name)))))
66 (unless (or ref (slot-boundp class 'ref))
67 (setf
68 (slot-value class 'ref)
69 #'(lambda (location)
70 (%boxed-copy type-number location))))
71 (unless (or unref (slot-boundp class 'unref))
72 (setf
73 (slot-value class 'unref)
74 #'(lambda (location)
75 (%boxed-free type-number location)))))
76 (call-next-method))
b44caf77 77
3a935dfa 78
e9934f39 79(defun expand-boxed-type (type-number forward-p slots)
3a935dfa 80 `(defclass ,(type-from-number type-number) (boxed)
e9934f39 81 ,(unless forward-p
82 slots)
3a935dfa 83 (:metaclass boxed-class)
80031aba 84 (:gtype ,(register-type-as type-number))))
b44caf77 85
6895c081 86(register-derivable-type 'boxed "GBoxed" 'expand-boxed-type)
888d25fb 87
8574c8ad 88
48ae54db 89;;;; NULL terminated vector of strings
8574c8ad 90
48ae54db 91(deftype strings () '(null-terminated-vector string))
dcb31db6 92(register-type 'strings '|g_strv_get_type|)