// Same copyright and license as the rest of the files in this project // This file contains accelerator related functions and structures package gtk // #include // #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().