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