chiark / gitweb /
Added abstraction layer for C callback functions
[clg] / glib / glib.lisp
... / ...
CommitLineData
1;; Common Lisp bindings for GTK+ v1.2.x
2;; Copyright (C) 1999 Espen S. Johnsen <espejohn@online.no>
3;;
4;; This library is free software; you can redistribute it and/or
5;; modify it under the terms of the GNU Lesser General Public
6;; License as published by the Free Software Foundation; either
7;; version 2 of the License, or (at your option) any later version.
8;;
9;; This library is distributed in the hope that it will be useful,
10;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12;; Lesser General Public License for more details.
13;;
14;; You should have received a copy of the GNU Lesser General Public
15;; License along with this library; if not, write to the Free Software
16;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18;; $Id: glib.lisp,v 1.17 2004/11/07 01:23:38 espen Exp $
19
20
21(in-package "GLIB")
22
23(use-prefix "g")
24
25
26;;;; Memory management
27
28(defbinding (allocate-memory "g_malloc0") () pointer
29 (size unsigned-long))
30
31(defbinding (reallocate-memory "g_realloc") () pointer
32 (address pointer)
33 (size unsigned-long))
34
35(defbinding (deallocate-memory "g_free") () nil
36 (address pointer))
37;; (defun deallocate-memory (address)
38;; (declare (ignore address)))
39
40(defun copy-memory (from length &optional (to (allocate-memory length)))
41 (kernel:system-area-copy from 0 to 0 (* 8 length))
42 to)
43
44
45;;;; User data mechanism
46
47(internal *user-data* *user-data-count*)
48
49(declaim (fixnum *user-data-count*))
50
51(defvar *user-data* (make-hash-table))
52(defvar *user-data-count* 0)
53
54(defun register-user-data (object &optional destroy-function)
55 (check-type destroy-function (or null symbol function))
56 (incf *user-data-count*)
57 (setf
58 (gethash *user-data-count* *user-data*)
59 (cons object destroy-function))
60 *user-data-count*)
61
62(defun find-user-data (id)
63 (check-type id fixnum)
64 (multiple-value-bind (user-data p) (gethash id *user-data*)
65 (values (car user-data) p)))
66
67(defun destroy-user-data (id)
68 (check-type id fixnum)
69 (let ((user-data (gethash id *user-data*)))
70 (when (cdr user-data)
71 (funcall (cdr user-data) (car user-data))))
72 (remhash id *user-data*))
73
74(defmacro def-callback-marshal (name (return-type &rest args))
75 (let ((names (loop
76 for arg in args
77 collect (if (atom arg) (gensym) (first arg))))
78 (types (loop
79 for arg in args
80 collect (if (atom arg) arg (second arg)))))
81 `(defcallback ,name (,return-type ,@(mapcar #'list names types)
82 (callback-id unsigned-int))
83 (invoke-callback callback-id ',return-type ,@names))))
84
85
86;;;; Quarks
87
88(internal *quark-counter* *quark-from-object* *quark-to-object*)
89
90(deftype quark () 'unsigned)
91
92;(defbinding %quark-get-reserved () quark)
93
94(defbinding %quark-from-string () quark
95 (string string))
96
97(defvar *quark-counter* 0)
98
99(defun %quark-get-reserved ()
100 ;; The string is just a dummy
101