Fix some compilation warnings
[cl-gtk2.git] / gtk / gtk.widget.lisp
1 (in-package :gtk)
2
3 ; TODO: GtkWidget
4
5 (defun widget-flags (widget)
6   (convert-from-foreign (gtk-object-flags-as-integer widget) 'widget-flags))
7
8 (defun (setf widget-flags) (new-value widget)
9   (setf (gtk-object-flags-as-integer widget)
10         (convert-to-foreign new-value 'widget-flags))
11   new-value)
12
13 (export 'widget-flags)
14
15 (defcstruct %gtk-widget
16   (:object %gtk-object)
17   (:private-flags :uint16)
18   (:state state-type)
19   (:saved-state state-type)
20   (:name (:pointer :char))
21   (:style :pointer)
22   (:requisition requisition-cstruct)
23   (:allocation allocation-cstruct)
24   (:window :pointer)
25   (:parent :pointer))
26
27 (defun widget-state (widget)
28   (foreign-slot-value (pointer widget) '%gtk-widget :state))
29
30 (export 'widget-state)
31 (defun widget-saved-state (widget)
32   (foreign-slot-value (pointer widget) '%gtk-widget :saved-state))
33
34 (export 'widget-saved-state)
35
36 (defmacro widget-p-fn (type)
37   (let ((name (intern (format nil "WIDGET-~A-P" (symbol-name type)) (find-package :gtk))))
38     `(progn (defun ,name (widget)
39               (member ,type (widget-flags widget)))
40             (export ',name))))
41
42 (widget-p-fn :toplevel)
43 (widget-p-fn :no-window)
44 (widget-p-fn :realized)
45 (widget-p-fn :mapped)
46 (widget-p-fn :visible)
47 (widget-p-fn :sensitive)
48 (widget-p-fn :parent-sensitive)
49 (widget-p-fn :can-focus)
50 (widget-p-fn :has-focus)
51 (widget-p-fn :can-default)
52 (widget-p-fn :has-default)
53 (widget-p-fn :has-grab)
54 (widget-p-fn :rc-style)
55 (widget-p-fn :composite-child)
56 (widget-p-fn :no-reparent)
57 (widget-p-fn :app-paintable)
58 (widget-p-fn :receives-default)
59 (widget-p-fn :double-buffered)
60 (widget-p-fn :no-show-all)
61
62 (defcfun (widget-unparent "gtk_widget_unparent") :void
63   (widget g-object))
64
65 (export 'widget-unparent)
66
67 (defcfun gtk-widget-show :void
68   (widget g-object))
69
70 (defcfun gtk-widget-show-all :void
71   (widget g-object))
72
73 (defun widget-show (widget &key (all t))
74   (if all
75       (gtk-widget-show-all widget)
76       (gtk-widget-show widget)))
77
78 (export 'widget-show)
79
80 (defcfun (widget-show-now "gtk_widget_show_now") :void
81   (widget g-object))
82
83 (export 'widget-show-now)
84
85 (defcfun gtk-widget-hide :void
86   (widget g-object))
87
88 (defcfun gtk-widget-hide-all :void
89   (widget g-object))
90
91 (defun widget-hide (widget &key (all t))
92   (if all
93       (gtk-widget-hide-all widget)
94       (gtk-widget-hide widget)))
95
96 (defcfun (widget-map "gtk_widget_map") :void
97   (widget g-object))
98
99 (export 'widget-map)
100
101 (defcfun (widget-unmap "gtk_widget_unmap") :void
102   (widget g-object))
103
104 (export 'widget-unmap)
105
106 (defcfun (widget-realize "gtk_widget_realize") :void
107   (width g-object))
108
109 (export 'widget-realize)
110
111 (defcfun (widget-unrealize "gtk_widget_unrealize") :void
112   (width g-object))
113
114 (export 'widget-unrealize)
115
116 (defcfun (widget-queue-draw "gtk_widget_queue_draw") :void
117   (widget (g-object widget)))
118
119 (export 'widget-queue-draw)
120
121 (defcfun (widget-queue-resize "gtk_widget_queue_resize") :void
122   (widget (g-object widget)))
123
124 (export 'widget-queue-resize)
125
126 (defcfun (widget-queue-resize-no-redraw "gtk_widget_queue_resize_no_redraw") :void
127   (widget (g-object widget)))
128
129 (export 'widget-queue-resize-no-redraw)
130
131 ; TODO: gtk_widget_get_child_requisition
132
133 ; TODO: gtk_widget_size_allocate
134
135 (defcfun (widget-add-accelerator "gtk_widget_add_accelerator") :void
136   (widget g-object)
137   (accel-signal :string)
138   (accel-group g-object)
139   (accel-key :uint)
140   (accel-mods modifier-type)
141   (accel-flags accel-flags))
142
143 (export 'widget-add-accelerator)
144
145 (defcfun (widget-remove-accelerator "gtk_widget_remove_accelerator") :void
146   (widget g-object)
147   (accel-group g-object)
148   (accel-key :uint)
149   (accel-mods modifier-type))
150
151 (export 'widget-remove-accelerator)
152
153 (defcfun (widget-set-accel-path "gtk_widget_set_accel_path") :void
154   (widget g-object)
155   (accel-path :string)
156   (accel-group g-object))
157
158 (export 'widget-set-accel-path)
159
160 ; TODO: gtk_widget_list_accel_closures
161
162 (defcfun gtk-widget-can-activate-accel :boolean
163   (widget g-object)
164   (signal-id :uint))
165
166 (defun widget-can-activate-accel (widget signal)
167   (when (stringp signal) (setf signal (g-signal-lookup signal (g-type-from-object widget))))
168   (gtk-widget-can-activate-accel widget signal))
169
170 (export 'widget-can-activate-accel)
171
172 ; TODO: gtk_widget_event
173
174 (defcfun (widget-activate "gtk_widget_activate") :boolean
175   (widget g-object))
176
177 (export 'widget-activate)
178
179 (defcfun (widget-reparent "gtk_widget_reparent") :void
180   (widget g-object)
181   (new-parent g-object))
182
183 (export 'widget-reparent)
184
185 (defcfun gtk-widget-intersect :boolean
186   (widget g-object)
187   (area (g-boxed-foreign rectangle))
188   (intersection (g-boxed-foreign rectangle :in-out)))
189
190 (defun widget-intersect (widget rectangle)
191   (let ((result (make-rectangle :x 0 :y 0 :width 0 :height 0)))
192     (when (gtk-widget-intersect widget rectangle result)
193       result)))
194
195 (export 'widget-intersect)
196
197 (defcfun (widget-focus-p "gtk_widget_is_focus") :boolean
198   (widget g-object))
199
200 (export 'widget-focus-p)
201
202 (defcfun (widget-grab-focus "gtk_widget_grab_focus") :void
203   (widget g-object))
204
205 (export 'widget-grab-focus)
206
207 (defcfun (widget-grab-default "gtk_widget_grab_default") :void
208   (widget g-object))
209
210 (export 'widget-grab-default)
211
212 ; TODO: gtk_widget_set_state
213
214 ; TODO: gtk_widget_set_parent_window
215
216 ; TODO: gtk_widget_get_parent_window
217
218 ; TODO: gtk_widget_set_extension_events
219
220 ; TODO: gtk_widget_get_extension_events
221
222
223 ; fix ownership issues:
224 ; TODO: gtk_widget_get_toplevel
225
226 ; TODO: gtk_widget_get_ancestor
227
228 ; TODO: gtk_widget_get_colormap
229
230 ; TODO: gtk_widget_get_visual
231
232 (defcfun gtk-widget-get-pointer :void
233   (widget g-object)
234   (x (:pointer :int))
235   (y (:pointer :int)))
236
237 (defun widget-pointer (widget)
238   (with-foreign-objects ((x :int) (y :int))
239     (gtk-widget-get-pointer widget x y)
240     (values (mem-ref x :int) (mem-ref y :int))))
241
242 (export 'widget-pointer)
243
244 (defcfun (widget-contained-p "gtk_widget_is_ancestor") :boolean
245   (widget g-object)
246   (container g-object))
247
248 (export 'widget-contained-p)
249
250 (defcfun gtk-widget-translate-coordinates :boolean
251   (src-widget g-object)
252   (dst-widget g-object)
253   (src-x :int)
254   (src-y :int)
255   (dst-x (:pointer :int))
256   (dst-y (:pointer :int)))
257
258 (defun widget-translate-coordinates (src-widget dst-widget src-x src-y)
259   (with-foreign-objects ((dst-x :int) (dst-y :int))
260     (gtk-widget-translate-coordinates src-widget dst-widget src-x src-y dst-x dst-y)
261     (values (mem-ref dst-x :int)
262             (mem-ref dst-y :int))))
263
264 (export 'widget-translate-coordinates)
265
266 (defcfun (widget-ensure-style "gtk_widget_ensure_style") :void
267   (widget g-object))
268
269 (export 'widget-ensure-style)
270
271 (defcfun (widget-reset-rc-styles "gtk_widget_reset_rc_styles") :void
272   (widget g-object))
273
274 (export 'widget-reset-rc-styles)
275
276 ; TODO: gtk_widget_push_colormap
277
278 ; TODO: gtk_widget_pop_colormap
279
280 ; TODO: gtk_widget_set_default_colormap
281
282 ; TODO: gtk_widget_get_default_colormap
283
284 ; TODO: gtk_widget_get_default_style (ownership)
285
286 ; TODO: gtk_widget_get_default_visual
287
288 (defcfun (widget-default-direction "gtk_widget_get_default_direction") text-direction)
289
290 (defcfun gtk-widget-set-default-direction :void
291   (direction text-direction))
292
293 (defun (setf widget-default-direction) (new-value)
294   (gtk-widget-set-default-direction new-value))
295
296 (export 'widget-default-direction)
297
298 ; TODO: gtk_widget_shape_combine_mask 
299
300 ; TODO: gtk_widget_input_shape_combine_mask
301
302 (defcfun gtk-widget-path :void
303   (widget g-object)
304   (path-length (:pointer :uint))
305   (path (:pointer (:pointer :char)))
306   (path-reversed (:pointer (:pointer :char))))
307
308 (defcfun gtk-widget-class-path :void
309   (widget g-object)
310   (path-length (:pointer :uint))
311   (path (:pointer (:pointer :char)))
312   (path-reversed (:pointer (:pointer :char))))
313
314 (defun widget-path (widget &key (path-type :name))
315   (assert (typep path-type '(member :name :class)))
316   (with-foreign-object (path :pointer)
317     (ecase path-type
318       (:name (gtk-widget-path widget (null-pointer) path (null-pointer)))
319       (:class (gtk-widget-class-path widget (null-pointer) path (null-pointer))))
320     (mem-ref path '(g-string :free-from-foreign t))))
321
322 (export 'widget-path)
323
324 ; TODO: gtk_widget_modify_fg
325
326 ; TODO: gtk_widget_modify_bg
327
328 ; TODO: gtk_widget_modify_text
329
330 ; TODO: gtk_widget_modify_base
331
332 ; TODO: gtk_widget_modify_font
333
334 ; TODO: gtk_widget_modify_cursor 
335
336 (defcfun (widget-create-pango-context "gtk_widget_create_pango_context") g-object
337   (widget g-object))
338
339 (export 'widget-create-pango-context)
340
341 (defcfun (widget-get-pango-context "gtk_widget_get_pango_context") g-object
342   (widget g-object))
343
344 (export 'widget-get-pango-context)
345
346 (defcfun (widget-create-pango-layout "gtk_widget_create_pango_layout") (g-object gdk::pango-layout :already-referenced)
347   (widget (g-object widget))
348   (text :string))
349
350 (export 'widget-create-pango-layout)
351
352 (defcfun (widget-render-icon "gtk_widget_render_icon") g-object
353   (widget g-object)
354   (stock-id :string)
355   (size icon-size)
356   (detail :string))
357
358 (export 'widget-render-icon)
359
360 (defcfun (widget-push-composite-child "gtk_widget_push_composite_child") :void
361   (widget g-object))
362
363 (export 'widget-push-composite-child)
364
365 (defcfun (widget-pop-composite-child "gtk_widget_pop_composite_child") :void
366   (widget g-object))
367
368 (export 'widget-pop-composite-child)
369
370 (defcfun (widget-queue-draw-area "gtk_widget_queue_draw_area") :void
371   (widget g-object)
372   (x :int)
373   (y :int)
374   (width :int)
375   (height :int))
376
377 (export 'widget-queue-draw-area)
378
379 (defcfun (widget-reset-shapes "gtk_widget_reset_shapes") :void
380   (widget g-object))
381
382 (export 'widget-reset-shapes)
383
384 (defcfun (widget-set-scroll-adjustments "gtk_widget_set_scroll_adjustments") :boolean
385   (widget g-object)
386   (hadjustment g-object)
387   (vadjustment g-object))
388
389 (export 'widget-set-scroll-adjustments)
390
391 ; TODO: gtk_widget_class_install_style_property
392
393 ; TOOD: gtk_widget_class_install_style_property_parser
394
395 ; TODO: gtk_widget_class_list_style_properties
396
397 ; TODO: gtk_widget_region_intersect
398
399 ; TODO: gtk_widget_send_expose
400
401 (defcfun gtk-widget-style-get-property :void
402   (widget g-object)
403   (property-name :string)
404   (value (:pointer g-value)))
405
406 (defcfun gtk-widget-class-find-style-property (:pointer g-param-spec)
407   (class :pointer)
408   (property-name :string))
409
410 (defcfun gtk-widget-class-list-style-properties (:pointer (:pointer g-param-spec))
411   (class :pointer)
412   (n-properties (:pointer :int)))
413
414 (defun widget-class-get-style-properties (type)
415   (setf type (ensure-g-type type))
416   (let ((class (g-type-class-ref type)))
417     (unwind-protect
418          (with-foreign-object (np :int)
419            (let ((specs (gtk-widget-class-list-style-properties class np)))
420              (unwind-protect
421                   (loop
422                      repeat (mem-ref np :int)
423                      for i from 0
424                      for spec = (mem-aref specs :pointer i)
425                      collect (parse-g-param-spec spec))
426                (g-free specs))))
427       (g-type-class-unref class))))
428
429 (export 'widget-class-get-style-properties)
430
431 (defun widget-child-property-type (widget property-name)
432   (let* ((type (g-type-from-object widget))
433          (class (g-type-class-ref type)))
434     (unwind-protect
435          (let ((g-param-spec (gtk-widget-class-find-style-property class property-name)))
436            (when (null-pointer-p g-param-spec) (error "Widget ~A has no style-property named '~A'" widget property-name))
437            (foreign-slot-value g-param-spec 'gobject:g-param-spec :value-type))
438       (g-type-class-unref class))))
439
440 (defun widget-child-property-value (widget property-name &optional property-type)
441   (unless property-type (setf property-type (widget-child-property-type widget property-name)))
442   (setf property-type (ensure-g-type property-type))
443   (with-foreign-object (gvalue 'g-value)
444     (g-value-zero gvalue)
445     (g-value-init gvalue property-type)
446     (prog1 (gtk-widget-style-get-property widget property-name gvalue)
447       (g-value-unset gvalue))))
448
449 (export 'widget-child-property-value)
450
451 (defcfun (widget-child-focus "gtk_widget_child_focus") :boolean
452   (widget g-object)
453   (direction direction-type))
454
455 (export 'widget-child-focus)
456
457 (defcfun (widget-freeze-child-notify "gtk_widget_freeze_child_notify") :void
458   (widget g-object))
459
460 (export 'widget-freeze-child-notify)
461
462 (defcfun (widget-settings "gtk_widget_get_settings") g-object
463   (widget g-object))
464
465 (export 'widget-settings)
466
467 ; TODO: gtk_widget_get_clipboard
468
469 (defcfun (widget-display "gtk_widget_get_display") g-object
470   (widget g-object))
471
472 (export 'widget-display)
473
474 (defcfun (widget-root-window "gtk_widget_get_root_window") g-object
475   (widget g-object))
476
477 (export 'widget-root-window)
478
479 (defcfun (widget-screen "gtk_widget_get_screen") g-object
480   (widget g-object))
481
482 (export 'widget-screen)
483
484 (defcfun (widget-has-screen "gtk_widget_has_screen") :boolean
485   (widget g-object))
486
487 (export 'widget-has-screen)
488
489 ; TODO: gtk_widget_set_child_visible
490
491 (defcfun (widget-thaw-child-notify "gtk_widget_thaw_child_notify") :void
492   (widget g-object))
493
494 (export 'widget-thaw-child-notify)
495
496 ; TODO: gtk_widget_list_mnemonic_labels
497
498 (defcfun (widget-add-mnemonic-label "gtk_widget_add_mnemonic_label") :void
499   (widget g-object)
500   (label g-object))
501
502 (export 'widget-add-mnemonic-label)
503
504 (defcfun (widget-remove-mnemonic-label "gtk_widget_remove_mnemonic_label") :void
505   (widget g-object)
506   (label g-object))
507
508 (export 'widget-remove-mnemonic-label)
509
510 (defcfun (widget-action "gtk_widget_get_action") g-object
511   (widget g-object))
512
513 (export 'widget-action)
514
515 (defcfun (widget-composited-p "gtk_widget_is_composited") :boolean
516   (widget g-object))
517
518 (export 'widget-composited-p)
519
520 (defcfun (widget-error-bell "gtk_widget_error_bell") :void
521   (widget g-object))
522
523 (export 'widget-error-bell)
524
525 (defcfun (widget-trigger-tooltip-query "gtk_tooltip_trigger_tooltip_query") :void
526   (widget g-object))
527
528 (export 'widget-trigger-tooltip-query)
529
530 (defcfun gtk-widget-get-snapshot g-object
531   (widget g-object)
532   (clip-rectangle (g-boxed-foreign rectangle)))
533
534 (defun widget-snapshot (widget &optional clip-rectangle)
535   (gtk-widget-get-snapshot widget clip-rectangle))
536
537 (export 'widget-snapshot)