chiark / gitweb /
Renamed CHILD-SLOTS to CHILD-PROPERTIES
[clg] / gtk / gtkwidget.lisp
1 ;; Common Lisp bindings for GTK+ v2.0
2 ;; Copyright (C) 2000-2002 Espen S. Johnsen <espen@users.sourceforge.net>
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: gtkwidget.lisp,v 1.13 2004-12-20 20:09:53 espen Exp $
19
20 (in-package "GTK")
21
22
23 (defmethod shared-initialize ((widget widget) names &rest initargs &key parent)
24   (remf initargs :parent)
25   (prog1
26       (apply #'call-next-method widget names initargs)
27     (when parent
28       (when (slot-boundp widget 'parent)
29         (container-remove (widget-parent widget) widget))
30       (let ((parent-widget (first (mklist parent)))
31             (args (rest (mklist parent))))
32         (apply #'container-add parent-widget widget args)))))
33
34 (defmethod shared-initialize :after ((widget widget) names &rest initargs
35                                      &key show-all all-visible)
36   (declare (ignore initargs names))
37   (when (or all-visible show-all)
38     (widget-show-all widget)))
39
40
41 (defmethod slot-unbound ((class gobject-class) (object widget) slot)
42   (cond
43    ((and (eq slot 'child-properties) (slot-value object 'parent))
44     (with-slots (parent child-properties) object
45       (setf
46        child-properties
47        (make-instance
48         (gethash (class-of parent) *container-to-child-class-mappings*)
49         :parent parent :child object))))
50    (t (call-next-method))))
51
52
53 (defun child-property-value (widget slot)
54   (slot-value (widget-child-properties widget) slot))
55
56 (defun (setf child-property-value) (value widget slot)
57   (setf (slot-value (widget-child-properties widget) slot) value))
58
59 (defmacro with-child-properties (slots widget &body body)
60   `(with-slots ,slots (widget-child-properties ,widget)
61      ,@body))
62
63
64 (defmacro widget-destroyed (place)
65   `(setf ,place nil))
66
67
68 ;;; Bindings
69
70 (defbinding widget-destroy () nil
71   (widget widget))
72
73 (defbinding widget-unparent () nil
74   (widget widget))
75
76 (defbinding widget-show () nil
77   (widget widget))
78
79 (defbinding widget-show-now () nil
80   (widget widget))
81
82 (defbinding widget-hide () nil
83   (widget widget))
84
85 (defbinding widget-show-all () nil
86   (widget widget))
87
88 (defbinding widget-hide-all () nil
89   (widget widget))
90
91 (defbinding widget-map () nil
92   (widget widget))
93
94 (defbinding widget-unmap () nil
95   (widget widget))
96
97 (defbinding widget-realize () nil
98   (widget widget))
99
100 (defbinding widget-unrealize () nil
101   (widget widget))
102
103 (defbinding widget-queue-draw () nil
104   (widget widget))
105
106 (defbinding widget-queue-resize () nil
107   (widget widget))
108
109 (defbinding widget-size-request () nil
110   (widget widget)
111   (requisition requisition))
112
113 (defbinding widget-get-child-requisition () nil
114   (widget widget)
115   (requisition requisition))
116
117 (defbinding widget-size-allocate () nil
118   (widget widget)
119   (allocation allocation))
120
121
122 (defbinding widget-add-accelerator
123     (widget signal accel-group key modifiers flags) nil
124   (widget widget)
125   ((name-to-string signal) string)
126   (accel-group accel-group)
127   ((gdk:keyval-from-name key) unsigned-int)
128   (modifiers gdk:modifier-type)
129   (flags accel-flags))
130
131 (defbinding widget-remove-accelerator
132     (widget accel-group key modifiers) nil
133   (widget widget)
134   (accel-group accel-group)
135   ((gdk:keyval-from-name key) unsigned-int)
136   (modifiers gdk:modifier-type))
137
138 (defbinding (widget-set-accelerator-path "gtk_widget_set_accel_path") () nil
139   (widget widget)
140   (accel-path string)
141   (accel-group accel-group))
142   
143
144 (defbinding widget-event () int
145   (widget widget)
146   (event gdk:event))
147
148 (defbinding widget-activate () boolean
149   (widget widget))
150
151 (defbinding widget-reparent () nil
152   (widget widget)
153   (new-parent widget))
154
155 (defbinding %widget-intersect () boolean
156   (widget widget)
157   (area gdk:rectangle)
158   (intersection (or null gdk:rectangle)))
159
160 (defun widget-intersection (widget area)
161   (let ((intersection (make-instance 'gdk:rectangle)))
162     (when (%widget-intersect widget area intersection)
163       intersection)))
164
165 (defun widget-intersect-p (widget area)
166   (%widget-intersect widget area nil))
167
168 ;; (defbinding (widget-is-focus-p "gtk_widget_is_focus") () boolean
169 ;;   (widget widget))
170
171 (defbinding widget-grab-focus () nil
172   (widget widget))
173
174 (defbinding widget-grab-default () nil
175   (widget widget))
176
177 (defbinding widget-add-events () nil
178   (widget widget)
179   (events gdk:event-mask))
180
181 (defbinding widget-get-toplevel () widget
182   (widget widget))
183
184 (defbinding widget-get-ancestor (widget type) widget
185   (widget widget)
186   ((find-type-number type) type-number))
187
188 (defbinding widget-get-pointer () nil
189   (widget widget)
190   (x int :out)
191   (y int :out))
192
193 (defbinding (widget-is-ancestor-p "gtk_widget_is_ancestor") () boolean
194   (widget widget)
195   (ancestor widget))
196
197 (defbinding widget-translate-coordinates () boolean
198   (src-widget widget)
199   (dest-widget widget)
200   (src-x int) (src-y int)
201   (set-x int :out) (dest-y int :out))
202
203 (defun widget-hide-on-delete (widget)
204   "Utility function; intended to be connected to the DELETE-EVENT
205 signal on a GtkWindow. The function calls WIDGET-HIDE on its
206 argument, then returns T. If connected to DELETE-EVENT, the
207 result is that clicking the close button for a window (on the window
208 frame, top right corner usually) will hide but not destroy the
209 window. By default, GTK+ destroys windows when DELETE-EVENT is
210 received."
211   (widget-hide widget)
212   t)
213   
214 (defbinding widget-ensure-style () nil
215   (widget widget))
216
217 (defbinding widget-reset-rc-styles () nil
218   (widget widget))
219
220 (defbinding widget-push-colormap () nil
221   (colormap gdk:colormap))
222
223 (defbinding widget-pop-colormap () nil)
224
225 (defbinding widget-set-default-colormap () nil
226   (colormap gdk:colormap))
227
228 (defbinding widget-get-default-style () style)
229
230 (defbinding widget-get-default-colormap () gdk:colormap)
231
232 (defbinding widget-get-default-visual () gdk:visual)
233
234 (defbinding widget-get-default-direction () text-direction)
235
236 (defbinding widget-set-default-direction () nil
237   (direction  text-direction))
238
239 (defbinding widget-shape-combine-mask () nil
240   (widget widget)
241   (shape-mask gdk:bitmap)
242   (x-offset int)
243   (y-offset int))
244
245 (defbinding widget-path () nil
246   (widget widget)
247   (path-length int :out)
248   (path string :out)
249   (reverse-path string :out))
250
251 (defbinding widget-class-path () nil
252   (widget widget)
253   (path-length int :out)
254   (path string :out)
255   (reverse-path string :out))
256
257 (defbinding widget-modify-style () nil
258   (widget widget)
259   (style rc-style))
260
261 (defbinding widget-modify-style () rc-style
262   (widget widget))
263
264 (defbinding (widget-modify-foreground "gtk_widget_modify_fg") () nil
265   (widget widget)
266   (state state-type)
267   (color gdk:color))
268
269 (defbinding (widget-modify-background "gtk_widget_modify_bg") () nil
270   (widget widget)
271   (state state-type)
272   (color gdk:color))
273
274 (defbinding widget-modify-text () nil
275   (widget widget)
276   (state state-type)
277   (color gdk:color))
278
279 (defbinding widget-modify-base () nil
280   (widget widget)
281   (state state-type)
282   (color gdk:color))
283
284 (defbinding widget-modify-font () nil
285   (widget widget)
286   (state state-type)
287   (font-desc pango:font-description))
288
289 (defbinding widget-create-pango-context () pango:context
290   (widget widget))
291
292 (defbinding widget-get-pango-context () pango:context
293   (widget widget))
294
295 (defbinding widget-create-pango-layout (widget &optional text) pango:layout
296   (widget widget)
297   (text (or string null)))
298
299 (defbinding widget-render-icon () gdk:pixbuf
300   (widget widget)
301   (stock-id string)
302   (size icon-size)
303   (detail string))
304
305 (defbinding widget-push-composite-child () nil)
306
307 (defbinding widget-pop-composite-child () nil)
308
309 (defbinding widget-queue-draw-area () nil
310   (widget widget)
311   (x int) (y int) (width int) (height int))
312
313 (defbinding widget-reset-shapes () nil
314   (widget widget))
315
316 (defbinding widget-set-double-buffered () nil
317   (widget widget)
318   (double-buffered boolean))
319
320 (defbinding widget-set-redraw-on-allocate () nil
321   (widget widget)
322   (redraw-on-allocate boolean))
323
324 (defbinding widget-set-scroll-adjustments () boolean
325   (widget widget)
326   (hadjustment adjustment)
327   (vadjustment adjustment))
328
329 (defbinding widget-mnemonic-activate () boolean
330   (widget widget)
331   (group-cycling boolean))
332
333 (defbinding widget-region-intersect () pointer ;gdk:region
334   (widget widget)
335   (region pointer)) ;gdk:region))
336
337 (defbinding widget-send-expose () int
338   (widget widget)
339   (event gdk:event))
340
341 (defbinding widget-get-accessible () atk:object
342   (widget widget))
343
344 (defbinding widget-child-focus () boolean
345   (widget widget)
346   (direction direction-type))
347
348 (defbinding widget-child-notify () nil
349   (widget widget)
350   (child-property string))
351
352 (defbinding widget-freeze-child-notify () nil
353   (widget widget))
354
355 (defbinding %widget-get-size-request () nil
356   (widget widget)
357   (width int :out)
358   (height int :out))
359
360 (defun widget-get-size-request (widget)
361   (multiple-value-bind (width height) (%widget-get-size-request widget)
362      (values (unless (= width -1) width) (unless (= height -1) height))))
363
364 (defbinding widget-set-size-request (widget width height) nil
365   (widget widget)
366   ((or width -1) int)
367   ((or height -1) int))
368
369 (defbinding widget-thaw-child-notify () nil
370   (widget widget))
371
372
373 ;;; Additional bindings and functions
374
375 (defbinding (widget-mapped-p "gtk_widget_mapped_p") () boolean
376   (widget widget))
377
378 (defbinding widget-get-size-allocation () nil
379   (widget widget)
380   (width int :out)
381   (height int :out))
382
383 (defbinding get-event-widget () widget
384   (event gdk:event))
385
386 (defun (setf widget-cursor) (cursor-type widget)
387   (let ((cursor (make-instance 'gdk:cursor :type cursor-type)))
388     (gdk:window-set-cursor (widget-window widget) cursor)))