VT_Player/third_party/gotk3/gtk/widget.go
Stu d4efa91ce1 Add vendored gotk3 GTK3 bindings for Go
Vendor gotk3 library to ensure consistent GTK3 bindings across
environments and simplify dependency management.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-15 05:40:43 -05:00

975 lines
28 KiB
Go

// Same copyright and license as the rest of the files in this project
// This file contains accelerator related functions and structures
package gtk
// #include <gtk/gtk.h>
// #include "gtk.go.h"
import "C"
import (
"errors"
"runtime"
"unsafe"
"github.com/gotk3/gotk3/cairo"
"github.com/gotk3/gotk3/gdk"
"github.com/gotk3/gotk3/glib"
)
/*
* GtkWidget
*/
func init() {
tm := []glib.TypeMarshaler{
// Enums
{glib.Type(C.gtk_size_request_mode_get_type()), marshalSizeRequestMode},
// Boxed
{glib.Type(C.gtk_requisition_get_type()), marshalRequisition},
}
glib.RegisterGValueMarshalers(tm)
WrapMap["GtkRequisition"] = wrapRequisition
}
// SizeRequestMode is a representation of GTK's GtkSizeRequestMode.
type SizeRequestMode int
const (
SIZE_REQUEST_HEIGHT_FOR_WIDTH SizeRequestMode = C.GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH
SIZE_REQUEST_WIDTH_FOR_HEIGHT SizeRequestMode = C.GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT
SIZE_REQUEST_CONSTANT_SIZE SizeRequestMode = C.GTK_SIZE_REQUEST_CONSTANT_SIZE
)
func marshalSizeRequestMode(p uintptr) (interface{}, error) {
c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
return SizeRequestMode(c), nil
}
// Widget is a representation of GTK's GtkWidget.
type Widget struct {
glib.InitiallyUnowned
}
// IWidget is an interface type implemented by all structs
// embedding a Widget. It is meant to be used as an argument type
// for wrapper functions that wrap around a C GTK function taking a
// GtkWidget.
type IWidget interface {
toWidget() *C.GtkWidget
ToWidget() *Widget
Set(string, interface{}) error
}
type IWidgetable interface {
toWidget() *C.GtkWidget
}
func nullableWidget(v IWidgetable) *C.GtkWidget {
if v == nil {
return nil
}
return v.toWidget()
}
// native returns a pointer to the underlying GtkWidget.
func (v *Widget) native() *C.GtkWidget {
if v == nil || v.GObject == nil {
return nil
}
p := unsafe.Pointer(v.GObject)
return C.toGtkWidget(p)
}
func (v *Widget) toWidget() *C.GtkWidget {
if v == nil {
return nil
}
return v.native()
}
// ToWidget is a helper getter, e.g.: it returns *gtk.Label as a *gtk.Widget.
// In other cases, where you have a gtk.IWidget, use the type assertion.
func (v *Widget) ToWidget() *Widget {
return v
}
// Cast changes the widget to an object of interface type IWidget.
// This is only useful if you don't already have an object of type IWidget at hand (see example below).
// This func is similar to gtk.Builder.GetObject():
// The returned value needs to be type-asserted, before it can be used.
//
// Example:
// // you know that the parent is an object of type *gtk.ApplicationWindow,
// // or you want to check just in case
// parentWindow, _ := myWindow.GetTransientFor()
// intermediate, _ := parentWindow.Cast()
// appWindow, typeAssertSuccessful := intermediate.(*gtk.ApplicationWindow)
func (v *Widget) Cast() (IWidget, error) {
return castWidget(v.native())
}
func marshalWidget(p uintptr) (interface{}, error) {
c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
obj := glib.Take(unsafe.Pointer(c))
return wrapWidget(obj), nil
}
func wrapWidget(obj *glib.Object) *Widget {
if obj == nil {
return nil
}
return &Widget{glib.InitiallyUnowned{obj}}
}
// TODO:
// GtkCallback().
// gtk_widget_new().
// Destroy is a wrapper around gtk_widget_destroy().
func (v *Widget) Destroy() {
C.gtk_widget_destroy(v.native())
}
// HideOnDelete is a wrapper around gtk_widget_hide_on_delete().
// Calling this func adds gtk_widget_hide_on_delete to the widget's "delete-event" signal.
func (v *Widget) HideOnDelete() {
C._gtk_widget_hide_on_delete(v.native())
}
// TODO:
// gtk_widget_set_direction().
// gtk_widget_get_direction().
// gtk_widget_set_default_direction().
// gtk_widget_get_default_direction().
// gtk_widget_input_shape_combine_region().
// gtk_widget_create_pango_context().
// gtk_widget_create_pango_context().
// gtk_widget_get_pango_context().
// gtk_widget_create_pango_layout().
// QueueDrawArea is a wrapper aroung gtk_widget_queue_draw_area().
func (v *Widget) QueueDrawArea(x, y, w, h int) {
C.gtk_widget_queue_draw_area(v.native(), C.gint(x), C.gint(y), C.gint(w), C.gint(h))
}
// QueueDrawRegion is a wrapper aroung gtk_widget_queue_draw_region().
func (v *Widget) QueueDrawRegion(region *cairo.Region) {
C.gtk_widget_queue_draw_region(v.native(), (*C.cairo_region_t)(unsafe.Pointer(region.Native())))
}
// TODO:
// gtk_widget_set_redraw_on_allocate().
// gtk_widget_mnemonic_activate().
// gtk_widget_class_install_style_property().
// gtk_widget_class_install_style_property_parser().
// gtk_widget_class_find_style_property().
// gtk_widget_class_list_style_properties().
// gtk_widget_send_focus_change().
// gtk_widget_style_get().
// gtk_widget_style_get_property().
// gtk_widget_style_get_valist().
// gtk_widget_class_set_accessible_type().
// gtk_widget_get_accessible().
// gtk_widget_child_focus().
// gtk_widget_child_notify().
// gtk_widget_get_child_visible().
// gtk_widget_get_settings().
// gtk_widget_get_clipboard().
// GetDisplay is a wrapper around gtk_widget_get_display().
func (v *Widget) GetDisplay() (*gdk.Display, error) {
c := C.gtk_widget_get_display(v.native())
if c == nil {
return nil, nilPtrErr
}
s := &gdk.Display{glib.Take(unsafe.Pointer(c))}
return s, nil
}
// GetScreen is a wrapper around gtk_widget_get_screen().
func (v *Widget) GetScreen() (*gdk.Screen, error) {
c := C.gtk_widget_get_screen(v.native())
if c == nil {
return nil, nilPtrErr
}
s := &gdk.Screen{glib.Take(unsafe.Pointer(c))}
return s, nil
}
// TODO:
// gtk_widget_has_screen().
// gtk_widget_get_size_request().
// gtk_widget_set_child_visible().
// gtk_widget_list_mnemonic_labels().
// gtk_widget_add_mnemonic_label().
// gtk_widget_remove_mnemonic_label().
// gtk_widget_error_bell().
// gtk_widget_keynav_failed().
// gtk_widget_get_tooltip_window().
// gtk_widget_get_has_tooltip().
// gtk_widget_set_has_tooltip().
// gtk_widget_trigger_tooltip_query().
// gtk_cairo_should_draw_window().
// gtk_cairo_transform_to_window().
// DragDestSet is a wrapper around gtk_drag_dest_set().
func (v *Widget) DragDestSet(flags DestDefaults, targets []TargetEntry, actions gdk.DragAction) {
C.gtk_drag_dest_set(v.native(), C.GtkDestDefaults(flags), (*C.GtkTargetEntry)(&targets[0]), C.gint(len(targets)), C.GdkDragAction(actions))
}
// DragSourceSet is a wrapper around gtk_drag_source_set().
func (v *Widget) DragSourceSet(startButtonMask gdk.ModifierType, targets []TargetEntry, actions gdk.DragAction) {
C.gtk_drag_source_set(v.native(), C.GdkModifierType(startButtonMask), (*C.GtkTargetEntry)(&targets[0]), C.gint(len(targets)), C.GdkDragAction(actions))
}
// ResetStyle is a wrapper around gtk_widget_reset_style().
func (v *Widget) ResetStyle() {
C.gtk_widget_reset_style(v.native())
}
// InDestruction is a wrapper around gtk_widget_in_destruction().
func (v *Widget) InDestruction() bool {
return gobool(C.gtk_widget_in_destruction(v.native()))
}
// TODO(jrick) this may require some rethinking
/*
// Destroyed is a wrapper around gtk_widget_destroyed().
func (v *Widget) Destroyed(widgetPointer **Widget) {
}
*/
// Unparent is a wrapper around gtk_widget_unparent().
func (v *Widget) Unparent() {
C.gtk_widget_unparent(v.native())
}
// Show is a wrapper around gtk_widget_show().
func (v *Widget) Show() {
C.gtk_widget_show(v.native())
}
// Hide is a wrapper around gtk_widget_hide().
func (v *Widget) Hide() {
C.gtk_widget_hide(v.native())
}
// GetCanFocus is a wrapper around gtk_widget_get_can_focus().
func (v *Widget) GetCanFocus() bool {
c := C.gtk_widget_get_can_focus(v.native())
return gobool(c)
}
// SetCanFocus is a wrapper around gtk_widget_set_can_focus().
func (v *Widget) SetCanFocus(canFocus bool) {
C.gtk_widget_set_can_focus(v.native(), gbool(canFocus))
}
// GetCanDefault is a wrapper around gtk_widget_get_can_default().
func (v *Widget) GetCanDefault() bool {
c := C.gtk_widget_get_can_default(v.native())
return gobool(c)
}
// SetCanDefault is a wrapper around gtk_widget_set_can_default().
func (v *Widget) SetCanDefault(canDefault bool) {
C.gtk_widget_set_can_default(v.native(), gbool(canDefault))
}
// SetMapped is a wrapper around gtk_widget_set_mapped().
func (v *Widget) SetMapped(mapped bool) {
C.gtk_widget_set_mapped(v.native(), gbool(mapped))
}
// GetMapped is a wrapper around gtk_widget_get_mapped().
func (v *Widget) GetMapped() bool {
c := C.gtk_widget_get_mapped(v.native())
return gobool(c)
}
// TODO:
// gtk_widget_device_is_shadowed().
// gtk_widget_get_modifier_mask().
// InsertActionGroup is a wrapper around gtk_widget_insert_action_group().
func (v *Widget) InsertActionGroup(name string, group glib.IActionGroup) {
C.gtk_widget_insert_action_group(v.native(), (*C.gchar)(C.CString(name)), C.toGActionGroup(unsafe.Pointer(group.Native())))
}
// TODO:
// gtk_widget_get_path().
// GetPreferredHeight is a wrapper around gtk_widget_get_preferred_height().
func (v *Widget) GetPreferredHeight() (int, int) {
var minimum, natural C.gint
C.gtk_widget_get_preferred_height(v.native(), &minimum, &natural)
return int(minimum), int(natural)
}
// GetPreferredWidth is a wrapper around gtk_widget_get_preferred_width().
func (v *Widget) GetPreferredWidth() (int, int) {
var minimum, natural C.gint
C.gtk_widget_get_preferred_width(v.native(), &minimum, &natural)
return int(minimum), int(natural)
}
// GetPreferredHeightForWidth is a wrapper around gtk_widget_get_preferred_height_for_width().
func (v *Widget) GetPreferredHeightForWidth(width int) (int, int) {
var minimum, natural C.gint
C.gtk_widget_get_preferred_height_for_width(
v.native(),
C.gint(width),
&minimum,
&natural)
return int(minimum), int(natural)
}
// GetPreferredWidthForHeight is a wrapper around gtk_widget_get_preferred_width_for_height().
func (v *Widget) GetPreferredWidthForHeight(height int) (int, int) {
var minimum, natural C.gint
C.gtk_widget_get_preferred_width_for_height(
v.native(),
C.gint(height),
&minimum,
&natural)
return int(minimum), int(natural)
}
// GetRequestMode is a wrapper around gtk_widget_get_request_mode().
func (v *Widget) GetRequestMode() SizeRequestMode {
return SizeRequestMode(C.gtk_widget_get_request_mode(v.native()))
}
// GetPreferredSize is a wrapper around gtk_widget_get_preferred_size().
func (v *Widget) GetPreferredSize() (*Requisition, *Requisition) {
minimum_size := new(C.GtkRequisition)
natural_size := new(C.GtkRequisition)
C.gtk_widget_get_preferred_size(v.native(), minimum_size, natural_size)
minR, err := requisitionFromNative(minimum_size)
if err != nil {
minR = nil
}
natR, err := requisitionFromNative(natural_size)
if err != nil {
natR = nil
}
return minR, natR
}
// TODO:
/*
gint
gtk_distribute_natural_allocation (gint extra_space,
guint n_requested_sizes,
GtkRequestedSize *sizes);
*/
// GetHAlign is a wrapper around gtk_widget_get_halign().
func (v *Widget) GetHAlign() Align {
c := C.gtk_widget_get_halign(v.native())
return Align(c)
}
// SetHAlign is a wrapper around gtk_widget_set_halign().
func (v *Widget) SetHAlign(align Align) {
C.gtk_widget_set_halign(v.native(), C.GtkAlign(align))
}
// GetVAlign is a wrapper around gtk_widget_get_valign().
func (v *Widget) GetVAlign() Align {
c := C.gtk_widget_get_valign(v.native())
return Align(c)
}
// SetVAlign is a wrapper around gtk_widget_set_valign().
func (v *Widget) SetVAlign(align Align) {
C.gtk_widget_set_valign(v.native(), C.GtkAlign(align))
}
// GetMarginTop is a wrapper around gtk_widget_get_margin_top().
func (v *Widget) GetMarginTop() int {
c := C.gtk_widget_get_margin_top(v.native())
return int(c)
}
// SetMarginTop is a wrapper around gtk_widget_set_margin_top().
func (v *Widget) SetMarginTop(margin int) {
C.gtk_widget_set_margin_top(v.native(), C.gint(margin))
}
// GetMarginBottom is a wrapper around gtk_widget_get_margin_bottom().
func (v *Widget) GetMarginBottom() int {
c := C.gtk_widget_get_margin_bottom(v.native())
return int(c)
}
// SetMarginBottom is a wrapper around gtk_widget_set_margin_bottom().
func (v *Widget) SetMarginBottom(margin int) {
C.gtk_widget_set_margin_bottom(v.native(), C.gint(margin))
}
// GetHExpand is a wrapper around gtk_widget_get_hexpand().
func (v *Widget) GetHExpand() bool {
c := C.gtk_widget_get_hexpand(v.native())
return gobool(c)
}
// SetHExpand is a wrapper around gtk_widget_set_hexpand().
func (v *Widget) SetHExpand(expand bool) {
C.gtk_widget_set_hexpand(v.native(), gbool(expand))
}
// TODO:
// gtk_widget_get_hexpand_set().
// gtk_widget_set_hexpand_set().
// GetVExpand is a wrapper around gtk_widget_get_vexpand().
func (v *Widget) GetVExpand() bool {
c := C.gtk_widget_get_vexpand(v.native())
return gobool(c)
}
// SetVExpand is a wrapper around gtk_widget_set_vexpand().
func (v *Widget) SetVExpand(expand bool) {
C.gtk_widget_set_vexpand(v.native(), gbool(expand))
}
// TODO:
// gtk_widget_get_vexpand_set().
// gtk_widget_set_vexpand_set().
// gtk_widget_queue_compute_expand().
// gtk_widget_compute_expand().
// GetRealized is a wrapper around gtk_widget_get_realized().
func (v *Widget) GetRealized() bool {
c := C.gtk_widget_get_realized(v.native())
return gobool(c)
}
// SetRealized is a wrapper around gtk_widget_set_realized().
func (v *Widget) SetRealized(realized bool) {
C.gtk_widget_set_realized(v.native(), gbool(realized))
}
// GetHasWindow is a wrapper around gtk_widget_get_has_window().
func (v *Widget) GetHasWindow() bool {
c := C.gtk_widget_get_has_window(v.native())
return gobool(c)
}
// SetHasWindow is a wrapper around gtk_widget_set_has_window().
func (v *Widget) SetHasWindow(hasWindow bool) {
C.gtk_widget_set_has_window(v.native(), gbool(hasWindow))
}
// ShowNow is a wrapper around gtk_widget_show_now().
func (v *Widget) ShowNow() {
C.gtk_widget_show_now(v.native())
}
// ShowAll is a wrapper around gtk_widget_show_all().
func (v *Widget) ShowAll() {
C.gtk_widget_show_all(v.native())
}
// SetNoShowAll is a wrapper around gtk_widget_set_no_show_all().
func (v *Widget) SetNoShowAll(noShowAll bool) {
C.gtk_widget_set_no_show_all(v.native(), gbool(noShowAll))
}
// GetNoShowAll is a wrapper around gtk_widget_get_no_show_all().
func (v *Widget) GetNoShowAll() bool {
c := C.gtk_widget_get_no_show_all(v.native())
return gobool(c)
}
// Map is a wrapper around gtk_widget_map().
func (v *Widget) Map() {
C.gtk_widget_map(v.native())
}
// Unmap is a wrapper around gtk_widget_unmap().
func (v *Widget) Unmap() {
C.gtk_widget_unmap(v.native())
}
// TODO:
//void gtk_widget_draw(GtkWidget *widget, cairo_t *cr);
//void gtk_widget_queue_resize(GtkWidget *widget);
//void gtk_widget_queue_resize_no_redraw(GtkWidget *widget);
// gtk_widget_queue_allocate().
// Realize is a wrapper around gtk_widget_realize().
func (v *Widget) Realize() {
C.gtk_widget_realize(v.native())
}
// Unrealize is a wrapper around gtk_widget_unrealize().
func (v *Widget) Unrealize() {
C.gtk_widget_unrealize(v.native())
}
// Event() is a wrapper around gtk_widget_event().
func (v *Widget) Event(event *gdk.Event) bool {
c := C.gtk_widget_event(v.native(),
(*C.GdkEvent)(unsafe.Pointer(event.Native())))
return gobool(c)
}
// Activate() is a wrapper around gtk_widget_activate().
func (v *Widget) Activate() bool {
return gobool(C.gtk_widget_activate(v.native()))
}
// Intersect is a wrapper around gtk_widget_intersect().
func (v *Widget) Intersect(area gdk.Rectangle) (*gdk.Rectangle, bool) {
var cRect *C.GdkRectangle
hadIntersection := C.gtk_widget_intersect(v.native(), nativeGdkRectangle(area), cRect)
intersection := gdk.WrapRectangle(uintptr(unsafe.Pointer(cRect)))
return intersection, gobool(hadIntersection)
}
// IsFocus() is a wrapper around gtk_widget_is_focus().
func (v *Widget) IsFocus() bool {
return gobool(C.gtk_widget_is_focus(v.native()))
}
// GrabFocus() is a wrapper around gtk_widget_grab_focus().
func (v *Widget) GrabFocus() {
C.gtk_widget_grab_focus(v.native())
}
// GrabDefault() is a wrapper around gtk_widget_grab_default().
func (v *Widget) GrabDefault() {
C.gtk_widget_grab_default(v.native())
}
// SetName() is a wrapper around gtk_widget_set_name().
func (v *Widget) SetName(name string) {
cstr := C.CString(name)
defer C.free(unsafe.Pointer(cstr))
C.gtk_widget_set_name(v.native(), (*C.gchar)(cstr))
}
// GetName() is a wrapper around gtk_widget_get_name(). A non-nil
// error is returned in the case that gtk_widget_get_name returns NULL to
// differentiate between NULL and an empty string.
func (v *Widget) GetName() (string, error) {
c := C.gtk_widget_get_name(v.native())
if c == nil {
return "", nilPtrErr
}
return C.GoString((*C.char)(c)), nil
}
// GetSensitive is a wrapper around gtk_widget_get_sensitive().
func (v *Widget) GetSensitive() bool {
c := C.gtk_widget_get_sensitive(v.native())
return gobool(c)
}
// IsSensitive is a wrapper around gtk_widget_is_sensitive().
func (v *Widget) IsSensitive() bool {
c := C.gtk_widget_is_sensitive(v.native())
return gobool(c)
}
// SetSensitive is a wrapper around gtk_widget_set_sensitive().
func (v *Widget) SetSensitive(sensitive bool) {
C.gtk_widget_set_sensitive(v.native(), gbool(sensitive))
}
// GetVisible is a wrapper around gtk_widget_get_visible().
func (v *Widget) GetVisible() bool {
c := C.gtk_widget_get_visible(v.native())
return gobool(c)
}
// SetVisible is a wrapper around gtk_widget_set_visible().
func (v *Widget) SetVisible(visible bool) {
C.gtk_widget_set_visible(v.native(), gbool(visible))
}
// SetParent is a wrapper around gtk_widget_set_parent().
func (v *Widget) SetParent(parent IWidget) {
C.gtk_widget_set_parent(v.native(), parent.toWidget())
}
// GetParent is a wrapper around gtk_widget_get_parent().
func (v *Widget) GetParent() (IWidget, error) {
c := C.gtk_widget_get_parent(v.native())
if c == nil {
return nil, nil
}
return castWidget(c)
}
// SetSizeRequest is a wrapper around gtk_widget_set_size_request().
func (v *Widget) SetSizeRequest(width, height int) {
C.gtk_widget_set_size_request(v.native(), C.gint(width), C.gint(height))
}
// GetSizeRequest is a wrapper around gtk_widget_get_size_request().
func (v *Widget) GetSizeRequest() (width, height int) {
var w, h C.gint
C.gtk_widget_get_size_request(v.native(), &w, &h)
return int(w), int(h)
}
// SetParentWindow is a wrapper around gtk_widget_set_parent_window().
func (v *Widget) SetParentWindow(parentWindow *gdk.Window) {
C.gtk_widget_set_parent_window(v.native(),
(*C.GdkWindow)(unsafe.Pointer(parentWindow.Native())))
}
// GetParentWindow is a wrapper around gtk_widget_get_parent_window().
func (v *Widget) GetParentWindow() (*gdk.Window, error) {
c := C.gtk_widget_get_parent_window(v.native())
if v == nil {
return nil, nilPtrErr
}
w := &gdk.Window{glib.Take(unsafe.Pointer(c))}
return w, nil
}
// SetEvents is a wrapper around gtk_widget_set_events().
func (v *Widget) SetEvents(events int) {
C.gtk_widget_set_events(v.native(), C.gint(events))
}
// GetEvents is a wrapper around gtk_widget_get_events().
func (v *Widget) GetEvents() int {
return int(C.gtk_widget_get_events(v.native()))
}
// AddEvents is a wrapper around gtk_widget_add_events().
func (v *Widget) AddEvents(events int) {
C.gtk_widget_add_events(v.native(), C.gint(events))
}
// TODO:
/*
// gtk_widget_set_device_events().
func (v *Widget) SetDeviceEvents() {
}
*/
/*
// gtk_widget_get_device_events().
func (v *Widget) GetDeviceEvents() {
}
*/
/*
// gtk_widget_add_device_events().
func (v *Widget) AddDeviceEvents() {
}
*/
// FreezeChildNotify is a wrapper around gtk_widget_freeze_child_notify().
func (v *Widget) FreezeChildNotify() {
C.gtk_widget_freeze_child_notify(v.native())
}
// ThawChildNotify is a wrapper around gtk_widget_thaw_child_notify().
func (v *Widget) ThawChildNotify() {
C.gtk_widget_thaw_child_notify(v.native())
}
// HasDefault is a wrapper around gtk_widget_has_default().
func (v *Widget) HasDefault() bool {
c := C.gtk_widget_has_default(v.native())
return gobool(c)
}
// HasFocus is a wrapper around gtk_widget_has_focus().
func (v *Widget) HasFocus() bool {
c := C.gtk_widget_has_focus(v.native())
return gobool(c)
}
// HasVisibleFocus is a wrapper around gtk_widget_has_visible_focus().
func (v *Widget) HasVisibleFocus() bool {
c := C.gtk_widget_has_visible_focus(v.native())
return gobool(c)
}
// HasGrab is a wrapper around gtk_widget_has_grab().
func (v *Widget) HasGrab() bool {
c := C.gtk_widget_has_grab(v.native())
return gobool(c)
}
// IsDrawable is a wrapper around gtk_widget_is_drawable().
func (v *Widget) IsDrawable() bool {
c := C.gtk_widget_is_drawable(v.native())
return gobool(c)
}
// IsToplevel is a wrapper around gtk_widget_is_toplevel().
func (v *Widget) IsToplevel() bool {
c := C.gtk_widget_is_toplevel(v.native())
return gobool(c)
}
// FIXME:
// gtk_widget_set_window().
// gtk_widget_set_receives_default().
// gtk_widget_get_receives_default().
// gtk_widget_set_support_multidevice().
// gtk_widget_get_support_multidevice().
// SetDeviceEnabled is a wrapper around gtk_widget_set_device_enabled().
func (v *Widget) SetDeviceEnabled(device *gdk.Device, enabled bool) {
C.gtk_widget_set_device_enabled(v.native(),
(*C.GdkDevice)(unsafe.Pointer(device.Native())), gbool(enabled))
}
// GetDeviceEnabled is a wrapper around gtk_widget_get_device_enabled().
func (v *Widget) GetDeviceEnabled(device *gdk.Device) bool {
c := C.gtk_widget_get_device_enabled(v.native(),
(*C.GdkDevice)(unsafe.Pointer(device.Native())))
return gobool(c)
}
// GetToplevel is a wrapper around gtk_widget_get_toplevel().
func (v *Widget) GetToplevel() (IWidget, error) {
c := C.gtk_widget_get_toplevel(v.native())
if c == nil {
return nil, nilPtrErr
}
return castWidget(c)
}
// TODO:
// gtk_widget_get_ancestor().
// gtk_widget_get_visual().
// gtk_widget_is_ancestor().
// GetTooltipMarkup is a wrapper around gtk_widget_get_tooltip_markup().
// A non-nil error is returned in the case that gtk_widget_get_tooltip_markup
// returns NULL to differentiate between NULL and an empty string.
func (v *Widget) GetTooltipMarkup() (string, error) {
c := C.gtk_widget_get_tooltip_markup(v.native())
if c == nil {
return "", nilPtrErr
}
return C.GoString((*C.char)(c)), nil
}
// SetTooltipMarkup is a wrapper around gtk_widget_set_tooltip_markup().
func (v *Widget) SetTooltipMarkup(text string) {
cstr := C.CString(text)
defer C.free(unsafe.Pointer(cstr))
C.gtk_widget_set_tooltip_markup(v.native(), (*C.gchar)(cstr))
}
// GetTooltipText is a wrapper around gtk_widget_get_tooltip_text().
// A non-nil error is returned in the case that
// gtk_widget_get_tooltip_text returns NULL to differentiate between NULL
// and an empty string.
func (v *Widget) GetTooltipText() (string, error) {
c := C.gtk_widget_get_tooltip_text(v.native())
if c == nil {
return "", nilPtrErr
}
return C.GoString((*C.char)(c)), nil
}
// SetTooltipText is a wrapper around gtk_widget_set_tooltip_text().
func (v *Widget) SetTooltipText(text string) {
cstr := C.CString(text)
defer C.free(unsafe.Pointer(cstr))
C.gtk_widget_set_tooltip_text(v.native(), (*C.gchar)(cstr))
}
// TranslateCoordinates is a wrapper around gtk_widget_translate_coordinates().
func (v *Widget) TranslateCoordinates(dest IWidget, srcX, srcY int) (destX, destY int, e error) {
cdest := nullableWidget(dest)
var cdestX, cdestY C.gint
c := C.gtk_widget_translate_coordinates(v.native(), cdest, C.gint(srcX), C.gint(srcY), &cdestX, &cdestY)
if !gobool(c) {
return 0, 0, errors.New("translate coordinates failed")
}
return int(cdestX), int(cdestY), nil
}
// SetVisual is a wrapper around gtk_widget_set_visual().
func (v *Widget) SetVisual(visual *gdk.Visual) {
C.gtk_widget_set_visual(v.native(),
(*C.GdkVisual)(unsafe.Pointer(visual.Native())))
}
// SetAppPaintable is a wrapper around gtk_widget_set_app_paintable().
func (v *Widget) SetAppPaintable(paintable bool) {
C.gtk_widget_set_app_paintable(v.native(), gbool(paintable))
}
// GetAppPaintable is a wrapper around gtk_widget_get_app_paintable().
func (v *Widget) GetAppPaintable() bool {
c := C.gtk_widget_get_app_paintable(v.native())
return gobool(c)
}
// QueueDraw is a wrapper around gtk_widget_queue_draw().
func (v *Widget) QueueDraw() {
C.gtk_widget_queue_draw(v.native())
}
// GetAllocation is a wrapper around gtk_widget_get_allocation().
func (v *Widget) GetAllocation() *Allocation {
var a Allocation
C.gtk_widget_get_allocation(v.native(), a.native())
return &a
}
// SetAllocation is a wrapper around gtk_widget_set_allocation().
func (v *Widget) SetAllocation(allocation *Allocation) {
C.gtk_widget_set_allocation(v.native(), allocation.native())
}
// SizeAllocate is a wrapper around gtk_widget_size_allocate().
func (v *Widget) SizeAllocate(allocation *Allocation) {
C.gtk_widget_size_allocate(v.native(), allocation.native())
}
// TODO:
// gtk_widget_size_allocate_with_baseline().
// SetStateFlags is a wrapper around gtk_widget_set_state_flags().
func (v *Widget) SetStateFlags(stateFlags StateFlags, clear bool) {
C.gtk_widget_set_state_flags(v.native(), C.GtkStateFlags(stateFlags), gbool(clear))
}
func (v *Widget) UnsetStateFlags(stateFlags StateFlags) {
C.gtk_widget_unset_state_flags(v.native(), C.GtkStateFlags(stateFlags))
}
func (v *Widget) GetStateFlags() StateFlags {
return StateFlags(C.gtk_widget_get_state_flags(v.native()))
}
// GetWindow is a wrapper around gtk_widget_get_window().
func (v *Widget) GetWindow() (*gdk.Window, error) {
c := C.gtk_widget_get_window(v.native())
if c == nil {
return nil, nilPtrErr
}
w := &gdk.Window{glib.Take(unsafe.Pointer(c))}
return w, nil
}
/*
* GtkRequisition
*/
// Requisition is a representation of GTK's GtkRequisition
type Requisition struct {
requisition *C.GtkRequisition
Width,
Height int
}
func (v *Requisition) native() *C.GtkRequisition {
if v == nil {
return nil
}
v.requisition.width = C.int(v.Width)
v.requisition.height = C.int(v.Height)
return v.requisition
}
// Native returns a pointer to the underlying GtkRequisition.
func (v *Requisition) Native() uintptr {
return uintptr(unsafe.Pointer(v.native()))
}
func marshalRequisition(p uintptr) (interface{}, error) {
c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
requisition := (*C.GtkRequisition)(unsafe.Pointer(c))
return wrapRequisition(requisition), nil
}
func wrapRequisition(requisition *C.GtkRequisition) *Requisition {
if requisition == nil {
return nil
}
return &Requisition{requisition, int(requisition.width), int(requisition.height)}
}
// requisitionFromNative that handle finalizer.
func requisitionFromNative(requisitionNative *C.GtkRequisition) (*Requisition, error) {
requisition := wrapRequisition(requisitionNative)
if requisition == nil {
return nil, nilPtrErr
}
runtime.SetFinalizer(requisition, func(l *Requisition) { glib.FinalizerStrategy(l.free) })
return requisition, nil
}
// RequisitionNew is a wrapper around gtk_requisition_new().
func RequisitionNew() (*Requisition, error) {
c := C.gtk_requisition_new()
if c == nil {
return nil, nilPtrErr
}
return requisitionFromNative(c)
}
// free is a wrapper around gtk_requisition_free().
func (v *Requisition) free() {
C.gtk_requisition_free(v.native())
}
// Copy is a wrapper around gtk_requisition_copy().
func (v *Requisition) Copy() (*Requisition, error) {
c := C.gtk_requisition_copy(v.native())
if c == nil {
return nil, nilPtrErr
}
return requisitionFromNative(c)
}
/*
* GtkAllocation
*/
// Allocation is a representation of GTK's GtkAllocation type.
type Allocation struct {
gdk.Rectangle
}
// Native returns a pointer to the underlying GtkAllocation.
func (v *Allocation) native() *C.GtkAllocation {
return (*C.GtkAllocation)(unsafe.Pointer(&v.GdkRectangle))
}
// GetAllocatedWidth() is a wrapper around gtk_widget_get_allocated_width().
func (v *Widget) GetAllocatedWidth() int {
return int(C.gtk_widget_get_allocated_width(v.native()))
}
// GetAllocatedHeight() is a wrapper around gtk_widget_get_allocated_height().
func (v *Widget) GetAllocatedHeight() int {
return int(C.gtk_widget_get_allocated_height(v.native()))
}
// TODO:
// gtk_widget_get_allocated_baseline().
// gtk_widget_get_allocated_size().