11 #:*glib-interface-age*
21 #:+g-priority-default+
22 #:+g-priority-high-idle+
23 #:+g-priority-default-idle+
29 (eval-when (:compile-toplevel :load-toplevel :execute)
30 (defvar *initializers* nil)
31 (defun register-initializer (fn)
32 (setf *initializers* (nconc *initializers* (list fn)))))
34 (defun run-initializers ()
35 (iter (for fn in *initializers*)
38 (defmacro at-init (&body body)
39 `(progn (register-initializer (lambda () ,@body))
42 (eval-when (:compile-toplevel :load-toplevel :execute)
43 (define-foreign-library glib
44 (:unix (:or "libglib-2.0.so.0" "libglib-2.0.so"))
47 (use-foreign-library glib)
49 (eval-when (:compile-toplevel :load-toplevel :execute)
50 (define-foreign-library gthread
51 (:unix (:or "libgthread-2.0.so.0" "libgthread-2.0.so"))
52 (t "libgthread-2.0")))
54 (use-foreign-library gthread)
61 ;; Fundamentals - Basic types
65 ;; TODO: not sure about these: for amd64 they are ok
66 (eval-when (:compile-toplevel :load-toplevel :execute)
68 ((cffi-features:cffi-feature-p :x86-64) (defctype gsize :uint64))
69 ((cffi-features:cffi-feature-p :x86) (defctype gsize :ulong))
70 (t (error "Can not define 'gsize', unknown CPU architecture (known are x86 and x86-64)"))))
72 (defctype gssize :long)
74 (defctype goffset :uint64)
78 ;; Fundamentals - Version information
81 (defcvar (*glib-major-version* "glib_major_version" :read-only t :library glib) :uint)
82 (defcvar (*glib-minor-version* "glib_minor_version" :read-only t :library glib) :uint)
83 (defcvar (*glib-micro-version* "glib_micro_version" :read-only t :library glib) :uint)
84 (defcvar (*glib-binary-age* "glib_binary_age" :read-only t :library glib) :uint)
85 (defcvar (*glib-interface-age* "glib_interface_age" :read-only t :library glib) :uint)
89 ;; Limits of Basic Types, Standard Macros, Type Conversion Macros, Byte Order Macros,
90 ;; Numerical Definitions, Miscellaneous Macros, Atomic operations
93 ;; Core Application Support - The Main Event Loop
95 (defcstruct g-main-loop)
96 (defcstruct g-main-context)
98 (defcstruct g-source-funcs
103 (closure-callback :pointer)
104 (closure-marshal :pointer))
105 (defcstruct g-source-callback-funcs
112 (defcstruct g-poll-fd
113 (fd :int) ;; TODO: #if defined (G_OS_WIN32) && GLIB_SIZEOF_VOID_P == 8
117 (defcstruct g-time-val
119 (microseconds :long))
121 (defcstruct g-thread)
123 (defcfun (g-main-loop-new "g_main_loop_new" :library glib) (:pointer g-main-loop)
124 (context (:pointer g-main-context))
125 (is-running :boolean))
127 (defcfun (g-main-loop-ref "g_main_loop_ref" :library glib) (:pointer g-main-loop)
128 (loop (:pointer g-main-loop)))
130 (defcfun (g-main-loop-unref "g_main_loop_unref" :library glib) (:pointer g-main-loop)
131 (loop (:pointer g-main-loop)))
133 (defcfun (g-main-loop-run "g_main_loop_run" :library glib) :void
134 (loop (:pointer g-main-loop)))
136 (defcfun (g-main-loop-quit "g_main_loop_quit" :library glib) :void
137 (loop (:pointer g-main-loop)))
139 (defcfun (g-main-loop-is-running "g_main_loop_is_running" :library glib) :boolean
140 (loop (:pointer g-main-loop)))
142 (defcfun (g-main-loop-get-context "g_main_loop_get_context" :library glib) (:pointer g-main-context)
143 (loop (:pointer g-main-loop)))
145 (defconstant +g-priority-high+ -100)
146 (defconstant +g-priority-default+ 0)
147 (defconstant +g-priority-high-idle+ 100)
148 (defconstant +g-priority-default-idle+ 200)
149 (defconstant +g-priority-low+ 300)
151 (defcfun (g-main-context-new "g_main_context_new" :library glib) (:pointer g-main-context))
153 (defcfun (g-main-context-ref "g_main_context_ref" :library glib) (:pointer g-main-context)
154 (context (:pointer g-main-context)))
156 (defcfun (g-main-context-unref "g_main_context_unref" :library glib) (:pointer g-main-context)
157 (context (:pointer g-main-context)))
159 (defcfun (g-main-context-default "g_main_context_default" :library glib) (:pointer g-main-context))
161 (defcfun (g-main-context-iteration "g_main_context_iteration" :library glib) :boolean
162 (context (:pointer g-main-context))
163 (may-block :boolean))
165 (defcfun (g-main-context-pending "g_main_context_pending" :library glib) :boolean
166 (context (:pointer g-main-context)))
168 (defcfun (g-main-context-find-source-by-id "g_main_context_find_source_by_id" :library glib) (:pointer g-source)
169 (context (:pointer g-main-context))
172 (defcfun (g-main-context-find-source-by-user-data "g_main_context_find_source_by_user_data" :library glib) (:pointer g-source)
173 (context (:pointer g-main-context))
174 (user-data :pointer))
176 (defcfun (g-main-context-find-source-by-funcs-user-data "g_main_context_find_source_by_funcs_user_data" :library glib) (:pointer g-source)
177 (context (:pointer g-main-context))
178 (funcs (:pointer g-source-funcs))
179 (user-data :pointer))
181 (defcfun (g-main-context-wakeup "g_main_context_wakeup" :library glib) :void
182 (context (:pointer g-main-context)))
184 (defcfun (g-main-context-acquire "g_main_context_acquire" :library glib) :boolean
185 (context (:pointer g-main-context)))
187 (defcfun (g-main-context-release "g_main_context_release" :library glib) :void
188 (context (:pointer g-main-context)))
190 (defcfun (g-main-context-is-owner "g_main_context_is_owner" :library glib) :boolean
191 (context (:pointer g-main-context)))
193 (defcfun (g-main-context-wait "g_main_context_wait" :library glib) :boolean
194 (context (:pointer g-main-context))
195 (cond (:pointer g-cond))
196 (mutex (:pointer g-mutex)))
198 (defcfun (g_main_context_prepare "g_main_context_prepare" :library glib) :boolean
199 (context (:pointer g-main-context))
200 (priority-ret (:pointer :int)))
202 (defcfun (g_main_context_query "g_main_context_query" :library glib) :int
203 (context (:pointer g-main-context))
205 (timeout-ret (:pointer :int))
206 (fds-ret (:pointer g-poll-fd))
209 (defcfun (g-main-context-check "g_main_context_check" :library glib) :int
210 (context (:pointer g-main-context))
212 (fds (:pointer g-poll-fd))
215 (defcfun (g-main-context-dispatch "g_main_context_dispatch" :library glib) :void
216 (context (:pointer g-main-context)))
218 (defcfun (g-main-context-set-poll-func "g_main_context_set_poll_func" :library glib) :void
219 (context (:pointer g-main-context))
222 (defcfun (g-main-context-get-poll-func "g_main_context_get_poll_func" :library glib) :pointer
223 (context (:pointer g-main-context)))
225 (defcfun (g-main-context-add-poll "g_main_context_add_poll" :library glib) :void
226 (context (:pointer g-main-context))
227 (fd (:pointer g-poll-fd))
230 (defcfun (g-main-context-remove-poll "g_main_context_remove_poll" :library glib) :void
231 (context (:pointer g-main-context))
232 (fd (:pointer g-poll-fd)))
234 (defcfun (g-main-depth "g_main_depth" :library glib) :int)
236 (defcfun (g-main-current-source "g_main_current_source" :library glib) (:pointer g-source))
238 (defcfun (g-timeout-source-new "g_timeout_source_new" :library glib) (:pointer g-source)
239 (interval-milliseconds :int))
241 (defcfun (g-timeout-source-new-seconds "g_timeout_source_new_seconds" :library glib) (:pointer g-source)
242 (interval-seconds :int))
244 (defcfun (g-timeout-add "g_timeout_add" :library glib) :uint
245 (interval-milliseconds :uint)
249 (defcfun (g-timeout-add-full "g_timeout_add_full" :library glib) :uint
251 (interval-milliseconds :uint)
254 (destroy-notify :pointer))
256 (defcfun (g-timeout-add-seconds "g_timeout_add_seconds" :library glib) :uint
257 (interval-seconds :uint)
261 (defcfun (g-timeout-add-seconds-full "g_timeout_add_seconds_full" :library glib) :uint
263 (interval-seconds :uint)
266 (destroy-notify :pointer))
268 (defcfun (g-idle-source-new "g_idle_source_new" :library glib) (:pointer g-source))
270 (defcfun (g-idle-add "g_idle_add" :library glib) :uint
274 (defcfun (g-idle-add-full "g_idle_add_full" :library glib) :uint
280 (defcfun (g-idle-remove-by-data "g_idle_remove_by_data" :library glib) :boolean
283 ;(defctype g-pid :int) ;;TODO: might work on amd64 linux, but on others
285 ;; Omitted GPid, g_child_add_watch, g_child_add_watch_full
287 (defcfun (g-source-new "g_source_new" :library glib) (:pointer g-source)
288 (source-funcs (:pointer g-source-funcs))
291 (defcfun (g-source-ref "g_source_ref" :library glib) (:pointer g-source)
292 (source (:pointer g-source)))
294 (defcfun (g-source-unref "g_source_unref" :library glib) :void
295 (source (:pointer g-source)))
297 (defcfun (g-source-set-funcs "g_source_set_funcs" :library glib) :void
298 (source (:pointer g-source))
299 (funcs (:pointer g-source-funcs)))
301 (defcfun (g-source-attach "g_source_attach" :library glib) :uint
302 (source (:pointer g-source))
303 (context (:pointer g-main-context)))
305 (defcfun (g-source-destroy "g_source_destroy" :library glib) :void
306 (source (:pointer g-source)))
308 (defcfun (g-source-is-destroyed "g_source_is_destroyed" :library glib) :boolean
309 (source (:pointer g-source)))
311 (defcfun (g-source-set-priority "g_source_set_priority" :library glib) :void
312 (source (:pointer g-source))
315 (defcfun (g-source-get-priority "g_source_get_priority" :library glib) :int
316 (source (:pointer g-source)))
318 (defcfun (g-source-set-can-recurse "g_source_set_can_recurse" :library glib) :void
319 (source (:pointer g-source))
320 (can-recurse :boolean))
322 (defcfun (g-source-get-can-recurse "g_source_get_can_recurse" :library glib) :boolean
323 (source (:pointer g-source)))
325 (defcfun (g-source-get-id "g_source_get_id" :library glib) :uint
326 (source (:pointer g-source)))
328 (defcfun (g-source-get-context "g_source_get_context" :library glib) (:pointer g-main-context)
329 (source (:pointer g-source)))
331 (defcfun (g-source-set-callback "g_source_set_callback" :library glib) :void
332 (source (:pointer g-source))
337 (defcfun (g-source-add-poll "g_source_add_poll" :library glib) :void
338 (source (:pointer g-source))
339 (fd (:pointer g-poll-fd)))
341 (defcfun (g-source-remove-poll "g_source_remove_poll" :library glib) :void
342 (source (:pointer g-source))
343 (fd (:pointer g-poll-fd)))
345 (defcfun (g-source-get-current-time "g_source_get_current_time" :library glib) :void
346 (source (:pointer g-source))
347 (timeval-ret (:pointer g-time-val)))
349 (defcfun (g-source-remove "g_source_remove" :library glib) :boolean
352 (defcfun (g-source-remove-by-funcs-user-data "g_source_remove_by_funcs_user_data" :library glib) :boolean
353 (funcs (:pointer g-source-funcs))
356 (defcfun (g-source-remove-by-user-data "g_source_remove_by_user_data" :library glib) :boolean
360 ;; Core Application Support - Threads
363 (defcenum g-thread-error
364 :g-thread-error-again)
366 ;omitted: struct GThreadFunctions
368 (defcfun (g-thread-init "g_thread_init") :void
371 (defvar *threads-initialized-p* nil)
374 (unless *threads-initialized-p*
375 (g-thread-init (null-pointer))
376 (setf *threads-initialized-p* t)))
378 (defcenum g-thread-priority
379 :g-thread-priority-low
380 :g-thread-priority-normal
381 :g-thread-priority-hight
382 :g-thread-priority-urgent)
384 ;omitted: g_thread_create, g_thread_create_full, g_thread_yield, g_thread_exit, g_thread_foreach
386 (defcfun (g-thread-self "g_thread_self" :library glib) (:pointer g-thread))
388 (defcfun (g-thread-join "g_thread_join" :library glib) :pointer
389 (thread (:pointer g-thread)))
391 (defcfun (g-thread-priority "g_thread_set_priority" :library glib) :void
392 (thread (:pointer g-thread))
393 (priority g-thread-priority))
395 ;;;; TODO: Commented g_mutex_*, g_cond* because they are not functions, but called through dispatch table
397 ;; (defcfun (g-mutex-new "g_mutex_new" :library glib) (:pointer g-mutex))
399 ;; (defcfun (g-mutex-lock "g_mutex_lock" :library glib) :void
400 ;; (mutex (:pointer g-mutex)))
402 ;; (defcfun (g-mutex-try-lock "g_mutex_trylock" :library glib) :boolean
403 ;; (mutex (:pointer g-mutex)))
405 ;; (defcfun (g-mutex-free "g_mutex_free" :library glib) :void
406 ;; (mutex (:pointer g-mutex)))
408 ;omitted: GStaticMutex, GStaticRWLock stuff
410 ;; (defcfun (g-cond-new "g_cond_new" :library glib) (:pointer g-cond))
412 ;; (defcfun (g-cond-signal "g_cond_signal" :library glib) :void
413 ;; (cond (:pointer g-cond)))
415 ;; (defcfun (g-cond-broadcast "g_cond_broadcast" :library glib) :void
416 ;; (cond (:pointer g-cond)))
418 ;; (defcfun (g-cond-wait "g_cond_wait" :library glib) :void
419 ;; (cond (:pointer g-cond))
420 ;; (mutex (:pointer g-mutex)))
422 ;; (defcfun (g-cond-timed-wait "g_cond_timed_wait" :library glib) :boolean
423 ;; (cond (:pointer g-cond))
424 ;; (mutex (:pointer g-mutex))
425 ;; (abs-time (:pointer g-time-val)))
427 ;; (defcfun (g-cond-free "g_cond_free" :library glib) :void
428 ;; (cond (:pointer g-cond)))
430 ;omitted: GPrivate, GOnce stuff
432 ;omitted: Thread pools, Asynchronous queues, Dynamic Loading of Modules,
433 ; Memory Allocation, IO Channels, Error Reporting, Message Output and Debugging Functions, Message Logging
435 (defcfun g-free :void
438 (defcfun (g-malloc "g_malloc0") :pointer
441 (defcfun g-strdup :pointer
442 (str (:string :free-to-foreign t)))
444 ;omitted all GLib Utilites
445 ;TODO: omitted Date and Time Functions