1// Same copyright and license as the rest of the files in this project
2// This file contains accelerator related functions and structures
3
4// +build !gtk_3_6,!gtk_3_8
5// not use this: go build -tags gtk_3_8'. Otherwise, if no build tags are used, GTK 3.10
6
7package gtk
8
9// #include <stdlib.h>
10// #include <gtk/gtk.h>
11// #include "gtk_since_3_10.go.h"
12import "C"
13import (
14	"errors"
15	"unsafe"
16
17	"github.com/gotk3/gotk3/cairo"
18	"github.com/gotk3/gotk3/gdk"
19	"github.com/gotk3/gotk3/glib"
20	"github.com/gotk3/gotk3/internal/callback"
21	"github.com/gotk3/gotk3/pango"
22)
23
24func init() {
25	tm := []glib.TypeMarshaler{
26		// Enums
27		{glib.Type(C.gtk_revealer_transition_type_get_type()), marshalRevealerTransitionType},
28		{glib.Type(C.gtk_stack_transition_type_get_type()), marshalStackTransitionType},
29
30		// Objects/Interfaces
31		{glib.Type(C.gtk_header_bar_get_type()), marshalHeaderBar},
32		{glib.Type(C.gtk_list_box_get_type()), marshalListBox},
33		{glib.Type(C.gtk_list_box_row_get_type()), marshalListBoxRow},
34		{glib.Type(C.gtk_revealer_get_type()), marshalRevealer},
35		{glib.Type(C.gtk_search_bar_get_type()), marshalSearchBar},
36		{glib.Type(C.gtk_stack_get_type()), marshalStack},
37		{glib.Type(C.gtk_stack_switcher_get_type()), marshalStackSwitcher},
38	}
39	glib.RegisterGValueMarshalers(tm)
40
41	//Contribute to casting
42	for k, v := range map[string]WrapFn{
43		"GtkHeaderBar":  wrapHeaderBar,
44		"GtkListBox":    wrapListBox,
45		"GtkListBoxRow": wrapListBoxRow,
46		"GtkRevealer":   wrapRevealer,
47		"GtkSearchBar":  wrapSearchBar,
48		"GtkStack":      wrapStack,
49	} {
50		WrapMap[k] = v
51	}
52}
53
54/*
55 * Constants
56 */
57
58const (
59	ALIGN_BASELINE Align = C.GTK_ALIGN_BASELINE
60)
61
62// ImageType
63const (
64	IMAGE_SURFACE ImageType = C.GTK_IMAGE_SURFACE
65)
66
67// RevealerTransitionType is a representation of GTK's GtkRevealerTransitionType.
68type RevealerTransitionType int
69
70const (
71	REVEALER_TRANSITION_TYPE_NONE        RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_NONE
72	REVEALER_TRANSITION_TYPE_CROSSFADE   RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_CROSSFADE
73	REVEALER_TRANSITION_TYPE_SLIDE_RIGHT RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT
74	REVEALER_TRANSITION_TYPE_SLIDE_LEFT  RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT
75	REVEALER_TRANSITION_TYPE_SLIDE_UP    RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP
76	REVEALER_TRANSITION_TYPE_SLIDE_DOWN  RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN
77)
78
79func marshalRevealerTransitionType(p uintptr) (interface{}, error) {
80	c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
81	return RevealerTransitionType(c), nil
82}
83
84// StackTransitionType is a representation of GTK's GtkStackTransitionType.
85type StackTransitionType int
86
87const (
88	STACK_TRANSITION_TYPE_NONE             StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_NONE
89	STACK_TRANSITION_TYPE_CROSSFADE        StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_CROSSFADE
90	STACK_TRANSITION_TYPE_SLIDE_RIGHT      StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT
91	STACK_TRANSITION_TYPE_SLIDE_LEFT       StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT
92	STACK_TRANSITION_TYPE_SLIDE_UP         StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_UP
93	STACK_TRANSITION_TYPE_SLIDE_DOWN       StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_DOWN
94	STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT
95	STACK_TRANSITION_TYPE_SLIDE_UP_DOWN    StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN
96)
97
98func marshalStackTransitionType(p uintptr) (interface{}, error) {
99	c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
100	return StackTransitionType(c), nil
101}
102
103/*
104 * GtkWidget
105 */
106
107// TODO:
108// gtk_widget_get_composite_name().
109
110/*
111 * GtkImage
112 */
113
114// ImageNewFromSurface is a wrapper around gtk_image_new_from_surface().
115func ImageNewFromSurface(surface *cairo.Surface) (*Image, error) {
116	c := C.gtk_image_new_from_surface((*C.cairo_surface_t)(surface.GetCSurface()))
117	if c == nil {
118		return nil, nilPtrErr
119	}
120	obj := glib.Take(unsafe.Pointer(c))
121	return wrapImage(obj), nil
122}
123
124// SetFromSurface is a wrapper around gtk_image_set_from_surface().
125func (v *Image) SetFromSurface(surface *cairo.Surface) {
126	csurface := (*C.cairo_surface_t)(surface.GetCSurface())
127	C.gtk_image_set_from_surface(v.native(), csurface)
128}
129
130/*
131 * GtkIconTheme
132 */
133
134// HasIcon is a wrapper around gtk_icon_theme_load_icon_for_scale().
135func (v *IconTheme) LoadIconForScale(iconName string, size, scale int, flags IconLookupFlags) (*gdk.Pixbuf, error) {
136	cstr := C.CString(iconName)
137	defer C.free(unsafe.Pointer(cstr))
138
139	var err *C.GError = nil
140	c := C.gtk_icon_theme_load_icon_for_scale(v.Theme, (*C.gchar)(cstr), C.gint(size), C.gint(scale), C.GtkIconLookupFlags(flags), &err)
141	if c == nil {
142		defer C.g_error_free(err)
143		return nil, errors.New(goString(err.message))
144	}
145	return &gdk.Pixbuf{glib.Take(unsafe.Pointer(c))}, nil
146}
147
148/*
149 * GtkEntry
150 */
151
152// GetTabs is a wrapper around gtk_entry_get_tabs().
153func (v *Entry) GetTabs() (*pango.TabArray, error) {
154	c := C.gtk_entry_get_tabs(v.native())
155	if c == nil {
156		return nil, nilPtrErr
157	}
158	return pango.WrapTabArray(uintptr(unsafe.Pointer(c))), nil
159}
160
161// SetTabs is a wrapper around gtk_entry_set_tabs().
162func (v *Entry) SetTabs(tabs *pango.TabArray) {
163	C.gtk_entry_set_tabs(v.native(), (*C.PangoTabArray)(unsafe.Pointer(tabs.Native())))
164}
165
166/*
167 * GtkButton
168 */
169
170// ButtonNewFromIconName is a wrapper around gtk_button_new_from_icon_name().
171func ButtonNewFromIconName(iconName string, size IconSize) (*Button, error) {
172	cstr := C.CString(iconName)
173	defer C.free(unsafe.Pointer(cstr))
174	c := C.gtk_button_new_from_icon_name((*C.gchar)(cstr),
175		C.GtkIconSize(size))
176	if c == nil {
177		return nil, nilPtrErr
178	}
179	return wrapButton(glib.Take(unsafe.Pointer(c))), nil
180}
181
182/*
183 * GtkBox
184 */
185
186// TODO:
187// gtk_box_get_baseline_position().
188// gtk_box_set_baseline_position().
189
190/*
191 * GtkGrid
192 */
193
194// RemoveRow is a wrapper around gtk_grid_remove_row().
195func (v *Grid) RemoveRow(position int) {
196	C.gtk_grid_remove_row(v.native(), C.gint(position))
197}
198
199// RemoveColumn is a wrapper around gtk_grid_remove_column().
200func (v *Grid) RemoveColumn(position int) {
201	C.gtk_grid_remove_column(v.native(), C.gint(position))
202}
203
204// TODO:
205// gtk_grid_get_baseline_row().
206// gtk_grid_set_baseline_row().
207// gtk_grid_get_row_baseline_position().
208// gtk_grid_set_row_baseline_position().
209
210/*
211 * GtkHeaderBar
212 */
213
214// HeaderBar is a representation of GtkHeaderBar
215type HeaderBar struct {
216	Container
217}
218
219// native returns a pointer to the underlying GtkHeaderBar.
220func (v *HeaderBar) native() *C.GtkHeaderBar {
221	if v == nil || v.GObject == nil {
222		return nil
223	}
224	p := unsafe.Pointer(v.GObject)
225	return C.toGtkHeaderBar(p)
226}
227
228func marshalHeaderBar(p uintptr) (interface{}, error) {
229	c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
230	obj := glib.Take(unsafe.Pointer(c))
231	return wrapHeaderBar(obj), nil
232}
233
234func wrapHeaderBar(obj *glib.Object) *HeaderBar {
235	if obj == nil {
236		return nil
237	}
238
239	return &HeaderBar{Container{Widget{glib.InitiallyUnowned{obj}}}}
240}
241
242// HeaderBarNew is a wrapper around gtk_header_bar_new().
243func HeaderBarNew() (*HeaderBar, error) {
244	c := C.gtk_header_bar_new()
245	if c == nil {
246		return nil, nilPtrErr
247	}
248	return wrapHeaderBar(glib.Take(unsafe.Pointer(c))), nil
249}
250
251// SetTitle is a wrapper around gtk_header_bar_set_title().
252func (v *HeaderBar) SetTitle(title string) {
253	cstr := C.CString(title)
254	defer C.free(unsafe.Pointer(cstr))
255	C.gtk_header_bar_set_title(v.native(), (*C.gchar)(cstr))
256}
257
258// GetTitle is a wrapper around gtk_header_bar_get_title().
259func (v *HeaderBar) GetTitle() string {
260	cstr := C.gtk_header_bar_get_title(v.native())
261	return C.GoString((*C.char)(cstr))
262}
263
264// SetSubtitle is a wrapper around gtk_header_bar_set_subtitle().
265func (v *HeaderBar) SetSubtitle(subtitle string) {
266	cstr := C.CString(subtitle)
267	defer C.free(unsafe.Pointer(cstr))
268	C.gtk_header_bar_set_subtitle(v.native(), (*C.gchar)(cstr))
269}
270
271// GetSubtitle is a wrapper around gtk_header_bar_get_subtitle().
272func (v *HeaderBar) GetSubtitle() string {
273	cstr := C.gtk_header_bar_get_subtitle(v.native())
274	return C.GoString((*C.char)(cstr))
275}
276
277// SetCustomTitle is a wrapper around gtk_header_bar_set_custom_title().
278func (v *HeaderBar) SetCustomTitle(titleWidget IWidget) {
279	C.gtk_header_bar_set_custom_title(v.native(), titleWidget.toWidget())
280}
281
282// GetCustomTitle is a wrapper around gtk_header_bar_get_custom_title().
283func (v *HeaderBar) GetCustomTitle() (IWidget, error) {
284	c := C.gtk_header_bar_get_custom_title(v.native())
285	if c == nil {
286		return nil, nil
287	}
288	return castWidget(c)
289}
290
291// PackStart is a wrapper around gtk_header_bar_pack_start().
292func (v *HeaderBar) PackStart(child IWidget) {
293	C.gtk_header_bar_pack_start(v.native(), child.toWidget())
294}
295
296// PackEnd is a wrapper around gtk_header_bar_pack_end().
297func (v *HeaderBar) PackEnd(child IWidget) {
298	C.gtk_header_bar_pack_end(v.native(), child.toWidget())
299}
300
301// SetShowCloseButton is a wrapper around gtk_header_bar_set_show_close_button().
302func (v *HeaderBar) SetShowCloseButton(setting bool) {
303	C.gtk_header_bar_set_show_close_button(v.native(), gbool(setting))
304}
305
306// GetShowCloseButton is a wrapper around gtk_header_bar_get_show_close_button().
307func (v *HeaderBar) GetShowCloseButton() bool {
308	c := C.gtk_header_bar_get_show_close_button(v.native())
309	return gobool(c)
310}
311
312/*
313 * GtkLabel
314 */
315
316// GetLines is a wrapper around gtk_label_get_lines().
317func (v *Label) GetLines() int {
318	c := C.gtk_label_get_lines(v.native())
319	return int(c)
320}
321
322// SetLines is a wrapper around gtk_label_set_lines().
323func (v *Label) SetLines(lines int) {
324	C.gtk_label_set_lines(v.native(), C.gint(lines))
325}
326
327/*
328 * GtkListBox
329 */
330
331// ListBox is a representation of GTK's GtkListBox.
332type ListBox struct {
333	Container
334}
335
336// native returns a pointer to the underlying GtkListBox.
337func (v *ListBox) native() *C.GtkListBox {
338	if v == nil || v.GObject == nil {
339		return nil
340	}
341	p := unsafe.Pointer(v.GObject)
342	return C.toGtkListBox(p)
343}
344
345func marshalListBox(p uintptr) (interface{}, error) {
346	c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
347	obj := glib.Take(unsafe.Pointer(c))
348	return wrapListBox(obj), nil
349}
350
351func wrapListBox(obj *glib.Object) *ListBox {
352	if obj == nil {
353		return nil
354	}
355
356	return &ListBox{Container{Widget{glib.InitiallyUnowned{obj}}}}
357}
358
359// ListBoxNew is a wrapper around gtk_list_box_new().
360func ListBoxNew() (*ListBox, error) {
361	c := C.gtk_list_box_new()
362	if c == nil {
363		return nil, nilPtrErr
364	}
365	return wrapListBox(glib.Take(unsafe.Pointer(c))), nil
366}
367
368// Prepend is a wrapper around gtk_list_box_prepend().
369func (v *ListBox) Prepend(child IWidget) {
370	C.gtk_list_box_prepend(v.native(), child.toWidget())
371}
372
373// Insert is a wrapper around gtk_list_box_insert().
374func (v *ListBox) Insert(child IWidget, position int) {
375	C.gtk_list_box_insert(v.native(), child.toWidget(), C.gint(position))
376}
377
378// SelectRow is a wrapper around gtk_list_box_select_row().
379func (v *ListBox) SelectRow(row *ListBoxRow) {
380	C.gtk_list_box_select_row(v.native(), row.native())
381}
382
383// GetSelectedRow is a wrapper around gtk_list_box_get_selected_row().
384func (v *ListBox) GetSelectedRow() *ListBoxRow {
385	c := C.gtk_list_box_get_selected_row(v.native())
386	if c == nil {
387		return nil
388	}
389	return wrapListBoxRow(glib.Take(unsafe.Pointer(c)))
390}
391
392// SetSelectionMode is a wrapper around gtk_list_box_set_selection_mode().
393func (v *ListBox) SetSelectionMode(mode SelectionMode) {
394	C.gtk_list_box_set_selection_mode(v.native(), C.GtkSelectionMode(mode))
395}
396
397// GetSelectionMode is a wrapper around gtk_list_box_get_selection_mode()
398func (v *ListBox) GetSelectionMode() SelectionMode {
399	c := C.gtk_list_box_get_selection_mode(v.native())
400	return SelectionMode(c)
401}
402
403// SetActivateOnSingleClick is a wrapper around gtk_list_box_set_activate_on_single_click().
404func (v *ListBox) SetActivateOnSingleClick(single bool) {
405	C.gtk_list_box_set_activate_on_single_click(v.native(), gbool(single))
406}
407
408// GetActivateOnSingleClick is a wrapper around gtk_list_box_get_activate_on_single_click().
409func (v *ListBox) GetActivateOnSingleClick() bool {
410	c := C.gtk_list_box_get_activate_on_single_click(v.native())
411	return gobool(c)
412}
413
414// GetAdjustment is a wrapper around gtk_list_box_get_adjustment().
415func (v *ListBox) GetAdjustment() *Adjustment {
416	c := C.gtk_list_box_get_adjustment(v.native())
417	obj := glib.Take(unsafe.Pointer(c))
418	return &Adjustment{glib.InitiallyUnowned{obj}}
419}
420
421// SetAdjustment is a wrapper around gtk_list_box_set_adjustment().
422func (v *ListBox) SetAdjustment(adjustment *Adjustment) {
423	C.gtk_list_box_set_adjustment(v.native(), adjustment.native())
424}
425
426// SetPlaceholder is a wrapper around gtk_list_box_set_placeholder().
427func (v *ListBox) SetPlaceholder(placeholder IWidget) {
428	C.gtk_list_box_set_placeholder(v.native(), placeholder.toWidget())
429}
430
431// GetRowAtIndex is a wrapper around gtk_list_box_get_row_at_index().
432func (v *ListBox) GetRowAtIndex(index int) *ListBoxRow {
433	c := C.gtk_list_box_get_row_at_index(v.native(), C.gint(index))
434	if c == nil {
435		return nil
436	}
437	return wrapListBoxRow(glib.Take(unsafe.Pointer(c)))
438}
439
440// GetRowAtY is a wrapper around gtk_list_box_get_row_at_y().
441func (v *ListBox) GetRowAtY(y int) *ListBoxRow {
442	c := C.gtk_list_box_get_row_at_y(v.native(), C.gint(y))
443	if c == nil {
444		return nil
445	}
446	return wrapListBoxRow(glib.Take(unsafe.Pointer(c)))
447}
448
449// InvalidateFilter is a wrapper around gtk_list_box_invalidate_filter().
450func (v *ListBox) InvalidateFilter() {
451	C.gtk_list_box_invalidate_filter(v.native())
452}
453
454// InvalidateHeaders is a wrapper around gtk_list_box_invalidate_headers().
455func (v *ListBox) InvalidateHeaders() {
456	C.gtk_list_box_invalidate_headers(v.native())
457}
458
459// InvalidateSort is a wrapper around gtk_list_box_invalidate_sort().
460func (v *ListBox) InvalidateSort() {
461	C.gtk_list_box_invalidate_sort(v.native())
462}
463
464// ListBoxFilterFunc is a representation of GtkListBoxFilterFunc
465type ListBoxFilterFunc func(row *ListBoxRow) bool
466
467// SetFilterFunc is a wrapper around gtk_list_box_set_filter_func
468func (v *ListBox) SetFilterFunc(fn ListBoxFilterFunc) {
469	C._gtk_list_box_set_filter_func(v.native(), C.gpointer(callback.Assign(fn)))
470}
471
472// ListBoxHeaderFunc is a representation of GtkListBoxUpdateHeaderFunc
473type ListBoxHeaderFunc func(row *ListBoxRow, before *ListBoxRow)
474
475// SetHeaderFunc is a wrapper around gtk_list_box_set_header_func
476func (v *ListBox) SetHeaderFunc(fn ListBoxHeaderFunc) {
477	C._gtk_list_box_set_header_func(v.native(), C.gpointer(callback.Assign(fn)))
478}
479
480// ListBoxSortFunc is a representation of GtkListBoxSortFunc
481type ListBoxSortFunc func(row1 *ListBoxRow, row2 *ListBoxRow) int
482
483// SetSortFunc is a wrapper around gtk_list_box_set_sort_func
484func (v *ListBox) SetSortFunc(fn ListBoxSortFunc) {
485	C._gtk_list_box_set_sort_func(v.native(), C.gpointer(callback.Assign(fn)))
486}
487
488// DragHighlightRow is a wrapper around gtk_list_box_drag_highlight_row()
489func (v *ListBox) DragHighlightRow(row *ListBoxRow) {
490	C.gtk_list_box_drag_highlight_row(v.native(), row.native())
491}
492
493// DragUnhighlightRow is a wrapper around gtk_list_box_drag_unhighlight_row().
494func (v *ListBox) DragUnhighlightRow() {
495	C.gtk_list_box_drag_unhighlight_row(v.native())
496}
497
498/*
499 * GtkListBoxRow
500 */
501
502// ListBoxRow is a representation of GTK's GtkListBoxRow.
503type ListBoxRow struct {
504	Bin
505}
506
507// native returns a pointer to the underlying GtkListBoxRow.
508func (v *ListBoxRow) native() *C.GtkListBoxRow {
509	if v == nil || v.GObject == nil {
510		return nil
511	}
512	p := unsafe.Pointer(v.GObject)
513	return C.toGtkListBoxRow(p)
514}
515
516func marshalListBoxRow(p uintptr) (interface{}, error) {
517	c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
518	obj := glib.Take(unsafe.Pointer(c))
519	return wrapListBoxRow(obj), nil
520}
521
522func wrapListBoxRow(obj *glib.Object) *ListBoxRow {
523	if obj == nil {
524		return nil
525	}
526
527	return &ListBoxRow{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
528}
529
530// ListBoxRowNew is a wrapper around gtk_list_box_row_new().
531func ListBoxRowNew() (*ListBoxRow, error) {
532	c := C.gtk_list_box_row_new()
533	if c == nil {
534		return nil, nilPtrErr
535	}
536	return wrapListBoxRow(glib.Take(unsafe.Pointer(c))), nil
537}
538
539// Changed is a wrapper around gtk_list_box_row_changed().
540func (v *ListBoxRow) Changed() {
541	C.gtk_list_box_row_changed(v.native())
542}
543
544// GetHeader is a wrapper around gtk_list_box_row_get_header().
545func (v *ListBoxRow) GetHeader() (IWidget, error) {
546	c := C.gtk_list_box_row_get_header(v.native())
547	if c == nil {
548		return nil, nil
549	}
550	return castWidget(c)
551}
552
553// SetHeader is a wrapper around gtk_list_box_row_set_header().
554func (v *ListBoxRow) SetHeader(header IWidget) {
555	if header == nil {
556		C.gtk_list_box_row_set_header(v.native(), nil)
557		return
558	}
559	C.gtk_list_box_row_set_header(v.native(), header.toWidget())
560}
561
562// GetIndex is a wrapper around gtk_list_box_row_get_index()
563func (v *ListBoxRow) GetIndex() int {
564	c := C.gtk_list_box_row_get_index(v.native())
565	return int(c)
566}
567
568/*
569 * GtkPlacesSidebar
570 */
571
572// TODO:
573// gtk_places_sidebar_new().
574// gtk_places_sidebar_set_open_flags().
575// gtk_places_sidebar_get_open_flags().
576// gtk_places_sidebar_set_location().
577// gtk_places_sidebar_get_location().
578// gtk_places_sidebar_set_show_desktop().
579// gtk_places_sidebar_get_show_desktop().
580// gtk_places_sidebar_add_shortcut().
581// gtk_places_sidebar_remove_shortcut().
582// gtk_places_sidebar_list_shortcuts().
583// gtk_places_sidebar_get_nth_bookmark().
584// enum GtkPlacesOpenFlags
585
586/*
587 * GtkRevealer
588 */
589
590// Revealer is a representation of GTK's GtkRevealer
591type Revealer struct {
592	Bin
593}
594
595// native returns a pointer to the underlying GtkRevealer.
596func (v *Revealer) native() *C.GtkRevealer {
597	if v == nil || v.GObject == nil {
598		return nil
599	}
600	p := unsafe.Pointer(v.GObject)
601	return C.toGtkRevealer(p)
602}
603
604func marshalRevealer(p uintptr) (interface{}, error) {
605	c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
606	obj := glib.Take(unsafe.Pointer(c))
607	return wrapRevealer(obj), nil
608}
609
610func wrapRevealer(obj *glib.Object) *Revealer {
611	if obj == nil {
612		return nil
613	}
614
615	return &Revealer{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
616}
617
618// RevealerNew is a wrapper around gtk_revealer_new()
619func RevealerNew() (*Revealer, error) {
620	c := C.gtk_revealer_new()
621	if c == nil {
622		return nil, nilPtrErr
623	}
624	return wrapRevealer(glib.Take(unsafe.Pointer(c))), nil
625}
626
627// GetRevealChild is a wrapper around gtk_revealer_get_reveal_child().
628func (v *Revealer) GetRevealChild() bool {
629	c := C.gtk_revealer_get_reveal_child(v.native())
630	return gobool(c)
631}
632
633// SetRevealChild is a wrapper around gtk_revealer_set_reveal_child().
634func (v *Revealer) SetRevealChild(revealChild bool) {
635	C.gtk_revealer_set_reveal_child(v.native(), gbool(revealChild))
636}
637
638// GetChildRevealed is a wrapper around gtk_revealer_get_child_revealed().
639func (v *Revealer) GetChildRevealed() bool {
640	c := C.gtk_revealer_get_child_revealed(v.native())
641	return gobool(c)
642}
643
644// GetTransitionDuration is a wrapper around gtk_revealer_get_transition_duration()
645func (v *Revealer) GetTransitionDuration() uint {
646	c := C.gtk_revealer_get_transition_duration(v.native())
647	return uint(c)
648}
649
650// SetTransitionDuration is a wrapper around gtk_revealer_set_transition_duration().
651func (v *Revealer) SetTransitionDuration(duration uint) {
652	C.gtk_revealer_set_transition_duration(v.native(), C.guint(duration))
653}
654
655// GetTransitionType is a wrapper around gtk_revealer_get_transition_type()
656func (v *Revealer) GetTransitionType() RevealerTransitionType {
657	c := C.gtk_revealer_get_transition_type(v.native())
658	return RevealerTransitionType(c)
659}
660
661// SetTransitionType is a wrapper around gtk_revealer_set_transition_type()
662func (v *Revealer) SetTransitionType(transition RevealerTransitionType) {
663	t := C.GtkRevealerTransitionType(transition)
664	C.gtk_revealer_set_transition_type(v.native(), t)
665}
666
667/*
668 * GtkSearchBar
669 */
670
671// SearchBar is a representation of GTK's GtkSearchBar.
672type SearchBar struct {
673	Bin
674}
675
676// native returns a pointer to the underlying GtkSearchBar.
677func (v *SearchBar) native() *C.GtkSearchBar {
678	if v == nil || v.GObject == nil {
679		return nil
680	}
681	p := unsafe.Pointer(v.GObject)
682	return C.toGtkSearchBar(p)
683}
684
685func marshalSearchBar(p uintptr) (interface{}, error) {
686	c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
687	obj := glib.Take(unsafe.Pointer(c))
688	return wrapSearchBar(obj), nil
689}
690
691func wrapSearchBar(obj *glib.Object) *SearchBar {
692	if obj == nil {
693		return nil
694	}
695
696	return &SearchBar{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
697}
698
699// SearchBarNew is a wrapper around gtk_search_bar_new()
700func SearchBarNew() (*SearchBar, error) {
701	c := C.gtk_search_bar_new()
702	if c == nil {
703		return nil, nilPtrErr
704	}
705	return wrapSearchBar(glib.Take(unsafe.Pointer(c))), nil
706}
707
708// ConnectEntry is a wrapper around gtk_search_bar_connect_entry().
709func (v *SearchBar) ConnectEntry(entry IEntry) {
710	C.gtk_search_bar_connect_entry(v.native(), entry.toEntry())
711}
712
713// GetSearchMode is a wrapper around gtk_search_bar_get_search_mode().
714func (v *SearchBar) GetSearchMode() bool {
715	c := C.gtk_search_bar_get_search_mode(v.native())
716	return gobool(c)
717}
718
719// SetSearchMode is a wrapper around gtk_search_bar_set_search_mode().
720func (v *SearchBar) SetSearchMode(searchMode bool) {
721	C.gtk_search_bar_set_search_mode(v.native(), gbool(searchMode))
722}
723
724// GetShowCloseButton is a wrapper arounb gtk_search_bar_get_show_close_button().
725func (v *SearchBar) GetShowCloseButton() bool {
726	c := C.gtk_search_bar_get_show_close_button(v.native())
727	return gobool(c)
728}
729
730// SetShowCloseButton is a wrapper around gtk_search_bar_set_show_close_button()
731func (v *SearchBar) SetShowCloseButton(visible bool) {
732	C.gtk_search_bar_set_show_close_button(v.native(), gbool(visible))
733}
734
735// HandleEvent is a wrapper around gtk_search_bar_handle_event()
736func (v *SearchBar) HandleEvent(event *gdk.Event) {
737	e := (*C.GdkEvent)(unsafe.Pointer(event.Native()))
738	C.gtk_search_bar_handle_event(v.native(), e)
739}
740
741/*
742 * GtkStack
743 */
744
745// Stack is a representation of GTK's GtkStack.
746type Stack struct {
747	Container
748}
749
750// native returns a pointer to the underlying GtkStack.
751func (v *Stack) native() *C.GtkStack {
752	if v == nil || v.GObject == nil {
753		return nil
754	}
755	p := unsafe.Pointer(v.GObject)
756	return C.toGtkStack(p)
757}
758
759func marshalStack(p uintptr) (interface{}, error) {
760	c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
761	obj := glib.Take(unsafe.Pointer(c))
762	return wrapStack(obj), nil
763}
764
765func wrapStack(obj *glib.Object) *Stack {
766	if obj == nil {
767		return nil
768	}
769
770	return &Stack{Container{Widget{glib.InitiallyUnowned{obj}}}}
771}
772
773// StackNew is a wrapper around gtk_stack_new().
774func StackNew() (*Stack, error) {
775	c := C.gtk_stack_new()
776	if c == nil {
777		return nil, nilPtrErr
778	}
779	return wrapStack(glib.Take(unsafe.Pointer(c))), nil
780}
781
782// AddNamed is a wrapper around gtk_stack_add_named().
783func (v *Stack) AddNamed(child IWidget, name string) {
784	cstr := C.CString(name)
785	defer C.free(unsafe.Pointer(cstr))
786	C.gtk_stack_add_named(v.native(), child.toWidget(), (*C.gchar)(cstr))
787}
788
789// AddTitled is a wrapper around gtk_stack_add_titled().
790func (v *Stack) AddTitled(child IWidget, name, title string) {
791	cName := C.CString(name)
792	defer C.free(unsafe.Pointer(cName))
793	cTitle := C.CString(title)
794	defer C.free(unsafe.Pointer(cTitle))
795	C.gtk_stack_add_titled(v.native(), child.toWidget(), (*C.gchar)(cName),
796		(*C.gchar)(cTitle))
797}
798
799// SetVisibleChild is a wrapper around gtk_stack_set_visible_child().
800func (v *Stack) SetVisibleChild(child IWidget) {
801	C.gtk_stack_set_visible_child(v.native(), child.toWidget())
802}
803
804// GetVisibleChild is a wrapper around gtk_stack_get_visible_child().
805func (v *Stack) GetVisibleChild() (IWidget, error) {
806	c := C.gtk_stack_get_visible_child(v.native())
807	if c == nil {
808		return nil, nil
809	}
810	return castWidget(c)
811}
812
813// SetVisibleChildName is a wrapper around gtk_stack_set_visible_child_name().
814func (v *Stack) SetVisibleChildName(name string) {
815	cstr := C.CString(name)
816	defer C.free(unsafe.Pointer(cstr))
817	C.gtk_stack_set_visible_child_name(v.native(), (*C.gchar)(cstr))
818}
819
820// GetVisibleChildName is a wrapper around gtk_stack_get_visible_child_name().
821func (v *Stack) GetVisibleChildName() string {
822	c := C.gtk_stack_get_visible_child_name(v.native())
823	return C.GoString((*C.char)(c))
824}
825
826// SetVisibleChildFull is a wrapper around gtk_stack_set_visible_child_full().
827func (v *Stack) SetVisibleChildFull(name string, transaction StackTransitionType) {
828	cstr := C.CString(name)
829	defer C.free(unsafe.Pointer(cstr))
830	C.gtk_stack_set_visible_child_full(v.native(), (*C.gchar)(cstr),
831		C.GtkStackTransitionType(transaction))
832}
833
834// SetHomogeneous is a wrapper around gtk_stack_set_homogeneous().
835func (v *Stack) SetHomogeneous(homogeneous bool) {
836	C.gtk_stack_set_homogeneous(v.native(), gbool(homogeneous))
837}
838
839// GetHomogeneous is a wrapper around gtk_stack_get_homogeneous().
840func (v *Stack) GetHomogeneous() bool {
841	c := C.gtk_stack_get_homogeneous(v.native())
842	return gobool(c)
843}
844
845// SetTransitionDuration is a wrapper around gtk_stack_set_transition_duration().
846func (v *Stack) SetTransitionDuration(duration uint) {
847	C.gtk_stack_set_transition_duration(v.native(), C.guint(duration))
848}
849
850// GetTransitionDuration is a wrapper around gtk_stack_get_transition_duration().
851func (v *Stack) GetTransitionDuration() uint {
852	c := C.gtk_stack_get_transition_duration(v.native())
853	return uint(c)
854}
855
856// SetTransitionType is a wrapper around gtk_stack_set_transition_type().
857func (v *Stack) SetTransitionType(transition StackTransitionType) {
858	C.gtk_stack_set_transition_type(v.native(), C.GtkStackTransitionType(transition))
859}
860
861// GetTransitionType is a wrapper around gtk_stack_get_transition_type().
862func (v *Stack) GetTransitionType() StackTransitionType {
863	c := C.gtk_stack_get_transition_type(v.native())
864	return StackTransitionType(c)
865}
866
867/*
868 * GtkBuilder
869 */
870
871// BuilderNewFromFile is a wrapper around gtk_builder_new_from_file().
872func BuilderNewFromFile(filePath string) (*Builder, error) {
873	cstr := C.CString(filePath)
874	defer C.free(unsafe.Pointer(cstr))
875
876	c := C.gtk_builder_new_from_file((*C.gchar)(cstr))
877	if c == nil {
878		return nil, nilPtrErr
879	}
880
881	obj := glib.Take(unsafe.Pointer(c))
882	return &Builder{obj}, nil
883}
884
885// BuilderNewFromResource is a wrapper around gtk_builder_new_from_resource().
886func BuilderNewFromResource(resourcePath string) (*Builder, error) {
887	cstr := C.CString(resourcePath)
888	defer C.free(unsafe.Pointer(cstr))
889
890	c := C.gtk_builder_new_from_resource((*C.gchar)(cstr))
891	if c == nil {
892		return nil, nilPtrErr
893	}
894
895	obj := glib.Take(unsafe.Pointer(c))
896	return &Builder{obj}, nil
897}
898
899// BuilderNewFromString is a wrapper around gtk_builder_new_from_string().
900func BuilderNewFromString(resource string) (*Builder, error) {
901	cstr := C.CString(resource)
902	defer C.free(unsafe.Pointer(cstr))
903
904	c := C.gtk_builder_new_from_string((*C.gchar)(cstr), C.gssize(len(resource)))
905	if c == nil {
906		return nil, nilPtrErr
907	}
908
909	obj := glib.Take(unsafe.Pointer(c))
910	return &Builder{obj}, nil
911}
912
913// TODO:
914// gtk_builder_add_callback_symbol
915// gtk_builder_add_callback_symbols
916// gtk_builder_lookup_callback_symbol
917// gtk_builder_set_application
918// gtk_builder_get_application
919