GtkWidget binding
[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
32 (defun widget-saved-state (widget)
33   (foreign-slot-value (pointer widget) '%gtk-widget :saved-state))
34
35 (export 'widget-saved-state)
36
37 (defmacro widget-p-fn (type)
38   (let ((name (intern (format nil "WIDGET-~A-P" (symbol-name type)) (find-package :gtk))))
39     `(progn (defun ,name (widget)
40               (member ,type (widget-flags widget)))
41             (export ',name))))
42
43 (widget-p-fn :toplevel)
44 (widget-p-fn :no-window)
45 (widget-p-fn :realized)
46 (widget-p-fn :mapped)
47 (widget-p-fn :visible)
48 (widget-p-fn :sensitive)
49 (widget-p-fn :parent-sensitive)
50 (widget-p-fn :can-focus)
51 (widget-p-fn :has-focus)
52 (widget-p-fn :can-default)
53 (widget-p-fn :has-default)
54 (widget-p-fn :has-grab)
55 (widget-p-fn :rc-style)
56 (widget-p-fn :composite-child)
57 (widget-p-fn :no-reparent)
58 (widget-p-fn :app-paintable)
59 (widget-p-fn :receives-default)
60 (widget-p-fn :double-buffered)
61 (widget-p-fn :no-show-all)
62
63 (defcfun (widget-unparent "gtk_widget_unparent") :void
64   (widget g-object))
65
66 (export 'widget-unparent)
67
68 (defcfun gtk-widget-show :void
69   (widget g-object))
70
71 (defcfun gtk-widget-show-all :void
72   (widget g-object))
73
74 (defun widget-show (widget &key (all t))
75   (if all
76       (gtk-widget-show-all widget)
77       (gtk-widget-show widget)))
78
79 (export 'widget-show)
80
81 (defcfun (widget-show-now "gtk_widget_show_now") :void
82   (widget g-object))
83
84 (export 'widget-show-now)
85
86 (defcfun gtk-widget-hide :void
87   (widget g-object))
88
89 (defcfun gtk-widget-hide-all :void
90   (widget g-object))
91
92 (defun widget-hide (widget &key (all t))
93   (if all
94       (gtk-widget-hide-all widget)
95       (gtk-widget-hide widget)))
96
97 (defcfun (widget-map "gtk_widget_map") :void
98   (widget g-object))
99
100 (export 'widget-map)
101
102 (defcfun (widget-unmap "gtk_widget_unmap") :void
103   (widget g-object))
104
105 (export 'widget-unmap)
106
107 (defcfun (widget-realize "gtk_widget_realize") :void
108   (width g-object))
109
110 (export 'widget-realize)
111
112 (defcfun (widget-unrealize "gtk_widget_unrealize") :void
113   (width g-object))
114
115 (export 'widget-unrealize)
116
117 (defcfun (widget-queue-draw "gtk_widget_queue_draw") :void
118   (widget (g-object widget)))
119
120 (export 'widget-queue-draw)
121
122 (defcfun (widget-queue-resize "gtk_widget_queue_resize") :void
123   (widget (g-object widget)))
124
125 (export 'widget-queue-resize)
126
127 (defcfun (widget-queue-resize-no-redraw "gtk_widget_queue_resize_no_redraw") :void
128   (widget (g-object widget)))
129
130 (export 'widget-queue-resize-no-redraw)
131
132 ; TODO: gtk_widget_get_child_requisition
133
134 ; TODO: gtk_widget_size_allocate
135
136 (defcfun (widget-add-accelerator "gtk_widget_add_accelerator") :void
137   (widget g-object)
138   (accel-signal :string)
139   (accel-group g-object)
140   (accel-key :uint)
141   (accel-mods modifier-type)
142   (accel-flags accel-flags))
143
144 (export 'widget-add-accelerator)
145
146 (defcfun (widget-remove-accelerator "gtk_widget_remove_accelerator") :void
147   (widget g-object)
148   (accel-group g-object)
149   (accel-key :uint)
150   (accel-mods modifier-type))
151
152 (export 'widget-remove-accelerator)
153
154 (defcfun (widget-set-accel-path "gtk_widget_set_accel_path") :void
155   (widget g-object)
156   (accel-path :string)
157   (accel-group g-object))
158
159 (export 'widget-set-accel-path)
160
161 ; TODO: gtk_widget_list_accel_closures
162
163 (defcfun gtk-widget-can-activate-accel :boolean
164   (widget g-object)
165   (signal-id :uint))
166
167 (defun widget-can-activate-accel (widget signal)
168   (when (stringp signal) (setf signal (g-signal-lookup signal (g-type-from-object widget))))
169   (gtk-widget-can-activate-accel widget signal))
170
171 (export 'widget-can-activate-accel)
172
173 (defcfun (widget-event "gtk_widget_event") :boolean
174   (widget (g-object widget))
175   (event (g-boxed-foreign event)))
176
177 (export 'widget-event)
178
179 (defcfun (widget-activate "gtk_widget_activate") :boolean
180   (widget g-object))
181
182 (export 'widget-activate)
183
184 (defcfun (widget-reparent "gtk_widget_reparent") :void
185   (widget g-object)
186   (new-parent g-object))
187
188 (export 'widget-reparent)
189
190 (defcfun gtk-widget-intersect :boolean
191   (widget g-object)
192   (area (g-boxed-foreign rectangle))
193   (intersection (g-boxed-foreign rectangle)))
194
195 (defun widget-intersect (widget rectangle)
196   (let ((result (make-rectangle)))
197     (when (gtk-widget-intersect widget rectangle result)
198       result)))
199
200 (export 'widget-intersect)
201
202 (defcfun (widget-focus-p "gtk_widget_is_focus") :boolean
203   (widget g-object))
204
205 (export 'widget-focus-p)
206
207 (defcfun (widget-grab-focus "gtk_widget_grab_focus") :void
208   (widget g-object))
209
210 (export 'widget-grab-focus)
211
212 (defcfun (widget-grab-default "gtk_widget_grab_default") :void
213   (widget g-object))
214
215 (export 'widget-grab-default)
216
217 (defcfun (widget-set-state "gtk_widget_set_state") :void
218   (widget (g-object widget))
219   (state state-type))
220
221 (export 'widget-set-state)
222
223 (defcfun (widget-ancestor "gtk_widget_get_ancestor") (g-object widget)
224   (widget (g-object widget))
225   (type g-type-designator))
226
227 (export 'widget-ancestor)
228
229 (defcfun gtk-widget-get-pointer :void
230   (widget g-object)
231   (x (:pointer :int))
232   (y (:pointer :int)))
233
234 (defun widget-pointer (widget)
235   (with-foreign-objects ((x :int) (y :int))
236     (gtk-widget-get-pointer widget x y)
237     (values (mem-ref x :int) (mem-ref y :int))))
238
239 (export 'widget-pointer)
240
241 (defcfun (widget-is-ancestor "gtk_widget_is_ancestor") :boolean
242   (widget g-object)
243   (container g-object))
244
245 (export 'widget-is-ancestor)
246
247 (defcfun gtk-widget-translate-coordinates :boolean
248   (src-widget g-object)
249   (dst-widget g-object)
250   (src-x :int)
251   (src-y :int)
252   (dst-x (:pointer :int))
253   (dst-y (:pointer :int)))
254
255 (defun widget-translate-coordinates (src-widget dst-widget src-x src-y)
256   (with-foreign-objects ((dst-x :int) (dst-y :int))
257     (gtk-widget-translate-coordinates src-widget dst-widget src-x src-y dst-x dst-y)
258     (values (mem-ref dst-x :int)
259             (mem-ref dst-y :int))))
260
261 (export 'widget-translate-coordinates)
262
263 (defcfun (widget-ensure-style "gtk_widget_ensure_style") :void
264   (widget g-object))
265
266 (export 'widget-ensure-style)
267
268 (defcfun (widget-reset-rc-styles "gtk_widget_reset_rc_styles") :void
269   (widget g-object))
270
271 (export 'widget-reset-rc-styles)
272
273 (defcfun (widget-push-colormap "gtk_widget_push_colormap") :void
274   (colormap (g-object gdk-colormap)))
275
276 (export 'widget-push-colormap)
277
278 (defcfun (widget-pop-colormap "gtk_widget_pop_colormap") :void)
279
280 (export 'widget-pop-colormap)
281
282 (defcfun (widget-default-colormap "gtk_widget_get_default_colormap") (g-object gdk-colormap))
283
284 (defcfun gtk-widget-set-default-colormap :void
285   (colormap (g-object gdk-colormap)))
286
287 (defun (setf widget-default-colormap) (colormap)
288   (gtk-widget-set-default-colormap colormap))
289
290 (export 'widget-default-colormap)
291
292 (defcfun (widget-default-style "gtk_widget_get_default_style") (g-object style))
293
294 (export 'widget-default-style)
295
296 (defcfun (widget-default-visual "gtk_widget_get_default_visual") (g-object visual))
297
298 (export 'widget-default-visual)
299
300 (defcfun (widget-default-direction "gtk_widget_get_default_direction") text-direction)
301
302 (defcfun gtk-widget-set-default-direction :void
303   (direction text-direction))
304
305 (defun (setf widget-default-direction) (new-value)
306   (gtk-widget-set-default-direction new-value))
307
308 (export 'widget-default-direction)
309
310 (defcfun (widget-shape-combine-mask "gtk_widget_shape_combine_mask") :void
311   (widget (g-object widget))
312   (shape-mask g-object)
313   (offset-x :int)
314   (offset-y :int))
315
316 (export 'widget-shape-combine-mask)
317
318 (defcfun (widget-input-shape-combine-mask "gtk_widget_input_shape_combine_mask") :void
319   (widget (g-object widget))
320   (shape-mask g-object)
321   (offset-x :int)
322   (offset-y :int))
323
324 (export 'widget-input-shape-combine-mask)
325
326 (defcfun gtk-widget-path :void
327   (widget g-object)
328   (path-length (:pointer :uint))
329   (path (:pointer (:pointer :char)))
330   (path-reversed (:pointer (:pointer :char))))
331
332 (defcfun gtk-widget-class-path :void
333   (widget g-object)
334   (path-length (:pointer :uint))
335   (path (:pointer (:pointer :char)))
336   (path-reversed (:pointer (:pointer :char))))
337
338 (defun widget-path (widget &key (path-type :name))
339   (assert (typep path-type '(member :name :class)))
340   (with-foreign-object (path :pointer)
341     (ecase path-type
342       (:name (gtk-widget-path widget (null-pointer) path (null-pointer)))
343       (:class (gtk-widget-class-path widget (null-pointer) path (null-pointer))))
344     (mem-ref path '(g-string :free-from-foreign t))))
345
346 (export 'widget-path)
347
348 (defcfun (widget-modify-fg "gtk_widget_modify_fg") :void
349   (widget (g-object widget))
350   (state state-type)
351   (color (g-boxed-foreign color)))
352
353 (export 'widget-modify-fg)
354
355 (defcfun (widget-modify-bg "gtk_widget_modify_bg") :void
356   (widget (g-object widget))
357   (state state-type)
358   (color (g-boxed-foreign color)))
359
360 (export 'widget-modify-bg)
361
362 (defcfun (widget-modify-text "gtk_widget_modify_text") :void
363   (widget (g-object widget))
364   (state state-type)
365   (color (g-boxed-foreign color)))
366
367 (export 'widget-modify-text)
368
369 (defcfun (widget-modify-base "gtk_widget_modify_base") :void
370   (widget (g-object widget))
371   (state state-type)
372   (color (g-boxed-foreign color)))
373
374 (export 'widget-modify-base)
375
376 ;void                gtk_widget_modify_font              (GtkWidget *widget,
377 ;                                                         PangoFontDescription *font_desc);
378
379 (defcfun (widget-modify-cursor "gtk_widget_modify_cursor") :void
380   (widget (g-object widget))
381   (primary (g-boxed-foreign color))
382   (secondary (g-boxed-foreign color)))
383
384 (export 'widget-modify-cursor)
385
386 (defcfun (widget-create-pango-context "gtk_widget_create_pango_context") (g-object :already-referenced)
387   (widget g-object))
388
389 (export 'widget-create-pango-context)
390
391 (defcfun (widget-get-pango-context "gtk_widget_get_pango_context") g-object
392   (widget g-object))
393
394 (export 'widget-get-pango-context)
395
396 (defcfun (widget-create-pango-layout "gtk_widget_create_pango_layout") (g-object gdk::pango-layout :already-referenced)
397   (widget (g-object widget))
398   (text :string))
399
400 (export 'widget-create-pango-layout)
401
402 (defcfun (widget-render-icon "gtk_widget_render_icon") g-object
403   (widget g-object)
404   (stock-id :string)
405   (size icon-size)
406   (detail :string))
407
408 (export 'widget-render-icon)
409
410 (defcfun (widget-push-composite-child "gtk_widget_push_composite_child") :void
411   (widget g-object))
412
413 (export 'widget-push-composite-child)
414
415 (defcfun (widget-pop-composite-child "gtk_widget_pop_composite_child") :void
416   (widget g-object))
417
418 (export 'widget-pop-composite-child)
419
420 (defcfun (widget-queue-clear "gtk_widget_queue_clear") :void
421   (widget (g-object widget)))
422
423 (export 'widget-queue-clear)
424
425 (defcfun (widget-queue-clear-area "gtk_widget_queue_clear_area") :void
426   (widget (g-object widget))
427   (x :int)
428   (y :int)
429   (width :int)
430   (height :int))
431
432 (export 'widget-queue-clear-area)
433
434 (defcfun (widget-queue-draw-area "gtk_widget_queue_draw_area") :void
435   (widget g-object)
436   (x :int)
437   (y :int)
438   (width :int)
439   (height :int))
440
441 (export 'widget-queue-draw-area)
442
443 (defcfun (widget-reset-shapes "gtk_widget_reset_shapes") :void
444   (widget g-object))
445
446 (export 'widget-reset-shapes)
447
448 (defcfun (widget-set-double-buffered "gtk_widget_set_double_buffered") :void
449   (widget (g-object widget))
450   (double-buffered :boolean))
451
452 (export 'widget-set-double-buffered)
453
454 (defcfun (widget-set-scroll-adjustments "gtk_widget_set_scroll_adjustments") :boolean
455   (widget g-object)
456   (hadjustment g-object)
457   (vadjustment g-object))
458
459 (export 'widget-set-scroll-adjustments)
460
461 (defcfun (widget-mnemonic-activate "gtk_widget_mnemonic_activate") :boolean
462   (widget (g-object widget))
463   (group-cycling :boolean))
464
465 (export 'widget-mnemonic-activate)
466
467 ; TODO: gtk_widget_class_install_style_property
468
469 ; TOOD: gtk_widget_class_install_style_property_parser
470
471 ; TODO: gtk_widget_class_list_style_properties
472
473 ; TODO: gtk_widget_region_intersect
474
475 ; TODO: gtk_widget_send_expose
476
477 (defcfun gtk-widget-style-get-property :void
478   (widget g-object)
479   (property-name :string)
480   (value (:pointer g-value)))
481
482 (defcfun gtk-widget-class-find-style-property (:pointer g-param-spec)
483   (class :pointer)
484   (property-name :string))
485
486 (defcfun gtk-widget-class-list-style-properties (:pointer (:pointer g-param-spec))
487   (class :pointer)
488   (n-properties (:pointer :int)))
489
490 (defun widget-get-style-properties (type)
491   (setf type (ensure-g-type type))
492   (let ((class (g-type-class-ref type)))
493     (unwind-protect
494          (with-foreign-object (np :int)
495            (let ((specs (gtk-widget-class-list-style-properties class np)))
496              (unwind-protect
497                   (loop
498                      repeat (mem-ref np :int)
499                      for i from 0
500                      for spec = (mem-aref specs :pointer i)
501                      collect (parse-g-param-spec spec))
502                (g-free specs))))
503       (g-type-class-unref class))))
504
505 (export 'widget-get-style-properties)
506
507 (defun widget-style-property-info (type property-name)
508   (let ((class (g-type-class-ref type)))
509     (unwind-protect
510          (let ((g-param-spec (gtk-widget-class-find-style-property class property-name)))
511            (parse-g-param-spec g-param-spec))
512       (g-type-class-unref class))))
513
514 (export 'widget-style-property-info)
515
516 (defun widget-style-property-type (widget property-name)
517   (let ((property-info (widget-style-property-info (g-type-from-object widget) property-name)))
518     (g-class-property-definition-type property-info)))
519
520 (defun widget-style-property-value (widget property-name &optional property-type)
521   (unless property-type (setf property-type (widget-style-property-type widget property-name)))
522   (setf property-type (ensure-g-type property-type))
523   (with-foreign-object (gvalue 'g-value)
524     (g-value-zero gvalue)
525     (g-value-init gvalue property-type)
526     (prog1 (gtk-widget-style-get-property widget property-name gvalue)
527       (g-value-unset gvalue))))
528
529 (export 'widget-style-property-value)
530
531 (defcfun (widget-child-focus "gtk_widget_child_focus") :boolean
532   (widget g-object)
533   (direction direction-type))
534
535 (export 'widget-child-focus)
536
537 (defcfun (widget-child-notify "gtk_widget_child_notify") :void
538   (widget (g-object widget))
539   (property-name :string))
540
541 (export 'widget-child-notify)
542
543 (defcfun (widget-freeze-child-notify "gtk_widget_freeze_child_notify") :void
544   (widget g-object))
545
546 (export 'widget-freeze-child-notify)
547
548 (defcfun (widget-settings "gtk_widget_get_settings") g-object
549   (widget g-object))
550
551 (export 'widget-settings)
552
553 (defcfun (widget-clipboard "gtk_widget_get_clipboard") (g-object clipboard)
554   (widget (g-object widget))
555   (selection gdk-atom-as-string))
556
557 (export 'widget-clipboard)
558
559 (defcfun (widget-display "gtk_widget_get_display") g-object
560   (widget g-object))
561
562 (export 'widget-display)
563
564 (defcfun (widget-root-window "gtk_widget_get_root_window") g-object
565   (widget g-object))
566
567 (export 'widget-root-window)
568
569 (defcfun (widget-screen "gtk_widget_get_screen") g-object
570   (widget g-object))
571
572 (export 'widget-screen)
573
574 (defcfun (widget-has-screen "gtk_widget_has_screen") :boolean
575   (widget g-object))
576
577 (export 'widget-has-screen)
578
579 (defcfun (widget-thaw-child-notify "gtk_widget_thaw_child_notify") :void
580   (widget g-object))
581
582 (export 'widget-thaw-child-notify)
583
584 (defcfun (widget-mnemonic-labels "gtk_widget_list_mnemonic_labels") (glist (g-object widget) :free-from-foreign t)
585   (widget (g-object widget)))
586
587 (export 'widget-mnemonic-labels)
588
589 (defcfun (widget-add-mnemonic-label "gtk_widget_add_mnemonic_label") :void
590   (widget g-object)
591   (label g-object))
592
593 (export 'widget-add-mnemonic-label)
594
595 (defcfun (widget-remove-mnemonic-label "gtk_widget_remove_mnemonic_label") :void
596   (widget g-object)
597   (label g-object))
598
599 (export 'widget-remove-mnemonic-label)
600
601 (defcfun (widget-action "gtk_widget_get_action") g-object
602   (widget g-object))
603
604 (export 'widget-action)
605
606 (defcfun (widget-composited-p "gtk_widget_is_composited") :boolean
607   (widget g-object))
608
609 (export 'widget-composited-p)
610
611 (defcfun (widget-error-bell "gtk_widget_error_bell") :void
612   (widget g-object))
613
614 (export 'widget-error-bell)
615
616 (defcfun (widget-trigger-tooltip-query "gtk_tooltip_trigger_tooltip_query") :void
617   (widget g-object))
618
619 (export 'widget-trigger-tooltip-query)
620
621 (defcfun gtk-widget-get-snapshot g-object
622   (widget g-object)
623   (clip-rectangle (g-boxed-foreign rectangle)))
624
625 (defun widget-snapshot (widget &optional clip-rectangle)
626   (gtk-widget-get-snapshot widget clip-rectangle))
627
628 (export 'widget-snapshot)