summaryrefslogtreecommitdiff
path: root/vendor/github.com
diff options
context:
space:
mode:
authorKali Kaneko (leap communications) <kali@leap.se>2019-01-12 18:39:45 +0100
committerRuben Pollan <meskio@sindominio.net>2019-01-17 12:30:32 +0100
commitb1247d2d0d51108c910a73891ff3116e5f032ab1 (patch)
treee9948964f0bfb1ad2df3bc7bad02aa1f41ccfbd8 /vendor/github.com
parentefcb8312e31b5c2261b1a1e95ace55b322cfcc27 (diff)
[pkg] all your deps are vendored to us
Diffstat (limited to 'vendor/github.com')
-rw-r--r--vendor/github.com/AllenDang/w32/AUTHORS19
-rw-r--r--vendor/github.com/AllenDang/w32/LICENSE23
-rw-r--r--vendor/github.com/AllenDang/w32/README.md33
-rw-r--r--vendor/github.com/AllenDang/w32/advapi32.go389
-rw-r--r--vendor/github.com/AllenDang/w32/advapi32_constants.go300
-rw-r--r--vendor/github.com/AllenDang/w32/advapi32_test.go41
-rw-r--r--vendor/github.com/AllenDang/w32/advapi32_typedef.go122
-rw-r--r--vendor/github.com/AllenDang/w32/alpc.go304
-rw-r--r--vendor/github.com/AllenDang/w32/alpc_constants.go64
-rw-r--r--vendor/github.com/AllenDang/w32/alpc_test.go137
-rw-r--r--vendor/github.com/AllenDang/w32/alpc_typedef.go181
-rw-r--r--vendor/github.com/AllenDang/w32/comctl32.go109
-rw-r--r--vendor/github.com/AllenDang/w32/comdlg32.go38
-rw-r--r--vendor/github.com/AllenDang/w32/constants.go2628
-rw-r--r--vendor/github.com/AllenDang/w32/create_process.go152
-rw-r--r--vendor/github.com/AllenDang/w32/create_process_constants.go9
-rw-r--r--vendor/github.com/AllenDang/w32/create_process_test.go47
-rw-r--r--vendor/github.com/AllenDang/w32/create_process_typedef.go68
-rw-r--r--vendor/github.com/AllenDang/w32/dwmapi.go254
-rw-r--r--vendor/github.com/AllenDang/w32/fork.go174
-rw-r--r--vendor/github.com/AllenDang/w32/fork_constants.go26
-rw-r--r--vendor/github.com/AllenDang/w32/fork_test.go50
-rw-r--r--vendor/github.com/AllenDang/w32/fork_typedef.go89
-rw-r--r--vendor/github.com/AllenDang/w32/gdi32.go543
-rw-r--r--vendor/github.com/AllenDang/w32/gdiplus.go175
-rw-r--r--vendor/github.com/AllenDang/w32/idispatch.go43
-rw-r--r--vendor/github.com/AllenDang/w32/istream.go31
-rw-r--r--vendor/github.com/AllenDang/w32/iunknown.go27
-rw-r--r--vendor/github.com/AllenDang/w32/kernel32.go388
-rw-r--r--vendor/github.com/AllenDang/w32/ole32.go63
-rw-r--r--vendor/github.com/AllenDang/w32/oleaut32.go48
-rw-r--r--vendor/github.com/AllenDang/w32/opengl32.go72
-rw-r--r--vendor/github.com/AllenDang/w32/psapi.go25
-rw-r--r--vendor/github.com/AllenDang/w32/shell32.go153
-rw-r--r--vendor/github.com/AllenDang/w32/typedef.go891
-rw-r--r--vendor/github.com/AllenDang/w32/user32.go1046
-rw-r--r--vendor/github.com/AllenDang/w32/utils.go201
-rw-r--r--vendor/github.com/AllenDang/w32/vars.go13
-rw-r--r--vendor/github.com/ProtonMail/go-autostart/LICENSE21
-rw-r--r--vendor/github.com/ProtonMail/go-autostart/README.md51
-rw-r--r--vendor/github.com/ProtonMail/go-autostart/autostart.go13
-rw-r--r--vendor/github.com/ProtonMail/go-autostart/autostart_darwin.go66
-rw-r--r--vendor/github.com/ProtonMail/go-autostart/autostart_windows.c51
-rw-r--r--vendor/github.com/ProtonMail/go-autostart/autostart_windows.go52
-rw-r--r--vendor/github.com/ProtonMail/go-autostart/autostart_xdg.go69
-rw-r--r--vendor/github.com/ProtonMail/go-autostart/quote.go16
-rw-r--r--vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/demuxer.go63
-rw-r--r--vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/demuxer_test.go218
-rw-r--r--vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/doc.go12
-rw-r--r--vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/client.go303
-rw-r--r--vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/error.go11
-rw-r--r--vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event.go299
-rw-r--r--vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go346
-rw-r--r--vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/server.go172
-rw-r--r--vendor/github.com/getlantern/context/LICENSE202
-rw-r--r--vendor/github.com/getlantern/context/README.md6
-rw-r--r--vendor/github.com/getlantern/context/context.go309
-rw-r--r--vendor/github.com/getlantern/context/context_test.go160
-rw-r--r--vendor/github.com/getlantern/context/gotrack.go130
-rw-r--r--vendor/github.com/getlantern/errors/errors.go566
-rw-r--r--vendor/github.com/getlantern/errors/errors_test.go142
-rw-r--r--vendor/github.com/getlantern/errors/hide.go50
-rw-r--r--vendor/github.com/getlantern/golog/LICENSE202
-rw-r--r--vendor/github.com/getlantern/golog/README.md6
-rw-r--r--vendor/github.com/getlantern/golog/golog.go458
-rw-r--r--vendor/github.com/getlantern/golog/golog_test.go224
-rw-r--r--vendor/github.com/getlantern/hex/hex.go107
-rw-r--r--vendor/github.com/getlantern/hidden/hidden.go66
-rw-r--r--vendor/github.com/getlantern/hidden/hidden_test.go33
-rw-r--r--vendor/github.com/getlantern/ops/ops.go154
-rw-r--r--vendor/github.com/getlantern/ops/ops_test.go76
-rw-r--r--vendor/github.com/go-stack/stack/LICENSE.md21
-rw-r--r--vendor/github.com/go-stack/stack/README.md38
-rw-r--r--vendor/github.com/go-stack/stack/format_test.go21
-rw-r--r--vendor/github.com/go-stack/stack/go.mod1
-rw-r--r--vendor/github.com/go-stack/stack/stack-go19_test.go67
-rw-r--r--vendor/github.com/go-stack/stack/stack.go400
-rw-r--r--vendor/github.com/go-stack/stack/stack_test.go582
-rw-r--r--vendor/github.com/gotk3/gotk3/LICENSE14
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/antialias.go27
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/cairo.go65
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/canvas.go418
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/errors.go7
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/fillrule.go22
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/format.go27
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/linecap.go23
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/linejoin.go23
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/matrix.go98
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/mimetype.go13
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/operator.go49
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/pattern.go112
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/status.go124
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/surface.go275
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/surfacetype.go45
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/text.go125
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/translations.go78
-rw-r--r--vendor/github.com/gotk3/gotk3/cairo/util.go20
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/gdk.go1864
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/gdk.go.h102
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_16.go12
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_20.go79
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_22.go83
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_8.go33
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/gdk_pixbuf_format.go89
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/gdk_since_3_22.go95
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/gdk_since_3_22.go.h26
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/keys.go2278
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/screen.go113
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/screen_no_x11.go25
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/screen_x11.go30
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/window_no_x11.go17
-rw-r--r--vendor/github.com/gotk3/gotk3/gdk/window_x11.go26
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/application.go219
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/connect.go116
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gaction.go215
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gactiongroup.go113
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gactionmap.go66
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gbinding.go98
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/glib.go1371
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/glib.go.h259
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/glib_extension.go18
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/glib_test.go58
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gmain_context.go31
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gsimpleactiongroup.go58
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gsimpleactiongroup_test.go70
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gsource.go26
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gvariant.go284
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gvariant.go.h40
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gvariant_test.go14
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gvariantbuilder.go52
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gvariantclass.go39
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gvariantdict.go52
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gvariantiter.go52
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gvarianttype.go60
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/gvarianttype.go.h37
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/list.go155
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/list_test.go76
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/menu.go350
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/notifications.go105
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/settings.go304
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/settings_backend.go70
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/settings_schema.go95
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/settings_schema_source.go69
-rw-r--r--vendor/github.com/gotk3/gotk3/glib/slist.go109
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/aboutdialog.go324
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/accel.go435
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/accel_test.go34
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/actionable.go117
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/actionable.go.h5
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/actionable_test.go35
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/actionbar_since_3_12.go105
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/actionbar_since_3_12.go.h25
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/app_chooser.go378
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/application.go158
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/application_since_3_12.go62
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/application_since_3_14.go49
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/application_window.go71
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/box_since_3_12.go53
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/color_chooser.go148
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/combo_box.go272
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/fixed.go68
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/fixed.go.h5
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/font_chooser.go148
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gdk.go20
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk.go8935
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk.go.h911
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_10.go244
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_12.go89
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_14.go467
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_14.go.h46
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_16.go48
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_20.go34
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_22.go57
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_24.go46
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_8.go41
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_export.go104
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_export_since_3_10.go24
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_10.go734
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_10.go.h67
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_12.go351
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_12.go.h29
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_16.go126
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_16.go.h23
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_18.go29
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_20.go207
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_20.go.h39
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_8.go36
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/gtk_test.go739
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/icon_view.go468
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/info_bar.go106
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/label.go281
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/level_bar.go151
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/level_bar_since_3_8.go18
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/menu.go76
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/menu_before_3_22.go19
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/menu_shell.go96
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/menu_since_3_22.go24
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/popover_since_3_12.go82
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/popover_since_3_12.go.h25
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/popover_since_3_18.go29
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/print.go1600
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/print_since_3_16.go34
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/print_test.go55
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/settings.go53
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/settings.go.h5
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/shortcutswindow_since_3_22.go140
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/shortcutswindow_since_3_22.go.h41
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/stack_since_3_12.go34
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/stackswitcher_since_3_10.go77
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/style.go232
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/text_child_anchor.go19
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/text_iter.go403
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/text_mark.go29
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/text_view.go423
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/tooltip.go79
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/tree_view.go458
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/tree_view_column.go291
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/version.go29
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/version_test.go20
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/widget.go637
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/widget_since_3_12.go45
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/widget_since_3_14.go20
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/widget_since_3_8.go48
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/window.go614
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/window_since_3_10.go26
-rw-r--r--vendor/github.com/gotk3/gotk3/gtk/window_since_3_12.go12
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/fontconfig.go.h7
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-attributes.go356
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-attributes.go.h27
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-context.go139
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-font.go710
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-glyph-item.go43
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-glyph.go85
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-gravity.go63
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-layout.go469
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-layout.go.h27
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango-types.go135
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango.go55
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pango.go.h38
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pangocairo.go138
-rw-r--r--vendor/github.com/gotk3/gotk3/pango/pangocairo.go.h0
-rw-r--r--vendor/github.com/jmshal/go-locale/detect_locale_darwin.go9
-rw-r--r--vendor/github.com/jmshal/go-locale/detect_locale_linux.go31
-rw-r--r--vendor/github.com/jmshal/go-locale/detect_locale_windows.go29
-rw-r--r--vendor/github.com/jmshal/go-locale/get_command_output.go16
-rw-r--r--vendor/github.com/jmshal/go-locale/lc_windows.go241
-rw-r--r--vendor/github.com/jmshal/go-locale/locale_test.go11
-rw-r--r--vendor/github.com/mitchellh/go-ps/LICENSE.md21
-rw-r--r--vendor/github.com/mitchellh/go-ps/README.md34
-rw-r--r--vendor/github.com/mitchellh/go-ps/Vagrantfile43
-rw-r--r--vendor/github.com/mitchellh/go-ps/process.go40
-rw-r--r--vendor/github.com/mitchellh/go-ps/process_darwin.go138
-rw-r--r--vendor/github.com/mitchellh/go-ps/process_darwin_test.go11
-rw-r--r--vendor/github.com/mitchellh/go-ps/process_freebsd.go260
-rw-r--r--vendor/github.com/mitchellh/go-ps/process_linux.go35
-rw-r--r--vendor/github.com/mitchellh/go-ps/process_solaris.go96
-rw-r--r--vendor/github.com/mitchellh/go-ps/process_test.go45
-rw-r--r--vendor/github.com/mitchellh/go-ps/process_unix.go101
-rw-r--r--vendor/github.com/mitchellh/go-ps/process_unix_test.go11
-rw-r--r--vendor/github.com/mitchellh/go-ps/process_windows.go119
-rw-r--r--vendor/github.com/oxtoacart/bpool/LICENSE202
-rw-r--r--vendor/github.com/oxtoacart/bpool/README.md65
-rw-r--r--vendor/github.com/oxtoacart/bpool/bpool.go6
-rw-r--r--vendor/github.com/oxtoacart/bpool/bufferpool.go40
-rw-r--r--vendor/github.com/oxtoacart/bpool/bufferpool_test.go30
-rw-r--r--vendor/github.com/oxtoacart/bpool/bytepool.go45
-rw-r--r--vendor/github.com/oxtoacart/bpool/bytepool_test.go37
-rw-r--r--vendor/github.com/oxtoacart/bpool/sizedbufferpool.go60
-rw-r--r--vendor/github.com/oxtoacart/bpool/sizedbufferpool_test.go50
-rw-r--r--vendor/github.com/skratchdot/open-golang/LICENSE-MIT22
-rw-r--r--vendor/github.com/skratchdot/open-golang/open/exec.go18
-rw-r--r--vendor/github.com/skratchdot/open-golang/open/exec_darwin.go15
-rw-r--r--vendor/github.com/skratchdot/open-golang/open/exec_windows.go33
-rw-r--r--vendor/github.com/skratchdot/open-golang/open/open.go50
-rw-r--r--vendor/github.com/skratchdot/open-golang/open/open_test.go70
275 files changed, 52941 insertions, 0 deletions
diff --git a/vendor/github.com/AllenDang/w32/AUTHORS b/vendor/github.com/AllenDang/w32/AUTHORS
new file mode 100644
index 0000000..93ec5db
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/AUTHORS
@@ -0,0 +1,19 @@
+# This is the official list of 'w32' authors for copyright purposes.
+
+# Names should be added to this file as
+# Name or Organization <email address>
+# The email address is not required for organizations.
+
+# Please keep the list sorted.
+
+# Contributors
+# ============
+
+Allen Dang <allengnr@gmail.com>
+Benny Siegert <bsiegert@gmail.com>
+Bruno Bigras <bigras.bruno@gmail.com>
+Daniel Joos
+Gerald Rosenberg <gerald.rosenberg@gmail.com>
+Liam Bowen <liambowen@gmail.com>
+Michael Henke
+Paul Maddox <paul.maddox@gmail.com> \ No newline at end of file
diff --git a/vendor/github.com/AllenDang/w32/LICENSE b/vendor/github.com/AllenDang/w32/LICENSE
new file mode 100644
index 0000000..9f36608
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/LICENSE
@@ -0,0 +1,23 @@
+Copyright (c) 2010-2012 The w32 Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/AllenDang/w32/README.md b/vendor/github.com/AllenDang/w32/README.md
new file mode 100644
index 0000000..ed196e7
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/README.md
@@ -0,0 +1,33 @@
+About w32
+==========
+
+w32 is a wrapper of windows apis for the Go Programming Language.
+
+It wraps win32 apis to "Go style" to make them easier to use.
+
+Setup
+=====
+
+1. Make sure you have a working Go installation and build environment,
+ see this go-nuts post for details:
+ http://groups.google.com/group/golang-nuts/msg/5c87630a84f4fd0c
+
+ Updated versions of the Windows Go build are available here:
+ http://code.google.com/p/gomingw/downloads/list
+
+2. Create a "gopath" directory if you do not have one yet and set the
+ GOPATH variable accordingly. For example:
+ mkdir -p go-externals/src
+ export GOPATH=${PWD}/go-externals
+
+3. go get github.com/AllenDang/w32
+
+4. go install github.com/AllenDang/w32...
+
+Contribute
+==========
+
+Contributions in form of design, code, documentation, bug reporting or other
+ways you see fit are very welcome.
+
+Thank You!
diff --git a/vendor/github.com/AllenDang/w32/advapi32.go b/vendor/github.com/AllenDang/w32/advapi32.go
new file mode 100644
index 0000000..10e1416
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/advapi32.go
@@ -0,0 +1,389 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "errors"
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
+
+ // procRegSetKeyValue = modadvapi32.NewProc("RegSetKeyValueW")
+ procCloseEventLog = modadvapi32.NewProc("CloseEventLog")
+ procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle")
+ procControlService = modadvapi32.NewProc("ControlService")
+ procControlTrace = modadvapi32.NewProc("ControlTraceW")
+ procInitializeSecurityDescriptor = modadvapi32.NewProc("InitializeSecurityDescriptor")
+ procOpenEventLog = modadvapi32.NewProc("OpenEventLogW")
+ procOpenSCManager = modadvapi32.NewProc("OpenSCManagerW")
+ procOpenService = modadvapi32.NewProc("OpenServiceW")
+ procReadEventLog = modadvapi32.NewProc("ReadEventLogW")
+ procRegCloseKey = modadvapi32.NewProc("RegCloseKey")
+ procRegCreateKeyEx = modadvapi32.NewProc("RegCreateKeyExW")
+ procRegEnumKeyEx = modadvapi32.NewProc("RegEnumKeyExW")
+ procRegGetValue = modadvapi32.NewProc("RegGetValueW")
+ procRegOpenKeyEx = modadvapi32.NewProc("RegOpenKeyExW")
+ procRegSetValueEx = modadvapi32.NewProc("RegSetValueExW")
+ procSetSecurityDescriptorDacl = modadvapi32.NewProc("SetSecurityDescriptorDacl")
+ procStartService = modadvapi32.NewProc("StartServiceW")
+ procStartTrace = modadvapi32.NewProc("StartTraceW")
+)
+
+var (
+ SystemTraceControlGuid = GUID{
+ 0x9e814aad,
+ 0x3204,
+ 0x11d2,
+ [8]byte{0x9a, 0x82, 0x00, 0x60, 0x08, 0xa8, 0x69, 0x39},
+ }
+)
+
+func RegCreateKey(hKey HKEY, subKey string) HKEY {
+ var result HKEY
+ ret, _, _ := procRegCreateKeyEx.Call(
+ uintptr(hKey),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
+ uintptr(0),
+ uintptr(0),
+ uintptr(0),
+ uintptr(KEY_ALL_ACCESS),
+ uintptr(0),
+ uintptr(unsafe.Pointer(&result)),
+ uintptr(0))
+ _ = ret
+ return result
+}
+
+func RegOpenKeyEx(hKey HKEY, subKey string, samDesired uint32) HKEY {
+ var result HKEY
+ ret, _, _ := procRegOpenKeyEx.Call(
+ uintptr(hKey),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
+ uintptr(0),
+ uintptr(samDesired),
+ uintptr(unsafe.Pointer(&result)))
+
+ if ret != ERROR_SUCCESS {
+ panic(fmt.Sprintf("RegOpenKeyEx(%d, %s, %d) failed", hKey, subKey, samDesired))
+ }
+ return result
+}
+
+func RegCloseKey(hKey HKEY) error {
+ var err error
+ ret, _, _ := procRegCloseKey.Call(
+ uintptr(hKey))
+
+ if ret != ERROR_SUCCESS {
+ err = errors.New("RegCloseKey failed")
+ }
+ return err
+}
+
+func RegGetRaw(hKey HKEY, subKey string, value string) []byte {
+ var bufLen uint32
+ var valptr unsafe.Pointer
+ if len(value) > 0 {
+ valptr = unsafe.Pointer(syscall.StringToUTF16Ptr(value))
+ }
+ procRegGetValue.Call(
+ uintptr(hKey),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
+ uintptr(valptr),
+ uintptr(RRF_RT_ANY),
+ 0,
+ 0,
+ uintptr(unsafe.Pointer(&bufLen)))
+
+ if bufLen == 0 {
+ return nil
+ }
+
+ buf := make([]byte, bufLen)
+ ret, _, _ := procRegGetValue.Call(
+ uintptr(hKey),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
+ uintptr(valptr),
+ uintptr(RRF_RT_ANY),
+ 0,
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(unsafe.Pointer(&bufLen)))
+
+ if ret != ERROR_SUCCESS {
+ return nil
+ }
+
+ return buf
+}
+
+func RegSetBinary(hKey HKEY, subKey string, value []byte) (errno int) {
+ var lptr, vptr unsafe.Pointer
+ if len(subKey) > 0 {
+ lptr = unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))
+ }
+ if len(value) > 0 {
+ vptr = unsafe.Pointer(&value[0])
+ }
+ ret, _, _ := procRegSetValueEx.Call(
+ uintptr(hKey),
+ uintptr(lptr),
+ uintptr(0),
+ uintptr(REG_BINARY),
+ uintptr(vptr),
+ uintptr(len(value)))
+
+ return int(ret)
+}
+
+func RegGetString(hKey HKEY, subKey string, value string) string {
+ var bufLen uint32
+ procRegGetValue.Call(
+ uintptr(hKey),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))),
+ uintptr(RRF_RT_REG_SZ),
+ 0,
+ 0,
+ uintptr(unsafe.Pointer(&bufLen)))
+
+ if bufLen == 0 {
+ return ""
+ }
+
+ buf := make([]uint16, bufLen)
+ ret, _, _ := procRegGetValue.Call(
+ uintptr(hKey),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))),
+ uintptr(RRF_RT_REG_SZ),
+ 0,
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(unsafe.Pointer(&bufLen)))
+
+ if ret != ERROR_SUCCESS {
+ return ""
+ }
+
+ return syscall.UTF16ToString(buf)
+}
+
+/*
+func RegSetKeyValue(hKey HKEY, subKey string, valueName string, dwType uint32, data uintptr, cbData uint16) (errno int) {
+ ret, _, _ := procRegSetKeyValue.Call(
+ uintptr(hKey),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(valueName))),
+ uintptr(dwType),
+ data,
+ uintptr(cbData))
+
+ return int(ret)
+}
+*/
+
+func RegEnumKeyEx(hKey HKEY, index uint32) string {
+ var bufLen uint32 = 255
+ buf := make([]uint16, bufLen)
+ procRegEnumKeyEx.Call(
+ uintptr(hKey),
+ uintptr(index),
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(unsafe.Pointer(&bufLen)),
+ 0,
+ 0,
+ 0,
+ 0)
+ return syscall.UTF16ToString(buf)
+}
+
+func OpenEventLog(servername string, sourcename string) HANDLE {
+ ret, _, _ := procOpenEventLog.Call(
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(servername))),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(sourcename))))
+
+ return HANDLE(ret)
+}
+
+func ReadEventLog(eventlog HANDLE, readflags, recordoffset uint32, buffer []byte, numberofbytestoread uint32, bytesread, minnumberofbytesneeded *uint32) bool {
+ ret, _, _ := procReadEventLog.Call(
+ uintptr(eventlog),
+ uintptr(readflags),
+ uintptr(recordoffset),
+ uintptr(unsafe.Pointer(&buffer[0])),
+ uintptr(numberofbytestoread),
+ uintptr(unsafe.Pointer(bytesread)),
+ uintptr(unsafe.Pointer(minnumberofbytesneeded)))
+
+ return ret != 0
+}
+
+func CloseEventLog(eventlog HANDLE) bool {
+ ret, _, _ := procCloseEventLog.Call(
+ uintptr(eventlog))
+
+ return ret != 0
+}
+
+func OpenSCManager(lpMachineName, lpDatabaseName string, dwDesiredAccess uint32) (HANDLE, error) {
+ var p1, p2 uintptr
+ if len(lpMachineName) > 0 {
+ p1 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpMachineName)))
+ }
+ if len(lpDatabaseName) > 0 {
+ p2 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDatabaseName)))
+ }
+ ret, _, _ := procOpenSCManager.Call(
+ p1,
+ p2,
+ uintptr(dwDesiredAccess))
+
+ if ret == 0 {
+ return 0, syscall.GetLastError()
+ }
+
+ return HANDLE(ret), nil
+}
+
+func CloseServiceHandle(hSCObject HANDLE) error {
+ ret, _, _ := procCloseServiceHandle.Call(uintptr(hSCObject))
+ if ret == 0 {
+ return syscall.GetLastError()
+ }
+ return nil
+}
+
+func OpenService(hSCManager HANDLE, lpServiceName string, dwDesiredAccess uint32) (HANDLE, error) {
+ ret, _, _ := procOpenService.Call(
+ uintptr(hSCManager),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceName))),
+ uintptr(dwDesiredAccess))
+
+ if ret == 0 {
+ return 0, syscall.GetLastError()
+ }
+
+ return HANDLE(ret), nil
+}
+
+func StartService(hService HANDLE, lpServiceArgVectors []string) error {
+ l := len(lpServiceArgVectors)
+ var ret uintptr
+ if l == 0 {
+ ret, _, _ = procStartService.Call(
+ uintptr(hService),
+ 0,
+ 0)
+ } else {
+ lpArgs := make([]uintptr, l)
+ for i := 0; i < l; i++ {
+ lpArgs[i] = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceArgVectors[i])))
+ }
+
+ ret, _, _ = procStartService.Call(
+ uintptr(hService),
+ uintptr(l),
+ uintptr(unsafe.Pointer(&lpArgs[0])))
+ }
+
+ if ret == 0 {
+ return syscall.GetLastError()
+ }
+
+ return nil
+}
+
+func ControlService(hService HANDLE, dwControl uint32, lpServiceStatus *SERVICE_STATUS) bool {
+ if lpServiceStatus == nil {
+ panic("ControlService:lpServiceStatus cannot be nil")
+ }
+
+ ret, _, _ := procControlService.Call(
+ uintptr(hService),
+ uintptr(dwControl),
+ uintptr(unsafe.Pointer(lpServiceStatus)))
+
+ return ret != 0
+}
+
+func ControlTrace(hTrace TRACEHANDLE, lpSessionName string, props *EVENT_TRACE_PROPERTIES, dwControl uint32) (success bool, e error) {
+
+ ret, _, _ := procControlTrace.Call(
+ uintptr(unsafe.Pointer(hTrace)),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpSessionName))),
+ uintptr(unsafe.Pointer(props)),
+ uintptr(dwControl))
+
+ if ret == ERROR_SUCCESS {
+ return true, nil
+ }
+ e = errors.New(fmt.Sprintf("error: 0x%x", ret))
+ return
+}
+
+func StartTrace(lpSessionName string, props *EVENT_TRACE_PROPERTIES) (hTrace TRACEHANDLE, e error) {
+
+ ret, _, _ := procStartTrace.Call(
+ uintptr(unsafe.Pointer(&hTrace)),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpSessionName))),
+ uintptr(unsafe.Pointer(props)))
+
+ if ret == ERROR_SUCCESS {
+ return
+ }
+ e = errors.New(fmt.Sprintf("error: 0x%x", ret))
+ return
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa378863(v=vs.85).aspx
+func InitializeSecurityDescriptor(rev uint16) (pSecurityDescriptor *SECURITY_DESCRIPTOR, e error) {
+
+ pSecurityDescriptor = &SECURITY_DESCRIPTOR{}
+
+ ret, _, _ := procInitializeSecurityDescriptor.Call(
+ uintptr(unsafe.Pointer(pSecurityDescriptor)),
+ uintptr(rev),
+ )
+
+ if ret != 0 {
+ return
+ }
+ e = syscall.GetLastError()
+ return
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa379583(v=vs.85).aspx
+func SetSecurityDescriptorDacl(pSecurityDescriptor *SECURITY_DESCRIPTOR, pDacl *ACL) (e error) {
+
+ if pSecurityDescriptor == nil {
+ return errors.New("null descriptor")
+ }
+
+ var ret uintptr
+ if pDacl == nil {
+ ret, _, _ = procSetSecurityDescriptorDacl.Call(
+ uintptr(unsafe.Pointer(pSecurityDescriptor)),
+ uintptr(1), // DaclPresent
+ uintptr(0), // pDacl
+ uintptr(0), // DaclDefaulted
+ )
+ } else {
+ ret, _, _ = procSetSecurityDescriptorDacl.Call(
+ uintptr(unsafe.Pointer(pSecurityDescriptor)),
+ uintptr(1), // DaclPresent
+ uintptr(unsafe.Pointer(pDacl)),
+ uintptr(0), //DaclDefaulted
+ )
+ }
+
+ if ret != 0 {
+ return
+ }
+ e = syscall.GetLastError()
+ return
+}
diff --git a/vendor/github.com/AllenDang/w32/advapi32_constants.go b/vendor/github.com/AllenDang/w32/advapi32_constants.go
new file mode 100644
index 0000000..fa3c767
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/advapi32_constants.go
@@ -0,0 +1,300 @@
+package w32
+
+// Registry predefined keys
+const (
+ HKEY_CLASSES_ROOT HKEY = 0x80000000
+ HKEY_CURRENT_USER HKEY = 0x80000001
+ HKEY_LOCAL_MACHINE HKEY = 0x80000002
+ HKEY_USERS HKEY = 0x80000003
+ HKEY_PERFORMANCE_DATA HKEY = 0x80000004
+ HKEY_CURRENT_CONFIG HKEY = 0x80000005
+ HKEY_DYN_DATA HKEY = 0x80000006
+)
+
+// Registry Key Security and Access Rights
+const (
+ KEY_ALL_ACCESS = 0xF003F
+ KEY_CREATE_SUB_KEY = 0x0004
+ KEY_ENUMERATE_SUB_KEYS = 0x0008
+ KEY_NOTIFY = 0x0010
+ KEY_QUERY_VALUE = 0x0001
+ KEY_SET_VALUE = 0x0002
+ KEY_READ = 0x20019
+ KEY_WRITE = 0x20006
+)
+
+const (
+ NFR_ANSI = 1
+ NFR_UNICODE = 2
+ NF_QUERY = 3
+ NF_REQUERY = 4
+)
+
+// Registry value types
+const (
+ RRF_RT_REG_NONE = 0x00000001
+ RRF_RT_REG_SZ = 0x00000002
+ RRF_RT_REG_EXPAND_SZ = 0x00000004
+ RRF_RT_REG_BINARY = 0x00000008
+ RRF_RT_REG_DWORD = 0x00000010
+ RRF_RT_REG_MULTI_SZ = 0x00000020
+ RRF_RT_REG_QWORD = 0x00000040
+ RRF_RT_DWORD = (RRF_RT_REG_BINARY | RRF_RT_REG_DWORD)
+ RRF_RT_QWORD = (RRF_RT_REG_BINARY | RRF_RT_REG_QWORD)
+ RRF_RT_ANY = 0x0000ffff
+ RRF_NOEXPAND = 0x10000000
+ RRF_ZEROONFAILURE = 0x20000000
+ REG_PROCESS_APPKEY = 0x00000001
+ REG_MUI_STRING_TRUNCATE = 0x00000001
+)
+
+// Service Control Manager object specific access types
+const (
+ SC_MANAGER_CONNECT = 0x0001
+ SC_MANAGER_CREATE_SERVICE = 0x0002
+ SC_MANAGER_ENUMERATE_SERVICE = 0x0004
+ SC_MANAGER_LOCK = 0x0008
+ SC_MANAGER_QUERY_LOCK_STATUS = 0x0010
+ SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020
+ SC_MANAGER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG
+)
+
+// Service Types (Bit Mask)
+const (
+ SERVICE_KERNEL_DRIVER = 0x00000001
+ SERVICE_FILE_SYSTEM_DRIVER = 0x00000002
+ SERVICE_ADAPTER = 0x00000004
+ SERVICE_RECOGNIZER_DRIVER = 0x00000008
+ SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER
+ SERVICE_WIN32_OWN_PROCESS = 0x00000010
+ SERVICE_WIN32_SHARE_PROCESS = 0x00000020
+ SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS
+ SERVICE_INTERACTIVE_PROCESS = 0x00000100
+ SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS
+)
+
+// Service State -- for CurrentState
+const (
+ SERVICE_STOPPED = 0x00000001
+ SERVICE_START_PENDING = 0x00000002
+ SERVICE_STOP_PENDING = 0x00000003
+ SERVICE_RUNNING = 0x00000004
+ SERVICE_CONTINUE_PENDING = 0x00000005
+ SERVICE_PAUSE_PENDING = 0x00000006
+ SERVICE_PAUSED = 0x00000007
+)
+
+// Controls Accepted (Bit Mask)
+const (
+ SERVICE_ACCEPT_STOP = 0x00000001
+ SERVICE_ACCEPT_PAUSE_CONTINUE = 0x00000002
+ SERVICE_ACCEPT_SHUTDOWN = 0x00000004
+ SERVICE_ACCEPT_PARAMCHANGE = 0x00000008
+ SERVICE_ACCEPT_NETBINDCHANGE = 0x00000010
+ SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x00000020
+ SERVICE_ACCEPT_POWEREVENT = 0x00000040
+ SERVICE_ACCEPT_SESSIONCHANGE = 0x00000080
+ SERVICE_ACCEPT_PRESHUTDOWN = 0x00000100
+ SERVICE_ACCEPT_TIMECHANGE = 0x00000200
+ SERVICE_ACCEPT_TRIGGEREVENT = 0x00000400
+)
+
+// Service object specific access type
+const (
+ SERVICE_QUERY_CONFIG = 0x0001
+ SERVICE_CHANGE_CONFIG = 0x0002
+ SERVICE_QUERY_STATUS = 0x0004
+ SERVICE_ENUMERATE_DEPENDENTS = 0x0008
+ SERVICE_START = 0x0010
+ SERVICE_STOP = 0x0020
+ SERVICE_PAUSE_CONTINUE = 0x0040
+ SERVICE_INTERROGATE = 0x0080
+ SERVICE_USER_DEFINED_CONTROL = 0x0100
+
+ SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |
+ SERVICE_QUERY_CONFIG |
+ SERVICE_CHANGE_CONFIG |
+ SERVICE_QUERY_STATUS |
+ SERVICE_ENUMERATE_DEPENDENTS |
+ SERVICE_START |
+ SERVICE_STOP |
+ SERVICE_PAUSE_CONTINUE |
+ SERVICE_INTERROGATE |
+ SERVICE_USER_DEFINED_CONTROL
+)
+
+const (
+ KERNEL_LOGGER_NAME = "NT Kernel Logger"
+)
+
+// WNODE flags, for ETW (Event Tracing for Windows) / WMI
+const (
+ WNODE_FLAG_ALL_DATA = 0x00000001
+ WNODE_FLAG_SINGLE_INSTANCE = 0x00000002
+ WNODE_FLAG_SINGLE_ITEM = 0x00000004
+ WNODE_FLAG_EVENT_ITEM = 0x00000008
+ WNODE_FLAG_FIXED_INSTANCE_SIZE = 0x00000010
+ WNODE_FLAG_TOO_SMALL = 0x00000020
+ WNODE_FLAG_INSTANCES_SAME = 0x00000040
+ WNODE_FLAG_STATIC_INSTANCE_NAMES = 0x00000080
+ WNODE_FLAG_INTERNAL = 0x00000100
+ WNODE_FLAG_USE_TIMESTAMP = 0x00000200
+ WNODE_FLAG_PERSIST_EVENT = 0x00000400
+ WNODE_FLAG_EVENT_REFERENCE = 0x00002000
+ WNODE_FLAG_ANSI_INSTANCENAMES = 0x00004000
+ WNODE_FLAG_METHOD_ITEM = 0x00008000
+ WNODE_FLAG_PDO_INSTANCE_NAMES = 0x00010000
+ WNODE_FLAG_TRACED_GUID = 0x00020000
+ WNODE_FLAG_LOG_WNODE = 0x00040000
+ WNODE_FLAG_USE_GUID_PTR = 0x00080000
+ WNODE_FLAG_USE_MOF_PTR = 0x00100000
+ WNODE_FLAG_NO_HEADER = 0x00200000
+ WNODE_FLAG_SEVERITY_MASK = 0xff000000
+)
+
+// ETW flags and types etc
+const (
+ EVENT_TRACE_TYPE_INFO = 0x00
+ EVENT_TRACE_TYPE_START = 0x01
+ EVENT_TRACE_TYPE_END = 0x02
+ EVENT_TRACE_TYPE_STOP = 0x02
+ EVENT_TRACE_TYPE_DC_START = 0x03
+ EVENT_TRACE_TYPE_DC_END = 0x04
+ EVENT_TRACE_TYPE_EXTENSION = 0x05
+ EVENT_TRACE_TYPE_REPLY = 0x06
+ EVENT_TRACE_TYPE_DEQUEUE = 0x07
+ EVENT_TRACE_TYPE_RESUME = 0x07
+ EVENT_TRACE_TYPE_CHECKPOINT = 0x08
+ EVENT_TRACE_TYPE_SUSPEND = 0x08
+ EVENT_TRACE_TYPE_WINEVT_SEND = 0x09
+ EVENT_TRACE_TYPE_WINEVT_RECEIVE = 0XF0
+ TRACE_LEVEL_NONE = 0
+ TRACE_LEVEL_CRITICAL = 1
+ TRACE_LEVEL_FATAL = 1
+ TRACE_LEVEL_ERROR = 2
+ TRACE_LEVEL_WARNING = 3
+ TRACE_LEVEL_INFORMATION = 4
+ TRACE_LEVEL_VERBOSE = 5
+ TRACE_LEVEL_RESERVED6 = 6
+ TRACE_LEVEL_RESERVED7 = 7
+ TRACE_LEVEL_RESERVED8 = 8
+ TRACE_LEVEL_RESERVED9 = 9
+ EVENT_TRACE_TYPE_LOAD = 0x0A
+ EVENT_TRACE_TYPE_IO_READ = 0x0A
+ EVENT_TRACE_TYPE_IO_WRITE = 0x0B
+ EVENT_TRACE_TYPE_IO_READ_INIT = 0x0C
+ EVENT_TRACE_TYPE_IO_WRITE_INIT = 0x0D
+ EVENT_TRACE_TYPE_IO_FLUSH = 0x0E
+ EVENT_TRACE_TYPE_IO_FLUSH_INIT = 0x0F
+ EVENT_TRACE_TYPE_MM_TF = 0x0A
+ EVENT_TRACE_TYPE_MM_DZF = 0x0B
+ EVENT_TRACE_TYPE_MM_COW = 0x0C
+ EVENT_TRACE_TYPE_MM_GPF = 0x0D
+ EVENT_TRACE_TYPE_MM_HPF = 0x0E
+ EVENT_TRACE_TYPE_MM_AV = 0x0F
+ EVENT_TRACE_TYPE_SEND = 0x0A
+ EVENT_TRACE_TYPE_RECEIVE = 0x0B
+ EVENT_TRACE_TYPE_CONNECT = 0x0C
+ EVENT_TRACE_TYPE_DISCONNECT = 0x0D
+ EVENT_TRACE_TYPE_RETRANSMIT = 0x0E
+ EVENT_TRACE_TYPE_ACCEPT = 0x0F
+ EVENT_TRACE_TYPE_RECONNECT = 0x10
+ EVENT_TRACE_TYPE_CONNFAIL = 0x11
+ EVENT_TRACE_TYPE_COPY_TCP = 0x12
+ EVENT_TRACE_TYPE_COPY_ARP = 0x13
+ EVENT_TRACE_TYPE_ACKFULL = 0x14
+ EVENT_TRACE_TYPE_ACKPART = 0x15
+ EVENT_TRACE_TYPE_ACKDUP = 0x16
+ EVENT_TRACE_TYPE_GUIDMAP = 0x0A
+ EVENT_TRACE_TYPE_CONFIG = 0x0B
+ EVENT_TRACE_TYPE_SIDINFO = 0x0C
+ EVENT_TRACE_TYPE_SECURITY = 0x0D
+ EVENT_TRACE_TYPE_REGCREATE = 0x0A
+ EVENT_TRACE_TYPE_REGOPEN = 0x0B
+ EVENT_TRACE_TYPE_REGDELETE = 0x0C
+ EVENT_TRACE_TYPE_REGQUERY = 0x0D
+ EVENT_TRACE_TYPE_REGSETVALUE = 0x0E
+ EVENT_TRACE_TYPE_REGDELETEVALUE = 0x0F
+ EVENT_TRACE_TYPE_REGQUERYVALUE = 0x10
+ EVENT_TRACE_TYPE_REGENUMERATEKEY = 0x11
+ EVENT_TRACE_TYPE_REGENUMERATEVALUEKEY = 0x12
+ EVENT_TRACE_TYPE_REGQUERYMULTIPLEVALUE = 0x13
+ EVENT_TRACE_TYPE_REGSETINFORMATION = 0x14
+ EVENT_TRACE_TYPE_REGFLUSH = 0x15
+ EVENT_TRACE_TYPE_REGKCBCREATE = 0x16
+ EVENT_TRACE_TYPE_REGKCBDELETE = 0x17
+ EVENT_TRACE_TYPE_REGKCBRUNDOWNBEGIN = 0x18
+ EVENT_TRACE_TYPE_REGKCBRUNDOWNEND = 0x19
+ EVENT_TRACE_TYPE_REGVIRTUALIZE = 0x1A
+ EVENT_TRACE_TYPE_REGCLOSE = 0x1B
+ EVENT_TRACE_TYPE_REGSETSECURITY = 0x1C
+ EVENT_TRACE_TYPE_REGQUERYSECURITY = 0x1D
+ EVENT_TRACE_TYPE_REGCOMMIT = 0x1E
+ EVENT_TRACE_TYPE_REGPREPARE = 0x1F
+ EVENT_TRACE_TYPE_REGROLLBACK = 0x20
+ EVENT_TRACE_TYPE_REGMOUNTHIVE = 0x21
+ EVENT_TRACE_TYPE_CONFIG_CPU = 0x0A
+ EVENT_TRACE_TYPE_CONFIG_PHYSICALDISK = 0x0B
+ EVENT_TRACE_TYPE_CONFIG_LOGICALDISK = 0x0C
+ EVENT_TRACE_TYPE_CONFIG_NIC = 0x0D
+ EVENT_TRACE_TYPE_CONFIG_VIDEO = 0x0E
+ EVENT_TRACE_TYPE_CONFIG_SERVICES = 0x0F
+ EVENT_TRACE_TYPE_CONFIG_POWER = 0x10
+ EVENT_TRACE_TYPE_CONFIG_NETINFO = 0x11
+ EVENT_TRACE_TYPE_CONFIG_IRQ = 0x15
+ EVENT_TRACE_TYPE_CONFIG_PNP = 0x16
+ EVENT_TRACE_TYPE_CONFIG_IDECHANNEL = 0x17
+ EVENT_TRACE_TYPE_CONFIG_PLATFORM = 0x19
+ EVENT_TRACE_FLAG_PROCESS = 0x00000001
+ EVENT_TRACE_FLAG_THREAD = 0x00000002
+ EVENT_TRACE_FLAG_IMAGE_LOAD = 0x00000004
+ EVENT_TRACE_FLAG_DISK_IO = 0x00000100
+ EVENT_TRACE_FLAG_DISK_FILE_IO = 0x00000200
+ EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS = 0x00001000
+ EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS = 0x00002000
+ EVENT_TRACE_FLAG_NETWORK_TCPIP = 0x00010000
+ EVENT_TRACE_FLAG_REGISTRY = 0x00020000
+ EVENT_TRACE_FLAG_DBGPRINT = 0x00040000
+ EVENT_TRACE_FLAG_PROCESS_COUNTERS = 0x00000008
+ EVENT_TRACE_FLAG_CSWITCH = 0x00000010
+ EVENT_TRACE_FLAG_DPC = 0x00000020
+ EVENT_TRACE_FLAG_INTERRUPT = 0x00000040
+ EVENT_TRACE_FLAG_SYSTEMCALL = 0x00000080
+ EVENT_TRACE_FLAG_DISK_IO_INIT = 0x00000400
+ EVENT_TRACE_FLAG_ALPC = 0x00100000
+ EVENT_TRACE_FLAG_SPLIT_IO = 0x00200000
+ EVENT_TRACE_FLAG_DRIVER = 0x00800000
+ EVENT_TRACE_FLAG_PROFILE = 0x01000000
+ EVENT_TRACE_FLAG_FILE_IO = 0x02000000
+ EVENT_TRACE_FLAG_FILE_IO_INIT = 0x04000000
+ EVENT_TRACE_FLAG_DISPATCHER = 0x00000800
+ EVENT_TRACE_FLAG_VIRTUAL_ALLOC = 0x00004000
+ EVENT_TRACE_FLAG_EXTENSION = 0x80000000
+ EVENT_TRACE_FLAG_FORWARD_WMI = 0x40000000
+ EVENT_TRACE_FLAG_ENABLE_RESERVE = 0x20000000
+ EVENT_TRACE_FILE_MODE_NONE = 0x00000000
+ EVENT_TRACE_FILE_MODE_SEQUENTIAL = 0x00000001
+ EVENT_TRACE_FILE_MODE_CIRCULAR = 0x00000002
+ EVENT_TRACE_FILE_MODE_APPEND = 0x00000004
+ EVENT_TRACE_REAL_TIME_MODE = 0x00000100
+ EVENT_TRACE_DELAY_OPEN_FILE_MODE = 0x00000200
+ EVENT_TRACE_BUFFERING_MODE = 0x00000400
+ EVENT_TRACE_PRIVATE_LOGGER_MODE = 0x00000800
+ EVENT_TRACE_ADD_HEADER_MODE = 0x00001000
+ EVENT_TRACE_USE_GLOBAL_SEQUENCE = 0x00004000
+ EVENT_TRACE_USE_LOCAL_SEQUENCE = 0x00008000
+ EVENT_TRACE_RELOG_MODE = 0x00010000
+ EVENT_TRACE_USE_PAGED_MEMORY = 0x01000000
+ EVENT_TRACE_FILE_MODE_NEWFILE = 0x00000008
+ EVENT_TRACE_FILE_MODE_PREALLOCATE = 0x00000020
+ EVENT_TRACE_NONSTOPPABLE_MODE = 0x00000040
+ EVENT_TRACE_SECURE_MODE = 0x00000080
+ EVENT_TRACE_USE_KBYTES_FOR_SIZE = 0x00002000
+ EVENT_TRACE_PRIVATE_IN_PROC = 0x00020000
+ EVENT_TRACE_MODE_RESERVED = 0x00100000
+ EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING = 0x10000000
+ EVENT_TRACE_CONTROL_QUERY = 0
+ EVENT_TRACE_CONTROL_STOP = 1
+ EVENT_TRACE_CONTROL_UPDATE = 2
+ EVENT_TRACE_CONTROL_FLUSH = 3
+)
diff --git a/vendor/github.com/AllenDang/w32/advapi32_test.go b/vendor/github.com/AllenDang/w32/advapi32_test.go
new file mode 100644
index 0000000..72a9198
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/advapi32_test.go
@@ -0,0 +1,41 @@
+package w32
+
+import (
+ "testing"
+)
+
+func TestInitializeSecurityDescriptor(t *testing.T) {
+ sd, err := InitializeSecurityDescriptor(1)
+ if err != nil {
+ t.Errorf("Failed: %v", err)
+ }
+ t.Logf("SD:\n%#v\n", *sd)
+}
+
+func TestSetSecurityDescriptorDacl(t *testing.T) {
+
+ sd, err := InitializeSecurityDescriptor(1)
+ if err != nil {
+ t.Errorf("Failed to initialize: %v", err)
+ }
+ err = SetSecurityDescriptorDacl(sd, nil)
+ if err != nil {
+ t.Errorf("Failed to set NULL DACL: %v", err)
+ }
+ t.Logf("[OK] Set NULL DACL")
+
+ empty := &ACL{
+ AclRevision: 4,
+ Sbz1: 0,
+ AclSize: 4,
+ AceCount: 0,
+ Sbz2: 0,
+ }
+ err = SetSecurityDescriptorDacl(sd, empty)
+ if err != nil {
+ t.Errorf("Failed to set empty DACL: %v", err)
+ }
+ t.Logf("[OK] Set empty DACL")
+ t.Logf("SD:\n%#v\n", *sd)
+
+}
diff --git a/vendor/github.com/AllenDang/w32/advapi32_typedef.go b/vendor/github.com/AllenDang/w32/advapi32_typedef.go
new file mode 100644
index 0000000..3a4308c
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/advapi32_typedef.go
@@ -0,0 +1,122 @@
+package w32
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa374931(v=vs.85).aspx
+type ACL struct {
+ AclRevision byte
+ Sbz1 byte
+ AclSize uint16
+ AceCount uint16
+ Sbz2 uint16
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa379561(v=vs.85).aspx
+
+type SECURITY_DESCRIPTOR_CONTROL uint16
+
+type SECURITY_DESCRIPTOR struct {
+ Revision byte
+ Sbz1 byte
+ Control SECURITY_DESCRIPTOR_CONTROL
+ Owner uintptr
+ Group uintptr
+ Sacl *ACL
+ Dacl *ACL
+}
+
+type SID_IDENTIFIER_AUTHORITY struct {
+ Value [6]byte
+}
+
+// typedef struct _SID // 4 elements, 0xC bytes (sizeof)
+// {
+// /*0x000*/ UINT8 Revision;
+// /*0x001*/ UINT8 SubAuthorityCount;
+// /*0x002*/ struct _SID_IDENTIFIER_AUTHORITY IdentifierAuthority; // 1 elements, 0x6 bytes (sizeof)
+// /*0x008*/ ULONG32 SubAuthority[1];
+// }SID, *PSID;
+type SID struct {
+ Revision byte
+ SubAuthorityCount byte
+ IdentifierAuthority SID_IDENTIFIER_AUTHORITY
+ SubAuthority uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363646.aspx
+type EVENTLOGRECORD struct {
+ Length uint32
+ Reserved uint32
+ RecordNumber uint32
+ TimeGenerated uint32
+ TimeWritten uint32
+ EventID uint32
+ EventType uint16
+ NumStrings uint16
+ EventCategory uint16
+ ReservedFlags uint16
+ ClosingRecordNumber uint32
+ StringOffset uint32
+ UserSidLength uint32
+ UserSidOffset uint32
+ DataLength uint32
+ DataOffset uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms685996.aspx
+type SERVICE_STATUS struct {
+ DwServiceType uint32
+ DwCurrentState uint32
+ DwControlsAccepted uint32
+ DwWin32ExitCode uint32
+ DwServiceSpecificExitCode uint32
+ DwCheckPoint uint32
+ DwWaitHint uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa364160(v=vs.85).aspx
+type WNODE_HEADER struct {
+ BufferSize uint32
+ ProviderId uint32
+ HistoricalContext uint64
+ KernelHandle HANDLE
+ Guid GUID
+ ClientContext uint32
+ Flags uint32
+}
+
+// These partially compensate for the anonymous unions we removed, but there
+// are no setters.
+func (w WNODE_HEADER) TimeStamp() uint64 {
+ // TODO: Cast to the stupid LARGE_INTEGER struct which is, itself, nasty
+ // and union-y
+ return uint64(w.KernelHandle)
+}
+
+func (w WNODE_HEADER) Version() uint32 {
+ return uint32(w.HistoricalContext >> 32)
+}
+
+func (w WNODE_HEADER) Linkage() uint32 {
+ return uint32(w.HistoricalContext)
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363784(v=vs.85).aspx
+type EVENT_TRACE_PROPERTIES struct {
+ Wnode WNODE_HEADER
+ BufferSize uint32
+ MinimumBuffers uint32
+ MaximumBuffers uint32
+ MaximumFileSize uint32
+ LogFileMode uint32
+ FlushTimer uint32
+ EnableFlags uint32
+ AgeLimit int32
+ NumberOfBuffers uint32
+ FreeBuffers uint32
+ EventsLost uint32
+ BuffersWritten uint32
+ LogBuffersLost uint32
+ RealTimeBuffersLost uint32
+ LoggerThreadId HANDLE
+ LogFileNameOffset uint32
+ LoggerNameOffset uint32
+}
diff --git a/vendor/github.com/AllenDang/w32/alpc.go b/vendor/github.com/AllenDang/w32/alpc.go
new file mode 100644
index 0000000..408d47e
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/alpc.go
@@ -0,0 +1,304 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "fmt"
+ // "github.com/davecgh/go-spew/spew"
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modntdll = syscall.NewLazyDLL("ntdll.dll")
+
+ procAlpcGetMessageAttribute = modntdll.NewProc("AlpcGetMessageAttribute")
+ procNtAlpcAcceptConnectPort = modntdll.NewProc("NtAlpcAcceptConnectPort")
+ procNtAlpcCancelMessage = modntdll.NewProc("NtAlpcCancelMessage")
+ procNtAlpcConnectPort = modntdll.NewProc("NtAlpcConnectPort")
+ procNtAlpcCreatePort = modntdll.NewProc("NtAlpcCreatePort")
+ procNtAlpcDisconnectPort = modntdll.NewProc("NtAlpcDisconnectPort")
+ procNtAlpcSendWaitReceivePort = modntdll.NewProc("NtAlpcSendWaitReceivePort")
+ procRtlCreateUnicodeStringFromAsciiz = modntdll.NewProc("RtlCreateUnicodeStringFromAsciiz")
+)
+
+//func RtlCreateUnicodeStringFromAsciiz(s string) (us UNICODE_STRING, e error) {
+//
+// cs := C.CString(s)
+// defer C.free(unsafe.Pointer(cs))
+//
+// ret, _, lastErr := procRtlCreateUnicodeStringFromAsciiz.Call(
+// uintptr(unsafe.Pointer(&us)),
+// uintptr(unsafe.Pointer(cs)),
+// )
+//
+// if ret != 1 { // ret is a BOOL ( I think )
+// e = lastErr
+// }
+//
+// return
+//}
+
+//func newUnicodeString(s string) (us UNICODE_STRING, e error) {
+// // TODO probably not the most efficient way to do this, but I couldn't
+// // work out how to manually initialize the UNICODE_STRING struct in a way
+// // that the ALPC subsystem liked.
+// us, e = RtlCreateUnicodeStringFromAsciiz(s)
+// return
+//}
+
+// (this is a macro)
+// VOID InitializeObjectAttributes(
+// [out] POBJECT_ATTRIBUTES InitializedAttributes,
+// [in] PUNICODE_STRING ObjectName,
+// [in] ULONG Attributes,
+// [in] HANDLE RootDirectory,
+// [in, optional] PSECURITY_DESCRIPTOR SecurityDescriptor
+// )
+//func InitializeObjectAttributes(
+// name string,
+// attributes uint32,
+// rootDir HANDLE,
+// pSecurityDescriptor *SECURITY_DESCRIPTOR,
+//) (oa OBJECT_ATTRIBUTES, e error) {
+//
+// oa = OBJECT_ATTRIBUTES{
+// RootDirectory: rootDir,
+// Attributes: attributes,
+// SecurityDescriptor: pSecurityDescriptor,
+// }
+// oa.Length = uint32(unsafe.Sizeof(oa))
+//
+// if len(name) > 0 {
+// us, err := newUnicodeString(name)
+// if err != nil {
+// e = err
+// return
+// }
+// oa.ObjectName = &us
+// }
+//
+// return
+//}
+
+// NTSTATUS
+// NtAlpcCreatePort(
+// __out PHANDLE PortHandle,
+// __in POBJECT_ATTRIBUTES ObjectAttributes,
+// __in_opt PALPC_PORT_ATTRIBUTES PortAttributes
+// );
+func NtAlpcCreatePort(pObjectAttributes *OBJECT_ATTRIBUTES, pPortAttributes *ALPC_PORT_ATTRIBUTES) (hPort HANDLE, e error) {
+
+ ret, _, _ := procNtAlpcCreatePort.Call(
+ uintptr(unsafe.Pointer(&hPort)),
+ uintptr(unsafe.Pointer(pObjectAttributes)),
+ uintptr(unsafe.Pointer(pPortAttributes)),
+ )
+
+ if ret != ERROR_SUCCESS {
+ return hPort, fmt.Errorf("0x%x", ret)
+ }
+
+ return
+}
+
+// NTSTATUS
+// NtAlpcConnectPort(
+// __out PHANDLE PortHandle,
+// __in PUNICODE_STRING PortName,
+// __in POBJECT_ATTRIBUTES ObjectAttributes,
+// __in_opt PALPC_PORT_ATTRIBUTES PortAttributes,
+// __in ULONG Flags,
+// __in_opt PSID RequiredServerSid,
+// __inout PPORT_MESSAGE ConnectionMessage,
+// __inout_opt PULONG BufferLength,
+// __inout_opt PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,
+// __inout_opt PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,
+// __in_opt PLARGE_INTEGER Timeout
+// );
+//func NtAlpcConnectPort(
+// destPort string,
+// pClientObjAttrs *OBJECT_ATTRIBUTES,
+// pClientAlpcPortAttrs *ALPC_PORT_ATTRIBUTES,
+// flags uint32,
+// pRequiredServerSid *SID,
+// pConnMsg *AlpcShortMessage,
+// pBufLen *uint32,
+// pOutMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
+// pInMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
+// timeout *int64,
+//) (hPort HANDLE, e error) {
+//
+// destPortU, e := newUnicodeString(destPort)
+// if e != nil {
+// return
+// }
+//
+// ret, _, _ := procNtAlpcConnectPort.Call(
+// uintptr(unsafe.Pointer(&hPort)),
+// uintptr(unsafe.Pointer(&destPortU)),
+// uintptr(unsafe.Pointer(pClientObjAttrs)),
+// uintptr(unsafe.Pointer(pClientAlpcPortAttrs)),
+// uintptr(flags),
+// uintptr(unsafe.Pointer(pRequiredServerSid)),
+// uintptr(unsafe.Pointer(pConnMsg)),
+// uintptr(unsafe.Pointer(pBufLen)),
+// uintptr(unsafe.Pointer(pOutMsgAttrs)),
+// uintptr(unsafe.Pointer(pInMsgAttrs)),
+// uintptr(unsafe.Pointer(timeout)),
+// )
+//
+// if ret != ERROR_SUCCESS {
+// e = fmt.Errorf("0x%x", ret)
+// }
+// return
+//}
+
+// NTSTATUS
+// NtAlpcAcceptConnectPort(
+// __out PHANDLE PortHandle,
+// __in HANDLE ConnectionPortHandle,
+// __in ULONG Flags,
+// __in POBJECT_ATTRIBUTES ObjectAttributes,
+// __in PALPC_PORT_ATTRIBUTES PortAttributes,
+// __in_opt PVOID PortContext,
+// __in PPORT_MESSAGE ConnectionRequest,
+// __inout_opt PALPC_MESSAGE_ATTRIBUTES ConnectionMessageAttributes,
+// __in BOOLEAN AcceptConnection
+// );
+func NtAlpcAcceptConnectPort(
+ hSrvConnPort HANDLE,
+ flags uint32,
+ pObjAttr *OBJECT_ATTRIBUTES,
+ pPortAttr *ALPC_PORT_ATTRIBUTES,
+ pContext *AlpcPortContext,
+ pConnReq *AlpcShortMessage,
+ pConnMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
+ accept uintptr,
+) (hPort HANDLE, e error) {
+
+ ret, _, _ := procNtAlpcAcceptConnectPort.Call(
+ uintptr(unsafe.Pointer(&hPort)),
+ uintptr(hSrvConnPort),
+ uintptr(flags),
+ uintptr(unsafe.Pointer(pObjAttr)),
+ uintptr(unsafe.Pointer(pPortAttr)),
+ uintptr(unsafe.Pointer(pContext)),
+ uintptr(unsafe.Pointer(pConnReq)),
+ uintptr(unsafe.Pointer(pConnMsgAttrs)),
+ accept,
+ )
+
+ if ret != ERROR_SUCCESS {
+ e = fmt.Errorf("0x%x", ret)
+ }
+ return
+}
+
+// NTSTATUS
+// NtAlpcSendWaitReceivePort(
+// __in HANDLE PortHandle,
+// __in ULONG Flags,
+// __in_opt PPORT_MESSAGE SendMessage,
+// __in_opt PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes,
+// __inout_opt PPORT_MESSAGE ReceiveMessage,
+// __inout_opt PULONG BufferLength,
+// __inout_opt PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes,
+// __in_opt PLARGE_INTEGER Timeout
+// );
+func NtAlpcSendWaitReceivePort(
+ hPort HANDLE,
+ flags uint32,
+ sendMsg *AlpcShortMessage, // Should actually point to PORT_MESSAGE + payload
+ sendMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
+ recvMsg *AlpcShortMessage,
+ recvBufLen *uint32,
+ recvMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
+ timeout *int64, // use native int64
+) (e error) {
+
+ ret, _, _ := procNtAlpcSendWaitReceivePort.Call(
+ uintptr(hPort),
+ uintptr(flags),
+ uintptr(unsafe.Pointer(sendMsg)),
+ uintptr(unsafe.Pointer(sendMsgAttrs)),
+ uintptr(unsafe.Pointer(recvMsg)),
+ uintptr(unsafe.Pointer(recvBufLen)),
+ uintptr(unsafe.Pointer(recvMsgAttrs)),
+ uintptr(unsafe.Pointer(timeout)),
+ )
+
+ if ret != ERROR_SUCCESS {
+ e = fmt.Errorf("0x%x", ret)
+ }
+ return
+}
+
+// NTSYSAPI
+// PVOID
+// NTAPI
+// AlpcGetMessageAttribute(
+// __in PALPC_MESSAGE_ATTRIBUTES Buffer,
+// __in ULONG AttributeFlag
+// );
+
+// This basically returns a pointer to the correct struct for whichever
+// message attribute you asked for. In Go terms, it returns unsafe.Pointer
+// which you should then cast. Example:
+
+// ptr := AlpcGetMessageAttribute(&recvMsgAttrs, ALPC_MESSAGE_CONTEXT_ATTRIBUTE)
+// if ptr != nil {
+// context := (*ALPC_CONTEXT_ATTR)(ptr)
+// }
+func AlpcGetMessageAttribute(buf *ALPC_MESSAGE_ATTRIBUTES, attr uint32) unsafe.Pointer {
+
+ ret, _, _ := procAlpcGetMessageAttribute.Call(
+ uintptr(unsafe.Pointer(buf)),
+ uintptr(attr),
+ )
+ return unsafe.Pointer(ret)
+}
+
+// NTSYSCALLAPI
+// NTSTATUS
+// NTAPI
+// NtAlpcCancelMessage(
+// __in HANDLE PortHandle,
+// __in ULONG Flags,
+// __in PALPC_CONTEXT_ATTR MessageContext
+// );
+func NtAlpcCancelMessage(hPort HANDLE, flags uint32, pMsgContext *ALPC_CONTEXT_ATTR) (e error) {
+
+ ret, _, _ := procNtAlpcCancelMessage.Call(
+ uintptr(hPort),
+ uintptr(flags),
+ uintptr(unsafe.Pointer(pMsgContext)),
+ )
+
+ if ret != ERROR_SUCCESS {
+ e = fmt.Errorf("0x%x", ret)
+ }
+ return
+}
+
+// NTSYSCALLAPI
+// NTSTATUS
+// NTAPI
+// NtAlpcDisconnectPort(
+// __in HANDLE PortHandle,
+// __in ULONG Flags
+// );
+func NtAlpcDisconnectPort(hPort HANDLE, flags uint32) (e error) {
+
+ ret, _, _ := procNtAlpcDisconnectPort.Call(
+ uintptr(hPort),
+ uintptr(flags),
+ )
+
+ if ret != ERROR_SUCCESS {
+ e = fmt.Errorf("0x%x", ret)
+ }
+ return
+}
diff --git a/vendor/github.com/AllenDang/w32/alpc_constants.go b/vendor/github.com/AllenDang/w32/alpc_constants.go
new file mode 100644
index 0000000..82d9d2e
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/alpc_constants.go
@@ -0,0 +1,64 @@
+package w32
+
+const (
+ ALPC_PORFLG_ALLOW_LPC_REQUESTS = 0x20000
+ ALPC_PORFLG_SYSTEM_PROCESS = 0x100000
+ ALPC_PORFLG_WAITABLE_PORT = 0x40000
+)
+
+const (
+ ALPC_MSGFLG_REPLY_MESSAGE = 0x1
+ ALPC_MSGFLG_LPC_MODE = 0x2 // ?
+ ALPC_MSGFLG_RELEASE_MESSAGE = 0x10000 // dbg
+ ALPC_MSGFLG_SYNC_REQUEST = 0x20000 // dbg
+ ALPC_MSGFLG_WAIT_USER_MODE = 0x100000
+ ALPC_MSGFLG_WAIT_ALERTABLE = 0x200000
+ ALPC_MSGFLG_WOW64_CALL = 0x80000000 // dbg
+)
+const (
+ ALPC_MESSAGE_SECURITY_ATTRIBUTE = 0x80000000
+ ALPC_MESSAGE_VIEW_ATTRIBUTE = 0x40000000
+ ALPC_MESSAGE_CONTEXT_ATTRIBUTE = 0x20000000
+ ALPC_MESSAGE_HANDLE_ATTRIBUTE = 0x10000000
+)
+
+const (
+ OBJ_INHERIT = 0x00000002
+ OBJ_PERMANENT = 0x00000010
+ OBJ_EXCLUSIVE = 0x00000020
+ OBJ_CASE_INSENSITIVE = 0x00000040
+ OBJ_OPENIF = 0x00000080
+ OBJ_OPENLINK = 0x00000100
+ OBJ_KERNEL_HANDLE = 0x00000200
+)
+
+const (
+ LPC_REQUEST = 1
+ LPC_REPLY = 2
+ LPC_DATAGRAM = 3
+ LPC_LOST_REPLY = 4
+ LPC_PORT_CLOSED = 5
+ LPC_CLIENT_DIED = 6
+ LPC_EXCEPTION = 7
+ LPC_DEBUG_EVENT = 8
+ LPC_ERROR_EVENT = 9
+ LPC_CONNECTION_REQUEST = 10
+ LPC_CONTINUATION_REQUIRED = 0x2000
+)
+
+const (
+ SecurityAnonymous uint32 = 1
+ SecurityIdentification uint32 = 2
+ SecurityImpersonation uint32 = 3
+ SecurityDelegation uint32 = 4
+)
+
+const (
+ SECURITY_DYNAMIC_TRACKING byte = 1
+ SECURITY_STATIC_TRACKING byte = 0
+)
+
+const (
+ ALPC_SYNC_OBJECT_TYPE uint32 = 2
+ ALPC_THREAD_OBJECT_TYPE uint32 = 4
+)
diff --git a/vendor/github.com/AllenDang/w32/alpc_test.go b/vendor/github.com/AllenDang/w32/alpc_test.go
new file mode 100644
index 0000000..6d1c7d4
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/alpc_test.go
@@ -0,0 +1,137 @@
+package w32
+
+import (
+ "testing"
+)
+
+var testPortName = "\\TestAlpcPort"
+
+var basicPortAttr = ALPC_PORT_ATTRIBUTES{
+ MaxMessageLength: uint64(SHORT_MESSAGE_MAX_SIZE),
+ SecurityQos: SECURITY_QUALITY_OF_SERVICE{
+ Length: SECURITY_QOS_SIZE,
+ ContextTrackingMode: SECURITY_DYNAMIC_TRACKING,
+ EffectiveOnly: 1,
+ ImpersonationLevel: SecurityAnonymous,
+ },
+ Flags: ALPC_PORFLG_ALLOW_LPC_REQUESTS,
+ DupObjectTypes: ALPC_SYNC_OBJECT_TYPE,
+}
+
+func ObjectAttributes(name string) (oa OBJECT_ATTRIBUTES, e error) {
+
+ sd, e := InitializeSecurityDescriptor(1)
+ if e != nil {
+ return
+ }
+
+ e = SetSecurityDescriptorDacl(sd, nil)
+ if e != nil {
+ return
+ }
+
+ oa, e = InitializeObjectAttributes(name, 0, 0, sd)
+ return
+}
+
+func Send(
+ hPort HANDLE,
+ msg *AlpcShortMessage,
+ flags uint32,
+ pMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
+ timeout *int64,
+) (e error) {
+
+ e = NtAlpcSendWaitReceivePort(hPort, flags, msg, pMsgAttrs, nil, nil, nil, timeout)
+ return
+
+}
+
+func Recv(
+ hPort HANDLE,
+ pMsg *AlpcShortMessage,
+ pMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
+ timeout *int64,
+) (bufLen uint32, e error) {
+
+ bufLen = uint32(pMsg.TotalLength)
+ e = NtAlpcSendWaitReceivePort(hPort, 0, nil, nil, pMsg, &bufLen, pMsgAttrs, timeout)
+ return
+
+}
+
+// Convenience method to create an ALPC port with a NULL DACL. Requires an
+// absolute port name ( where / is the root of the kernel object directory )
+func CreatePort(name string) (hPort HANDLE, e error) {
+
+ oa, e := ObjectAttributes(name)
+ if e != nil {
+ return
+ }
+
+ hPort, e = NtAlpcCreatePort(&oa, &basicPortAttr)
+
+ return
+}
+
+func ConnectPort(serverName, clientName string, pConnMsg *AlpcShortMessage) (hPort HANDLE, e error) {
+
+ oa, e := InitializeObjectAttributes(clientName, 0, 0, nil)
+ if e != nil {
+ return
+ }
+
+ hPort, e = NtAlpcConnectPort(
+ serverName,
+ &oa,
+ &basicPortAttr,
+ ALPC_PORFLG_ALLOW_LPC_REQUESTS,
+ nil,
+ pConnMsg,
+ nil,
+ nil,
+ nil,
+ nil,
+ )
+
+ return
+}
+
+func Accept(
+ hSrv HANDLE,
+ context *AlpcPortContext,
+ pConnReq *AlpcShortMessage,
+ accept bool,
+) (hPort HANDLE, e error) {
+
+ oa, _ := InitializeObjectAttributes("", 0, 0, nil)
+
+ var accepted uintptr
+ if accept {
+ accepted++
+ }
+
+ hPort, e = NtAlpcAcceptConnectPort(
+ hSrv,
+ 0,
+ &oa,
+ &basicPortAttr,
+ context,
+ pConnReq,
+ nil,
+ accepted,
+ )
+
+ return
+}
+
+func TestNtAlpcCreatePort(t *testing.T) {
+
+ hPort, err := CreatePort(testPortName)
+
+ if err != nil {
+ t.Errorf("failed to create ALPC port %v: %v", testPortName, err)
+ } else {
+ t.Logf("[OK] Created ALPC port %v with handle 0x%x", testPortName, hPort)
+ }
+}
diff --git a/vendor/github.com/AllenDang/w32/alpc_typedef.go b/vendor/github.com/AllenDang/w32/alpc_typedef.go
new file mode 100644
index 0000000..52b35c9
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/alpc_typedef.go
@@ -0,0 +1,181 @@
+package w32
+
+import (
+ "errors"
+)
+
+// nt!_ALPC_MESSAGE_ATTRIBUTES
+// +0x000 AllocatedAttributes : Uint4B
+// +0x004 ValidAttributes : Uint4B
+type ALPC_MESSAGE_ATTRIBUTES struct {
+ AllocatedAttributes uint32
+ ValidAttributes uint32
+}
+
+type ALPC_CONTEXT_ATTR struct {
+ PortContext *AlpcPortContext
+ MessageContext uintptr
+ Sequence uint32
+ MessageId uint32
+ CallbackId uint32
+}
+
+type ALPC_HANDLE_ATTR struct {
+ Flags uint32
+ Handle HANDLE
+ ObjectType uint32
+ DesiredAccess uint32
+}
+
+// nt!_CLIENT_ID
+// +0x000 UniqueProcess : Ptr64 Void
+// +0x008 UniqueThread : Ptr64 Void
+type CLIENT_ID struct {
+ UniqueProcess uintptr
+ UniqueThread uintptr
+}
+
+// nt!_UNICODE_STRING
+// +0x000 Length : Uint2B
+// +0x002 MaximumLength : Uint2B
+// +0x008 Buffer : Ptr64 Uint2B
+type UNICODE_STRING struct {
+ Length uint16
+ MaximumLength uint16
+ _ [4]byte // align to 0x08
+ Buffer *uint16
+}
+
+// nt!_OBJECT_ATTRIBUTES
+// +0x000 Length : Uint4B
+// +0x008 RootDirectory : Ptr64 Void
+// +0x010 ObjectName : Ptr64 _UNICODE_STRING
+// +0x018 Attributes : Uint4B
+// +0x020 SecurityDescriptor : Ptr64 Void
+// +0x028 SecurityQualityOfService : Ptr64 Void
+type OBJECT_ATTRIBUTES struct {
+ Length uint32
+ _ [4]byte // align to 0x08
+ RootDirectory HANDLE
+ ObjectName *UNICODE_STRING
+ Attributes uint32
+ _ [4]byte // align to 0x20
+ SecurityDescriptor *SECURITY_DESCRIPTOR
+ SecurityQualityOfService *SECURITY_QUALITY_OF_SERVICE
+}
+
+// cf: http://j00ru.vexillium.org/?p=502 for legacy RPC
+// nt!_PORT_MESSAGE
+// +0x000 u1 : <unnamed-tag>
+// +0x004 u2 : <unnamed-tag>
+// +0x008 ClientId : _CLIENT_ID
+// +0x008 DoNotUseThisField : Float
+// +0x018 MessageId : Uint4B
+// +0x020 ClientViewSize : Uint8B
+// +0x020 CallbackId : Uint4B
+type PORT_MESSAGE struct {
+ DataLength uint16 // These are the two unnamed unions
+ TotalLength uint16 // without Length and ZeroInit
+ Type uint16
+ DataInfoOffset uint16
+ ClientId CLIENT_ID
+ MessageId uint32
+ _ [4]byte // align up to 0x20
+ ClientViewSize uint64
+}
+
+func (pm PORT_MESSAGE) CallbackId() uint32 {
+ return uint32(pm.ClientViewSize >> 32)
+}
+
+func (pm PORT_MESSAGE) DoNotUseThisField() float64 {
+ panic("WE TOLD YOU NOT TO USE THIS FIELD")
+}
+
+const PORT_MESSAGE_SIZE = 0x28
+
+// http://www.nirsoft.net/kernel_struct/vista/SECURITY_QUALITY_OF_SERVICE.html
+type SECURITY_QUALITY_OF_SERVICE struct {
+ Length uint32
+ ImpersonationLevel uint32
+ ContextTrackingMode byte
+ EffectiveOnly byte
+ _ [2]byte // align to 12 bytes
+}
+
+const SECURITY_QOS_SIZE = 12
+
+// nt!_ALPC_PORT_ATTRIBUTES
+// +0x000 Flags : Uint4B
+// +0x004 SecurityQos : _SECURITY_QUALITY_OF_SERVICE
+// +0x010 MaxMessageLength : Uint8B
+// +0x018 MemoryBandwidth : Uint8B
+// +0x020 MaxPoolUsage : Uint8B
+// +0x028 MaxSectionSize : Uint8B
+// +0x030 MaxViewSize : Uint8B
+// +0x038 MaxTotalSectionSize : Uint8B
+// +0x040 DupObjectTypes : Uint4B
+// +0x044 Reserved : Uint4B
+type ALPC_PORT_ATTRIBUTES struct {
+ Flags uint32
+ SecurityQos SECURITY_QUALITY_OF_SERVICE
+ MaxMessageLength uint64 // must be filled out
+ MemoryBandwidth uint64
+ MaxPoolUsage uint64
+ MaxSectionSize uint64
+ MaxViewSize uint64
+ MaxTotalSectionSize uint64
+ DupObjectTypes uint32
+ Reserved uint32
+}
+
+const SHORT_MESSAGE_MAX_SIZE uint16 = 65535 // MAX_USHORT
+const SHORT_MESSAGE_MAX_PAYLOAD uint16 = SHORT_MESSAGE_MAX_SIZE - PORT_MESSAGE_SIZE
+
+// LPC uses the first 4 bytes of the payload as an LPC Command, but this is
+// NOT represented here, to allow the use of raw ALPC. For legacy LPC, callers
+// must include the command as part of their payload.
+type AlpcShortMessage struct {
+ PORT_MESSAGE
+ Data [SHORT_MESSAGE_MAX_PAYLOAD]byte
+}
+
+func NewAlpcShortMessage() AlpcShortMessage {
+ sm := AlpcShortMessage{}
+ sm.TotalLength = SHORT_MESSAGE_MAX_SIZE
+ return sm
+}
+
+func (sm *AlpcShortMessage) SetData(d []byte) (e error) {
+
+ copy(sm.Data[:], d)
+ if len(d) > int(SHORT_MESSAGE_MAX_PAYLOAD) {
+ e = errors.New("data too big - truncated")
+ sm.DataLength = SHORT_MESSAGE_MAX_PAYLOAD
+ sm.TotalLength = SHORT_MESSAGE_MAX_SIZE
+ return
+ }
+ sm.TotalLength = uint16(PORT_MESSAGE_SIZE + len(d))
+ sm.DataLength = uint16(len(d))
+ return
+
+}
+
+// TODO - is this still useful?
+func (sm *AlpcShortMessage) GetData() []byte {
+ if int(sm.DataLength) > int(SHORT_MESSAGE_MAX_PAYLOAD) {
+ return sm.Data[:] // truncate
+ }
+ return sm.Data[:sm.DataLength]
+}
+
+func (sm *AlpcShortMessage) Reset() {
+ // zero the PORT_MESSAGE header
+ sm.PORT_MESSAGE = PORT_MESSAGE{}
+ sm.TotalLength = SHORT_MESSAGE_MAX_SIZE
+ sm.DataLength = 0
+}
+
+type AlpcPortContext struct {
+ Handle HANDLE
+}
diff --git a/vendor/github.com/AllenDang/w32/comctl32.go b/vendor/github.com/AllenDang/w32/comctl32.go
new file mode 100644
index 0000000..4f4e6b5
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/comctl32.go
@@ -0,0 +1,109 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modcomctl32 = syscall.NewLazyDLL("comctl32.dll")
+
+ procInitCommonControlsEx = modcomctl32.NewProc("InitCommonControlsEx")
+ procImageList_Create = modcomctl32.NewProc("ImageList_Create")
+ procImageList_Destroy = modcomctl32.NewProc("ImageList_Destroy")
+ procImageList_GetImageCount = modcomctl32.NewProc("ImageList_GetImageCount")
+ procImageList_SetImageCount = modcomctl32.NewProc("ImageList_SetImageCount")
+ procImageList_Add = modcomctl32.NewProc("ImageList_Add")
+ procImageList_ReplaceIcon = modcomctl32.NewProc("ImageList_ReplaceIcon")
+ procImageList_Remove = modcomctl32.NewProc("ImageList_Remove")
+ procTrackMouseEvent = modcomctl32.NewProc("_TrackMouseEvent")
+)
+
+func InitCommonControlsEx(lpInitCtrls *INITCOMMONCONTROLSEX) bool {
+ ret, _, _ := procInitCommonControlsEx.Call(
+ uintptr(unsafe.Pointer(lpInitCtrls)))
+
+ return ret != 0
+}
+
+func ImageList_Create(cx, cy int, flags uint, cInitial, cGrow int) HIMAGELIST {
+ ret, _, _ := procImageList_Create.Call(
+ uintptr(cx),
+ uintptr(cy),
+ uintptr(flags),
+ uintptr(cInitial),
+ uintptr(cGrow))
+
+ if ret == 0 {
+ panic("Create image list failed")
+ }
+
+ return HIMAGELIST(ret)
+}
+
+func ImageList_Destroy(himl HIMAGELIST) bool {
+ ret, _, _ := procImageList_Destroy.Call(
+ uintptr(himl))
+
+ return ret != 0
+}
+
+func ImageList_GetImageCount(himl HIMAGELIST) int {
+ ret, _, _ := procImageList_GetImageCount.Call(
+ uintptr(himl))
+
+ return int(ret)
+}
+
+func ImageList_SetImageCount(himl HIMAGELIST, uNewCount uint) bool {
+ ret, _, _ := procImageList_SetImageCount.Call(
+ uintptr(himl),
+ uintptr(uNewCount))
+
+ return ret != 0
+}
+
+func ImageList_Add(himl HIMAGELIST, hbmImage, hbmMask HBITMAP) int {
+ ret, _, _ := procImageList_Add.Call(
+ uintptr(himl),
+ uintptr(hbmImage),
+ uintptr(hbmMask))
+
+ return int(ret)
+}
+
+func ImageList_ReplaceIcon(himl HIMAGELIST, i int, hicon HICON) int {
+ ret, _, _ := procImageList_ReplaceIcon.Call(
+ uintptr(himl),
+ uintptr(i),
+ uintptr(hicon))
+
+ return int(ret)
+}
+
+func ImageList_AddIcon(himl HIMAGELIST, hicon HICON) int {
+ return ImageList_ReplaceIcon(himl, -1, hicon)
+}
+
+func ImageList_Remove(himl HIMAGELIST, i int) bool {
+ ret, _, _ := procImageList_Remove.Call(
+ uintptr(himl),
+ uintptr(i))
+
+ return ret != 0
+}
+
+func ImageList_RemoveAll(himl HIMAGELIST) bool {
+ return ImageList_Remove(himl, -1)
+}
+
+func TrackMouseEvent(tme *TRACKMOUSEEVENT) bool {
+ ret, _, _ := procTrackMouseEvent.Call(
+ uintptr(unsafe.Pointer(tme)))
+
+ return ret != 0
+}
diff --git a/vendor/github.com/AllenDang/w32/comdlg32.go b/vendor/github.com/AllenDang/w32/comdlg32.go
new file mode 100644
index 0000000..37bc985
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/comdlg32.go
@@ -0,0 +1,38 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modcomdlg32 = syscall.NewLazyDLL("comdlg32.dll")
+
+ procGetSaveFileName = modcomdlg32.NewProc("GetSaveFileNameW")
+ procGetOpenFileName = modcomdlg32.NewProc("GetOpenFileNameW")
+ procCommDlgExtendedError = modcomdlg32.NewProc("CommDlgExtendedError")
+)
+
+func GetOpenFileName(ofn *OPENFILENAME) bool {
+ ret, _, _ := procGetOpenFileName.Call(
+ uintptr(unsafe.Pointer(ofn)))
+
+ return ret != 0
+}
+
+func GetSaveFileName(ofn *OPENFILENAME) bool {
+ ret, _, _ := procGetSaveFileName.Call(
+ uintptr(unsafe.Pointer(ofn)))
+
+ return ret != 0
+}
+
+func CommDlgExtendedError() uint {
+ ret, _, _ := procCommDlgExtendedError.Call()
+
+ return uint(ret)
+}
diff --git a/vendor/github.com/AllenDang/w32/constants.go b/vendor/github.com/AllenDang/w32/constants.go
new file mode 100644
index 0000000..1775ca8
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/constants.go
@@ -0,0 +1,2628 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+const (
+ FALSE = 0
+ TRUE = 1
+)
+
+const (
+ NO_ERROR = 0
+ ERROR_SUCCESS = 0
+ ERROR_FILE_NOT_FOUND = 2
+ ERROR_PATH_NOT_FOUND = 3
+ ERROR_ACCESS_DENIED = 5
+ ERROR_INVALID_HANDLE = 6
+ ERROR_BAD_FORMAT = 11
+ ERROR_INVALID_NAME = 123
+ ERROR_MORE_DATA = 234
+ ERROR_NO_MORE_ITEMS = 259
+ ERROR_INVALID_SERVICE_CONTROL = 1052
+ ERROR_SERVICE_REQUEST_TIMEOUT = 1053
+ ERROR_SERVICE_NO_THREAD = 1054
+ ERROR_SERVICE_DATABASE_LOCKED = 1055
+ ERROR_SERVICE_ALREADY_RUNNING = 1056
+ ERROR_SERVICE_DISABLED = 1058
+ ERROR_SERVICE_DOES_NOT_EXIST = 1060
+ ERROR_SERVICE_CANNOT_ACCEPT_CTRL = 1061
+ ERROR_SERVICE_NOT_ACTIVE = 1062
+ ERROR_DATABASE_DOES_NOT_EXIST = 1065
+ ERROR_SERVICE_DEPENDENCY_FAIL = 1068
+ ERROR_SERVICE_LOGON_FAILED = 1069
+ ERROR_SERVICE_MARKED_FOR_DELETE = 1072
+ ERROR_SERVICE_DEPENDENCY_DELETED = 1075
+)
+
+const (
+ SE_ERR_FNF = 2
+ SE_ERR_PNF = 3
+ SE_ERR_ACCESSDENIED = 5
+ SE_ERR_OOM = 8
+ SE_ERR_DLLNOTFOUND = 32
+ SE_ERR_SHARE = 26
+ SE_ERR_ASSOCINCOMPLETE = 27
+ SE_ERR_DDETIMEOUT = 28
+ SE_ERR_DDEFAIL = 29
+ SE_ERR_DDEBUSY = 30
+ SE_ERR_NOASSOC = 31
+)
+
+const (
+ CW_USEDEFAULT = ^0x7fffffff
+)
+
+// ShowWindow constants
+const (
+ SW_HIDE = 0
+ SW_NORMAL = 1
+ SW_SHOWNORMAL = 1
+ SW_SHOWMINIMIZED = 2
+ SW_MAXIMIZE = 3
+ SW_SHOWMAXIMIZED = 3
+ SW_SHOWNOACTIVATE = 4
+ SW_SHOW = 5
+ SW_MINIMIZE = 6
+ SW_SHOWMINNOACTIVE = 7
+ SW_SHOWNA = 8
+ SW_RESTORE = 9
+ SW_SHOWDEFAULT = 10
+ SW_FORCEMINIMIZE = 11
+)
+
+// Window class styles
+const (
+ CS_VREDRAW = 0x00000001
+ CS_HREDRAW = 0x00000002
+ CS_KEYCVTWINDOW = 0x00000004
+ CS_DBLCLKS = 0x00000008
+ CS_OWNDC = 0x00000020
+ CS_CLASSDC = 0x00000040
+ CS_PARENTDC = 0x00000080
+ CS_NOKEYCVT = 0x00000100
+ CS_NOCLOSE = 0x00000200
+ CS_SAVEBITS = 0x00000800
+ CS_BYTEALIGNCLIENT = 0x00001000
+ CS_BYTEALIGNWINDOW = 0x00002000
+ CS_GLOBALCLASS = 0x00004000
+ CS_IME = 0x00010000
+ CS_DROPSHADOW = 0x00020000
+)
+
+// Predefined cursor constants
+const (
+ IDC_ARROW = 32512
+ IDC_IBEAM = 32513
+ IDC_WAIT = 32514
+ IDC_CROSS = 32515
+ IDC_UPARROW = 32516
+ IDC_SIZENWSE = 32642
+ IDC_SIZENESW = 32643
+ IDC_SIZEWE = 32644
+ IDC_SIZENS = 32645
+ IDC_SIZEALL = 32646
+ IDC_NO = 32648
+ IDC_HAND = 32649
+ IDC_APPSTARTING = 32650
+ IDC_HELP = 32651
+ IDC_ICON = 32641
+ IDC_SIZE = 32640
+)
+
+// Predefined icon constants
+const (
+ IDI_APPLICATION = 32512
+ IDI_HAND = 32513
+ IDI_QUESTION = 32514
+ IDI_EXCLAMATION = 32515
+ IDI_ASTERISK = 32516
+ IDI_WINLOGO = 32517
+ IDI_WARNING = IDI_EXCLAMATION
+ IDI_ERROR = IDI_HAND
+ IDI_INFORMATION = IDI_ASTERISK
+)
+
+// Button style constants
+const (
+ BS_3STATE = 5
+ BS_AUTO3STATE = 6
+ BS_AUTOCHECKBOX = 3
+ BS_AUTORADIOBUTTON = 9
+ BS_BITMAP = 128
+ BS_BOTTOM = 0X800
+ BS_CENTER = 0X300
+ BS_CHECKBOX = 2
+ BS_DEFPUSHBUTTON = 1
+ BS_GROUPBOX = 7
+ BS_ICON = 64
+ BS_LEFT = 256
+ BS_LEFTTEXT = 32
+ BS_MULTILINE = 0X2000
+ BS_NOTIFY = 0X4000
+ BS_OWNERDRAW = 0XB
+ BS_PUSHBUTTON = 0
+ BS_PUSHLIKE = 4096
+ BS_RADIOBUTTON = 4
+ BS_RIGHT = 512
+ BS_RIGHTBUTTON = 32
+ BS_TEXT = 0
+ BS_TOP = 0X400
+ BS_USERBUTTON = 8
+ BS_VCENTER = 0XC00
+ BS_FLAT = 0X8000
+)
+
+// Button state constants
+const (
+ BST_CHECKED = 1
+ BST_INDETERMINATE = 2
+ BST_UNCHECKED = 0
+ BST_FOCUS = 8
+ BST_PUSHED = 4
+)
+
+// Predefined brushes constants
+const (
+ COLOR_3DDKSHADOW = 21
+ COLOR_3DFACE = 15
+ COLOR_3DHILIGHT = 20
+ COLOR_3DHIGHLIGHT = 20
+ COLOR_3DLIGHT = 22
+ COLOR_BTNHILIGHT = 20
+ COLOR_3DSHADOW = 16
+ COLOR_ACTIVEBORDER = 10
+ COLOR_ACTIVECAPTION = 2
+ COLOR_APPWORKSPACE = 12
+ COLOR_BACKGROUND = 1
+ COLOR_DESKTOP = 1
+ COLOR_BTNFACE = 15
+ COLOR_BTNHIGHLIGHT = 20
+ COLOR_BTNSHADOW = 16
+ COLOR_BTNTEXT = 18
+ COLOR_CAPTIONTEXT = 9
+ COLOR_GRAYTEXT = 17
+ COLOR_HIGHLIGHT = 13
+ COLOR_HIGHLIGHTTEXT = 14
+ COLOR_INACTIVEBORDER = 11
+ COLOR_INACTIVECAPTION = 3
+ COLOR_INACTIVECAPTIONTEXT = 19
+ COLOR_INFOBK = 24
+ COLOR_INFOTEXT = 23
+ COLOR_MENU = 4
+ COLOR_MENUTEXT = 7
+ COLOR_SCROLLBAR = 0
+ COLOR_WINDOW = 5
+ COLOR_WINDOWFRAME = 6
+ COLOR_WINDOWTEXT = 8
+ COLOR_HOTLIGHT = 26
+ COLOR_GRADIENTACTIVECAPTION = 27
+ COLOR_GRADIENTINACTIVECAPTION = 28
+)
+
+// Button message constants
+const (
+ BM_CLICK = 245
+ BM_GETCHECK = 240
+ BM_GETIMAGE = 246
+ BM_GETSTATE = 242
+ BM_SETCHECK = 241
+ BM_SETIMAGE = 247
+ BM_SETSTATE = 243
+ BM_SETSTYLE = 244
+)
+
+// Button notifications
+const (
+ BN_CLICKED = 0
+ BN_PAINT = 1
+ BN_HILITE = 2
+ BN_PUSHED = BN_HILITE
+ BN_UNHILITE = 3
+ BN_UNPUSHED = BN_UNHILITE
+ BN_DISABLE = 4
+ BN_DOUBLECLICKED = 5
+ BN_DBLCLK = BN_DOUBLECLICKED
+ BN_SETFOCUS = 6
+ BN_KILLFOCUS = 7
+)
+
+// GetWindowLong and GetWindowLongPtr constants
+const (
+ GWL_EXSTYLE = -20
+ GWL_STYLE = -16
+ GWL_WNDPROC = -4
+ GWLP_WNDPROC = -4
+ GWL_HINSTANCE = -6
+ GWLP_HINSTANCE = -6
+ GWL_HWNDPARENT = -8
+ GWLP_HWNDPARENT = -8
+ GWL_ID = -12
+ GWLP_ID = -12
+ GWL_USERDATA = -21
+ GWLP_USERDATA = -21
+)
+
+// Window style constants
+const (
+ WS_OVERLAPPED = 0X00000000
+ WS_POPUP = 0X80000000
+ WS_CHILD = 0X40000000
+ WS_MINIMIZE = 0X20000000
+ WS_VISIBLE = 0X10000000
+ WS_DISABLED = 0X08000000
+ WS_CLIPSIBLINGS = 0X04000000
+ WS_CLIPCHILDREN = 0X02000000
+ WS_MAXIMIZE = 0X01000000
+ WS_CAPTION = 0X00C00000
+ WS_BORDER = 0X00800000
+ WS_DLGFRAME = 0X00400000
+ WS_VSCROLL = 0X00200000
+ WS_HSCROLL = 0X00100000
+ WS_SYSMENU = 0X00080000
+ WS_THICKFRAME = 0X00040000
+ WS_GROUP = 0X00020000
+ WS_TABSTOP = 0X00010000
+ WS_MINIMIZEBOX = 0X00020000
+ WS_MAXIMIZEBOX = 0X00010000
+ WS_TILED = 0X00000000
+ WS_ICONIC = 0X20000000
+ WS_SIZEBOX = 0X00040000
+ WS_OVERLAPPEDWINDOW = 0X00000000 | 0X00C00000 | 0X00080000 | 0X00040000 | 0X00020000 | 0X00010000
+ WS_POPUPWINDOW = 0X80000000 | 0X00800000 | 0X00080000
+ WS_CHILDWINDOW = 0X40000000
+)
+
+// Extended window style constants
+const (
+ WS_EX_DLGMODALFRAME = 0X00000001
+ WS_EX_NOPARENTNOTIFY = 0X00000004
+ WS_EX_TOPMOST = 0X00000008
+ WS_EX_ACCEPTFILES = 0X00000010
+ WS_EX_TRANSPARENT = 0X00000020
+ WS_EX_MDICHILD = 0X00000040
+ WS_EX_TOOLWINDOW = 0X00000080
+ WS_EX_WINDOWEDGE = 0X00000100
+ WS_EX_CLIENTEDGE = 0X00000200
+ WS_EX_CONTEXTHELP = 0X00000400
+ WS_EX_RIGHT = 0X00001000
+ WS_EX_LEFT = 0X00000000
+ WS_EX_RTLREADING = 0X00002000
+ WS_EX_LTRREADING = 0X00000000
+ WS_EX_LEFTSCROLLBAR = 0X00004000
+ WS_EX_RIGHTSCROLLBAR = 0X00000000
+ WS_EX_CONTROLPARENT = 0X00010000
+ WS_EX_STATICEDGE = 0X00020000
+ WS_EX_APPWINDOW = 0X00040000
+ WS_EX_OVERLAPPEDWINDOW = 0X00000100 | 0X00000200
+ WS_EX_PALETTEWINDOW = 0X00000100 | 0X00000080 | 0X00000008
+ WS_EX_LAYERED = 0X00080000
+ WS_EX_NOINHERITLAYOUT = 0X00100000
+ WS_EX_LAYOUTRTL = 0X00400000
+ WS_EX_NOACTIVATE = 0X08000000
+)
+
+// Window message constants
+const (
+ WM_APP = 32768
+ WM_ACTIVATE = 6
+ WM_ACTIVATEAPP = 28
+ WM_AFXFIRST = 864
+ WM_AFXLAST = 895
+ WM_ASKCBFORMATNAME = 780
+ WM_CANCELJOURNAL = 75
+ WM_CANCELMODE = 31
+ WM_CAPTURECHANGED = 533
+ WM_CHANGECBCHAIN = 781
+ WM_CHAR = 258
+ WM_CHARTOITEM = 47
+ WM_CHILDACTIVATE = 34
+ WM_CLEAR = 771
+ WM_CLOSE = 16
+ WM_COMMAND = 273
+ WM_COMMNOTIFY = 68 /* OBSOLETE */
+ WM_COMPACTING = 65
+ WM_COMPAREITEM = 57
+ WM_CONTEXTMENU = 123
+ WM_COPY = 769
+ WM_COPYDATA = 74
+ WM_CREATE = 1
+ WM_CTLCOLORBTN = 309
+ WM_CTLCOLORDLG = 310
+ WM_CTLCOLOREDIT = 307
+ WM_CTLCOLORLISTBOX = 308
+ WM_CTLCOLORMSGBOX = 306
+ WM_CTLCOLORSCROLLBAR = 311
+ WM_CTLCOLORSTATIC = 312
+ WM_CUT = 768
+ WM_DEADCHAR = 259
+ WM_DELETEITEM = 45
+ WM_DESTROY = 2
+ WM_DESTROYCLIPBOARD = 775
+ WM_DEVICECHANGE = 537
+ WM_DEVMODECHANGE = 27
+ WM_DISPLAYCHANGE = 126
+ WM_DRAWCLIPBOARD = 776
+ WM_DRAWITEM = 43
+ WM_DROPFILES = 563
+ WM_ENABLE = 10
+ WM_ENDSESSION = 22
+ WM_ENTERIDLE = 289
+ WM_ENTERMENULOOP = 529
+ WM_ENTERSIZEMOVE = 561
+ WM_ERASEBKGND = 20
+ WM_EXITMENULOOP = 530
+ WM_EXITSIZEMOVE = 562
+ WM_FONTCHANGE = 29
+ WM_GETDLGCODE = 135
+ WM_GETFONT = 49
+ WM_GETHOTKEY = 51
+ WM_GETICON = 127
+ WM_GETMINMAXINFO = 36
+ WM_GETTEXT = 13
+ WM_GETTEXTLENGTH = 14
+ WM_HANDHELDFIRST = 856
+ WM_HANDHELDLAST = 863
+ WM_HELP = 83
+ WM_HOTKEY = 786
+ WM_HSCROLL = 276
+ WM_HSCROLLCLIPBOARD = 782
+ WM_ICONERASEBKGND = 39
+ WM_INITDIALOG = 272
+ WM_INITMENU = 278
+ WM_INITMENUPOPUP = 279
+ WM_INPUT = 0X00FF
+ WM_INPUTLANGCHANGE = 81
+ WM_INPUTLANGCHANGEREQUEST = 80
+ WM_KEYDOWN = 256
+ WM_KEYUP = 257
+ WM_KILLFOCUS = 8
+ WM_MDIACTIVATE = 546
+ WM_MDICASCADE = 551
+ WM_MDICREATE = 544
+ WM_MDIDESTROY = 545
+ WM_MDIGETACTIVE = 553
+ WM_MDIICONARRANGE = 552
+ WM_MDIMAXIMIZE = 549
+ WM_MDINEXT = 548
+ WM_MDIREFRESHMENU = 564
+ WM_MDIRESTORE = 547
+ WM_MDISETMENU = 560
+ WM_MDITILE = 550
+ WM_MEASUREITEM = 44
+ WM_GETOBJECT = 0X003D
+ WM_CHANGEUISTATE = 0X0127
+ WM_UPDATEUISTATE = 0X0128
+ WM_QUERYUISTATE = 0X0129
+ WM_UNINITMENUPOPUP = 0X0125
+ WM_MENURBUTTONUP = 290
+ WM_MENUCOMMAND = 0X0126
+ WM_MENUGETOBJECT = 0X0124
+ WM_MENUDRAG = 0X0123
+ WM_APPCOMMAND = 0X0319
+ WM_MENUCHAR = 288
+ WM_MENUSELECT = 287
+ WM_MOVE = 3
+ WM_MOVING = 534
+ WM_NCACTIVATE = 134
+ WM_NCCALCSIZE = 131
+ WM_NCCREATE = 129
+ WM_NCDESTROY = 130
+ WM_NCHITTEST = 132
+ WM_NCLBUTTONDBLCLK = 163
+ WM_NCLBUTTONDOWN = 161
+ WM_NCLBUTTONUP = 162
+ WM_NCMBUTTONDBLCLK = 169
+ WM_NCMBUTTONDOWN = 167
+ WM_NCMBUTTONUP = 168
+ WM_NCXBUTTONDOWN = 171
+ WM_NCXBUTTONUP = 172
+ WM_NCXBUTTONDBLCLK = 173
+ WM_NCMOUSEHOVER = 0X02A0
+ WM_NCMOUSELEAVE = 0X02A2
+ WM_NCMOUSEMOVE = 160
+ WM_NCPAINT = 133
+ WM_NCRBUTTONDBLCLK = 166
+ WM_NCRBUTTONDOWN = 164
+ WM_NCRBUTTONUP = 165
+ WM_NEXTDLGCTL = 40
+ WM_NEXTMENU = 531
+ WM_NOTIFY = 78
+ WM_NOTIFYFORMAT = 85
+ WM_NULL = 0
+ WM_PAINT = 15
+ WM_PAINTCLIPBOARD = 777
+ WM_PAINTICON = 38
+ WM_PALETTECHANGED = 785
+ WM_PALETTEISCHANGING = 784
+ WM_PARENTNOTIFY = 528
+ WM_PASTE = 770
+ WM_PENWINFIRST = 896
+ WM_PENWINLAST = 911
+ WM_POWER = 72
+ WM_POWERBROADCAST = 536
+ WM_PRINT = 791
+ WM_PRINTCLIENT = 792
+ WM_QUERYDRAGICON = 55
+ WM_QUERYENDSESSION = 17
+ WM_QUERYNEWPALETTE = 783
+ WM_QUERYOPEN = 19
+ WM_QUEUESYNC = 35
+ WM_QUIT = 18
+ WM_RENDERALLFORMATS = 774
+ WM_RENDERFORMAT = 773
+ WM_SETCURSOR = 32
+ WM_SETFOCUS = 7
+ WM_SETFONT = 48
+ WM_SETHOTKEY = 50
+ WM_SETICON = 128
+ WM_SETREDRAW = 11
+ WM_SETTEXT = 12
+ WM_SETTINGCHANGE = 26
+ WM_SHOWWINDOW = 24
+ WM_SIZE = 5
+ WM_SIZECLIPBOARD = 779
+ WM_SIZING = 532
+ WM_SPOOLERSTATUS = 42
+ WM_STYLECHANGED = 125
+ WM_STYLECHANGING = 124
+ WM_SYSCHAR = 262
+ WM_SYSCOLORCHANGE = 21
+ WM_SYSCOMMAND = 274
+ WM_SYSDEADCHAR = 263
+ WM_SYSKEYDOWN = 260
+ WM_SYSKEYUP = 261
+ WM_TCARD = 82
+ WM_THEMECHANGED = 794
+ WM_TIMECHANGE = 30
+ WM_TIMER = 275
+ WM_UNDO = 772
+ WM_USER = 1024
+ WM_USERCHANGED = 84
+ WM_VKEYTOITEM = 46
+ WM_VSCROLL = 277
+ WM_VSCROLLCLIPBOARD = 778
+ WM_WINDOWPOSCHANGED = 71
+ WM_WINDOWPOSCHANGING = 70
+ WM_WININICHANGE = 26
+ WM_KEYFIRST = 256
+ WM_KEYLAST = 264
+ WM_SYNCPAINT = 136
+ WM_MOUSEACTIVATE = 33
+ WM_MOUSEMOVE = 512
+ WM_LBUTTONDOWN = 513
+ WM_LBUTTONUP = 514
+ WM_LBUTTONDBLCLK = 515
+ WM_RBUTTONDOWN = 516
+ WM_RBUTTONUP = 517
+ WM_RBUTTONDBLCLK = 518
+ WM_MBUTTONDOWN = 519
+ WM_MBUTTONUP = 520
+ WM_MBUTTONDBLCLK = 521
+ WM_MOUSEWHEEL = 522
+ WM_XBUTTONDOWN = 523
+ WM_XBUTTONUP = 524
+ WM_XBUTTONDBLCLK = 525
+ WM_MOUSEHWHEEL = 526
+ WM_MOUSEFIRST = 512
+ WM_MOUSELAST = 526
+ WM_MOUSEHOVER = 0X2A1
+ WM_MOUSELEAVE = 0X2A3
+ WM_CLIPBOARDUPDATE = 0x031D
+)
+
+// WM_ACTIVATE
+const (
+ WA_INACTIVE = 0
+ WA_ACTIVE = 1
+ WA_CLICKACTIVE = 2
+)
+
+const LF_FACESIZE = 32
+
+// Font weight constants
+const (
+ FW_DONTCARE = 0
+ FW_THIN = 100
+ FW_EXTRALIGHT = 200
+ FW_ULTRALIGHT = FW_EXTRALIGHT
+ FW_LIGHT = 300
+ FW_NORMAL = 400
+ FW_REGULAR = 400
+ FW_MEDIUM = 500
+ FW_SEMIBOLD = 600
+ FW_DEMIBOLD = FW_SEMIBOLD
+ FW_BOLD = 700
+ FW_EXTRABOLD = 800
+ FW_ULTRABOLD = FW_EXTRABOLD
+ FW_HEAVY = 900
+ FW_BLACK = FW_HEAVY
+)
+
+// Charset constants
+const (
+ ANSI_CHARSET = 0
+ DEFAULT_CHARSET = 1
+ SYMBOL_CHARSET = 2
+ SHIFTJIS_CHARSET = 128
+ HANGEUL_CHARSET = 129
+ HANGUL_CHARSET = 129
+ GB2312_CHARSET = 134
+ CHINESEBIG5_CHARSET = 136
+ GREEK_CHARSET = 161
+ TURKISH_CHARSET = 162
+ HEBREW_CHARSET = 177
+ ARABIC_CHARSET = 178
+ BALTIC_CHARSET = 186
+ RUSSIAN_CHARSET = 204
+ THAI_CHARSET = 222
+ EASTEUROPE_CHARSET = 238
+ OEM_CHARSET = 255
+ JOHAB_CHARSET = 130
+ VIETNAMESE_CHARSET = 163
+ MAC_CHARSET = 77
+)
+
+// Font output precision constants
+const (
+ OUT_DEFAULT_PRECIS = 0
+ OUT_STRING_PRECIS = 1
+ OUT_CHARACTER_PRECIS = 2
+ OUT_STROKE_PRECIS = 3
+ OUT_TT_PRECIS = 4
+ OUT_DEVICE_PRECIS = 5
+ OUT_RASTER_PRECIS = 6
+ OUT_TT_ONLY_PRECIS = 7
+ OUT_OUTLINE_PRECIS = 8
+ OUT_PS_ONLY_PRECIS = 10
+)
+
+// Font clipping precision constants
+const (
+ CLIP_DEFAULT_PRECIS = 0
+ CLIP_CHARACTER_PRECIS = 1
+ CLIP_STROKE_PRECIS = 2
+ CLIP_MASK = 15
+ CLIP_LH_ANGLES = 16
+ CLIP_TT_ALWAYS = 32
+ CLIP_EMBEDDED = 128
+)
+
+// Font output quality constants
+const (
+ DEFAULT_QUALITY = 0
+ DRAFT_QUALITY = 1
+ PROOF_QUALITY = 2
+ NONANTIALIASED_QUALITY = 3
+ ANTIALIASED_QUALITY = 4
+ CLEARTYPE_QUALITY = 5
+)
+
+// Font pitch constants
+const (
+ DEFAULT_PITCH = 0
+ FIXED_PITCH = 1
+ VARIABLE_PITCH = 2
+)
+
+// Font family constants
+const (
+ FF_DECORATIVE = 80
+ FF_DONTCARE = 0
+ FF_MODERN = 48
+ FF_ROMAN = 16
+ FF_SCRIPT = 64
+ FF_SWISS = 32
+)
+
+// DeviceCapabilities capabilities
+const (
+ DC_FIELDS = 1
+ DC_PAPERS = 2
+ DC_PAPERSIZE = 3
+ DC_MINEXTENT = 4
+ DC_MAXEXTENT = 5
+ DC_BINS = 6
+ DC_DUPLEX = 7
+ DC_SIZE = 8
+ DC_EXTRA = 9
+ DC_VERSION = 10
+ DC_DRIVER = 11
+ DC_BINNAMES = 12
+ DC_ENUMRESOLUTIONS = 13
+ DC_FILEDEPENDENCIES = 14
+ DC_TRUETYPE = 15
+ DC_PAPERNAMES = 16
+ DC_ORIENTATION = 17
+ DC_COPIES = 18
+ DC_BINADJUST = 19
+ DC_EMF_COMPLIANT = 20
+ DC_DATATYPE_PRODUCED = 21
+ DC_COLLATE = 22
+ DC_MANUFACTURER = 23
+ DC_MODEL = 24
+ DC_PERSONALITY = 25
+ DC_PRINTRATE = 26
+ DC_PRINTRATEUNIT = 27
+ DC_PRINTERMEM = 28
+ DC_MEDIAREADY = 29
+ DC_STAPLE = 30
+ DC_PRINTRATEPPM = 31
+ DC_COLORDEVICE = 32
+ DC_NUP = 33
+ DC_MEDIATYPENAMES = 34
+ DC_MEDIATYPES = 35
+)
+
+// GetDeviceCaps index constants
+const (
+ DRIVERVERSION = 0
+ TECHNOLOGY = 2
+ HORZSIZE = 4
+ VERTSIZE = 6
+ HORZRES = 8
+ VERTRES = 10
+ LOGPIXELSX = 88
+ LOGPIXELSY = 90
+ BITSPIXEL = 12
+ PLANES = 14
+ NUMBRUSHES = 16
+ NUMPENS = 18
+ NUMFONTS = 22
+ NUMCOLORS = 24
+ NUMMARKERS = 20
+ ASPECTX = 40
+ ASPECTY = 42
+ ASPECTXY = 44
+ PDEVICESIZE = 26
+ CLIPCAPS = 36
+ SIZEPALETTE = 104
+ NUMRESERVED = 106
+ COLORRES = 108
+ PHYSICALWIDTH = 110
+ PHYSICALHEIGHT = 111
+ PHYSICALOFFSETX = 112
+ PHYSICALOFFSETY = 113
+ SCALINGFACTORX = 114
+ SCALINGFACTORY = 115
+ VREFRESH = 116
+ DESKTOPHORZRES = 118
+ DESKTOPVERTRES = 117
+ BLTALIGNMENT = 119
+ SHADEBLENDCAPS = 120
+ COLORMGMTCAPS = 121
+ RASTERCAPS = 38
+ CURVECAPS = 28
+ LINECAPS = 30
+ POLYGONALCAPS = 32
+ TEXTCAPS = 34
+)
+
+// GetDeviceCaps TECHNOLOGY constants
+const (
+ DT_PLOTTER = 0
+ DT_RASDISPLAY = 1
+ DT_RASPRINTER = 2
+ DT_RASCAMERA = 3
+ DT_CHARSTREAM = 4
+ DT_METAFILE = 5
+ DT_DISPFILE = 6
+)
+
+// GetDeviceCaps SHADEBLENDCAPS constants
+const (
+ SB_NONE = 0x00
+ SB_CONST_ALPHA = 0x01
+ SB_PIXEL_ALPHA = 0x02
+ SB_PREMULT_ALPHA = 0x04
+ SB_GRAD_RECT = 0x10
+ SB_GRAD_TRI = 0x20
+)
+
+// GetDeviceCaps COLORMGMTCAPS constants
+const (
+ CM_NONE = 0x00
+ CM_DEVICE_ICM = 0x01
+ CM_GAMMA_RAMP = 0x02
+ CM_CMYK_COLOR = 0x04
+)
+
+// GetDeviceCaps RASTERCAPS constants
+const (
+ RC_BANDING = 2
+ RC_BITBLT = 1
+ RC_BITMAP64 = 8
+ RC_DI_BITMAP = 128
+ RC_DIBTODEV = 512
+ RC_FLOODFILL = 4096
+ RC_GDI20_OUTPUT = 16
+ RC_PALETTE = 256
+ RC_SCALING = 4
+ RC_STRETCHBLT = 2048
+ RC_STRETCHDIB = 8192
+ RC_DEVBITS = 0x8000
+ RC_OP_DX_OUTPUT = 0x4000
+)
+
+// GetDeviceCaps CURVECAPS constants
+const (
+ CC_NONE = 0
+ CC_CIRCLES = 1
+ CC_PIE = 2
+ CC_CHORD = 4
+ CC_ELLIPSES = 8
+ CC_WIDE = 16
+ CC_STYLED = 32
+ CC_WIDESTYLED = 64
+ CC_INTERIORS = 128
+ CC_ROUNDRECT = 256
+)
+
+// GetDeviceCaps LINECAPS constants
+const (
+ LC_NONE = 0
+ LC_POLYLINE = 2
+ LC_MARKER = 4
+ LC_POLYMARKER = 8
+ LC_WIDE = 16
+ LC_STYLED = 32
+ LC_WIDESTYLED = 64
+ LC_INTERIORS = 128
+)
+
+// GetDeviceCaps POLYGONALCAPS constants
+const (
+ PC_NONE = 0
+ PC_POLYGON = 1
+ PC_POLYPOLYGON = 256
+ PC_PATHS = 512
+ PC_RECTANGLE = 2
+ PC_WINDPOLYGON = 4
+ PC_SCANLINE = 8
+ PC_TRAPEZOID = 4
+ PC_WIDE = 16
+ PC_STYLED = 32
+ PC_WIDESTYLED = 64
+ PC_INTERIORS = 128
+)
+
+// GetDeviceCaps TEXTCAPS constants
+const (
+ TC_OP_CHARACTER = 1
+ TC_OP_STROKE = 2
+ TC_CP_STROKE = 4
+ TC_CR_90 = 8
+ TC_CR_ANY = 16
+ TC_SF_X_YINDEP = 32
+ TC_SA_DOUBLE = 64
+ TC_SA_INTEGER = 128
+ TC_SA_CONTIN = 256
+ TC_EA_DOUBLE = 512
+ TC_IA_ABLE = 1024
+ TC_UA_ABLE = 2048
+ TC_SO_ABLE = 4096
+ TC_RA_ABLE = 8192
+ TC_VA_ABLE = 16384
+ TC_RESERVED = 32768
+ TC_SCROLLBLT = 65536
+)
+
+// Static control styles
+const (
+ SS_BITMAP = 14
+ SS_BLACKFRAME = 7
+ SS_BLACKRECT = 4
+ SS_CENTER = 1
+ SS_CENTERIMAGE = 512
+ SS_EDITCONTROL = 0x2000
+ SS_ENHMETAFILE = 15
+ SS_ETCHEDFRAME = 18
+ SS_ETCHEDHORZ = 16
+ SS_ETCHEDVERT = 17
+ SS_GRAYFRAME = 8
+ SS_GRAYRECT = 5
+ SS_ICON = 3
+ SS_LEFT = 0
+ SS_LEFTNOWORDWRAP = 0xc
+ SS_NOPREFIX = 128
+ SS_NOTIFY = 256
+ SS_OWNERDRAW = 0xd
+ SS_REALSIZECONTROL = 0x040
+ SS_REALSIZEIMAGE = 0x800
+ SS_RIGHT = 2
+ SS_RIGHTJUST = 0x400
+ SS_SIMPLE = 11
+ SS_SUNKEN = 4096
+ SS_WHITEFRAME = 9
+ SS_WHITERECT = 6
+ SS_USERITEM = 10
+ SS_TYPEMASK = 0x0000001F
+ SS_ENDELLIPSIS = 0x00004000
+ SS_PATHELLIPSIS = 0x00008000
+ SS_WORDELLIPSIS = 0x0000C000
+ SS_ELLIPSISMASK = 0x0000C000
+)
+
+// Edit styles
+const (
+ ES_LEFT = 0x0000
+ ES_CENTER = 0x0001
+ ES_RIGHT = 0x0002
+ ES_MULTILINE = 0x0004
+ ES_UPPERCASE = 0x0008
+ ES_LOWERCASE = 0x0010
+ ES_PASSWORD = 0x0020
+ ES_AUTOVSCROLL = 0x0040
+ ES_AUTOHSCROLL = 0x0080
+ ES_NOHIDESEL = 0x0100
+ ES_OEMCONVERT = 0x0400
+ ES_READONLY = 0x0800
+ ES_WANTRETURN = 0x1000
+ ES_NUMBER = 0x2000
+)
+
+// Edit notifications
+const (
+ EN_SETFOCUS = 0x0100
+ EN_KILLFOCUS = 0x0200
+ EN_CHANGE = 0x0300
+ EN_UPDATE = 0x0400
+ EN_ERRSPACE = 0x0500
+ EN_MAXTEXT = 0x0501
+ EN_HSCROLL = 0x0601
+ EN_VSCROLL = 0x0602
+ EN_ALIGN_LTR_EC = 0x0700
+ EN_ALIGN_RTL_EC = 0x0701
+)
+
+// Edit messages
+const (
+ EM_GETSEL = 0x00B0
+ EM_SETSEL = 0x00B1
+ EM_GETRECT = 0x00B2
+ EM_SETRECT = 0x00B3
+ EM_SETRECTNP = 0x00B4
+ EM_SCROLL = 0x00B5
+ EM_LINESCROLL = 0x00B6
+ EM_SCROLLCARET = 0x00B7
+ EM_GETMODIFY = 0x00B8
+ EM_SETMODIFY = 0x00B9
+ EM_GETLINECOUNT = 0x00BA
+ EM_LINEINDEX = 0x00BB
+ EM_SETHANDLE = 0x00BC
+ EM_GETHANDLE = 0x00BD
+ EM_GETTHUMB = 0x00BE
+ EM_LINELENGTH = 0x00C1
+ EM_REPLACESEL = 0x00C2
+ EM_GETLINE = 0x00C4
+ EM_LIMITTEXT = 0x00C5
+ EM_CANUNDO = 0x00C6
+ EM_UNDO = 0x00C7
+ EM_FMTLINES = 0x00C8
+ EM_LINEFROMCHAR = 0x00C9
+ EM_SETTABSTOPS = 0x00CB
+ EM_SETPASSWORDCHAR = 0x00CC
+ EM_EMPTYUNDOBUFFER = 0x00CD
+ EM_GETFIRSTVISIBLELINE = 0x00CE
+ EM_SETREADONLY = 0x00CF
+ EM_SETWORDBREAKPROC = 0x00D0
+ EM_GETWORDBREAKPROC = 0x00D1
+ EM_GETPASSWORDCHAR = 0x00D2
+ EM_SETMARGINS = 0x00D3
+ EM_GETMARGINS = 0x00D4
+ EM_SETLIMITTEXT = EM_LIMITTEXT
+ EM_GETLIMITTEXT = 0x00D5
+ EM_POSFROMCHAR = 0x00D6
+ EM_CHARFROMPOS = 0x00D7
+ EM_SETIMESTATUS = 0x00D8
+ EM_GETIMESTATUS = 0x00D9
+ EM_SETCUEBANNER = 0x1501
+ EM_GETCUEBANNER = 0x1502
+)
+
+const (
+ CCM_FIRST = 0x2000
+ CCM_LAST = CCM_FIRST + 0x200
+ CCM_SETBKCOLOR = 8193
+ CCM_SETCOLORSCHEME = 8194
+ CCM_GETCOLORSCHEME = 8195
+ CCM_GETDROPTARGET = 8196
+ CCM_SETUNICODEFORMAT = 8197
+ CCM_GETUNICODEFORMAT = 8198
+ CCM_SETVERSION = 0x2007
+ CCM_GETVERSION = 0x2008
+ CCM_SETNOTIFYWINDOW = 0x2009
+ CCM_SETWINDOWTHEME = 0x200b
+ CCM_DPISCALE = 0x200c
+)
+
+// Common controls styles
+const (
+ CCS_TOP = 1
+ CCS_NOMOVEY = 2
+ CCS_BOTTOM = 3
+ CCS_NORESIZE = 4
+ CCS_NOPARENTALIGN = 8
+ CCS_ADJUSTABLE = 32
+ CCS_NODIVIDER = 64
+ CCS_VERT = 128
+ CCS_LEFT = 129
+ CCS_NOMOVEX = 130
+ CCS_RIGHT = 131
+)
+
+// ProgressBar messages
+const (
+ PROGRESS_CLASS = "msctls_progress32"
+ PBM_SETPOS = WM_USER + 2
+ PBM_DELTAPOS = WM_USER + 3
+ PBM_SETSTEP = WM_USER + 4
+ PBM_STEPIT = WM_USER + 5
+ PBM_SETRANGE32 = 1030
+ PBM_GETRANGE = 1031
+ PBM_GETPOS = 1032
+ PBM_SETBARCOLOR = 1033
+ PBM_SETBKCOLOR = CCM_SETBKCOLOR
+ PBS_SMOOTH = 1
+ PBS_VERTICAL = 4
+)
+
+// GetOpenFileName and GetSaveFileName extended flags
+const (
+ OFN_EX_NOPLACESBAR = 0x00000001
+)
+
+// GetOpenFileName and GetSaveFileName flags
+const (
+ OFN_ALLOWMULTISELECT = 0x00000200
+ OFN_CREATEPROMPT = 0x00002000
+ OFN_DONTADDTORECENT = 0x02000000
+ OFN_ENABLEHOOK = 0x00000020
+ OFN_ENABLEINCLUDENOTIFY = 0x00400000
+ OFN_ENABLESIZING = 0x00800000
+ OFN_ENABLETEMPLATE = 0x00000040
+ OFN_ENABLETEMPLATEHANDLE = 0x00000080
+ OFN_EXPLORER = 0x00080000
+ OFN_EXTENSIONDIFFERENT = 0x00000400
+ OFN_FILEMUSTEXIST = 0x00001000
+ OFN_FORCESHOWHIDDEN = 0x10000000
+ OFN_HIDEREADONLY = 0x00000004
+ OFN_LONGNAMES = 0x00200000
+ OFN_NOCHANGEDIR = 0x00000008
+ OFN_NODEREFERENCELINKS = 0x00100000
+ OFN_NOLONGNAMES = 0x00040000
+ OFN_NONETWORKBUTTON = 0x00020000
+ OFN_NOREADONLYRETURN = 0x00008000
+ OFN_NOTESTFILECREATE = 0x00010000
+ OFN_NOVALIDATE = 0x00000100
+ OFN_OVERWRITEPROMPT = 0x00000002
+ OFN_PATHMUSTEXIST = 0x00000800
+ OFN_READONLY = 0x00000001
+ OFN_SHAREAWARE = 0x00004000
+ OFN_SHOWHELP = 0x00000010
+)
+
+//SHBrowseForFolder flags
+const (
+ BIF_RETURNONLYFSDIRS = 0x00000001
+ BIF_DONTGOBELOWDOMAIN = 0x00000002
+ BIF_STATUSTEXT = 0x00000004
+ BIF_RETURNFSANCESTORS = 0x00000008
+ BIF_EDITBOX = 0x00000010
+ BIF_VALIDATE = 0x00000020
+ BIF_NEWDIALOGSTYLE = 0x00000040
+ BIF_BROWSEINCLUDEURLS = 0x00000080
+ BIF_USENEWUI = BIF_EDITBOX | BIF_NEWDIALOGSTYLE
+ BIF_UAHINT = 0x00000100
+ BIF_NONEWFOLDERBUTTON = 0x00000200
+ BIF_NOTRANSLATETARGETS = 0x00000400
+ BIF_BROWSEFORCOMPUTER = 0x00001000
+ BIF_BROWSEFORPRINTER = 0x00002000
+ BIF_BROWSEINCLUDEFILES = 0x00004000
+ BIF_SHAREABLE = 0x00008000
+ BIF_BROWSEFILEJUNCTIONS = 0x00010000
+)
+
+//MessageBox flags
+const (
+ MB_OK = 0x00000000
+ MB_OKCANCEL = 0x00000001
+ MB_ABORTRETRYIGNORE = 0x00000002
+ MB_YESNOCANCEL = 0x00000003
+ MB_YESNO = 0x00000004
+ MB_RETRYCANCEL = 0x00000005
+ MB_CANCELTRYCONTINUE = 0x00000006
+ MB_ICONHAND = 0x00000010
+ MB_ICONQUESTION = 0x00000020
+ MB_ICONEXCLAMATION = 0x00000030
+ MB_ICONASTERISK = 0x00000040
+ MB_USERICON = 0x00000080
+ MB_ICONWARNING = MB_ICONEXCLAMATION
+ MB_ICONERROR = MB_ICONHAND
+ MB_ICONINFORMATION = MB_ICONASTERISK
+ MB_ICONSTOP = MB_ICONHAND
+ MB_DEFBUTTON1 = 0x00000000
+ MB_DEFBUTTON2 = 0x00000100
+ MB_DEFBUTTON3 = 0x00000200
+ MB_DEFBUTTON4 = 0x00000300
+)
+
+//COM
+const (
+ E_INVALIDARG = 0x80070057
+ E_OUTOFMEMORY = 0x8007000E
+ E_UNEXPECTED = 0x8000FFFF
+)
+
+const (
+ S_OK = 0
+ S_FALSE = 0x0001
+ RPC_E_CHANGED_MODE = 0x80010106
+)
+
+// GetSystemMetrics constants
+const (
+ SM_CXSCREEN = 0
+ SM_CYSCREEN = 1
+ SM_CXVSCROLL = 2
+ SM_CYHSCROLL = 3
+ SM_CYCAPTION = 4
+ SM_CXBORDER = 5
+ SM_CYBORDER = 6
+ SM_CXDLGFRAME = 7
+ SM_CYDLGFRAME = 8
+ SM_CYVTHUMB = 9
+ SM_CXHTHUMB = 10
+ SM_CXICON = 11
+ SM_CYICON = 12
+ SM_CXCURSOR = 13
+ SM_CYCURSOR = 14
+ SM_CYMENU = 15
+ SM_CXFULLSCREEN = 16
+ SM_CYFULLSCREEN = 17
+ SM_CYKANJIWINDOW = 18
+ SM_MOUSEPRESENT = 19
+ SM_CYVSCROLL = 20
+ SM_CXHSCROLL = 21
+ SM_DEBUG = 22
+ SM_SWAPBUTTON = 23
+ SM_RESERVED1 = 24
+ SM_RESERVED2 = 25
+ SM_RESERVED3 = 26
+ SM_RESERVED4 = 27
+ SM_CXMIN = 28
+ SM_CYMIN = 29
+ SM_CXSIZE = 30
+ SM_CYSIZE = 31
+ SM_CXFRAME = 32
+ SM_CYFRAME = 33
+ SM_CXMINTRACK = 34
+ SM_CYMINTRACK = 35
+ SM_CXDOUBLECLK = 36
+ SM_CYDOUBLECLK = 37
+ SM_CXICONSPACING = 38
+ SM_CYICONSPACING = 39
+ SM_MENUDROPALIGNMENT = 40
+ SM_PENWINDOWS = 41
+ SM_DBCSENABLED = 42
+ SM_CMOUSEBUTTONS = 43
+ SM_CXFIXEDFRAME = SM_CXDLGFRAME
+ SM_CYFIXEDFRAME = SM_CYDLGFRAME
+ SM_CXSIZEFRAME = SM_CXFRAME
+ SM_CYSIZEFRAME = SM_CYFRAME
+ SM_SECURE = 44
+ SM_CXEDGE = 45
+ SM_CYEDGE = 46
+ SM_CXMINSPACING = 47
+ SM_CYMINSPACING = 48
+ SM_CXSMICON = 49
+ SM_CYSMICON = 50
+ SM_CYSMCAPTION = 51
+ SM_CXSMSIZE = 52
+ SM_CYSMSIZE = 53
+ SM_CXMENUSIZE = 54
+ SM_CYMENUSIZE = 55
+ SM_ARRANGE = 56
+ SM_CXMINIMIZED = 57
+ SM_CYMINIMIZED = 58
+ SM_CXMAXTRACK = 59
+ SM_CYMAXTRACK = 60
+ SM_CXMAXIMIZED = 61
+ SM_CYMAXIMIZED = 62
+ SM_NETWORK = 63
+ SM_CLEANBOOT = 67
+ SM_CXDRAG = 68
+ SM_CYDRAG = 69
+ SM_SHOWSOUNDS = 70
+ SM_CXMENUCHECK = 71
+ SM_CYMENUCHECK = 72
+ SM_SLOWMACHINE = 73
+ SM_MIDEASTENABLED = 74
+ SM_MOUSEWHEELPRESENT = 75
+ SM_XVIRTUALSCREEN = 76
+ SM_YVIRTUALSCREEN = 77
+ SM_CXVIRTUALSCREEN = 78
+ SM_CYVIRTUALSCREEN = 79
+ SM_CMONITORS = 80
+ SM_SAMEDISPLAYFORMAT = 81
+ SM_IMMENABLED = 82
+ SM_CXFOCUSBORDER = 83
+ SM_CYFOCUSBORDER = 84
+ SM_TABLETPC = 86
+ SM_MEDIACENTER = 87
+ SM_STARTER = 88
+ SM_SERVERR2 = 89
+ SM_CMETRICS = 91
+ SM_REMOTESESSION = 0x1000
+ SM_SHUTTINGDOWN = 0x2000
+ SM_REMOTECONTROL = 0x2001
+ SM_CARETBLINKINGENABLED = 0x2002
+)
+
+const (
+ CLSCTX_INPROC_SERVER = 1
+ CLSCTX_INPROC_HANDLER = 2
+ CLSCTX_LOCAL_SERVER = 4
+ CLSCTX_INPROC_SERVER16 = 8
+ CLSCTX_REMOTE_SERVER = 16
+ CLSCTX_ALL = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER
+ CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER
+ CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER
+)
+
+const (
+ COINIT_APARTMENTTHREADED = 0x2
+ COINIT_MULTITHREADED = 0x0
+ COINIT_DISABLE_OLE1DDE = 0x4
+ COINIT_SPEED_OVER_MEMORY = 0x8
+)
+
+const (
+ DISPATCH_METHOD = 1
+ DISPATCH_PROPERTYGET = 2
+ DISPATCH_PROPERTYPUT = 4
+ DISPATCH_PROPERTYPUTREF = 8
+)
+
+const (
+ CC_FASTCALL = iota
+ CC_CDECL
+ CC_MSCPASCAL
+ CC_PASCAL = CC_MSCPASCAL
+ CC_MACPASCAL
+ CC_STDCALL
+ CC_FPFASTCALL
+ CC_SYSCALL
+ CC_MPWCDECL
+ CC_MPWPASCAL
+ CC_MAX = CC_MPWPASCAL
+)
+
+const (
+ VT_EMPTY = 0x0
+ VT_NULL = 0x1
+ VT_I2 = 0x2
+ VT_I4 = 0x3
+ VT_R4 = 0x4
+ VT_R8 = 0x5
+ VT_CY = 0x6
+ VT_DATE = 0x7
+ VT_BSTR = 0x8
+ VT_DISPATCH = 0x9
+ VT_ERROR = 0xa
+ VT_BOOL = 0xb
+ VT_VARIANT = 0xc
+ VT_UNKNOWN = 0xd
+ VT_DECIMAL = 0xe
+ VT_I1 = 0x10
+ VT_UI1 = 0x11
+ VT_UI2 = 0x12
+ VT_UI4 = 0x13
+ VT_I8 = 0x14
+ VT_UI8 = 0x15
+ VT_INT = 0x16
+ VT_UINT = 0x17
+ VT_VOID = 0x18
+ VT_HRESULT = 0x19
+ VT_PTR = 0x1a
+ VT_SAFEARRAY = 0x1b
+ VT_CARRAY = 0x1c
+ VT_USERDEFINED = 0x1d
+ VT_LPSTR = 0x1e
+ VT_LPWSTR = 0x1f
+ VT_RECORD = 0x24
+ VT_INT_PTR = 0x25
+ VT_UINT_PTR = 0x26
+ VT_FILETIME = 0x40
+ VT_BLOB = 0x41
+ VT_STREAM = 0x42
+ VT_STORAGE = 0x43
+ VT_STREAMED_OBJECT = 0x44
+ VT_STORED_OBJECT = 0x45
+ VT_BLOB_OBJECT = 0x46
+ VT_CF = 0x47
+ VT_CLSID = 0x48
+ VT_BSTR_BLOB = 0xfff
+ VT_VECTOR = 0x1000
+ VT_ARRAY = 0x2000
+ VT_BYREF = 0x4000
+ VT_RESERVED = 0x8000
+ VT_ILLEGAL = 0xffff
+ VT_ILLEGALMASKED = 0xfff
+ VT_TYPEMASK = 0xfff
+)
+
+const (
+ DISPID_UNKNOWN = -1
+ DISPID_VALUE = 0
+ DISPID_PROPERTYPUT = -3
+ DISPID_NEWENUM = -4
+ DISPID_EVALUATE = -5
+ DISPID_CONSTRUCTOR = -6
+ DISPID_DESTRUCTOR = -7
+ DISPID_COLLECT = -8
+)
+
+const (
+ MONITOR_DEFAULTTONULL = 0x00000000
+ MONITOR_DEFAULTTOPRIMARY = 0x00000001
+ MONITOR_DEFAULTTONEAREST = 0x00000002
+
+ MONITORINFOF_PRIMARY = 0x00000001
+)
+
+const (
+ CCHDEVICENAME = 32
+ CCHFORMNAME = 32
+)
+
+const (
+ IDOK = 1
+ IDCANCEL = 2
+ IDABORT = 3
+ IDRETRY = 4
+ IDIGNORE = 5
+ IDYES = 6
+ IDNO = 7
+ IDCLOSE = 8
+ IDHELP = 9
+ IDTRYAGAIN = 10
+ IDCONTINUE = 11
+ IDTIMEOUT = 32000
+)
+
+// Generic WM_NOTIFY notification codes
+const (
+ NM_FIRST = 0
+ NM_OUTOFMEMORY = NM_FIRST - 1
+ NM_CLICK = NM_FIRST - 2
+ NM_DBLCLK = NM_FIRST - 3
+ NM_RETURN = NM_FIRST - 4
+ NM_RCLICK = NM_FIRST - 5
+ NM_RDBLCLK = NM_FIRST - 6
+ NM_SETFOCUS = NM_FIRST - 7
+ NM_KILLFOCUS = NM_FIRST - 8
+ NM_CUSTOMDRAW = NM_FIRST - 12
+ NM_HOVER = NM_FIRST - 13
+ NM_NCHITTEST = NM_FIRST - 14
+ NM_KEYDOWN = NM_FIRST - 15
+ NM_RELEASEDCAPTURE = NM_FIRST - 16
+ NM_SETCURSOR = NM_FIRST - 17
+ NM_CHAR = NM_FIRST - 18
+ NM_TOOLTIPSCREATED = NM_FIRST - 19
+ NM_LAST = NM_FIRST - 99
+)
+
+// ListView messages
+const (
+ LVM_FIRST = 0x1000
+ LVM_GETITEMCOUNT = LVM_FIRST + 4
+ LVM_SETIMAGELIST = LVM_FIRST + 3
+ LVM_GETIMAGELIST = LVM_FIRST + 2
+ LVM_GETITEM = LVM_FIRST + 75
+ LVM_SETITEM = LVM_FIRST + 76
+ LVM_INSERTITEM = LVM_FIRST + 77
+ LVM_DELETEITEM = LVM_FIRST + 8
+ LVM_DELETEALLITEMS = LVM_FIRST + 9
+ LVM_GETCALLBACKMASK = LVM_FIRST + 10
+ LVM_SETCALLBACKMASK = LVM_FIRST + 11
+ LVM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT
+ LVM_GETNEXTITEM = LVM_FIRST + 12
+ LVM_FINDITEM = LVM_FIRST + 83
+ LVM_GETITEMRECT = LVM_FIRST + 14
+ LVM_GETSTRINGWIDTH = LVM_FIRST + 87
+ LVM_HITTEST = LVM_FIRST + 18
+ LVM_ENSUREVISIBLE = LVM_FIRST + 19
+ LVM_SCROLL = LVM_FIRST + 20
+ LVM_REDRAWITEMS = LVM_FIRST + 21
+ LVM_ARRANGE = LVM_FIRST + 22
+ LVM_EDITLABEL = LVM_FIRST + 118
+ LVM_GETEDITCONTROL = LVM_FIRST + 24
+ LVM_GETCOLUMN = LVM_FIRST + 95
+ LVM_SETCOLUMN = LVM_FIRST + 96
+ LVM_INSERTCOLUMN = LVM_FIRST + 97
+ LVM_DELETECOLUMN = LVM_FIRST + 28
+ LVM_GETCOLUMNWIDTH = LVM_FIRST + 29
+ LVM_SETCOLUMNWIDTH = LVM_FIRST + 30
+ LVM_GETHEADER = LVM_FIRST + 31
+ LVM_CREATEDRAGIMAGE = LVM_FIRST + 33
+ LVM_GETVIEWRECT = LVM_FIRST + 34
+ LVM_GETTEXTCOLOR = LVM_FIRST + 35
+ LVM_SETTEXTCOLOR = LVM_FIRST + 36
+ LVM_GETTEXTBKCOLOR = LVM_FIRST + 37
+ LVM_SETTEXTBKCOLOR = LVM_FIRST + 38
+ LVM_GETTOPINDEX = LVM_FIRST + 39
+ LVM_GETCOUNTPERPAGE = LVM_FIRST + 40
+ LVM_GETORIGIN = LVM_FIRST + 41
+ LVM_UPDATE = LVM_FIRST + 42
+ LVM_SETITEMSTATE = LVM_FIRST + 43
+ LVM_GETITEMSTATE = LVM_FIRST + 44
+ LVM_GETITEMTEXT = LVM_FIRST + 115
+ LVM_SETITEMTEXT = LVM_FIRST + 116
+ LVM_SETITEMCOUNT = LVM_FIRST + 47
+ LVM_SORTITEMS = LVM_FIRST + 48
+ LVM_SETITEMPOSITION32 = LVM_FIRST + 49
+ LVM_GETSELECTEDCOUNT = LVM_FIRST + 50
+ LVM_GETITEMSPACING = LVM_FIRST + 51
+ LVM_GETISEARCHSTRING = LVM_FIRST + 117
+ LVM_SETICONSPACING = LVM_FIRST + 53
+ LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54
+ LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55
+ LVM_GETSUBITEMRECT = LVM_FIRST + 56
+ LVM_SUBITEMHITTEST = LVM_FIRST + 57
+ LVM_SETCOLUMNORDERARRAY = LVM_FIRST + 58
+ LVM_GETCOLUMNORDERARRAY = LVM_FIRST + 59
+ LVM_SETHOTITEM = LVM_FIRST + 60
+ LVM_GETHOTITEM = LVM_FIRST + 61
+ LVM_SETHOTCURSOR = LVM_FIRST + 62
+ LVM_GETHOTCURSOR = LVM_FIRST + 63
+ LVM_APPROXIMATEVIEWRECT = LVM_FIRST + 64
+ LVM_SETWORKAREAS = LVM_FIRST + 65
+ LVM_GETWORKAREAS = LVM_FIRST + 70
+ LVM_GETNUMBEROFWORKAREAS = LVM_FIRST + 73
+ LVM_GETSELECTIONMARK = LVM_FIRST + 66
+ LVM_SETSELECTIONMARK = LVM_FIRST + 67
+ LVM_SETHOVERTIME = LVM_FIRST + 71
+ LVM_GETHOVERTIME = LVM_FIRST + 72
+ LVM_SETTOOLTIPS = LVM_FIRST + 74
+ LVM_GETTOOLTIPS = LVM_FIRST + 78
+ LVM_SORTITEMSEX = LVM_FIRST + 81
+ LVM_SETBKIMAGE = LVM_FIRST + 138
+ LVM_GETBKIMAGE = LVM_FIRST + 139
+ LVM_SETSELECTEDCOLUMN = LVM_FIRST + 140
+ LVM_SETVIEW = LVM_FIRST + 142
+ LVM_GETVIEW = LVM_FIRST + 143
+ LVM_INSERTGROUP = LVM_FIRST + 145
+ LVM_SETGROUPINFO = LVM_FIRST + 147
+ LVM_GETGROUPINFO = LVM_FIRST + 149
+ LVM_REMOVEGROUP = LVM_FIRST + 150
+ LVM_MOVEGROUP = LVM_FIRST + 151
+ LVM_GETGROUPCOUNT = LVM_FIRST + 152
+ LVM_GETGROUPINFOBYINDEX = LVM_FIRST + 153
+ LVM_MOVEITEMTOGROUP = LVM_FIRST + 154
+ LVM_GETGROUPRECT = LVM_FIRST + 98
+ LVM_SETGROUPMETRICS = LVM_FIRST + 155
+ LVM_GETGROUPMETRICS = LVM_FIRST + 156
+ LVM_ENABLEGROUPVIEW = LVM_FIRST + 157
+ LVM_SORTGROUPS = LVM_FIRST + 158
+ LVM_INSERTGROUPSORTED = LVM_FIRST + 159
+ LVM_REMOVEALLGROUPS = LVM_FIRST + 160
+ LVM_HASGROUP = LVM_FIRST + 161
+ LVM_GETGROUPSTATE = LVM_FIRST + 92
+ LVM_GETFOCUSEDGROUP = LVM_FIRST + 93
+ LVM_SETTILEVIEWINFO = LVM_FIRST + 162
+ LVM_GETTILEVIEWINFO = LVM_FIRST + 163
+ LVM_SETTILEINFO = LVM_FIRST + 164
+ LVM_GETTILEINFO = LVM_FIRST + 165
+ LVM_SETINSERTMARK = LVM_FIRST + 166
+ LVM_GETINSERTMARK = LVM_FIRST + 167
+ LVM_INSERTMARKHITTEST = LVM_FIRST + 168
+ LVM_GETINSERTMARKRECT = LVM_FIRST + 169
+ LVM_SETINSERTMARKCOLOR = LVM_FIRST + 170
+ LVM_GETINSERTMARKCOLOR = LVM_FIRST + 171
+ LVM_SETINFOTIP = LVM_FIRST + 173
+ LVM_GETSELECTEDCOLUMN = LVM_FIRST + 174
+ LVM_ISGROUPVIEWENABLED = LVM_FIRST + 175
+ LVM_GETOUTLINECOLOR = LVM_FIRST + 176
+ LVM_SETOUTLINECOLOR = LVM_FIRST + 177
+ LVM_CANCELEDITLABEL = LVM_FIRST + 179
+ LVM_MAPINDEXTOID = LVM_FIRST + 180
+ LVM_MAPIDTOINDEX = LVM_FIRST + 181
+ LVM_ISITEMVISIBLE = LVM_FIRST + 182
+ LVM_GETNEXTITEMINDEX = LVM_FIRST + 211
+)
+
+// ListView notifications
+const (
+ LVN_FIRST = -100
+
+ LVN_ITEMCHANGING = LVN_FIRST - 0
+ LVN_ITEMCHANGED = LVN_FIRST - 1
+ LVN_INSERTITEM = LVN_FIRST - 2
+ LVN_DELETEITEM = LVN_FIRST - 3
+ LVN_DELETEALLITEMS = LVN_FIRST - 4
+ LVN_BEGINLABELEDITA = LVN_FIRST - 5
+ LVN_BEGINLABELEDITW = LVN_FIRST - 75
+ LVN_ENDLABELEDITA = LVN_FIRST - 6
+ LVN_ENDLABELEDITW = LVN_FIRST - 76
+ LVN_COLUMNCLICK = LVN_FIRST - 8
+ LVN_BEGINDRAG = LVN_FIRST - 9
+ LVN_BEGINRDRAG = LVN_FIRST - 11
+ LVN_ODCACHEHINT = LVN_FIRST - 13
+ LVN_ODFINDITEMA = LVN_FIRST - 52
+ LVN_ODFINDITEMW = LVN_FIRST - 79
+ LVN_ITEMACTIVATE = LVN_FIRST - 14
+ LVN_ODSTATECHANGED = LVN_FIRST - 15
+ LVN_HOTTRACK = LVN_FIRST - 21
+ LVN_GETDISPINFO = LVN_FIRST - 77
+ LVN_SETDISPINFO = LVN_FIRST - 78
+ LVN_KEYDOWN = LVN_FIRST - 55
+ LVN_MARQUEEBEGIN = LVN_FIRST - 56
+ LVN_GETINFOTIP = LVN_FIRST - 58
+ LVN_INCREMENTALSEARCH = LVN_FIRST - 63
+ LVN_BEGINSCROLL = LVN_FIRST - 80
+ LVN_ENDSCROLL = LVN_FIRST - 81
+)
+
+// ListView LVNI constants
+const (
+ LVNI_ALL = 0
+ LVNI_FOCUSED = 1
+ LVNI_SELECTED = 2
+ LVNI_CUT = 4
+ LVNI_DROPHILITED = 8
+ LVNI_ABOVE = 256
+ LVNI_BELOW = 512
+ LVNI_TOLEFT = 1024
+ LVNI_TORIGHT = 2048
+)
+
+// ListView styles
+const (
+ LVS_ICON = 0x0000
+ LVS_REPORT = 0x0001
+ LVS_SMALLICON = 0x0002
+ LVS_LIST = 0x0003
+ LVS_TYPEMASK = 0x0003
+ LVS_SINGLESEL = 0x0004
+ LVS_SHOWSELALWAYS = 0x0008
+ LVS_SORTASCENDING = 0x0010
+ LVS_SORTDESCENDING = 0x0020
+ LVS_SHAREIMAGELISTS = 0x0040
+ LVS_NOLABELWRAP = 0x0080
+ LVS_AUTOARRANGE = 0x0100
+ LVS_EDITLABELS = 0x0200
+ LVS_OWNERDATA = 0x1000
+ LVS_NOSCROLL = 0x2000
+ LVS_TYPESTYLEMASK = 0xfc00
+ LVS_ALIGNTOP = 0x0000
+ LVS_ALIGNLEFT = 0x0800
+ LVS_ALIGNMASK = 0x0c00
+ LVS_OWNERDRAWFIXED = 0x0400
+ LVS_NOCOLUMNHEADER = 0x4000
+ LVS_NOSORTHEADER = 0x8000
+)
+
+// ListView extended styles
+const (
+ LVS_EX_GRIDLINES = 0x00000001
+ LVS_EX_SUBITEMIMAGES = 0x00000002
+ LVS_EX_CHECKBOXES = 0x00000004
+ LVS_EX_TRACKSELECT = 0x00000008
+ LVS_EX_HEADERDRAGDROP = 0x00000010
+ LVS_EX_FULLROWSELECT = 0x00000020
+ LVS_EX_ONECLICKACTIVATE = 0x00000040
+ LVS_EX_TWOCLICKACTIVATE = 0x00000080
+ LVS_EX_FLATSB = 0x00000100
+ LVS_EX_REGIONAL = 0x00000200
+ LVS_EX_INFOTIP = 0x00000400
+ LVS_EX_UNDERLINEHOT = 0x00000800
+ LVS_EX_UNDERLINECOLD = 0x00001000
+ LVS_EX_MULTIWORKAREAS = 0x00002000
+ LVS_EX_LABELTIP = 0x00004000
+ LVS_EX_BORDERSELECT = 0x00008000
+ LVS_EX_DOUBLEBUFFER = 0x00010000
+ LVS_EX_HIDELABELS = 0x00020000
+ LVS_EX_SINGLEROW = 0x00040000
+ LVS_EX_SNAPTOGRID = 0x00080000
+ LVS_EX_SIMPLESELECT = 0x00100000
+)
+
+// ListView column flags
+const (
+ LVCF_FMT = 0x0001
+ LVCF_WIDTH = 0x0002
+ LVCF_TEXT = 0x0004
+ LVCF_SUBITEM = 0x0008
+ LVCF_IMAGE = 0x0010
+ LVCF_ORDER = 0x0020
+)
+
+// ListView column format constants
+const (
+ LVCFMT_LEFT = 0x0000
+ LVCFMT_RIGHT = 0x0001
+ LVCFMT_CENTER = 0x0002
+ LVCFMT_JUSTIFYMASK = 0x0003
+ LVCFMT_IMAGE = 0x0800
+ LVCFMT_BITMAP_ON_RIGHT = 0x1000
+ LVCFMT_COL_HAS_IMAGES = 0x8000
+)
+
+// ListView item flags
+const (
+ LVIF_TEXT = 0x00000001
+ LVIF_IMAGE = 0x00000002
+ LVIF_PARAM = 0x00000004
+ LVIF_STATE = 0x00000008
+ LVIF_INDENT = 0x00000010
+ LVIF_NORECOMPUTE = 0x00000800
+ LVIF_GROUPID = 0x00000100
+ LVIF_COLUMNS = 0x00000200
+)
+
+// ListView item states
+const (
+ LVIS_FOCUSED = 1
+ LVIS_SELECTED = 2
+ LVIS_CUT = 4
+ LVIS_DROPHILITED = 8
+ LVIS_OVERLAYMASK = 0xF00
+ LVIS_STATEIMAGEMASK = 0xF000
+)
+
+// ListView hit test constants
+const (
+ LVHT_NOWHERE = 0x00000001
+ LVHT_ONITEMICON = 0x00000002
+ LVHT_ONITEMLABEL = 0x00000004
+ LVHT_ONITEMSTATEICON = 0x00000008
+ LVHT_ONITEM = LVHT_ONITEMICON | LVHT_ONITEMLABEL | LVHT_ONITEMSTATEICON
+
+ LVHT_ABOVE = 0x00000008
+ LVHT_BELOW = 0x00000010
+ LVHT_TORIGHT = 0x00000020
+ LVHT_TOLEFT = 0x00000040
+)
+
+// ListView image list types
+const (
+ LVSIL_NORMAL = 0
+ LVSIL_SMALL = 1
+ LVSIL_STATE = 2
+ LVSIL_GROUPHEADER = 3
+)
+
+// InitCommonControlsEx flags
+const (
+ ICC_LISTVIEW_CLASSES = 1
+ ICC_TREEVIEW_CLASSES = 2
+ ICC_BAR_CLASSES = 4
+ ICC_TAB_CLASSES = 8
+ ICC_UPDOWN_CLASS = 16
+ ICC_PROGRESS_CLASS = 32
+ ICC_HOTKEY_CLASS = 64
+ ICC_ANIMATE_CLASS = 128
+ ICC_WIN95_CLASSES = 255
+ ICC_DATE_CLASSES = 256
+ ICC_USEREX_CLASSES = 512
+ ICC_COOL_CLASSES = 1024
+ ICC_INTERNET_CLASSES = 2048
+ ICC_PAGESCROLLER_CLASS = 4096
+ ICC_NATIVEFNTCTL_CLASS = 8192
+ INFOTIPSIZE = 1024
+ ICC_STANDARD_CLASSES = 0x00004000
+ ICC_LINK_CLASS = 0x00008000
+)
+
+// Dialog Codes
+const (
+ DLGC_WANTARROWS = 0x0001
+ DLGC_WANTTAB = 0x0002
+ DLGC_WANTALLKEYS = 0x0004
+ DLGC_WANTMESSAGE = 0x0004
+ DLGC_HASSETSEL = 0x0008
+ DLGC_DEFPUSHBUTTON = 0x0010
+ DLGC_UNDEFPUSHBUTTON = 0x0020
+ DLGC_RADIOBUTTON = 0x0040
+ DLGC_WANTCHARS = 0x0080
+ DLGC_STATIC = 0x0100
+ DLGC_BUTTON = 0x2000
+)
+
+// Get/SetWindowWord/Long offsets for use with WC_DIALOG windows
+const (
+ DWL_MSGRESULT = 0
+ DWL_DLGPROC = 4
+ DWL_USER = 8
+)
+
+// PeekMessage wRemoveMsg value
+const (
+ PM_NOREMOVE = 0x000
+ PM_REMOVE = 0x001
+ PM_NOYIELD = 0x002
+)
+
+// ImageList flags
+const (
+ ILC_MASK = 0x00000001
+ ILC_COLOR = 0x00000000
+ ILC_COLORDDB = 0x000000FE
+ ILC_COLOR4 = 0x00000004
+ ILC_COLOR8 = 0x00000008
+ ILC_COLOR16 = 0x00000010
+ ILC_COLOR24 = 0x00000018
+ ILC_COLOR32 = 0x00000020
+ ILC_PALETTE = 0x00000800
+ ILC_MIRROR = 0x00002000
+ ILC_PERITEMMIRROR = 0x00008000
+ ILC_ORIGINALSIZE = 0x00010000
+ ILC_HIGHQUALITYSCALE = 0x00020000
+)
+
+// Keystroke Message Flags
+const (
+ KF_EXTENDED = 0x0100
+ KF_DLGMODE = 0x0800
+ KF_MENUMODE = 0x1000
+ KF_ALTDOWN = 0x2000
+ KF_REPEAT = 0x4000
+ KF_UP = 0x8000
+)
+
+// Virtual-Key Codes
+const (
+ VK_LBUTTON = 0x01
+ VK_RBUTTON = 0x02
+ VK_CANCEL = 0x03
+ VK_MBUTTON = 0x04
+ VK_XBUTTON1 = 0x05
+ VK_XBUTTON2 = 0x06
+ VK_BACK = 0x08
+ VK_TAB = 0x09
+ VK_CLEAR = 0x0C
+ VK_RETURN = 0x0D
+ VK_SHIFT = 0x10
+ VK_CONTROL = 0x11
+ VK_MENU = 0x12
+ VK_PAUSE = 0x13
+ VK_CAPITAL = 0x14
+ VK_KANA = 0x15
+ VK_HANGEUL = 0x15
+ VK_HANGUL = 0x15
+ VK_JUNJA = 0x17
+ VK_FINAL = 0x18
+ VK_HANJA = 0x19
+ VK_KANJI = 0x19
+ VK_ESCAPE = 0x1B
+ VK_CONVERT = 0x1C
+ VK_NONCONVERT = 0x1D
+ VK_ACCEPT = 0x1E
+ VK_MODECHANGE = 0x1F
+ VK_SPACE = 0x20
+ VK_PRIOR = 0x21
+ VK_NEXT = 0x22
+ VK_END = 0x23
+ VK_HOME = 0x24
+ VK_LEFT = 0x25
+ VK_UP = 0x26
+ VK_RIGHT = 0x27
+ VK_DOWN = 0x28
+ VK_SELECT = 0x29
+ VK_PRINT = 0x2A
+ VK_EXECUTE = 0x2B
+ VK_SNAPSHOT = 0x2C
+ VK_INSERT = 0x2D
+ VK_DELETE = 0x2E
+ VK_HELP = 0x2F
+ VK_LWIN = 0x5B
+ VK_RWIN = 0x5C
+ VK_APPS = 0x5D
+ VK_SLEEP = 0x5F
+ VK_NUMPAD0 = 0x60
+ VK_NUMPAD1 = 0x61
+ VK_NUMPAD2 = 0x62
+ VK_NUMPAD3 = 0x63
+ VK_NUMPAD4 = 0x64
+ VK_NUMPAD5 = 0x65
+ VK_NUMPAD6 = 0x66
+ VK_NUMPAD7 = 0x67
+ VK_NUMPAD8 = 0x68
+ VK_NUMPAD9 = 0x69
+ VK_MULTIPLY = 0x6A
+ VK_ADD = 0x6B
+ VK_SEPARATOR = 0x6C
+ VK_SUBTRACT = 0x6D
+ VK_DECIMAL = 0x6E
+ VK_DIVIDE = 0x6F
+ VK_F1 = 0x70
+ VK_F2 = 0x71
+ VK_F3 = 0x72
+ VK_F4 = 0x73
+ VK_F5 = 0x74
+ VK_F6 = 0x75
+ VK_F7 = 0x76
+ VK_F8 = 0x77
+ VK_F9 = 0x78
+ VK_F10 = 0x79
+ VK_F11 = 0x7A
+ VK_F12 = 0x7B
+ VK_F13 = 0x7C
+ VK_F14 = 0x7D
+ VK_F15 = 0x7E
+ VK_F16 = 0x7F
+ VK_F17 = 0x80
+ VK_F18 = 0x81
+ VK_F19 = 0x82
+ VK_F20 = 0x83
+ VK_F21 = 0x84
+ VK_F22 = 0x85
+ VK_F23 = 0x86
+ VK_F24 = 0x87
+ VK_NUMLOCK = 0x90
+ VK_SCROLL = 0x91
+ VK_OEM_NEC_EQUAL = 0x92
+ VK_OEM_FJ_JISHO = 0x92
+ VK_OEM_FJ_MASSHOU = 0x93
+ VK_OEM_FJ_TOUROKU = 0x94
+ VK_OEM_FJ_LOYA = 0x95
+ VK_OEM_FJ_ROYA = 0x96
+ VK_LSHIFT = 0xA0
+ VK_RSHIFT = 0xA1
+ VK_LCONTROL = 0xA2
+ VK_RCONTROL = 0xA3
+ VK_LMENU = 0xA4
+ VK_RMENU = 0xA5
+ VK_BROWSER_BACK = 0xA6
+ VK_BROWSER_FORWARD = 0xA7
+ VK_BROWSER_REFRESH = 0xA8
+ VK_BROWSER_STOP = 0xA9
+ VK_BROWSER_SEARCH = 0xAA
+ VK_BROWSER_FAVORITES = 0xAB
+ VK_BROWSER_HOME = 0xAC
+ VK_VOLUME_MUTE = 0xAD
+ VK_VOLUME_DOWN = 0xAE
+ VK_VOLUME_UP = 0xAF
+ VK_MEDIA_NEXT_TRACK = 0xB0
+ VK_MEDIA_PREV_TRACK = 0xB1
+ VK_MEDIA_STOP = 0xB2
+ VK_MEDIA_PLAY_PAUSE = 0xB3
+ VK_LAUNCH_MAIL = 0xB4
+ VK_LAUNCH_MEDIA_SELECT = 0xB5
+ VK_LAUNCH_APP1 = 0xB6
+ VK_LAUNCH_APP2 = 0xB7
+ VK_OEM_1 = 0xBA
+ VK_OEM_PLUS = 0xBB
+ VK_OEM_COMMA = 0xBC
+ VK_OEM_MINUS = 0xBD
+ VK_OEM_PERIOD = 0xBE
+ VK_OEM_2 = 0xBF
+ VK_OEM_3 = 0xC0
+ VK_OEM_4 = 0xDB
+ VK_OEM_5 = 0xDC
+ VK_OEM_6 = 0xDD
+ VK_OEM_7 = 0xDE
+ VK_OEM_8 = 0xDF
+ VK_OEM_AX = 0xE1
+ VK_OEM_102 = 0xE2
+ VK_ICO_HELP = 0xE3
+ VK_ICO_00 = 0xE4
+ VK_PROCESSKEY = 0xE5
+ VK_ICO_CLEAR = 0xE6
+ VK_PACKET = 0xE7
+ VK_OEM_RESET = 0xE9
+ VK_OEM_JUMP = 0xEA
+ VK_OEM_PA1 = 0xEB
+ VK_OEM_PA2 = 0xEC
+ VK_OEM_PA3 = 0xED
+ VK_OEM_WSCTRL = 0xEE
+ VK_OEM_CUSEL = 0xEF
+ VK_OEM_ATTN = 0xF0
+ VK_OEM_FINISH = 0xF1
+ VK_OEM_COPY = 0xF2
+ VK_OEM_AUTO = 0xF3
+ VK_OEM_ENLW = 0xF4
+ VK_OEM_BACKTAB = 0xF5
+ VK_ATTN = 0xF6
+ VK_CRSEL = 0xF7
+ VK_EXSEL = 0xF8
+ VK_EREOF = 0xF9
+ VK_PLAY = 0xFA
+ VK_ZOOM = 0xFB
+ VK_NONAME = 0xFC
+ VK_PA1 = 0xFD
+ VK_OEM_CLEAR = 0xFE
+)
+
+// Registry Value Types
+const (
+ REG_NONE = 0
+ REG_SZ = 1
+ REG_EXPAND_SZ = 2
+ REG_BINARY = 3
+ REG_DWORD = 4
+ REG_DWORD_LITTLE_ENDIAN = 4
+ REG_DWORD_BIG_ENDIAN = 5
+ REG_LINK = 6
+ REG_MULTI_SZ = 7
+ REG_RESOURCE_LIST = 8
+ REG_FULL_RESOURCE_DESCRIPTOR = 9
+ REG_RESOURCE_REQUIREMENTS_LIST = 10
+ REG_QWORD = 11
+ REG_QWORD_LITTLE_ENDIAN = 11
+)
+
+// Tooltip styles
+const (
+ TTS_ALWAYSTIP = 0x01
+ TTS_NOPREFIX = 0x02
+ TTS_NOANIMATE = 0x10
+ TTS_NOFADE = 0x20
+ TTS_BALLOON = 0x40
+ TTS_CLOSE = 0x80
+ TTS_USEVISUALSTYLE = 0x100
+)
+
+// Tooltip messages
+const (
+ TTM_ACTIVATE = (WM_USER + 1)
+ TTM_SETDELAYTIME = (WM_USER + 3)
+ TTM_ADDTOOL = (WM_USER + 50)
+ TTM_DELTOOL = (WM_USER + 51)
+ TTM_NEWTOOLRECT = (WM_USER + 52)
+ TTM_RELAYEVENT = (WM_USER + 7)
+ TTM_GETTOOLINFO = (WM_USER + 53)
+ TTM_SETTOOLINFO = (WM_USER + 54)
+ TTM_HITTEST = (WM_USER + 55)
+ TTM_GETTEXT = (WM_USER + 56)
+ TTM_UPDATETIPTEXT = (WM_USER + 57)
+ TTM_GETTOOLCOUNT = (WM_USER + 13)
+ TTM_ENUMTOOLS = (WM_USER + 58)
+ TTM_GETCURRENTTOOL = (WM_USER + 59)
+ TTM_WINDOWFROMPOINT = (WM_USER + 16)
+ TTM_TRACKACTIVATE = (WM_USER + 17)
+ TTM_TRACKPOSITION = (WM_USER + 18)
+ TTM_SETTIPBKCOLOR = (WM_USER + 19)
+ TTM_SETTIPTEXTCOLOR = (WM_USER + 20)
+ TTM_GETDELAYTIME = (WM_USER + 21)
+ TTM_GETTIPBKCOLOR = (WM_USER + 22)
+ TTM_GETTIPTEXTCOLOR = (WM_USER + 23)
+ TTM_SETMAXTIPWIDTH = (WM_USER + 24)
+ TTM_GETMAXTIPWIDTH = (WM_USER + 25)
+ TTM_SETMARGIN = (WM_USER + 26)
+ TTM_GETMARGIN = (WM_USER + 27)
+ TTM_POP = (WM_USER + 28)
+ TTM_UPDATE = (WM_USER + 29)
+ TTM_GETBUBBLESIZE = (WM_USER + 30)
+ TTM_ADJUSTRECT = (WM_USER + 31)
+ TTM_SETTITLE = (WM_USER + 33)
+ TTM_POPUP = (WM_USER + 34)
+ TTM_GETTITLE = (WM_USER + 35)
+)
+
+// Tooltip icons
+const (
+ TTI_NONE = 0
+ TTI_INFO = 1
+ TTI_WARNING = 2
+ TTI_ERROR = 3
+ TTI_INFO_LARGE = 4
+ TTI_WARNING_LARGE = 5
+ TTI_ERROR_LARGE = 6
+)
+
+// Tooltip notifications
+const (
+ TTN_FIRST = -520
+ TTN_LAST = -549
+ TTN_GETDISPINFO = (TTN_FIRST - 10)
+ TTN_SHOW = (TTN_FIRST - 1)
+ TTN_POP = (TTN_FIRST - 2)
+ TTN_LINKCLICK = (TTN_FIRST - 3)
+ TTN_NEEDTEXT = TTN_GETDISPINFO
+)
+
+const (
+ TTF_IDISHWND = 0x0001
+ TTF_CENTERTIP = 0x0002
+ TTF_RTLREADING = 0x0004
+ TTF_SUBCLASS = 0x0010
+ TTF_TRACK = 0x0020
+ TTF_ABSOLUTE = 0x0080
+ TTF_TRANSPARENT = 0x0100
+ TTF_PARSELINKS = 0x1000
+ TTF_DI_SETITEM = 0x8000
+)
+
+const (
+ SWP_NOSIZE = 0x0001
+ SWP_NOMOVE = 0x0002
+ SWP_NOZORDER = 0x0004
+ SWP_NOREDRAW = 0x0008
+ SWP_NOACTIVATE = 0x0010
+ SWP_FRAMECHANGED = 0x0020
+ SWP_SHOWWINDOW = 0x0040
+ SWP_HIDEWINDOW = 0x0080
+ SWP_NOCOPYBITS = 0x0100
+ SWP_NOOWNERZORDER = 0x0200
+ SWP_NOSENDCHANGING = 0x0400
+ SWP_DRAWFRAME = SWP_FRAMECHANGED
+ SWP_NOREPOSITION = SWP_NOOWNERZORDER
+ SWP_DEFERERASE = 0x2000
+ SWP_ASYNCWINDOWPOS = 0x4000
+)
+
+// Predefined window handles
+const (
+ HWND_BROADCAST = HWND(0xFFFF)
+ HWND_BOTTOM = HWND(1)
+ HWND_NOTOPMOST = ^HWND(1) // -2
+ HWND_TOP = HWND(0)
+ HWND_TOPMOST = ^HWND(0) // -1
+ HWND_DESKTOP = HWND(0)
+ HWND_MESSAGE = ^HWND(2) // -3
+)
+
+// Pen types
+const (
+ PS_COSMETIC = 0x00000000
+ PS_GEOMETRIC = 0x00010000
+ PS_TYPE_MASK = 0x000F0000
+)
+
+// Pen styles
+const (
+ PS_SOLID = 0
+ PS_DASH = 1
+ PS_DOT = 2
+ PS_DASHDOT = 3
+ PS_DASHDOTDOT = 4
+ PS_NULL = 5
+ PS_INSIDEFRAME = 6
+ PS_USERSTYLE = 7
+ PS_ALTERNATE = 8
+ PS_STYLE_MASK = 0x0000000F
+)
+
+// Pen cap types
+const (
+ PS_ENDCAP_ROUND = 0x00000000
+ PS_ENDCAP_SQUARE = 0x00000100
+ PS_ENDCAP_FLAT = 0x00000200
+ PS_ENDCAP_MASK = 0x00000F00
+)
+
+// Pen join types
+const (
+ PS_JOIN_ROUND = 0x00000000
+ PS_JOIN_BEVEL = 0x00001000
+ PS_JOIN_MITER = 0x00002000
+ PS_JOIN_MASK = 0x0000F000
+)
+
+// Hatch styles
+const (
+ HS_HORIZONTAL = 0
+ HS_VERTICAL = 1
+ HS_FDIAGONAL = 2
+ HS_BDIAGONAL = 3
+ HS_CROSS = 4
+ HS_DIAGCROSS = 5
+)
+
+// Stock Logical Objects
+const (
+ WHITE_BRUSH = 0
+ LTGRAY_BRUSH = 1
+ GRAY_BRUSH = 2
+ DKGRAY_BRUSH = 3
+ BLACK_BRUSH = 4
+ NULL_BRUSH = 5
+ HOLLOW_BRUSH = NULL_BRUSH
+ WHITE_PEN = 6
+ BLACK_PEN = 7
+ NULL_PEN = 8
+ OEM_FIXED_FONT = 10
+ ANSI_FIXED_FONT = 11
+ ANSI_VAR_FONT = 12
+ SYSTEM_FONT = 13
+ DEVICE_DEFAULT_FONT = 14
+ DEFAULT_PALETTE = 15
+ SYSTEM_FIXED_FONT = 16
+ DEFAULT_GUI_FONT = 17
+ DC_BRUSH = 18
+ DC_PEN = 19
+)
+
+// Brush styles
+const (
+ BS_SOLID = 0
+ BS_NULL = 1
+ BS_HOLLOW = BS_NULL
+ BS_HATCHED = 2
+ BS_PATTERN = 3
+ BS_INDEXED = 4
+ BS_DIBPATTERN = 5
+ BS_DIBPATTERNPT = 6
+ BS_PATTERN8X8 = 7
+ BS_DIBPATTERN8X8 = 8
+ BS_MONOPATTERN = 9
+)
+
+// TRACKMOUSEEVENT flags
+const (
+ TME_HOVER = 0x00000001
+ TME_LEAVE = 0x00000002
+ TME_NONCLIENT = 0x00000010
+ TME_QUERY = 0x40000000
+ TME_CANCEL = 0x80000000
+
+ HOVER_DEFAULT = 0xFFFFFFFF
+)
+
+// WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
+const (
+ HTERROR = (-2)
+ HTTRANSPARENT = (-1)
+ HTNOWHERE = 0
+ HTCLIENT = 1
+ HTCAPTION = 2
+ HTSYSMENU = 3
+ HTGROWBOX = 4
+ HTSIZE = HTGROWBOX
+ HTMENU = 5
+ HTHSCROLL = 6
+ HTVSCROLL = 7
+ HTMINBUTTON = 8
+ HTMAXBUTTON = 9
+ HTLEFT = 10
+ HTRIGHT = 11
+ HTTOP = 12
+ HTTOPLEFT = 13
+ HTTOPRIGHT = 14
+ HTBOTTOM = 15
+ HTBOTTOMLEFT = 16
+ HTBOTTOMRIGHT = 17
+ HTBORDER = 18
+ HTREDUCE = HTMINBUTTON
+ HTZOOM = HTMAXBUTTON
+ HTSIZEFIRST = HTLEFT
+ HTSIZELAST = HTBOTTOMRIGHT
+ HTOBJECT = 19
+ HTCLOSE = 20
+ HTHELP = 21
+)
+
+// DrawText[Ex] format flags
+const (
+ DT_TOP = 0x00000000
+ DT_LEFT = 0x00000000
+ DT_CENTER = 0x00000001
+ DT_RIGHT = 0x00000002
+ DT_VCENTER = 0x00000004
+ DT_BOTTOM = 0x00000008
+ DT_WORDBREAK = 0x00000010
+ DT_SINGLELINE = 0x00000020
+ DT_EXPANDTABS = 0x00000040
+ DT_TABSTOP = 0x00000080
+ DT_NOCLIP = 0x00000100
+ DT_EXTERNALLEADING = 0x00000200
+ DT_CALCRECT = 0x00000400
+ DT_NOPREFIX = 0x00000800
+ DT_INTERNAL = 0x00001000
+ DT_EDITCONTROL = 0x00002000
+ DT_PATH_ELLIPSIS = 0x00004000
+ DT_END_ELLIPSIS = 0x00008000
+ DT_MODIFYSTRING = 0x00010000
+ DT_RTLREADING = 0x00020000
+ DT_WORD_ELLIPSIS = 0x00040000
+ DT_NOFULLWIDTHCHARBREAK = 0x00080000
+ DT_HIDEPREFIX = 0x00100000
+ DT_PREFIXONLY = 0x00200000
+)
+
+const CLR_INVALID = 0xFFFFFFFF
+
+// Background Modes
+const (
+ TRANSPARENT = 1
+ OPAQUE = 2
+ BKMODE_LAST = 2
+)
+
+// Global Memory Flags
+const (
+ GMEM_FIXED = 0x0000
+ GMEM_MOVEABLE = 0x0002
+ GMEM_NOCOMPACT = 0x0010
+ GMEM_NODISCARD = 0x0020
+ GMEM_ZEROINIT = 0x0040
+ GMEM_MODIFY = 0x0080
+ GMEM_DISCARDABLE = 0x0100
+ GMEM_NOT_BANKED = 0x1000
+ GMEM_SHARE = 0x2000
+ GMEM_DDESHARE = 0x2000
+ GMEM_NOTIFY = 0x4000
+ GMEM_LOWER = GMEM_NOT_BANKED
+ GMEM_VALID_FLAGS = 0x7F72
+ GMEM_INVALID_HANDLE = 0x8000
+ GHND = (GMEM_MOVEABLE | GMEM_ZEROINIT)
+ GPTR = (GMEM_FIXED | GMEM_ZEROINIT)
+)
+
+// Ternary raster operations
+const (
+ SRCCOPY = 0x00CC0020
+ SRCPAINT = 0x00EE0086
+ SRCAND = 0x008800C6
+ SRCINVERT = 0x00660046
+ SRCERASE = 0x00440328
+ NOTSRCCOPY = 0x00330008
+ NOTSRCERASE = 0x001100A6
+ MERGECOPY = 0x00C000CA
+ MERGEPAINT = 0x00BB0226
+ PATCOPY = 0x00F00021
+ PATPAINT = 0x00FB0A09
+ PATINVERT = 0x005A0049
+ DSTINVERT = 0x00550009
+ BLACKNESS = 0x00000042
+ WHITENESS = 0x00FF0062
+ NOMIRRORBITMAP = 0x80000000
+ CAPTUREBLT = 0x40000000
+)
+
+// Clipboard formats
+const (
+ CF_TEXT = 1
+ CF_BITMAP = 2
+ CF_METAFILEPICT = 3
+ CF_SYLK = 4
+ CF_DIF = 5
+ CF_TIFF = 6
+ CF_OEMTEXT = 7
+ CF_DIB = 8
+ CF_PALETTE = 9
+ CF_PENDATA = 10
+ CF_RIFF = 11
+ CF_WAVE = 12
+ CF_UNICODETEXT = 13
+ CF_ENHMETAFILE = 14
+ CF_HDROP = 15
+ CF_LOCALE = 16
+ CF_DIBV5 = 17
+ CF_MAX = 18
+ CF_OWNERDISPLAY = 0x0080
+ CF_DSPTEXT = 0x0081
+ CF_DSPBITMAP = 0x0082
+ CF_DSPMETAFILEPICT = 0x0083
+ CF_DSPENHMETAFILE = 0x008E
+ CF_PRIVATEFIRST = 0x0200
+ CF_PRIVATELAST = 0x02FF
+ CF_GDIOBJFIRST = 0x0300
+ CF_GDIOBJLAST = 0x03FF
+)
+
+// Bitmap compression formats
+const (
+ BI_RGB = 0
+ BI_RLE8 = 1
+ BI_RLE4 = 2
+ BI_BITFIELDS = 3
+ BI_JPEG = 4
+ BI_PNG = 5
+)
+
+// SetDIBitsToDevice fuColorUse
+const (
+ DIB_PAL_COLORS = 1
+ DIB_RGB_COLORS = 0
+)
+
+const (
+ STANDARD_RIGHTS_REQUIRED = 0x000F
+)
+
+// MapVirtualKey maptypes
+const (
+ MAPVK_VK_TO_CHAR = 2
+ MAPVK_VK_TO_VSC = 0
+ MAPVK_VSC_TO_VK = 1
+ MAPVK_VSC_TO_VK_EX = 3
+)
+
+// ReadEventLog Flags
+const (
+ EVENTLOG_SEEK_READ = 0x0002
+ EVENTLOG_SEQUENTIAL_READ = 0x0001
+ EVENTLOG_FORWARDS_READ = 0x0004
+ EVENTLOG_BACKWARDS_READ = 0x0008
+)
+
+// CreateToolhelp32Snapshot flags
+const (
+ TH32CS_SNAPHEAPLIST = 0x00000001
+ TH32CS_SNAPPROCESS = 0x00000002
+ TH32CS_SNAPTHREAD = 0x00000004
+ TH32CS_SNAPMODULE = 0x00000008
+ TH32CS_SNAPMODULE32 = 0x00000010
+ TH32CS_INHERIT = 0x80000000
+ TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD
+)
+
+const (
+ MAX_MODULE_NAME32 = 255
+ MAX_PATH = 260
+)
+
+const (
+ FOREGROUND_BLUE = 0x0001
+ FOREGROUND_GREEN = 0x0002
+ FOREGROUND_RED = 0x0004
+ FOREGROUND_INTENSITY = 0x0008
+ BACKGROUND_BLUE = 0x0010
+ BACKGROUND_GREEN = 0x0020
+ BACKGROUND_RED = 0x0040
+ BACKGROUND_INTENSITY = 0x0080
+ COMMON_LVB_LEADING_BYTE = 0x0100
+ COMMON_LVB_TRAILING_BYTE = 0x0200
+ COMMON_LVB_GRID_HORIZONTAL = 0x0400
+ COMMON_LVB_GRID_LVERTICAL = 0x0800
+ COMMON_LVB_GRID_RVERTICAL = 0x1000
+ COMMON_LVB_REVERSE_VIDEO = 0x4000
+ COMMON_LVB_UNDERSCORE = 0x8000
+)
+
+// Flags used by the DWM_BLURBEHIND structure to indicate
+// which of its members contain valid information.
+const (
+ DWM_BB_ENABLE = 0x00000001 // A value for the fEnable member has been specified.
+ DWM_BB_BLURREGION = 0x00000002 // A value for the hRgnBlur member has been specified.
+ DWM_BB_TRANSITIONONMAXIMIZED = 0x00000004 // A value for the fTransitionOnMaximized member has been specified.
+)
+
+// Flags used by the DwmEnableComposition function
+// to change the state of Desktop Window Manager (DWM) composition.
+const (
+ DWM_EC_DISABLECOMPOSITION = 0 // Disable composition
+ DWM_EC_ENABLECOMPOSITION = 1 // Enable composition
+)
+
+// enum-lite implementation for the following constant structure
+type DWM_SHOWCONTACT int32
+
+const (
+ DWMSC_DOWN = 0x00000001
+ DWMSC_UP = 0x00000002
+ DWMSC_DRAG = 0x00000004
+ DWMSC_HOLD = 0x00000008
+ DWMSC_PENBARREL = 0x00000010
+ DWMSC_NONE = 0x00000000
+ DWMSC_ALL = 0xFFFFFFFF
+)
+
+// enum-lite implementation for the following constant structure
+type DWM_SOURCE_FRAME_SAMPLING int32
+
+// TODO: need to verify this construction
+// Flags used by the DwmSetPresentParameters function
+// to specify the frame sampling type
+const (
+ DWM_SOURCE_FRAME_SAMPLING_POINT = iota + 1
+ DWM_SOURCE_FRAME_SAMPLING_COVERAGE
+ DWM_SOURCE_FRAME_SAMPLING_LAST
+)
+
+// Flags used by the DWM_THUMBNAIL_PROPERTIES structure to
+// indicate which of its members contain valid information.
+const (
+ DWM_TNP_RECTDESTINATION = 0x00000001 // A value for the rcDestination member has been specified
+ DWM_TNP_RECTSOURCE = 0x00000002 // A value for the rcSource member has been specified
+ DWM_TNP_OPACITY = 0x00000004 // A value for the opacity member has been specified
+ DWM_TNP_VISIBLE = 0x00000008 // A value for the fVisible member has been specified
+ DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010 // A value for the fSourceClientAreaOnly member has been specified
+)
+
+// enum-lite implementation for the following constant structure
+type DWMFLIP3DWINDOWPOLICY int32
+
+// TODO: need to verify this construction
+// Flags used by the DwmSetWindowAttribute function
+// to specify the Flip3D window policy
+const (
+ DWMFLIP3D_DEFAULT = iota + 1
+ DWMFLIP3D_EXCLUDEBELOW
+ DWMFLIP3D_EXCLUDEABOVE
+ DWMFLIP3D_LAST
+)
+
+// enum-lite implementation for the following constant structure
+type DWMNCRENDERINGPOLICY int32
+
+// TODO: need to verify this construction
+// Flags used by the DwmSetWindowAttribute function
+// to specify the non-client area rendering policy
+const (
+ DWMNCRP_USEWINDOWSTYLE = iota + 1
+ DWMNCRP_DISABLED
+ DWMNCRP_ENABLED
+ DWMNCRP_LAST
+)
+
+// enum-lite implementation for the following constant structure
+type DWMTRANSITION_OWNEDWINDOW_TARGET int32
+
+const (
+ DWMTRANSITION_OWNEDWINDOW_NULL = -1
+ DWMTRANSITION_OWNEDWINDOW_REPOSITION = 0
+)
+
+// enum-lite implementation for the following constant structure
+type DWMWINDOWATTRIBUTE int32
+
+// TODO: need to verify this construction
+// Flags used by the DwmGetWindowAttribute and DwmSetWindowAttribute functions
+// to specify window attributes for non-client rendering
+const (
+ DWMWA_NCRENDERING_ENABLED = iota + 1
+ DWMWA_NCRENDERING_POLICY
+ DWMWA_TRANSITIONS_FORCEDISABLED
+ DWMWA_ALLOW_NCPAINT
+ DWMWA_CAPTION_BUTTON_BOUNDS
+ DWMWA_NONCLIENT_RTL_LAYOUT
+ DWMWA_FORCE_ICONIC_REPRESENTATION
+ DWMWA_FLIP3D_POLICY
+ DWMWA_EXTENDED_FRAME_BOUNDS
+ DWMWA_HAS_ICONIC_BITMAP
+ DWMWA_DISALLOW_PEEK
+ DWMWA_EXCLUDED_FROM_PEEK
+ DWMWA_CLOAK
+ DWMWA_CLOAKED
+ DWMWA_FREEZE_REPRESENTATION
+ DWMWA_LAST
+)
+
+// enum-lite implementation for the following constant structure
+type GESTURE_TYPE int32
+
+// TODO: use iota?
+// Identifies the gesture type
+const (
+ GT_PEN_TAP = 0
+ GT_PEN_DOUBLETAP = 1
+ GT_PEN_RIGHTTAP = 2
+ GT_PEN_PRESSANDHOLD = 3
+ GT_PEN_PRESSANDHOLDABORT = 4
+ GT_TOUCH_TAP = 5
+ GT_TOUCH_DOUBLETAP = 6
+ GT_TOUCH_RIGHTTAP = 7
+ GT_TOUCH_PRESSANDHOLD = 8
+ GT_TOUCH_PRESSANDHOLDABORT = 9
+ GT_TOUCH_PRESSANDTAP = 10
+)
+
+// Icons
+const (
+ ICON_SMALL = 0
+ ICON_BIG = 1
+ ICON_SMALL2 = 2
+)
+
+const (
+ SIZE_RESTORED = 0
+ SIZE_MINIMIZED = 1
+ SIZE_MAXIMIZED = 2
+ SIZE_MAXSHOW = 3
+ SIZE_MAXHIDE = 4
+)
+
+// XButton values
+const (
+ XBUTTON1 = 1
+ XBUTTON2 = 2
+)
+
+// Devmode
+const (
+ DM_SPECVERSION = 0x0401
+
+ DM_ORIENTATION = 0x00000001
+ DM_PAPERSIZE = 0x00000002
+ DM_PAPERLENGTH = 0x00000004
+ DM_PAPERWIDTH = 0x00000008
+ DM_SCALE = 0x00000010
+ DM_POSITION = 0x00000020
+ DM_NUP = 0x00000040
+ DM_DISPLAYORIENTATION = 0x00000080
+ DM_COPIES = 0x00000100
+ DM_DEFAULTSOURCE = 0x00000200
+ DM_PRINTQUALITY = 0x00000400
+ DM_COLOR = 0x00000800
+ DM_DUPLEX = 0x00001000
+ DM_YRESOLUTION = 0x00002000
+ DM_TTOPTION = 0x00004000
+ DM_COLLATE = 0x00008000
+ DM_FORMNAME = 0x00010000
+ DM_LOGPIXELS = 0x00020000
+ DM_BITSPERPEL = 0x00040000
+ DM_PELSWIDTH = 0x00080000
+ DM_PELSHEIGHT = 0x00100000
+ DM_DISPLAYFLAGS = 0x00200000
+ DM_DISPLAYFREQUENCY = 0x00400000
+ DM_ICMMETHOD = 0x00800000
+ DM_ICMINTENT = 0x01000000
+ DM_MEDIATYPE = 0x02000000
+ DM_DITHERTYPE = 0x04000000
+ DM_PANNINGWIDTH = 0x08000000
+ DM_PANNINGHEIGHT = 0x10000000
+ DM_DISPLAYFIXEDOUTPUT = 0x20000000
+)
+
+// ChangeDisplaySettings
+const (
+ CDS_UPDATEREGISTRY = 0x00000001
+ CDS_TEST = 0x00000002
+ CDS_FULLSCREEN = 0x00000004
+ CDS_GLOBAL = 0x00000008
+ CDS_SET_PRIMARY = 0x00000010
+ CDS_VIDEOPARAMETERS = 0x00000020
+ CDS_RESET = 0x40000000
+ CDS_NORESET = 0x10000000
+
+ DISP_CHANGE_SUCCESSFUL = 0
+ DISP_CHANGE_RESTART = 1
+ DISP_CHANGE_FAILED = -1
+ DISP_CHANGE_BADMODE = -2
+ DISP_CHANGE_NOTUPDATED = -3
+ DISP_CHANGE_BADFLAGS = -4
+ DISP_CHANGE_BADPARAM = -5
+ DISP_CHANGE_BADDUALVIEW = -6
+)
+
+const (
+ ENUM_CURRENT_SETTINGS = 0xFFFFFFFF
+ ENUM_REGISTRY_SETTINGS = 0xFFFFFFFE
+)
+
+// PIXELFORMATDESCRIPTOR
+const (
+ PFD_TYPE_RGBA = 0
+ PFD_TYPE_COLORINDEX = 1
+
+ PFD_MAIN_PLANE = 0
+ PFD_OVERLAY_PLANE = 1
+ PFD_UNDERLAY_PLANE = -1
+
+ PFD_DOUBLEBUFFER = 0x00000001
+ PFD_STEREO = 0x00000002
+ PFD_DRAW_TO_WINDOW = 0x00000004
+ PFD_DRAW_TO_BITMAP = 0x00000008
+ PFD_SUPPORT_GDI = 0x00000010
+ PFD_SUPPORT_OPENGL = 0x00000020
+ PFD_GENERIC_FORMAT = 0x00000040
+ PFD_NEED_PALETTE = 0x00000080
+ PFD_NEED_SYSTEM_PALETTE = 0x00000100
+ PFD_SWAP_EXCHANGE = 0x00000200
+ PFD_SWAP_COPY = 0x00000400
+ PFD_SWAP_LAYER_BUFFERS = 0x00000800
+ PFD_GENERIC_ACCELERATED = 0x00001000
+ PFD_SUPPORT_DIRECTDRAW = 0x00002000
+ PFD_DIRECT3D_ACCELERATED = 0x00004000
+ PFD_SUPPORT_COMPOSITION = 0x00008000
+
+ PFD_DEPTH_DONTCARE = 0x20000000
+ PFD_DOUBLEBUFFER_DONTCARE = 0x40000000
+ PFD_STEREO_DONTCARE = 0x80000000
+)
+
+const (
+ INPUT_MOUSE = 0
+ INPUT_KEYBOARD = 1
+ INPUT_HARDWARE = 2
+)
+
+const (
+ MOUSEEVENTF_ABSOLUTE = 0x8000
+ MOUSEEVENTF_HWHEEL = 0x01000
+ MOUSEEVENTF_MOVE = 0x0001
+ MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000
+ MOUSEEVENTF_LEFTDOWN = 0x0002
+ MOUSEEVENTF_LEFTUP = 0x0004
+ MOUSEEVENTF_RIGHTDOWN = 0x0008
+ MOUSEEVENTF_RIGHTUP = 0x0010
+ MOUSEEVENTF_MIDDLEDOWN = 0x0020
+ MOUSEEVENTF_MIDDLEUP = 0x0040
+ MOUSEEVENTF_VIRTUALDESK = 0x4000
+ MOUSEEVENTF_WHEEL = 0x0800
+ MOUSEEVENTF_XDOWN = 0x0080
+ MOUSEEVENTF_XUP = 0x0100
+)
+
+// Windows Hooks (WH_*)
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
+const (
+ WH_CALLWNDPROC = 4
+ WH_CALLWNDPROCRET = 12
+ WH_CBT = 5
+ WH_DEBUG = 9
+ WH_FOREGROUNDIDLE = 11
+ WH_GETMESSAGE = 3
+ WH_JOURNALPLAYBACK = 1
+ WH_JOURNALRECORD = 0
+ WH_KEYBOARD = 2
+ WH_KEYBOARD_LL = 13
+ WH_MOUSE = 7
+ WH_MOUSE_LL = 14
+ WH_MSGFILTER = -1
+ WH_SHELL = 10
+ WH_SYSMSGFILTER = 6
+)
+
+const (
+ MEM_COMMIT = 0x00001000
+ MEM_RESERVE = 0x00002000
+ MEM_RESET = 0x00080000
+ MEM_RESET_UNDO = 0x1000000
+
+ MEM_LARGE_PAGES = 0x20000000
+ MEM_PHYSICAL = 0x00400000
+ MEM_TOP_DOWN = 0x00100000
+
+ MEM_DECOMMIT = 0x4000
+ MEM_RELEASE = 0x8000
+)
+
+const (
+ PROCESS_CREATE_PROCESS = 0x0080
+ PROCESS_CREATE_THREAD = 0x0002
+ PROCESS_DUP_HANDLE = 0x0040
+ PROCESS_QUERY_INFORMATION = 0x0400
+ PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
+ PROCESS_SET_INFORMATION = 0x0200
+ PROCESS_SET_QUOTA = 0x0100
+ PROCESS_SUSPEND_RESUME = 0x0800
+ PROCESS_TERMINATE = 0x0001
+ PROCESS_VM_OPERATION = 0x0008
+ PROCESS_VM_READ = 0x0010
+ PROCESS_VM_WRITE = 0x0020
+ SYNCHRONIZE = 0x00100000
+)
+
+const (
+ PAGE_EXECUTE = 0x10
+ PAGE_EXECUTE_READ = 0x20
+ PAGE_EXECUTE_READWRITE = 0x40
+ PAGE_EXECUTE_WRITECOPY = 0x80
+ PAGE_NOACCESS = 0x01
+ PAGE_READWRITE = 0x04
+ PAGE_WRITECOPY = 0x08
+ PAGE_TARGETS_INVALID = 0x40000000
+ PAGE_TARGETS_NO_UPDATE = 0x40000000
+)
+
+// SendMessageTimeout Flags
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952(v=vs.85).aspx
+const (
+ SMTO_ABORTIFHUNG = 0x0002
+ SMTO_BLOCK = 0x0001
+ SMTO_NORMAL = 0x0000
+ SMTO_NOTIMEOUTIFNOTHUNG = 0x0008
+ SMTO_ERRORONEXIT = 0x0020
+)
+
+// RedrawWindow Flags
+const (
+ RDW_ERASE = 4
+ RDW_ALLCHILDREN = 0x80
+ RDW_ERASENOW = 0x200
+ RDW_FRAME = 0x400
+ RDW_INTERNALPAINT = 2
+ RDW_INVALIDATE = 1
+ RDW_NOCHILDREN = 0x40
+ RDW_NOERASE = 0x20
+ RDW_NOFRAME = 0x800
+ RDW_NOINTERNALPAINT = 0x10
+ RDW_UPDATENOW = 0x100
+ RDW_VALIDATE = 8
+)
diff --git a/vendor/github.com/AllenDang/w32/create_process.go b/vendor/github.com/AllenDang/w32/create_process.go
new file mode 100644
index 0000000..9caf9ff
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/create_process.go
@@ -0,0 +1,152 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var (
+ kernel32 = syscall.NewLazyDLL("kernel32.dll")
+
+ procCreateProcessW = kernel32.NewProc("CreateProcessW")
+ procTerminateProcess = kernel32.NewProc("TerminateProcess")
+ procGetExitCodeProcess = kernel32.NewProc("GetExitCodeProcess")
+ procWaitForSingleObject = kernel32.NewProc("WaitForSingleObject")
+)
+
+// WINBASEAPI WINBOOL WINAPI
+// CreateProcessW (
+// LPCWSTR lpApplicationName,
+// LPWSTR lpCommandLine,
+// LPSECURITY_ATTRIBUTES lpProcessAttributes,
+// LPSECURITY_ATTRIBUTES lpThreadAttributes
+// WINBOOL bInheritHandles
+// DWORD dwCreationFlags
+// LPVOID lpEnvironment
+// LPCWSTR lpCurrentDirectory
+// LPSTARTUPINFOW lpStartupInfo
+// LPPROCESS_INFORMATION lpProcessInformation
+//);
+func CreateProcessW(
+ lpApplicationName, lpCommandLine string,
+ lpProcessAttributes, lpThreadAttributes *SECURITY_ATTRIBUTES,
+ bInheritHandles BOOL,
+ dwCreationFlags uint32,
+ lpEnvironment unsafe.Pointer,
+ lpCurrentDirectory string,
+ lpStartupInfo *STARTUPINFOW,
+ lpProcessInformation *PROCESS_INFORMATION,
+) (e error) {
+
+ var lpAN, lpCL, lpCD *uint16
+ if len(lpApplicationName) > 0 {
+ lpAN, e = syscall.UTF16PtrFromString(lpApplicationName)
+ if e != nil {
+ return
+ }
+ }
+ if len(lpCommandLine) > 0 {
+ lpCL, e = syscall.UTF16PtrFromString(lpCommandLine)
+ if e != nil {
+ return
+ }
+ }
+ if len(lpCurrentDirectory) > 0 {
+ lpCD, e = syscall.UTF16PtrFromString(lpCurrentDirectory)
+ if e != nil {
+ return
+ }
+ }
+
+ ret, _, lastErr := procCreateProcessW.Call(
+ uintptr(unsafe.Pointer(lpAN)),
+ uintptr(unsafe.Pointer(lpCL)),
+ uintptr(unsafe.Pointer(lpProcessAttributes)),
+ uintptr(unsafe.Pointer(lpProcessInformation)),
+ uintptr(bInheritHandles),
+ uintptr(dwCreationFlags),
+ uintptr(lpEnvironment),
+ uintptr(unsafe.Pointer(lpCD)),
+ uintptr(unsafe.Pointer(lpStartupInfo)),
+ uintptr(unsafe.Pointer(lpProcessInformation)),
+ )
+
+ if ret == 0 {
+ e = lastErr
+ }
+
+ return
+}
+
+func CreateProcessQuick(cmd string) (pi PROCESS_INFORMATION, e error) {
+ si := &STARTUPINFOW{}
+ e = CreateProcessW(
+ "",
+ cmd,
+ nil,
+ nil,
+ 0,
+ 0,
+ unsafe.Pointer(nil),
+ "",
+ si,
+ &pi,
+ )
+ return
+}
+
+func TerminateProcess(hProcess HANDLE, exitCode uint32) (e error) {
+ ret, _, lastErr := procTerminateProcess.Call(
+ uintptr(hProcess),
+ uintptr(exitCode),
+ )
+
+ if ret == 0 {
+ e = lastErr
+ }
+
+ return
+}
+
+func GetExitCodeProcess(hProcess HANDLE) (code uintptr, e error) {
+ ret, _, lastErr := procGetExitCodeProcess.Call(
+ uintptr(hProcess),
+ uintptr(unsafe.Pointer(&code)),
+ )
+
+ if ret == 0 {
+ e = lastErr
+ }
+
+ return
+}
+
+// DWORD WINAPI WaitForSingleObject(
+// _In_ HANDLE hHandle,
+// _In_ DWORD dwMilliseconds
+// );
+
+func WaitForSingleObject(hHandle HANDLE, msecs uint32) (ok bool, e error) {
+
+ ret, _, lastErr := procWaitForSingleObject.Call(
+ uintptr(hHandle),
+ uintptr(msecs),
+ )
+
+ if ret == WAIT_OBJECT_0 {
+ ok = true
+ return
+ }
+
+ // don't set e for timeouts, or it will be ERROR_SUCCESS which is
+ // confusing
+ if ret != WAIT_TIMEOUT {
+ e = lastErr
+ }
+ return
+
+}
diff --git a/vendor/github.com/AllenDang/w32/create_process_constants.go b/vendor/github.com/AllenDang/w32/create_process_constants.go
new file mode 100644
index 0000000..c37d7e5
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/create_process_constants.go
@@ -0,0 +1,9 @@
+package w32
+
+const (
+ WAIT_ABANDONED = 0x00000080
+ WAIT_OBJECT_0 = 0x00000000
+ WAIT_TIMEOUT = 0x00000102
+ WAIT_FAILED = 0xFFFFFFFF
+ INFINITE = 0xFFFFFFFF
+)
diff --git a/vendor/github.com/AllenDang/w32/create_process_test.go b/vendor/github.com/AllenDang/w32/create_process_test.go
new file mode 100644
index 0000000..7e64b1d
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/create_process_test.go
@@ -0,0 +1,47 @@
+package w32
+
+import (
+ "testing"
+)
+
+var testProcess = "notepad.exe"
+var wantCode = uint32(42)
+
+func TestCreateProcess(t *testing.T) {
+
+ pi, err := CreateProcessQuick(testProcess)
+ if err != nil {
+ t.Errorf("[!!] Failed to create %s: %s", testProcess, err)
+ } else {
+ t.Logf("[OK] Created process %s with handle 0x%x, PID %d", testProcess, pi.Process, pi.ProcessId)
+ }
+
+ err = TerminateProcess(pi.Process, wantCode)
+ if err != nil {
+ t.Errorf("[!!]Failed to terminate %s: %s", testProcess, err)
+ } else {
+ t.Logf("[OK] Called TerminateProcess on PID %d", pi.ProcessId)
+ }
+
+ err = WaitForSingleObject(pi.Process, 1000) // 1000ms
+ if err != nil {
+ t.Errorf("[!!] failed in WaitForSingleObject: %s", err)
+ } else {
+ t.Logf("[OK] WaitForSingleObject returned...")
+ }
+
+ // make sure we see the magic exit code we asked for
+ code, err := GetExitCodeProcess(pi.Process)
+ if err != nil {
+ t.Errorf("[!!] Failed to get exit code for PID %d: %s", pi.ProcessId, err)
+ } else {
+ t.Logf("[OK] PID %d Exited with code %d", pi.ProcessId, code)
+ }
+ if code != 42 {
+ t.Errorf("[!!] Unexpected exit code for PID %d - want %d, got %d", pi.ProcessId, wantCode, code)
+ }
+
+ CloseHandle(pi.Process)
+ CloseHandle(pi.Thread)
+
+}
diff --git a/vendor/github.com/AllenDang/w32/create_process_typedef.go b/vendor/github.com/AllenDang/w32/create_process_typedef.go
new file mode 100644
index 0000000..df05972
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/create_process_typedef.go
@@ -0,0 +1,68 @@
+package w32
+
+// typedef struct _PROCESS_INFORMATION {
+// HANDLE hProcess;
+// HANDLE hThread;
+// DWORD dwProcessId;
+// DWORD dwThreadId;
+// } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
+
+type PROCESS_INFORMATION struct {
+ Process HANDLE
+ Thread HANDLE
+ ProcessId uint32
+ ThreadId uint32
+}
+
+// typedef struct _STARTUPINFOW {
+// DWORD cb;
+// LPWSTR lpReserved;
+// LPWSTR lpDesktop;
+// LPWSTR lpTitle;
+// DWORD dwX;
+// DWORD dwY;
+// DWORD dwXSize;
+// DWORD dwYSize;
+// DWORD dwXCountChars;
+// DWORD dwYCountChars;
+// DWORD dwFillAttribute;
+// DWORD dwFlags;
+// WORD wShowWindow;
+// WORD cbReserved2;
+// LPBYTE lpReserved2;
+// HANDLE hStdInput;
+// HANDLE hStdOutput;
+// HANDLE hStdError;
+// } STARTUPINFOW, *LPSTARTUPINFOW;
+
+type STARTUPINFOW struct {
+ cb uint32
+ _ *uint16
+ Desktop *uint16
+ Title *uint16
+ X uint32
+ Y uint32
+ XSize uint32
+ YSize uint32
+ XCountChars uint32
+ YCountChars uint32
+ FillAttribute uint32
+ Flags uint32
+ ShowWindow uint16
+ _ uint16
+ _ *uint8
+ StdInput HANDLE
+ StdOutput HANDLE
+ StdError HANDLE
+}
+
+// combase!_SECURITY_ATTRIBUTES
+// +0x000 nLength : Uint4B
+// +0x008 lpSecurityDescriptor : Ptr64 Void
+// +0x010 bInheritHandle : Int4B
+
+type SECURITY_ATTRIBUTES struct {
+ Length uint32
+ SecurityDescriptor uintptr
+ InheritHandle BOOL
+}
diff --git a/vendor/github.com/AllenDang/w32/dwmapi.go b/vendor/github.com/AllenDang/w32/dwmapi.go
new file mode 100644
index 0000000..eb656d1
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/dwmapi.go
@@ -0,0 +1,254 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+// DEFINED IN THE DWM API BUT NOT IMPLEMENTED BY MS:
+// DwmAttachMilContent
+// DwmDetachMilContent
+// DwmEnableComposition
+// DwmGetGraphicsStreamClient
+// DwmGetGraphicsStreamTransformHint
+
+var (
+ moddwmapi = syscall.NewLazyDLL("dwmapi.dll")
+
+ procDwmDefWindowProc = moddwmapi.NewProc("DwmDefWindowProc")
+ procDwmEnableBlurBehindWindow = moddwmapi.NewProc("DwmEnableBlurBehindWindow")
+ procDwmEnableMMCSS = moddwmapi.NewProc("DwmEnableMMCSS")
+ procDwmExtendFrameIntoClientArea = moddwmapi.NewProc("DwmExtendFrameIntoClientArea")
+ procDwmFlush = moddwmapi.NewProc("DwmFlush")
+ procDwmGetColorizationColor = moddwmapi.NewProc("DwmGetColorizationColor")
+ procDwmGetCompositionTimingInfo = moddwmapi.NewProc("DwmGetCompositionTimingInfo")
+ procDwmGetTransportAttributes = moddwmapi.NewProc("DwmGetTransportAttributes")
+ procDwmGetWindowAttribute = moddwmapi.NewProc("DwmGetWindowAttribute")
+ procDwmInvalidateIconicBitmaps = moddwmapi.NewProc("DwmInvalidateIconicBitmaps")
+ procDwmIsCompositionEnabled = moddwmapi.NewProc("DwmIsCompositionEnabled")
+ procDwmModifyPreviousDxFrameDuration = moddwmapi.NewProc("DwmModifyPreviousDxFrameDuration")
+ procDwmQueryThumbnailSourceSize = moddwmapi.NewProc("DwmQueryThumbnailSourceSize")
+ procDwmRegisterThumbnail = moddwmapi.NewProc("DwmRegisterThumbnail")
+ procDwmRenderGesture = moddwmapi.NewProc("DwmRenderGesture")
+ procDwmSetDxFrameDuration = moddwmapi.NewProc("DwmSetDxFrameDuration")
+ procDwmSetIconicLivePreviewBitmap = moddwmapi.NewProc("DwmSetIconicLivePreviewBitmap")
+ procDwmSetIconicThumbnail = moddwmapi.NewProc("DwmSetIconicThumbnail")
+ procDwmSetPresentParameters = moddwmapi.NewProc("DwmSetPresentParameters")
+ procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute")
+ procDwmShowContact = moddwmapi.NewProc("DwmShowContact")
+ procDwmTetherContact = moddwmapi.NewProc("DwmTetherContact")
+ procDwmTransitionOwnedWindow = moddwmapi.NewProc("DwmTransitionOwnedWindow")
+ procDwmUnregisterThumbnail = moddwmapi.NewProc("DwmUnregisterThumbnail")
+ procDwmUpdateThumbnailProperties = moddwmapi.NewProc("DwmUpdateThumbnailProperties")
+)
+
+func DwmDefWindowProc(hWnd HWND, msg uint, wParam, lParam uintptr) (bool, uint) {
+ var result uint
+ ret, _, _ := procDwmDefWindowProc.Call(
+ uintptr(hWnd),
+ uintptr(msg),
+ wParam,
+ lParam,
+ uintptr(unsafe.Pointer(&result)))
+ return ret != 0, result
+}
+
+func DwmEnableBlurBehindWindow(hWnd HWND, pBlurBehind *DWM_BLURBEHIND) HRESULT {
+ ret, _, _ := procDwmEnableBlurBehindWindow.Call(
+ uintptr(hWnd),
+ uintptr(unsafe.Pointer(pBlurBehind)))
+ return HRESULT(ret)
+}
+
+func DwmEnableMMCSS(fEnableMMCSS bool) HRESULT {
+ ret, _, _ := procDwmEnableMMCSS.Call(
+ uintptr(BoolToBOOL(fEnableMMCSS)))
+ return HRESULT(ret)
+}
+
+func DwmExtendFrameIntoClientArea(hWnd HWND, pMarInset *MARGINS) HRESULT {
+ ret, _, _ := procDwmExtendFrameIntoClientArea.Call(
+ uintptr(hWnd),
+ uintptr(unsafe.Pointer(pMarInset)))
+ return HRESULT(ret)
+}
+
+func DwmFlush() HRESULT {
+ ret, _, _ := procDwmFlush.Call()
+ return HRESULT(ret)
+}
+
+func DwmGetColorizationColor(pcrColorization *uint32, pfOpaqueBlend *BOOL) HRESULT {
+ ret, _, _ := procDwmGetColorizationColor.Call(
+ uintptr(unsafe.Pointer(pcrColorization)),
+ uintptr(unsafe.Pointer(pfOpaqueBlend)))
+ return HRESULT(ret)
+}
+
+func DwmGetCompositionTimingInfo(hWnd HWND, pTimingInfo *DWM_TIMING_INFO) HRESULT {
+ ret, _, _ := procDwmGetCompositionTimingInfo.Call(
+ uintptr(hWnd),
+ uintptr(unsafe.Pointer(pTimingInfo)))
+ return HRESULT(ret)
+}
+
+func DwmGetTransportAttributes(pfIsRemoting *BOOL, pfIsConnected *BOOL, pDwGeneration *uint32) HRESULT {
+ ret, _, _ := procDwmGetTransportAttributes.Call(
+ uintptr(unsafe.Pointer(pfIsRemoting)),
+ uintptr(unsafe.Pointer(pfIsConnected)),
+ uintptr(unsafe.Pointer(pDwGeneration)))
+ return HRESULT(ret)
+}
+
+// TODO: verify handling of variable arguments
+func DwmGetWindowAttribute(hWnd HWND, dwAttribute uint32) (pAttribute interface{}, result HRESULT) {
+ var pvAttribute, pvAttrSize uintptr
+ switch dwAttribute {
+ case DWMWA_NCRENDERING_ENABLED:
+ v := new(BOOL)
+ pAttribute = v
+ pvAttribute = uintptr(unsafe.Pointer(v))
+ pvAttrSize = unsafe.Sizeof(*v)
+ case DWMWA_CAPTION_BUTTON_BOUNDS, DWMWA_EXTENDED_FRAME_BOUNDS:
+ v := new(RECT)
+ pAttribute = v
+ pvAttribute = uintptr(unsafe.Pointer(v))
+ pvAttrSize = unsafe.Sizeof(*v)
+ case DWMWA_CLOAKED:
+ panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not currently supported.", dwAttribute))
+ default:
+ panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not valid.", dwAttribute))
+ }
+
+ ret, _, _ := procDwmGetWindowAttribute.Call(
+ uintptr(hWnd),
+ uintptr(dwAttribute),
+ pvAttribute,
+ pvAttrSize)
+ result = HRESULT(ret)
+ return
+}
+
+func DwmInvalidateIconicBitmaps(hWnd HWND) HRESULT {
+ ret, _, _ := procDwmInvalidateIconicBitmaps.Call(
+ uintptr(hWnd))
+ return HRESULT(ret)
+}
+
+func DwmIsCompositionEnabled(pfEnabled *BOOL) HRESULT {
+ ret, _, _ := procDwmIsCompositionEnabled.Call(
+ uintptr(unsafe.Pointer(pfEnabled)))
+ return HRESULT(ret)
+}
+
+func DwmModifyPreviousDxFrameDuration(hWnd HWND, cRefreshes int, fRelative bool) HRESULT {
+ ret, _, _ := procDwmModifyPreviousDxFrameDuration.Call(
+ uintptr(hWnd),
+ uintptr(cRefreshes),
+ uintptr(BoolToBOOL(fRelative)))
+ return HRESULT(ret)
+}
+
+func DwmQueryThumbnailSourceSize(hThumbnail HTHUMBNAIL, pSize *SIZE) HRESULT {
+ ret, _, _ := procDwmQueryThumbnailSourceSize.Call(
+ uintptr(hThumbnail),
+ uintptr(unsafe.Pointer(pSize)))
+ return HRESULT(ret)
+}
+
+func DwmRegisterThumbnail(hWndDestination HWND, hWndSource HWND, phThumbnailId *HTHUMBNAIL) HRESULT {
+ ret, _, _ := procDwmRegisterThumbnail.Call(
+ uintptr(hWndDestination),
+ uintptr(hWndSource),
+ uintptr(unsafe.Pointer(phThumbnailId)))
+ return HRESULT(ret)
+}
+
+func DwmRenderGesture(gt GESTURE_TYPE, cContacts uint, pdwPointerID *uint32, pPoints *POINT) {
+ procDwmRenderGesture.Call(
+ uintptr(gt),
+ uintptr(cContacts),
+ uintptr(unsafe.Pointer(pdwPointerID)),
+ uintptr(unsafe.Pointer(pPoints)))
+ return
+}
+
+func DwmSetDxFrameDuration(hWnd HWND, cRefreshes int) HRESULT {
+ ret, _, _ := procDwmSetDxFrameDuration.Call(
+ uintptr(hWnd),
+ uintptr(cRefreshes))
+ return HRESULT(ret)
+}
+
+func DwmSetIconicLivePreviewBitmap(hWnd HWND, hbmp HBITMAP, pptClient *POINT, dwSITFlags uint32) HRESULT {
+ ret, _, _ := procDwmSetIconicLivePreviewBitmap.Call(
+ uintptr(hWnd),
+ uintptr(hbmp),
+ uintptr(unsafe.Pointer(pptClient)),
+ uintptr(dwSITFlags))
+ return HRESULT(ret)
+}
+
+func DwmSetIconicThumbnail(hWnd HWND, hbmp HBITMAP, dwSITFlags uint32) HRESULT {
+ ret, _, _ := procDwmSetIconicThumbnail.Call(
+ uintptr(hWnd),
+ uintptr(hbmp),
+ uintptr(dwSITFlags))
+ return HRESULT(ret)
+}
+
+func DwmSetPresentParameters(hWnd HWND, pPresentParams *DWM_PRESENT_PARAMETERS) HRESULT {
+ ret, _, _ := procDwmSetPresentParameters.Call(
+ uintptr(hWnd),
+ uintptr(unsafe.Pointer(pPresentParams)))
+ return HRESULT(ret)
+}
+
+func DwmSetWindowAttribute(hWnd HWND, dwAttribute uint32, pvAttribute LPCVOID, cbAttribute uint32) HRESULT {
+ ret, _, _ := procDwmSetWindowAttribute.Call(
+ uintptr(hWnd),
+ uintptr(dwAttribute),
+ uintptr(pvAttribute),
+ uintptr(cbAttribute))
+ return HRESULT(ret)
+}
+
+func DwmShowContact(dwPointerID uint32, eShowContact DWM_SHOWCONTACT) {
+ procDwmShowContact.Call(
+ uintptr(dwPointerID),
+ uintptr(eShowContact))
+ return
+}
+
+func DwmTetherContact(dwPointerID uint32, fEnable bool, ptTether POINT) {
+ procDwmTetherContact.Call(
+ uintptr(dwPointerID),
+ uintptr(BoolToBOOL(fEnable)),
+ uintptr(unsafe.Pointer(&ptTether)))
+ return
+}
+
+func DwmTransitionOwnedWindow(hWnd HWND, target DWMTRANSITION_OWNEDWINDOW_TARGET) {
+ procDwmTransitionOwnedWindow.Call(
+ uintptr(hWnd),
+ uintptr(target))
+ return
+}
+
+func DwmUnregisterThumbnail(hThumbnailId HTHUMBNAIL) HRESULT {
+ ret, _, _ := procDwmUnregisterThumbnail.Call(
+ uintptr(hThumbnailId))
+ return HRESULT(ret)
+}
+
+func DwmUpdateThumbnailProperties(hThumbnailId HTHUMBNAIL, ptnProperties *DWM_THUMBNAIL_PROPERTIES) HRESULT {
+ ret, _, _ := procDwmUpdateThumbnailProperties.Call(
+ uintptr(hThumbnailId),
+ uintptr(unsafe.Pointer(ptnProperties)))
+ return HRESULT(ret)
+}
diff --git a/vendor/github.com/AllenDang/w32/fork.go b/vendor/github.com/AllenDang/w32/fork.go
new file mode 100644
index 0000000..b5543b9
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/fork.go
@@ -0,0 +1,174 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+// #include <stdlib.h>
+//import (
+// "C"
+//)
+
+// Based on C code found here https://gist.github.com/juntalis/4366916
+// Original code license:
+/*
+ * fork.c
+ * Experimental fork() on Windows. Requires NT 6 subsystem or
+ * newer.
+ *
+ * Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * This software is provided 'as is' and without any warranty, express or
+ * implied. In no event shall the authors be liable for any damages arising
+ * from the use of this software.
+ */
+
+import (
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+var (
+ ntdll = syscall.NewLazyDLL("ntdll.dll")
+
+ procRtlCloneUserProcess = ntdll.NewProc("RtlCloneUserProcess")
+ procAllocConsole = modkernel32.NewProc("AllocConsole")
+ procOpenProcess = modkernel32.NewProc("OpenProcess")
+ procOpenThread = modkernel32.NewProc("OpenThread")
+ procResumeThread = modkernel32.NewProc("ResumeThread")
+)
+
+func OpenProcess(desiredAccess int, inheritHandle bool, processId uintptr) (h HANDLE, e error) {
+ inherit := uintptr(0)
+ if inheritHandle {
+ inherit = 1
+ }
+
+ ret, _, lastErr := procOpenProcess.Call(
+ uintptr(desiredAccess),
+ inherit,
+ uintptr(processId),
+ )
+
+ if ret == 0 {
+ e = lastErr
+ }
+
+ h = HANDLE(ret)
+ return
+}
+
+func OpenThread(desiredAccess int, inheritHandle bool, threadId uintptr) (h HANDLE, e error) {
+ inherit := uintptr(0)
+ if inheritHandle {
+ inherit = 1
+ }
+
+ ret, _, lastErr := procOpenThread.Call(
+ uintptr(desiredAccess),
+ inherit,
+ uintptr(threadId),
+ )
+
+ if ret == 0 {
+ e = lastErr
+ }
+
+ h = HANDLE(ret)
+ return
+}
+
+// DWORD WINAPI ResumeThread(
+// _In_ HANDLE hThread
+// );
+func ResumeThread(ht HANDLE) (e error) {
+
+ ret, _, lastErr := procResumeThread.Call(
+ uintptr(ht),
+ )
+ if ret == ^uintptr(0) { // -1
+ e = lastErr
+ }
+ return
+}
+
+// BOOL WINAPI AllocConsole(void);
+func AllocConsole() (e error) {
+ ret, _, lastErr := procAllocConsole.Call()
+ if ret != ERROR_SUCCESS {
+ e = lastErr
+ }
+ return
+}
+
+// NTSYSAPI
+// NTSTATUS
+// NTAPI RtlCloneUserProcess (
+// _In_ ULONG ProcessFlags,
+// _In_opt_ PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,
+// _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
+// _In_opt_ HANDLE DebugPort,
+// _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInformation
+// )
+
+func RtlCloneUserProcess(
+ ProcessFlags uint32,
+ ProcessSecurityDescriptor, ThreadSecurityDescriptor *SECURITY_DESCRIPTOR, // in advapi32_typedef.go
+ DebugPort HANDLE,
+ ProcessInformation *RTL_USER_PROCESS_INFORMATION,
+) (status uintptr) {
+
+ status, _, _ = procRtlCloneUserProcess.Call(
+ uintptr(ProcessFlags),
+ uintptr(unsafe.Pointer(ProcessSecurityDescriptor)),
+ uintptr(unsafe.Pointer(ThreadSecurityDescriptor)),
+ uintptr(DebugPort),
+ uintptr(unsafe.Pointer(ProcessInformation)),
+ )
+
+ return
+}
+
+// Fork creates a clone of the current process using the undocumented
+// RtlCloneUserProcess call in ntdll, similar to unix fork(). The
+// return value in the parent is the child PID. In the child it is 0.
+func Fork() (pid uintptr, e error) {
+
+ pi := &RTL_USER_PROCESS_INFORMATION{}
+
+ ret := RtlCloneUserProcess(
+ RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED|RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES,
+ nil,
+ nil,
+ HANDLE(0),
+ pi,
+ )
+
+ switch ret {
+ case RTL_CLONE_PARENT:
+ pid = pi.ClientId.UniqueProcess
+ ht, err := OpenThread(THREAD_ALL_ACCESS, false, pi.ClientId.UniqueThread)
+ if err != nil {
+ e = fmt.Errorf("OpenThread: %s", err)
+ }
+ err = ResumeThread(ht)
+ if err != nil {
+ e = fmt.Errorf("ResumeThread: %s", err)
+ }
+ CloseHandle(ht)
+ case RTL_CLONE_CHILD:
+ pid = 0
+ err := AllocConsole()
+ if err != nil {
+ e = fmt.Errorf("AllocConsole: %s", err)
+ }
+ default:
+ e = fmt.Errorf("0x%x", ret)
+ }
+ return
+}
diff --git a/vendor/github.com/AllenDang/w32/fork_constants.go b/vendor/github.com/AllenDang/w32/fork_constants.go
new file mode 100644
index 0000000..3e9b217
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/fork_constants.go
@@ -0,0 +1,26 @@
+package w32
+
+const (
+ RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED = 0x00000001
+ RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES = 0x00000002
+ RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE = 0x00000004
+
+ RTL_CLONE_PARENT = 0
+ RTL_CLONE_CHILD = 297
+
+ THREAD_TERMINATE = 0x0001
+ THREAD_SUSPEND_RESUME = 0x0002
+ THREAD_GET_CONTEXT = 0x0008
+ THREAD_SET_CONTEXT = 0x0010
+ THREAD_SET_INFORMATION = 0x0020
+ THREAD_QUERY_INFORMATION = 0x0040
+ THREAD_SET_THREAD_TOKEN = 0x0080
+ THREAD_IMPERSONATE = 0x0100
+ THREAD_DIRECT_IMPERSONATION = 0x0200
+ THREAD_SET_LIMITED_INFORMATION = 0x0400
+ THREAD_QUERY_LIMITED_INFORMATION = 0x0800
+ THREAD_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff
+
+ PROCESS_SET_SESSIONID = 0x0004
+ PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff
+)
diff --git a/vendor/github.com/AllenDang/w32/fork_test.go b/vendor/github.com/AllenDang/w32/fork_test.go
new file mode 100644
index 0000000..47b52ba
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/fork_test.go
@@ -0,0 +1,50 @@
+package w32
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path"
+ "strconv"
+ "testing"
+ "time"
+)
+
+var forkFn = path.Join(os.TempDir(), "forktest.pid")
+
+func TestFork(t *testing.T) {
+
+ ppid := os.Getpid()
+ t.Logf("[OK] I am PID %d", ppid)
+ pid, err := Fork()
+ if err != nil {
+ t.Fatalf("[!!] Failed to fork. PID: %d: %s", pid, err)
+ }
+
+ if pid == 0 {
+ // We can't log anything here because our stdout doesn't point
+ // to the same console as our parent.
+ //
+ // This process won't show up in Task Manager, and os.Getpid() won't
+ // work, I guess because we haven't told CSRSS we exist.
+ f, _ := os.Create(forkFn)
+ f.WriteString(fmt.Sprintf("%d", ppid))
+ f.Close()
+ } else {
+ t.Logf("[OK] Forked child with PID %d", pid)
+ t.Logf("[OK] Sleeping, then trying to read checkfile.")
+ time.Sleep(2 * time.Second)
+ raw, err := ioutil.ReadFile(forkFn)
+ if err != nil {
+ t.Fatalf("[!!] Failed to read PID checkfile: %s", err)
+ }
+ if string(raw) == strconv.Itoa(ppid) {
+ t.Logf("[OK] Found PID checkfile - PID matches!")
+ } else {
+ t.Errorf("[!] Child reported PID %q vs %q!", string(raw), strconv.Itoa(ppid))
+ }
+ os.Remove(forkFn)
+
+ }
+
+}
diff --git a/vendor/github.com/AllenDang/w32/fork_typedef.go b/vendor/github.com/AllenDang/w32/fork_typedef.go
new file mode 100644
index 0000000..fcb9049
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/fork_typedef.go
@@ -0,0 +1,89 @@
+package w32
+
+// combase!_SECTION_IMAGE_INFORMATION
+// +0x000 TransferAddress : Ptr64 Void
+// +0x008 ZeroBits : Uint4B
+// +0x010 MaximumStackSize : Uint8B
+// +0x018 CommittedStackSize : Uint8B
+// +0x020 SubSystemType : Uint4B
+// +0x024 SubSystemMinorVersion : Uint2B
+// +0x026 SubSystemMajorVersion : Uint2B
+// +0x024 SubSystemVersion : Uint4B
+// +0x028 MajorOperatingSystemVersion : Uint2B
+// +0x02a MinorOperatingSystemVersion : Uint2B
+// +0x028 OperatingSystemVersion : Uint4B
+// +0x02c ImageCharacteristics : Uint2B
+// +0x02e DllCharacteristics : Uint2B
+// +0x030 Machine : Uint2B
+// +0x032 ImageContainsCode : UChar
+// +0x033 ImageFlags : UChar
+// +0x033 ComPlusNativeReady : Pos 0, 1 Bit
+// +0x033 ComPlusILOnly : Pos 1, 1 Bit
+// +0x033 ImageDynamicallyRelocated : Pos 2, 1 Bit
+// +0x033 ImageMappedFlat : Pos 3, 1 Bit
+// +0x033 BaseBelow4gb : Pos 4, 1 Bit
+// +0x033 ComPlusPrefer32bit : Pos 5, 1 Bit
+// +0x033 Reserved : Pos 6, 2 Bits
+// +0x034 LoaderFlags : Uint4B
+// +0x038 ImageFileSize : Uint4B
+// +0x03c CheckSum : Uint4B
+type SECTION_IMAGE_INFORMATION struct {
+ TransferAddress uintptr
+ ZeroBits uint32
+ MaximumStackSize uint64
+ CommittedStackSize uint64
+ SubSystemType uint32
+ SubSystemMinorVersion uint16
+ SubSystemMajorVersion uint16
+ SubSystemVersion uint32
+ MajorOperatingSystemVersion uint16
+ MinorOperatingSystemVersion uint16
+ OperatingSystemVersion uint32
+ ImageCharacteristics uint16
+ DllCharacteristics uint16
+ Machine uint16
+ ImageContainsCode uint8
+ ImageFlags uint8
+ ComPlusFlags uint8
+ LoaderFlags uint32
+ ImageFileSize uint32
+ CheckSum uint32
+}
+
+func (si *SECTION_IMAGE_INFORMATION) ComPlusNativeReady() bool {
+ return (si.ComPlusFlags & (1 << 0)) == 1
+}
+
+func (si *SECTION_IMAGE_INFORMATION) ComPlusILOnly() bool {
+ return (si.ComPlusFlags & (1 << 1)) == 1
+}
+
+func (si *SECTION_IMAGE_INFORMATION) ImageDynamicallyRelocated() bool {
+ return (si.ComPlusFlags & (1 << 2)) == 1
+}
+
+func (si *SECTION_IMAGE_INFORMATION) ImageMappedFlat() bool {
+ return (si.ComPlusFlags & (1 << 3)) == 1
+}
+
+func (si *SECTION_IMAGE_INFORMATION) BaseBelow4gb() bool {
+ return (si.ComPlusFlags & (1 << 4)) == 1
+}
+
+func (si *SECTION_IMAGE_INFORMATION) ComPlusPrefer32bit() bool {
+ return (si.ComPlusFlags & (1 << 5)) == 1
+}
+
+// combase!_RTL_USER_PROCESS_INFORMATION
+// +0x000 Length : Uint4B
+// +0x008 Process : Ptr64 Void
+// +0x010 Thread : Ptr64 Void
+// +0x018 ClientId : _CLIENT_ID
+// +0x028 ImageInformation : _SECTION_IMAGE_INFORMATION
+type RTL_USER_PROCESS_INFORMATION struct {
+ Length uint32
+ Process HANDLE
+ Thread HANDLE
+ ClientId CLIENT_ID
+ ImageInformation SECTION_IMAGE_INFORMATION
+}
diff --git a/vendor/github.com/AllenDang/w32/gdi32.go b/vendor/github.com/AllenDang/w32/gdi32.go
new file mode 100644
index 0000000..39a81d6
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/gdi32.go
@@ -0,0 +1,543 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modgdi32 = syscall.NewLazyDLL("gdi32.dll")
+
+ procGetDeviceCaps = modgdi32.NewProc("GetDeviceCaps")
+ procGetCurrentObject = modgdi32.NewProc("GetCurrentObject")
+ procDeleteObject = modgdi32.NewProc("DeleteObject")
+ procCreateFontIndirect = modgdi32.NewProc("CreateFontIndirectW")
+ procAbortDoc = modgdi32.NewProc("AbortDoc")
+ procBitBlt = modgdi32.NewProc("BitBlt")
+ procPatBlt = modgdi32.NewProc("PatBlt")
+ procCloseEnhMetaFile = modgdi32.NewProc("CloseEnhMetaFile")
+ procCopyEnhMetaFile = modgdi32.NewProc("CopyEnhMetaFileW")
+ procCreateBrushIndirect = modgdi32.NewProc("CreateBrushIndirect")
+ procCreateCompatibleDC = modgdi32.NewProc("CreateCompatibleDC")
+ procCreateDC = modgdi32.NewProc("CreateDCW")
+ procCreateCompatibleBitmap = modgdi32.NewProc("CreateCompatibleBitmap")
+ procCreateDIBSection = modgdi32.NewProc("CreateDIBSection")
+ procCreateEnhMetaFile = modgdi32.NewProc("CreateEnhMetaFileW")
+ procCreateIC = modgdi32.NewProc("CreateICW")
+ procDeleteDC = modgdi32.NewProc("DeleteDC")
+ procDeleteEnhMetaFile = modgdi32.NewProc("DeleteEnhMetaFile")
+ procEllipse = modgdi32.NewProc("Ellipse")
+ procEndDoc = modgdi32.NewProc("EndDoc")
+ procEndPage = modgdi32.NewProc("EndPage")
+ procExtCreatePen = modgdi32.NewProc("ExtCreatePen")
+ procGetEnhMetaFile = modgdi32.NewProc("GetEnhMetaFileW")
+ procGetEnhMetaFileHeader = modgdi32.NewProc("GetEnhMetaFileHeader")
+ procGetObject = modgdi32.NewProc("GetObjectW")
+ procGetStockObject = modgdi32.NewProc("GetStockObject")
+ procGetTextExtentExPoint = modgdi32.NewProc("GetTextExtentExPointW")
+ procGetTextExtentPoint32 = modgdi32.NewProc("GetTextExtentPoint32W")
+ procGetTextMetrics = modgdi32.NewProc("GetTextMetricsW")
+ procLineTo = modgdi32.NewProc("LineTo")
+ procMoveToEx = modgdi32.NewProc("MoveToEx")
+ procPlayEnhMetaFile = modgdi32.NewProc("PlayEnhMetaFile")
+ procRectangle = modgdi32.NewProc("Rectangle")
+ procResetDC = modgdi32.NewProc("ResetDCW")
+ procSelectObject = modgdi32.NewProc("SelectObject")
+ procSetBkMode = modgdi32.NewProc("SetBkMode")
+ procSetBrushOrgEx = modgdi32.NewProc("SetBrushOrgEx")
+ procSetStretchBltMode = modgdi32.NewProc("SetStretchBltMode")
+ procSetTextColor = modgdi32.NewProc("SetTextColor")
+ procSetBkColor = modgdi32.NewProc("SetBkColor")
+ procStartDoc = modgdi32.NewProc("StartDocW")
+ procStartPage = modgdi32.NewProc("StartPage")
+ procStretchBlt = modgdi32.NewProc("StretchBlt")
+ procSetDIBitsToDevice = modgdi32.NewProc("SetDIBitsToDevice")
+ procChoosePixelFormat = modgdi32.NewProc("ChoosePixelFormat")
+ procDescribePixelFormat = modgdi32.NewProc("DescribePixelFormat")
+ procGetEnhMetaFilePixelFormat = modgdi32.NewProc("GetEnhMetaFilePixelFormat")
+ procGetPixelFormat = modgdi32.NewProc("GetPixelFormat")
+ procSetPixelFormat = modgdi32.NewProc("SetPixelFormat")
+ procSwapBuffers = modgdi32.NewProc("SwapBuffers")
+)
+
+func GetDeviceCaps(hdc HDC, index int) int {
+ ret, _, _ := procGetDeviceCaps.Call(
+ uintptr(hdc),
+ uintptr(index))
+
+ return int(ret)
+}
+
+func GetCurrentObject(hdc HDC, uObjectType uint32) HGDIOBJ {
+ ret, _, _ := procGetCurrentObject.Call(
+ uintptr(hdc),
+ uintptr(uObjectType))
+
+ return HGDIOBJ(ret)
+}
+
+func DeleteObject(hObject HGDIOBJ) bool {
+ ret, _, _ := procDeleteObject.Call(
+ uintptr(hObject))
+
+ return ret != 0
+}
+
+func CreateFontIndirect(logFont *LOGFONT) HFONT {
+ ret, _, _ := procCreateFontIndirect.Call(
+ uintptr(unsafe.Pointer(logFont)))
+
+ return HFONT(ret)
+}
+
+func AbortDoc(hdc HDC) int {
+ ret, _, _ := procAbortDoc.Call(
+ uintptr(hdc))
+
+ return int(ret)
+}
+
+func BitBlt(hdcDest HDC, nXDest, nYDest, nWidth, nHeight int, hdcSrc HDC, nXSrc, nYSrc int, dwRop uint) {
+ ret, _, _ := procBitBlt.Call(
+ uintptr(hdcDest),
+ uintptr(nXDest),
+ uintptr(nYDest),
+ uintptr(nWidth),
+ uintptr(nHeight),
+ uintptr(hdcSrc),
+ uintptr(nXSrc),
+ uintptr(nYSrc),
+ uintptr(dwRop))
+
+ if ret == 0 {
+ panic("BitBlt failed")
+ }
+}
+
+func PatBlt(hdc HDC, nXLeft, nYLeft, nWidth, nHeight int, dwRop uint) {
+ ret, _, _ := procPatBlt.Call(
+ uintptr(hdc),
+ uintptr(nXLeft),
+ uintptr(nYLeft),
+ uintptr(nWidth),
+ uintptr(nHeight),
+ uintptr(dwRop))
+
+ if ret == 0 {
+ panic("PatBlt failed")
+ }
+}
+
+func CloseEnhMetaFile(hdc HDC) HENHMETAFILE {
+ ret, _, _ := procCloseEnhMetaFile.Call(
+ uintptr(hdc))
+
+ return HENHMETAFILE(ret)
+}
+
+func CopyEnhMetaFile(hemfSrc HENHMETAFILE, lpszFile *uint16) HENHMETAFILE {
+ ret, _, _ := procCopyEnhMetaFile.Call(
+ uintptr(hemfSrc),
+ uintptr(unsafe.Pointer(lpszFile)))
+
+ return HENHMETAFILE(ret)
+}
+
+func CreateBrushIndirect(lplb *LOGBRUSH) HBRUSH {
+ ret, _, _ := procCreateBrushIndirect.Call(
+ uintptr(unsafe.Pointer(lplb)))
+
+ return HBRUSH(ret)
+}
+
+func CreateCompatibleDC(hdc HDC) HDC {
+ ret, _, _ := procCreateCompatibleDC.Call(
+ uintptr(hdc))
+
+ if ret == 0 {
+ panic("Create compatible DC failed")
+ }
+
+ return HDC(ret)
+}
+
+func CreateDC(lpszDriver, lpszDevice, lpszOutput *uint16, lpInitData *DEVMODE) HDC {
+ ret, _, _ := procCreateDC.Call(
+ uintptr(unsafe.Pointer(lpszDriver)),
+ uintptr(unsafe.Pointer(lpszDevice)),
+ uintptr(unsafe.Pointer(lpszOutput)),
+ uintptr(unsafe.Pointer(lpInitData)))
+
+ return HDC(ret)
+}
+
+func CreateCompatibleBitmap(hdc HDC, width, height uint) HBITMAP {
+ ret, _, _ := procCreateCompatibleBitmap.Call(
+ uintptr(hdc),
+ uintptr(width),
+ uintptr(height))
+
+ return HBITMAP(ret)
+}
+
+func CreateDIBSection(hdc HDC, pbmi *BITMAPINFO, iUsage uint, ppvBits *unsafe.Pointer, hSection HANDLE, dwOffset uint) HBITMAP {
+ ret, _, _ := procCreateDIBSection.Call(
+ uintptr(hdc),
+ uintptr(unsafe.Pointer(pbmi)),
+ uintptr(iUsage),
+ uintptr(unsafe.Pointer(ppvBits)),
+ uintptr(hSection),
+ uintptr(dwOffset))
+
+ return HBITMAP(ret)
+}
+
+func CreateEnhMetaFile(hdcRef HDC, lpFilename *uint16, lpRect *RECT, lpDescription *uint16) HDC {
+ ret, _, _ := procCreateEnhMetaFile.Call(
+ uintptr(hdcRef),
+ uintptr(unsafe.Pointer(lpFilename)),
+ uintptr(unsafe.Pointer(lpRect)),
+ uintptr(unsafe.Pointer(lpDescription)))
+
+ return HDC(ret)
+}
+
+func CreateIC(lpszDriver, lpszDevice, lpszOutput *uint16, lpdvmInit *DEVMODE) HDC {
+ ret, _, _ := procCreateIC.Call(
+ uintptr(unsafe.Pointer(lpszDriver)),
+ uintptr(unsafe.Pointer(lpszDevice)),
+ uintptr(unsafe.Pointer(lpszOutput)),
+ uintptr(unsafe.Pointer(lpdvmInit)))
+
+ return HDC(ret)
+}
+
+func DeleteDC(hdc HDC) bool {
+ ret, _, _ := procDeleteDC.Call(
+ uintptr(hdc))
+
+ return ret != 0
+}
+
+func DeleteEnhMetaFile(hemf HENHMETAFILE) bool {
+ ret, _, _ := procDeleteEnhMetaFile.Call(
+ uintptr(hemf))
+
+ return ret != 0
+}
+
+func Ellipse(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool {
+ ret, _, _ := procEllipse.Call(
+ uintptr(hdc),
+ uintptr(nLeftRect),
+ uintptr(nTopRect),
+ uintptr(nRightRect),
+ uintptr(nBottomRect))
+
+ return ret != 0
+}
+
+func EndDoc(hdc HDC) int {
+ ret, _, _ := procEndDoc.Call(
+ uintptr(hdc))
+
+ return int(ret)
+}
+
+func EndPage(hdc HDC) int {
+ ret, _, _ := procEndPage.Call(
+ uintptr(hdc))
+
+ return int(ret)
+}
+
+func ExtCreatePen(dwPenStyle, dwWidth uint, lplb *LOGBRUSH, dwStyleCount uint, lpStyle *uint) HPEN {
+ ret, _, _ := procExtCreatePen.Call(
+ uintptr(dwPenStyle),
+ uintptr(dwWidth),
+ uintptr(unsafe.Pointer(lplb)),
+ uintptr(dwStyleCount),
+ uintptr(unsafe.Pointer(lpStyle)))
+
+ return HPEN(ret)
+}
+
+func GetEnhMetaFile(lpszMetaFile *uint16) HENHMETAFILE {
+ ret, _, _ := procGetEnhMetaFile.Call(
+ uintptr(unsafe.Pointer(lpszMetaFile)))
+
+ return HENHMETAFILE(ret)
+}
+
+func GetEnhMetaFileHeader(hemf HENHMETAFILE, cbBuffer uint, lpemh *ENHMETAHEADER) uint {
+ ret, _, _ := procGetEnhMetaFileHeader.Call(
+ uintptr(hemf),
+ uintptr(cbBuffer),
+ uintptr(unsafe.Pointer(lpemh)))
+
+ return uint(ret)
+}
+
+func GetObject(hgdiobj HGDIOBJ, cbBuffer uintptr, lpvObject unsafe.Pointer) int {
+ ret, _, _ := procGetObject.Call(
+ uintptr(hgdiobj),
+ uintptr(cbBuffer),
+ uintptr(lpvObject))
+
+ return int(ret)
+}
+
+func GetStockObject(fnObject int) HGDIOBJ {
+ ret, _, _ := procGetStockObject.Call(
+ uintptr(fnObject))
+
+ return HGDIOBJ(ret)
+}
+
+func GetTextExtentExPoint(hdc HDC, lpszStr *uint16, cchString, nMaxExtent int, lpnFit, alpDx *int, lpSize *SIZE) bool {
+ ret, _, _ := procGetTextExtentExPoint.Call(
+ uintptr(hdc),
+ uintptr(unsafe.Pointer(lpszStr)),
+ uintptr(cchString),
+ uintptr(nMaxExtent),
+ uintptr(unsafe.Pointer(lpnFit)),
+ uintptr(unsafe.Pointer(alpDx)),
+ uintptr(unsafe.Pointer(lpSize)))
+
+ return ret != 0
+}
+
+func GetTextExtentPoint32(hdc HDC, lpString *uint16, c int, lpSize *SIZE) bool {
+ ret, _, _ := procGetTextExtentPoint32.Call(
+ uintptr(hdc),
+ uintptr(unsafe.Pointer(lpString)),
+ uintptr(c),
+ uintptr(unsafe.Pointer(lpSize)))
+
+ return ret != 0
+}
+
+func GetTextMetrics(hdc HDC, lptm *TEXTMETRIC) bool {
+ ret, _, _ := procGetTextMetrics.Call(
+ uintptr(hdc),
+ uintptr(unsafe.Pointer(lptm)))
+
+ return ret != 0
+}
+
+func LineTo(hdc HDC, nXEnd, nYEnd int) bool {
+ ret, _, _ := procLineTo.Call(
+ uintptr(hdc),
+ uintptr(nXEnd),
+ uintptr(nYEnd))
+
+ return ret != 0
+}
+
+func MoveToEx(hdc HDC, x, y int, lpPoint *POINT) bool {
+ ret, _, _ := procMoveToEx.Call(
+ uintptr(hdc),
+ uintptr(x),
+ uintptr(y),
+ uintptr(unsafe.Pointer(lpPoint)))
+
+ return ret != 0
+}
+
+func PlayEnhMetaFile(hdc HDC, hemf HENHMETAFILE, lpRect *RECT) bool {
+ ret, _, _ := procPlayEnhMetaFile.Call(
+ uintptr(hdc),
+ uintptr(hemf),
+ uintptr(unsafe.Pointer(lpRect)))
+
+ return ret != 0
+}
+
+func Rectangle(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool {
+ ret, _, _ := procRectangle.Call(
+ uintptr(hdc),
+ uintptr(nLeftRect),
+ uintptr(nTopRect),
+ uintptr(nRightRect),
+ uintptr(nBottomRect))
+
+ return ret != 0
+}
+
+func ResetDC(hdc HDC, lpInitData *DEVMODE) HDC {
+ ret, _, _ := procResetDC.Call(
+ uintptr(hdc),
+ uintptr(unsafe.Pointer(lpInitData)))
+
+ return HDC(ret)
+}
+
+func SelectObject(hdc HDC, hgdiobj HGDIOBJ) HGDIOBJ {
+ ret, _, _ := procSelectObject.Call(
+ uintptr(hdc),
+ uintptr(hgdiobj))
+
+ if ret == 0 {
+ panic("SelectObject failed")
+ }
+
+ return HGDIOBJ(ret)
+}
+
+func SetBkMode(hdc HDC, iBkMode int) int {
+ ret, _, _ := procSetBkMode.Call(
+ uintptr(hdc),
+ uintptr(iBkMode))
+
+ if ret == 0 {
+ panic("SetBkMode failed")
+ }
+
+ return int(ret)
+}
+
+func SetBrushOrgEx(hdc HDC, nXOrg, nYOrg int, lppt *POINT) bool {
+ ret, _, _ := procSetBrushOrgEx.Call(
+ uintptr(hdc),
+ uintptr(nXOrg),
+ uintptr(nYOrg),
+ uintptr(unsafe.Pointer(lppt)))
+
+ return ret != 0
+}
+
+func SetStretchBltMode(hdc HDC, iStretchMode int) int {
+ ret, _, _ := procSetStretchBltMode.Call(
+ uintptr(hdc),
+ uintptr(iStretchMode))
+
+ return int(ret)
+}
+
+func SetTextColor(hdc HDC, crColor COLORREF) COLORREF {
+ ret, _, _ := procSetTextColor.Call(
+ uintptr(hdc),
+ uintptr(crColor))
+
+ if ret == CLR_INVALID {
+ panic("SetTextColor failed")
+ }
+
+ return COLORREF(ret)
+}
+
+func SetBkColor(hdc HDC, crColor COLORREF) COLORREF {
+ ret, _, _ := procSetBkColor.Call(
+ uintptr(hdc),
+ uintptr(crColor))
+
+ if ret == CLR_INVALID {
+ panic("SetBkColor failed")
+ }
+
+ return COLORREF(ret)
+}
+
+func StartDoc(hdc HDC, lpdi *DOCINFO) int {
+ ret, _, _ := procStartDoc.Call(
+ uintptr(hdc),
+ uintptr(unsafe.Pointer(lpdi)))
+
+ return int(ret)
+}
+
+func StartPage(hdc HDC) int {
+ ret, _, _ := procStartPage.Call(
+ uintptr(hdc))
+
+ return int(ret)
+}
+
+func StretchBlt(hdcDest HDC, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest int, hdcSrc HDC, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc int, dwRop uint) {
+ ret, _, _ := procStretchBlt.Call(
+ uintptr(hdcDest),
+ uintptr(nXOriginDest),
+ uintptr(nYOriginDest),
+ uintptr(nWidthDest),
+ uintptr(nHeightDest),
+ uintptr(hdcSrc),
+ uintptr(nXOriginSrc),
+ uintptr(nYOriginSrc),
+ uintptr(nWidthSrc),
+ uintptr(nHeightSrc),
+ uintptr(dwRop))
+
+ if ret == 0 {
+ panic("StretchBlt failed")
+ }
+}
+
+func SetDIBitsToDevice(hdc HDC, xDest, yDest, dwWidth, dwHeight, xSrc, ySrc int, uStartScan, cScanLines uint, lpvBits []byte, lpbmi *BITMAPINFO, fuColorUse uint) int {
+ ret, _, _ := procSetDIBitsToDevice.Call(
+ uintptr(hdc),
+ uintptr(xDest),
+ uintptr(yDest),
+ uintptr(dwWidth),
+ uintptr(dwHeight),
+ uintptr(xSrc),
+ uintptr(ySrc),
+ uintptr(uStartScan),
+ uintptr(cScanLines),
+ uintptr(unsafe.Pointer(&lpvBits[0])),
+ uintptr(unsafe.Pointer(lpbmi)),
+ uintptr(fuColorUse))
+
+ return int(ret)
+}
+
+func ChoosePixelFormat(hdc HDC, pfd *PIXELFORMATDESCRIPTOR) int {
+ ret, _, _ := procChoosePixelFormat.Call(
+ uintptr(hdc),
+ uintptr(unsafe.Pointer(pfd)),
+ )
+ return int(ret)
+}
+
+func DescribePixelFormat(hdc HDC, iPixelFormat int, nBytes uint, pfd *PIXELFORMATDESCRIPTOR) int {
+ ret, _, _ := procDescribePixelFormat.Call(
+ uintptr(hdc),
+ uintptr(iPixelFormat),
+ uintptr(nBytes),
+ uintptr(unsafe.Pointer(pfd)),
+ )
+ return int(ret)
+}
+
+func GetEnhMetaFilePixelFormat(hemf HENHMETAFILE, cbBuffer uint32, pfd *PIXELFORMATDESCRIPTOR) uint {
+ ret, _, _ := procGetEnhMetaFilePixelFormat.Call(
+ uintptr(hemf),
+ uintptr(cbBuffer),
+ uintptr(unsafe.Pointer(pfd)),
+ )
+ return uint(ret)
+}
+
+func GetPixelFormat(hdc HDC) int {
+ ret, _, _ := procGetPixelFormat.Call(
+ uintptr(hdc),
+ )
+ return int(ret)
+}
+
+func SetPixelFormat(hdc HDC, iPixelFormat int, pfd *PIXELFORMATDESCRIPTOR) bool {
+ ret, _, _ := procSetPixelFormat.Call(
+ uintptr(hdc),
+ uintptr(iPixelFormat),
+ uintptr(unsafe.Pointer(pfd)),
+ )
+ return ret == TRUE
+}
+
+func SwapBuffers(hdc HDC) bool {
+ ret, _, _ := procSwapBuffers.Call(uintptr(hdc))
+ return ret == TRUE
+}
diff --git a/vendor/github.com/AllenDang/w32/gdiplus.go b/vendor/github.com/AllenDang/w32/gdiplus.go
new file mode 100644
index 0000000..f3a8fca
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/gdiplus.go
@@ -0,0 +1,175 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "errors"
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+const (
+ Ok = 0
+ GenericError = 1
+ InvalidParameter = 2
+ OutOfMemory = 3
+ ObjectBusy = 4
+ InsufficientBuffer = 5
+ NotImplemented = 6
+ Win32Error = 7
+ WrongState = 8
+ Aborted = 9
+ FileNotFound = 10
+ ValueOverflow = 11
+ AccessDenied = 12
+ UnknownImageFormat = 13
+ FontFamilyNotFound = 14
+ FontStyleNotFound = 15
+ NotTrueTypeFont = 16
+ UnsupportedGdiplusVersion = 17
+ GdiplusNotInitialized = 18
+ PropertyNotFound = 19
+ PropertyNotSupported = 20
+ ProfileNotFound = 21
+)
+
+func GetGpStatus(s int32) string {
+ switch s {
+ case Ok:
+ return "Ok"
+ case GenericError:
+ return "GenericError"
+ case InvalidParameter:
+ return "InvalidParameter"
+ case OutOfMemory:
+ return "OutOfMemory"
+ case ObjectBusy:
+ return "ObjectBusy"
+ case InsufficientBuffer:
+ return "InsufficientBuffer"
+ case NotImplemented:
+ return "NotImplemented"
+ case Win32Error:
+ return "Win32Error"
+ case WrongState:
+ return "WrongState"
+ case Aborted:
+ return "Aborted"
+ case FileNotFound:
+ return "FileNotFound"
+ case ValueOverflow:
+ return "ValueOverflow"
+ case AccessDenied:
+ return "AccessDenied"
+ case UnknownImageFormat:
+ return "UnknownImageFormat"
+ case FontFamilyNotFound:
+ return "FontFamilyNotFound"
+ case FontStyleNotFound:
+ return "FontStyleNotFound"
+ case NotTrueTypeFont:
+ return "NotTrueTypeFont"
+ case UnsupportedGdiplusVersion:
+ return "UnsupportedGdiplusVersion"
+ case GdiplusNotInitialized:
+ return "GdiplusNotInitialized"
+ case PropertyNotFound:
+ return "PropertyNotFound"
+ case PropertyNotSupported:
+ return "PropertyNotSupported"
+ case ProfileNotFound:
+ return "ProfileNotFound"
+ }
+ return "Unknown Status Value"
+}
+
+var (
+ token uintptr
+
+ modgdiplus = syscall.NewLazyDLL("gdiplus.dll")
+
+ procGdipCreateBitmapFromFile = modgdiplus.NewProc("GdipCreateBitmapFromFile")
+ procGdipCreateBitmapFromHBITMAP = modgdiplus.NewProc("GdipCreateBitmapFromHBITMAP")
+ procGdipCreateHBITMAPFromBitmap = modgdiplus.NewProc("GdipCreateHBITMAPFromBitmap")
+ procGdipCreateBitmapFromResource = modgdiplus.NewProc("GdipCreateBitmapFromResource")
+ procGdipCreateBitmapFromStream = modgdiplus.NewProc("GdipCreateBitmapFromStream")
+ procGdipDisposeImage = modgdiplus.NewProc("GdipDisposeImage")
+ procGdiplusShutdown = modgdiplus.NewProc("GdiplusShutdown")
+ procGdiplusStartup = modgdiplus.NewProc("GdiplusStartup")
+)
+
+func GdipCreateBitmapFromFile(filename string) (*uintptr, error) {
+ var bitmap *uintptr
+ ret, _, _ := procGdipCreateBitmapFromFile.Call(
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filename))),
+ uintptr(unsafe.Pointer(&bitmap)))
+
+ if ret != Ok {
+ return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromFile failed with status '%s' for file '%s'", GetGpStatus(int32(ret)), filename))
+ }
+
+ return bitmap, nil
+}
+
+func GdipCreateBitmapFromResource(instance HINSTANCE, resId *uint16) (*uintptr, error) {
+ var bitmap *uintptr
+ ret, _, _ := procGdipCreateBitmapFromResource.Call(
+ uintptr(instance),
+ uintptr(unsafe.Pointer(resId)),
+ uintptr(unsafe.Pointer(&bitmap)))
+
+ if ret != Ok {
+ return nil, errors.New(fmt.Sprintf("GdiCreateBitmapFromResource failed with status '%s'", GetGpStatus(int32(ret))))
+ }
+
+ return bitmap, nil
+}
+
+func GdipCreateBitmapFromStream(stream *IStream) (*uintptr, error) {
+ var bitmap *uintptr
+ ret, _, _ := procGdipCreateBitmapFromStream.Call(
+ uintptr(unsafe.Pointer(stream)),
+ uintptr(unsafe.Pointer(&bitmap)))
+
+ if ret != Ok {
+ return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromStream failed with status '%s'", GetGpStatus(int32(ret))))
+ }
+
+ return bitmap, nil
+}
+
+func GdipCreateHBITMAPFromBitmap(bitmap *uintptr, background uint32) (HBITMAP, error) {
+ var hbitmap HBITMAP
+ ret, _, _ := procGdipCreateHBITMAPFromBitmap.Call(
+ uintptr(unsafe.Pointer(bitmap)),
+ uintptr(unsafe.Pointer(&hbitmap)),
+ uintptr(background))
+
+ if ret != Ok {
+ return 0, errors.New(fmt.Sprintf("GdipCreateHBITMAPFromBitmap failed with status '%s'", GetGpStatus(int32(ret))))
+ }
+
+ return hbitmap, nil
+}
+
+func GdipDisposeImage(image *uintptr) {
+ procGdipDisposeImage.Call(uintptr(unsafe.Pointer(image)))
+}
+
+func GdiplusShutdown() {
+ procGdiplusShutdown.Call(token)
+}
+
+func GdiplusStartup(input *GdiplusStartupInput, output *GdiplusStartupOutput) {
+ ret, _, _ := procGdiplusStartup.Call(
+ uintptr(unsafe.Pointer(&token)),
+ uintptr(unsafe.Pointer(input)),
+ uintptr(unsafe.Pointer(output)))
+
+ if ret != Ok {
+ panic("GdiplusStartup failed with status " + GetGpStatus(int32(ret)))
+ }
+}
diff --git a/vendor/github.com/AllenDang/w32/idispatch.go b/vendor/github.com/AllenDang/w32/idispatch.go
new file mode 100644
index 0000000..41634a6
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/idispatch.go
@@ -0,0 +1,43 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "unsafe"
+)
+
+type pIDispatchVtbl struct {
+ pQueryInterface uintptr
+ pAddRef uintptr
+ pRelease uintptr
+ pGetTypeInfoCount uintptr
+ pGetTypeInfo uintptr
+ pGetIDsOfNames uintptr
+ pInvoke uintptr
+}
+
+type IDispatch struct {
+ lpVtbl *pIDispatchVtbl
+}
+
+func (this *IDispatch) QueryInterface(id *GUID) *IDispatch {
+ return ComQueryInterface((*IUnknown)(unsafe.Pointer(this)), id)
+}
+
+func (this *IDispatch) AddRef() int32 {
+ return ComAddRef((*IUnknown)(unsafe.Pointer(this)))
+}
+
+func (this *IDispatch) Release() int32 {
+ return ComRelease((*IUnknown)(unsafe.Pointer(this)))
+}
+
+func (this *IDispatch) GetIDsOfName(names []string) []int32 {
+ return ComGetIDsOfName(this, names)
+}
+
+func (this *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) *VARIANT {
+ return ComInvoke(this, dispid, dispatch, params...)
+}
diff --git a/vendor/github.com/AllenDang/w32/istream.go b/vendor/github.com/AllenDang/w32/istream.go
new file mode 100644
index 0000000..2b840c3
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/istream.go
@@ -0,0 +1,31 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "unsafe"
+)
+
+type pIStreamVtbl struct {
+ pQueryInterface uintptr
+ pAddRef uintptr
+ pRelease uintptr
+}
+
+type IStream struct {
+ lpVtbl *pIStreamVtbl
+}
+
+func (this *IStream) QueryInterface(id *GUID) *IDispatch {
+ return ComQueryInterface((*IUnknown)(unsafe.Pointer(this)), id)
+}
+
+func (this *IStream) AddRef() int32 {
+ return ComAddRef((*IUnknown)(unsafe.Pointer(this)))
+}
+
+func (this *IStream) Release() int32 {
+ return ComRelease((*IUnknown)(unsafe.Pointer(this)))
+}
diff --git a/vendor/github.com/AllenDang/w32/iunknown.go b/vendor/github.com/AllenDang/w32/iunknown.go
new file mode 100644
index 0000000..d63ff1b
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/iunknown.go
@@ -0,0 +1,27 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+type pIUnknownVtbl struct {
+ pQueryInterface uintptr
+ pAddRef uintptr
+ pRelease uintptr
+}
+
+type IUnknown struct {
+ lpVtbl *pIUnknownVtbl
+}
+
+func (this *IUnknown) QueryInterface(id *GUID) *IDispatch {
+ return ComQueryInterface(this, id)
+}
+
+func (this *IUnknown) AddRef() int32 {
+ return ComAddRef(this)
+}
+
+func (this *IUnknown) Release() int32 {
+ return ComRelease(this)
+}
diff --git a/vendor/github.com/AllenDang/w32/kernel32.go b/vendor/github.com/AllenDang/w32/kernel32.go
new file mode 100644
index 0000000..28febbe
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/kernel32.go
@@ -0,0 +1,388 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modkernel32 = syscall.NewLazyDLL("kernel32.dll")
+
+ procGetModuleHandle = modkernel32.NewProc("GetModuleHandleW")
+ procMulDiv = modkernel32.NewProc("MulDiv")
+ procGetConsoleWindow = modkernel32.NewProc("GetConsoleWindow")
+ procGetCurrentThread = modkernel32.NewProc("GetCurrentThread")
+ procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives")
+ procGetUserDefaultLCID = modkernel32.NewProc("GetUserDefaultLCID")
+ procLstrlen = modkernel32.NewProc("lstrlenW")
+ procLstrcpy = modkernel32.NewProc("lstrcpyW")
+ procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
+ procGlobalFree = modkernel32.NewProc("GlobalFree")
+ procGlobalLock = modkernel32.NewProc("GlobalLock")
+ procGlobalUnlock = modkernel32.NewProc("GlobalUnlock")
+ procMoveMemory = modkernel32.NewProc("RtlMoveMemory")
+ procFindResource = modkernel32.NewProc("FindResourceW")
+ procSizeofResource = modkernel32.NewProc("SizeofResource")
+ procLockResource = modkernel32.NewProc("LockResource")
+ procLoadResource = modkernel32.NewProc("LoadResource")
+ procGetLastError = modkernel32.NewProc("GetLastError")
+ // procOpenProcess = modkernel32.NewProc("OpenProcess")
+ // procTerminateProcess = modkernel32.NewProc("TerminateProcess")
+ procCloseHandle = modkernel32.NewProc("CloseHandle")
+ procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")
+ procModule32First = modkernel32.NewProc("Module32FirstW")
+ procModule32Next = modkernel32.NewProc("Module32NextW")
+ procGetSystemTimes = modkernel32.NewProc("GetSystemTimes")
+ procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo")
+ procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute")
+ procGetDiskFreeSpaceEx = modkernel32.NewProc("GetDiskFreeSpaceExW")
+ procGetProcessTimes = modkernel32.NewProc("GetProcessTimes")
+ procSetSystemTime = modkernel32.NewProc("SetSystemTime")
+ procGetSystemTime = modkernel32.NewProc("GetSystemTime")
+ procVirtualAllocEx = modkernel32.NewProc("VirtualAllocEx")
+ procVirtualFreeEx = modkernel32.NewProc("VirtualFreeEx")
+ procWriteProcessMemory = modkernel32.NewProc("WriteProcessMemory")
+ procReadProcessMemory = modkernel32.NewProc("ReadProcessMemory")
+ procQueryPerformanceCounter = modkernel32.NewProc("QueryPerformanceCounter")
+ procQueryPerformanceFrequency = modkernel32.NewProc("QueryPerformanceFrequency")
+)
+
+func GetModuleHandle(modulename string) HINSTANCE {
+ var mn uintptr
+ if modulename == "" {
+ mn = 0
+ } else {
+ mn = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(modulename)))
+ }
+ ret, _, _ := procGetModuleHandle.Call(mn)
+ return HINSTANCE(ret)
+}
+
+func MulDiv(number, numerator, denominator int) int {
+ ret, _, _ := procMulDiv.Call(
+ uintptr(number),
+ uintptr(numerator),
+ uintptr(denominator))
+
+ return int(ret)
+}
+
+func GetConsoleWindow() HWND {
+ ret, _, _ := procGetConsoleWindow.Call()
+
+ return HWND(ret)
+}
+
+func GetCurrentThread() HANDLE {
+ ret, _, _ := procGetCurrentThread.Call()
+
+ return HANDLE(ret)
+}
+
+func GetLogicalDrives() uint32 {
+ ret, _, _ := procGetLogicalDrives.Call()
+
+ return uint32(ret)
+}
+
+func GetUserDefaultLCID() uint32 {
+ ret, _, _ := procGetUserDefaultLCID.Call()
+
+ return uint32(ret)
+}
+
+func Lstrlen(lpString *uint16) int {
+ ret, _, _ := procLstrlen.Call(uintptr(unsafe.Pointer(lpString)))
+
+ return int(ret)
+}
+
+func Lstrcpy(buf []uint16, lpString *uint16) {
+ procLstrcpy.Call(
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(unsafe.Pointer(lpString)))
+}
+
+func GlobalAlloc(uFlags uint, dwBytes uint32) HGLOBAL {
+ ret, _, _ := procGlobalAlloc.Call(
+ uintptr(uFlags),
+ uintptr(dwBytes))
+
+ if ret == 0 {
+ panic("GlobalAlloc failed")
+ }
+
+ return HGLOBAL(ret)
+}
+
+func GlobalFree(hMem HGLOBAL) {
+ ret, _, _ := procGlobalFree.Call(uintptr(hMem))
+
+ if ret != 0 {
+ panic("GlobalFree failed")
+ }
+}
+
+func GlobalLock(hMem HGLOBAL) unsafe.Pointer {
+ ret, _, _ := procGlobalLock.Call(uintptr(hMem))
+
+ if ret == 0 {
+ panic("GlobalLock failed")
+ }
+
+ return unsafe.Pointer(ret)
+}
+
+func GlobalUnlock(hMem HGLOBAL) bool {
+ ret, _, _ := procGlobalUnlock.Call(uintptr(hMem))
+
+ return ret != 0
+}
+
+func MoveMemory(destination, source unsafe.Pointer, length uint32) {
+ procMoveMemory.Call(
+ uintptr(unsafe.Pointer(destination)),
+ uintptr(source),
+ uintptr(length))
+}
+
+func FindResource(hModule HMODULE, lpName, lpType *uint16) (HRSRC, error) {
+ ret, _, _ := procFindResource.Call(
+ uintptr(hModule),
+ uintptr(unsafe.Pointer(lpName)),
+ uintptr(unsafe.Pointer(lpType)))
+
+ if ret == 0 {
+ return 0, syscall.GetLastError()
+ }
+
+ return HRSRC(ret), nil
+}
+
+func SizeofResource(hModule HMODULE, hResInfo HRSRC) uint32 {
+ ret, _, _ := procSizeofResource.Call(
+ uintptr(hModule),
+ uintptr(hResInfo))
+
+ if ret == 0 {
+ panic("SizeofResource failed")
+ }
+
+ return uint32(ret)
+}
+
+func LockResource(hResData HGLOBAL) unsafe.Pointer {
+ ret, _, _ := procLockResource.Call(uintptr(hResData))
+
+ if ret == 0 {
+ panic("LockResource failed")
+ }
+
+ return unsafe.Pointer(ret)
+}
+
+func LoadResource(hModule HMODULE, hResInfo HRSRC) HGLOBAL {
+ ret, _, _ := procLoadResource.Call(
+ uintptr(hModule),
+ uintptr(hResInfo))
+
+ if ret == 0 {
+ panic("LoadResource failed")
+ }
+
+ return HGLOBAL(ret)
+}
+
+func GetLastError() uint32 {
+ ret, _, _ := procGetLastError.Call()
+ return uint32(ret)
+}
+
+// func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) HANDLE {
+// inherit := 0
+// if inheritHandle {
+// inherit = 1
+// }
+
+// ret, _, _ := procOpenProcess.Call(
+// uintptr(desiredAccess),
+// uintptr(inherit),
+// uintptr(processId))
+// return HANDLE(ret)
+// }
+
+// func TerminateProcess(hProcess HANDLE, uExitCode uint) bool {
+// ret, _, _ := procTerminateProcess.Call(
+// uintptr(hProcess),
+// uintptr(uExitCode))
+// return ret != 0
+// }
+
+func CloseHandle(object HANDLE) bool {
+ ret, _, _ := procCloseHandle.Call(
+ uintptr(object))
+ return ret != 0
+}
+
+func CreateToolhelp32Snapshot(flags, processId uint32) HANDLE {
+ ret, _, _ := procCreateToolhelp32Snapshot.Call(
+ uintptr(flags),
+ uintptr(processId))
+
+ if ret <= 0 {
+ return HANDLE(0)
+ }
+
+ return HANDLE(ret)
+}
+
+func Module32First(snapshot HANDLE, me *MODULEENTRY32) bool {
+ ret, _, _ := procModule32First.Call(
+ uintptr(snapshot),
+ uintptr(unsafe.Pointer(me)))
+
+ return ret != 0
+}
+
+func Module32Next(snapshot HANDLE, me *MODULEENTRY32) bool {
+ ret, _, _ := procModule32Next.Call(
+ uintptr(snapshot),
+ uintptr(unsafe.Pointer(me)))
+
+ return ret != 0
+}
+
+func GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime *FILETIME) bool {
+ ret, _, _ := procGetSystemTimes.Call(
+ uintptr(unsafe.Pointer(lpIdleTime)),
+ uintptr(unsafe.Pointer(lpKernelTime)),
+ uintptr(unsafe.Pointer(lpUserTime)))
+
+ return ret != 0
+}
+
+func GetProcessTimes(hProcess HANDLE, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime *FILETIME) bool {
+ ret, _, _ := procGetProcessTimes.Call(
+ uintptr(hProcess),
+ uintptr(unsafe.Pointer(lpCreationTime)),
+ uintptr(unsafe.Pointer(lpExitTime)),
+ uintptr(unsafe.Pointer(lpKernelTime)),
+ uintptr(unsafe.Pointer(lpUserTime)))
+
+ return ret != 0
+}
+
+func GetConsoleScreenBufferInfo(hConsoleOutput HANDLE) *CONSOLE_SCREEN_BUFFER_INFO {
+ var csbi CONSOLE_SCREEN_BUFFER_INFO
+ ret, _, _ := procGetConsoleScreenBufferInfo.Call(
+ uintptr(hConsoleOutput),
+ uintptr(unsafe.Pointer(&csbi)))
+ if ret == 0 {
+ return nil
+ }
+ return &csbi
+}
+
+func SetConsoleTextAttribute(hConsoleOutput HANDLE, wAttributes uint16) bool {
+ ret, _, _ := procSetConsoleTextAttribute.Call(
+ uintptr(hConsoleOutput),
+ uintptr(wAttributes))
+ return ret != 0
+}
+
+func GetDiskFreeSpaceEx(dirName string) (r bool,
+ freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64) {
+ ret, _, _ := procGetDiskFreeSpaceEx.Call(
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(dirName))),
+ uintptr(unsafe.Pointer(&freeBytesAvailable)),
+ uintptr(unsafe.Pointer(&totalNumberOfBytes)),
+ uintptr(unsafe.Pointer(&totalNumberOfFreeBytes)))
+ return ret != 0,
+ freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes
+}
+
+func GetSystemTime() *SYSTEMTIME {
+ var time SYSTEMTIME
+ procGetSystemTime.Call(
+ uintptr(unsafe.Pointer(&time)))
+ return &time
+}
+
+func SetSystemTime(time *SYSTEMTIME) bool {
+ ret, _, _ := procSetSystemTime.Call(
+ uintptr(unsafe.Pointer(time)))
+ return ret != 0
+}
+
+func VirtualAllocEx(hProcess HANDLE, lpAddress, dwSize uintptr, flAllocationType, flProtect uint32) uintptr {
+ ret, _, _ := procVirtualAllocEx.Call(
+ uintptr(hProcess),
+ lpAddress,
+ dwSize,
+ uintptr(flAllocationType),
+ uintptr(flProtect),
+ )
+
+ return ret
+}
+
+func VirtualFreeEx(hProcess HANDLE, lpAddress, dwSize uintptr, dwFreeType uint32) bool {
+ ret, _, _ := procVirtualFreeEx.Call(
+ uintptr(hProcess),
+ lpAddress,
+ dwSize,
+ uintptr(dwFreeType),
+ )
+
+ return ret != 0
+}
+
+func WriteProcessMemory(hProcess HANDLE, lpBaseAddress, lpBuffer, nSize uintptr) (int, bool) {
+ var nBytesWritten int
+ ret, _, _ := procWriteProcessMemory.Call(
+ uintptr(hProcess),
+ lpBaseAddress,
+ lpBuffer,
+ nSize,
+ uintptr(unsafe.Pointer(&nBytesWritten)),
+ )
+
+ return nBytesWritten, ret != 0
+}
+
+func ReadProcessMemory(hProcess HANDLE, lpBaseAddress, nSize uintptr) (lpBuffer []uint16, lpNumberOfBytesRead int, ok bool) {
+
+ var nBytesRead int
+ buf := make([]uint16, nSize)
+ ret, _, _ := procReadProcessMemory.Call(
+ uintptr(hProcess),
+ lpBaseAddress,
+ uintptr(unsafe.Pointer(&buf[0])),
+ nSize,
+ uintptr(unsafe.Pointer(&nBytesRead)),
+ )
+
+ return buf, nBytesRead, ret != 0
+}
+
+func QueryPerformanceCounter() uint64 {
+ result := uint64(0)
+ procQueryPerformanceCounter.Call(
+ uintptr(unsafe.Pointer(&result)),
+ )
+
+ return result
+}
+
+func QueryPerformanceFrequency() uint64 {
+ result := uint64(0)
+ procQueryPerformanceFrequency.Call(
+ uintptr(unsafe.Pointer(&result)),
+ )
+
+ return result
+}
diff --git a/vendor/github.com/AllenDang/w32/ole32.go b/vendor/github.com/AllenDang/w32/ole32.go
new file mode 100644
index 0000000..a7f79b5
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/ole32.go
@@ -0,0 +1,63 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modole32 = syscall.NewLazyDLL("ole32.dll")
+
+ procCoInitializeEx = modole32.NewProc("CoInitializeEx")
+ procCoInitialize = modole32.NewProc("CoInitialize")
+ procCoUninitialize = modole32.NewProc("CoUninitialize")
+ procCreateStreamOnHGlobal = modole32.NewProc("CreateStreamOnHGlobal")
+)
+
+func CoInitializeEx(coInit uintptr) HRESULT {
+ ret, _, _ := procCoInitializeEx.Call(
+ 0,
+ coInit)
+
+ switch uint32(ret) {
+ case E_INVALIDARG:
+ panic("CoInitializeEx failed with E_INVALIDARG")
+ case E_OUTOFMEMORY:
+ panic("CoInitializeEx failed with E_OUTOFMEMORY")
+ case E_UNEXPECTED:
+ panic("CoInitializeEx failed with E_UNEXPECTED")
+ }
+
+ return HRESULT(ret)
+}
+
+func CoInitialize() {
+ procCoInitialize.Call(0)
+}
+
+func CoUninitialize() {
+ procCoUninitialize.Call()
+}
+
+func CreateStreamOnHGlobal(hGlobal HGLOBAL, fDeleteOnRelease bool) *IStream {
+ stream := new(IStream)
+ ret, _, _ := procCreateStreamOnHGlobal.Call(
+ uintptr(hGlobal),
+ uintptr(BoolToBOOL(fDeleteOnRelease)),
+ uintptr(unsafe.Pointer(&stream)))
+
+ switch uint32(ret) {
+ case E_INVALIDARG:
+ panic("CreateStreamOnHGlobal failed with E_INVALIDARG")
+ case E_OUTOFMEMORY:
+ panic("CreateStreamOnHGlobal failed with E_OUTOFMEMORY")
+ case E_UNEXPECTED:
+ panic("CreateStreamOnHGlobal failed with E_UNEXPECTED")
+ }
+
+ return stream
+}
diff --git a/vendor/github.com/AllenDang/w32/oleaut32.go b/vendor/github.com/AllenDang/w32/oleaut32.go
new file mode 100644
index 0000000..0eeeab7
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/oleaut32.go
@@ -0,0 +1,48 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modoleaut32 = syscall.NewLazyDLL("oleaut32")
+
+ procVariantInit = modoleaut32.NewProc("VariantInit")
+ procSysAllocString = modoleaut32.NewProc("SysAllocString")
+ procSysFreeString = modoleaut32.NewProc("SysFreeString")
+ procSysStringLen = modoleaut32.NewProc("SysStringLen")
+ procCreateDispTypeInfo = modoleaut32.NewProc("CreateDispTypeInfo")
+ procCreateStdDispatch = modoleaut32.NewProc("CreateStdDispatch")
+)
+
+func VariantInit(v *VARIANT) {
+ hr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v)))
+ if hr != 0 {
+ panic("Invoke VariantInit error.")
+ }
+ return
+}
+
+func SysAllocString(v string) (ss *int16) {
+ pss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v))))
+ ss = (*int16)(unsafe.Pointer(pss))
+ return
+}
+
+func SysFreeString(v *int16) {
+ hr, _, _ := procSysFreeString.Call(uintptr(unsafe.Pointer(v)))
+ if hr != 0 {
+ panic("Invoke SysFreeString error.")
+ }
+ return
+}
+
+func SysStringLen(v *int16) uint {
+ l, _, _ := procSysStringLen.Call(uintptr(unsafe.Pointer(v)))
+ return uint(l)
+}
diff --git a/vendor/github.com/AllenDang/w32/opengl32.go b/vendor/github.com/AllenDang/w32/opengl32.go
new file mode 100644
index 0000000..7363bb1
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/opengl32.go
@@ -0,0 +1,72 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modopengl32 = syscall.NewLazyDLL("opengl32.dll")
+
+ procwglCreateContext = modopengl32.NewProc("wglCreateContext")
+ procwglCreateLayerContext = modopengl32.NewProc("wglCreateLayerContext")
+ procwglDeleteContext = modopengl32.NewProc("wglDeleteContext")
+ procwglGetProcAddress = modopengl32.NewProc("wglGetProcAddress")
+ procwglMakeCurrent = modopengl32.NewProc("wglMakeCurrent")
+ procwglShareLists = modopengl32.NewProc("wglShareLists")
+)
+
+func WglCreateContext(hdc HDC) HGLRC {
+ ret, _, _ := procwglCreateContext.Call(
+ uintptr(hdc),
+ )
+
+ return HGLRC(ret)
+}
+
+func WglCreateLayerContext(hdc HDC, iLayerPlane int) HGLRC {
+ ret, _, _ := procwglCreateLayerContext.Call(
+ uintptr(hdc),
+ uintptr(iLayerPlane),
+ )
+
+ return HGLRC(ret)
+}
+
+func WglDeleteContext(hglrc HGLRC) bool {
+ ret, _, _ := procwglDeleteContext.Call(
+ uintptr(hglrc),
+ )
+
+ return ret == TRUE
+}
+
+func WglGetProcAddress(szProc string) uintptr {
+ ret, _, _ := procwglGetProcAddress.Call(
+ uintptr(unsafe.Pointer(syscall.StringBytePtr(szProc))),
+ )
+
+ return ret
+}
+
+func WglMakeCurrent(hdc HDC, hglrc HGLRC) bool {
+ ret, _, _ := procwglMakeCurrent.Call(
+ uintptr(hdc),
+ uintptr(hglrc),
+ )
+
+ return ret == TRUE
+}
+
+func WglShareLists(hglrc1, hglrc2 HGLRC) bool {
+ ret, _, _ := procwglShareLists.Call(
+ uintptr(hglrc1),
+ uintptr(hglrc2),
+ )
+
+ return ret == TRUE
+}
diff --git a/vendor/github.com/AllenDang/w32/psapi.go b/vendor/github.com/AllenDang/w32/psapi.go
new file mode 100644
index 0000000..bd1e126
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/psapi.go
@@ -0,0 +1,25 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modpsapi = syscall.NewLazyDLL("psapi.dll")
+
+ procEnumProcesses = modpsapi.NewProc("EnumProcesses")
+)
+
+func EnumProcesses(processIds []uint32, cb uint32, bytesReturned *uint32) bool {
+ ret, _, _ := procEnumProcesses.Call(
+ uintptr(unsafe.Pointer(&processIds[0])),
+ uintptr(cb),
+ uintptr(unsafe.Pointer(bytesReturned)))
+
+ return ret != 0
+}
diff --git a/vendor/github.com/AllenDang/w32/shell32.go b/vendor/github.com/AllenDang/w32/shell32.go
new file mode 100644
index 0000000..0923b8b
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/shell32.go
@@ -0,0 +1,153 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "errors"
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+var (
+ modshell32 = syscall.NewLazyDLL("shell32.dll")
+
+ procSHBrowseForFolder = modshell32.NewProc("SHBrowseForFolderW")
+ procSHGetPathFromIDList = modshell32.NewProc("SHGetPathFromIDListW")
+ procDragAcceptFiles = modshell32.NewProc("DragAcceptFiles")
+ procDragQueryFile = modshell32.NewProc("DragQueryFileW")
+ procDragQueryPoint = modshell32.NewProc("DragQueryPoint")
+ procDragFinish = modshell32.NewProc("DragFinish")
+ procShellExecute = modshell32.NewProc("ShellExecuteW")
+ procExtractIcon = modshell32.NewProc("ExtractIconW")
+)
+
+func SHBrowseForFolder(bi *BROWSEINFO) uintptr {
+ ret, _, _ := procSHBrowseForFolder.Call(uintptr(unsafe.Pointer(bi)))
+
+ return ret
+}
+
+func SHGetPathFromIDList(idl uintptr) string {
+ buf := make([]uint16, 1024)
+ procSHGetPathFromIDList.Call(
+ idl,
+ uintptr(unsafe.Pointer(&buf[0])))
+
+ return syscall.UTF16ToString(buf)
+}
+
+func DragAcceptFiles(hwnd HWND, accept bool) {
+ procDragAcceptFiles.Call(
+ uintptr(hwnd),
+ uintptr(BoolToBOOL(accept)))
+}
+
+func DragQueryFile(hDrop HDROP, iFile uint) (fileName string, fileCount uint) {
+ ret, _, _ := procDragQueryFile.Call(
+ uintptr(hDrop),
+ uintptr(iFile),
+ 0,
+ 0)
+
+ fileCount = uint(ret)
+
+ if iFile != 0xFFFFFFFF {
+ buf := make([]uint16, fileCount+1)
+
+ ret, _, _ := procDragQueryFile.Call(
+ uintptr(hDrop),
+ uintptr(iFile),
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(fileCount+1))
+
+ if ret == 0 {
+ panic("Invoke DragQueryFile error.")
+ }
+
+ fileName = syscall.UTF16ToString(buf)
+ }
+
+ return
+}
+
+func DragQueryPoint(hDrop HDROP) (x, y int, isClientArea bool) {
+ var pt POINT
+ ret, _, _ := procDragQueryPoint.Call(
+ uintptr(hDrop),
+ uintptr(unsafe.Pointer(&pt)))
+
+ return int(pt.X), int(pt.Y), (ret == 1)
+}
+
+func DragFinish(hDrop HDROP) {
+ procDragFinish.Call(uintptr(hDrop))
+}
+
+func ShellExecute(hwnd HWND, lpOperation, lpFile, lpParameters, lpDirectory string, nShowCmd int) error {
+ var op, param, directory uintptr
+ if len(lpOperation) != 0 {
+ op = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpOperation)))
+ }
+ if len(lpParameters) != 0 {
+ param = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpParameters)))
+ }
+ if len(lpDirectory) != 0 {
+ directory = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDirectory)))
+ }
+
+ ret, _, _ := procShellExecute.Call(
+ uintptr(hwnd),
+ op,
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpFile))),
+ param,
+ directory,
+ uintptr(nShowCmd))
+
+ errorMsg := ""
+ if ret != 0 && ret <= 32 {
+ switch int(ret) {
+ case ERROR_FILE_NOT_FOUND:
+ errorMsg = "The specified file was not found."
+ case ERROR_PATH_NOT_FOUND:
+ errorMsg = "The specified path was not found."
+ case ERROR_BAD_FORMAT:
+ errorMsg = "The .exe file is invalid (non-Win32 .exe or error in .exe image)."
+ case SE_ERR_ACCESSDENIED:
+ errorMsg = "The operating system denied access to the specified file."
+ case SE_ERR_ASSOCINCOMPLETE:
+ errorMsg = "The file name association is incomplete or invalid."
+ case SE_ERR_DDEBUSY:
+ errorMsg = "The DDE transaction could not be completed because other DDE transactions were being processed."
+ case SE_ERR_DDEFAIL:
+ errorMsg = "The DDE transaction failed."
+ case SE_ERR_DDETIMEOUT:
+ errorMsg = "The DDE transaction could not be completed because the request timed out."
+ case SE_ERR_DLLNOTFOUND:
+ errorMsg = "The specified DLL was not found."
+ case SE_ERR_NOASSOC:
+ errorMsg = "There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable."
+ case SE_ERR_OOM:
+ errorMsg = "There was not enough memory to complete the operation."
+ case SE_ERR_SHARE:
+ errorMsg = "A sharing violation occurred."
+ default:
+ errorMsg = fmt.Sprintf("Unknown error occurred with error code %v", ret)
+ }
+ } else {
+ return nil
+ }
+
+ return errors.New(errorMsg)
+}
+
+func ExtractIcon(lpszExeFileName string, nIconIndex int) HICON {
+ ret, _, _ := procExtractIcon.Call(
+ 0,
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpszExeFileName))),
+ uintptr(nIconIndex))
+
+ return HICON(ret)
+}
diff --git a/vendor/github.com/AllenDang/w32/typedef.go b/vendor/github.com/AllenDang/w32/typedef.go
new file mode 100644
index 0000000..118f76c
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/typedef.go
@@ -0,0 +1,891 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "unsafe"
+)
+
+// From MSDN: Windows Data Types
+// http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx
+// ATOM WORD
+// BOOL int32
+// BOOLEAN byte
+// BYTE byte
+// CCHAR int8
+// CHAR int8
+// COLORREF DWORD
+// DWORD uint32
+// DWORDLONG ULONGLONG
+// DWORD_PTR ULONG_PTR
+// DWORD32 uint32
+// DWORD64 uint64
+// FLOAT float32
+// HACCEL HANDLE
+// HALF_PTR struct{} // ???
+// HANDLE PVOID
+// HBITMAP HANDLE
+// HBRUSH HANDLE
+// HCOLORSPACE HANDLE
+// HCONV HANDLE
+// HCONVLIST HANDLE
+// HCURSOR HANDLE
+// HDC HANDLE
+// HDDEDATA HANDLE
+// HDESK HANDLE
+// HDROP HANDLE
+// HDWP HANDLE
+// HENHMETAFILE HANDLE
+// HFILE HANDLE
+// HFONT HANDLE
+// HGDIOBJ HANDLE
+// HGLOBAL HANDLE
+// HHOOK HANDLE
+// HICON HANDLE
+// HINSTANCE HANDLE
+// HKEY HANDLE
+// HKL HANDLE
+// HLOCAL HANDLE
+// HMENU HANDLE
+// HMETAFILE HANDLE
+// HMODULE HANDLE
+// HPALETTE HANDLE
+// HPEN HANDLE
+// HRESULT int32
+// HRGN HANDLE
+// HSZ HANDLE
+// HWINSTA HANDLE
+// HWND HANDLE
+// INT int32
+// INT_PTR uintptr
+// INT8 int8
+// INT16 int16
+// INT32 int32
+// INT64 int64
+// LANGID WORD
+// LCID DWORD
+// LCTYPE DWORD
+// LGRPID DWORD
+// LONG int32
+// LONGLONG int64
+// LONG_PTR uintptr
+// LONG32 int32
+// LONG64 int64
+// LPARAM LONG_PTR
+// LPBOOL *BOOL
+// LPBYTE *BYTE
+// LPCOLORREF *COLORREF
+// LPCSTR *int8
+// LPCTSTR LPCWSTR
+// LPCVOID unsafe.Pointer
+// LPCWSTR *WCHAR
+// LPDWORD *DWORD
+// LPHANDLE *HANDLE
+// LPINT *INT
+// LPLONG *LONG
+// LPSTR *CHAR
+// LPTSTR LPWSTR
+// LPVOID unsafe.Pointer
+// LPWORD *WORD
+// LPWSTR *WCHAR
+// LRESULT LONG_PTR
+// PBOOL *BOOL
+// PBOOLEAN *BOOLEAN
+// PBYTE *BYTE
+// PCHAR *CHAR
+// PCSTR *CHAR
+// PCTSTR PCWSTR
+// PCWSTR *WCHAR
+// PDWORD *DWORD
+// PDWORDLONG *DWORDLONG
+// PDWORD_PTR *DWORD_PTR
+// PDWORD32 *DWORD32
+// PDWORD64 *DWORD64
+// PFLOAT *FLOAT
+// PHALF_PTR *HALF_PTR
+// PHANDLE *HANDLE
+// PHKEY *HKEY
+// PINT_PTR *INT_PTR
+// PINT8 *INT8
+// PINT16 *INT16
+// PINT32 *INT32
+// PINT64 *INT64
+// PLCID *LCID
+// PLONG *LONG
+// PLONGLONG *LONGLONG
+// PLONG_PTR *LONG_PTR
+// PLONG32 *LONG32
+// PLONG64 *LONG64
+// POINTER_32 struct{} // ???
+// POINTER_64 struct{} // ???
+// POINTER_SIGNED uintptr
+// POINTER_UNSIGNED uintptr
+// PSHORT *SHORT
+// PSIZE_T *SIZE_T
+// PSSIZE_T *SSIZE_T
+// PSTR *CHAR
+// PTBYTE *TBYTE
+// PTCHAR *TCHAR
+// PTSTR PWSTR
+// PUCHAR *UCHAR
+// PUHALF_PTR *UHALF_PTR
+// PUINT *UINT
+// PUINT_PTR *UINT_PTR
+// PUINT8 *UINT8
+// PUINT16 *UINT16
+// PUINT32 *UINT32
+// PUINT64 *UINT64
+// PULONG *ULONG
+// PULONGLONG *ULONGLONG
+// PULONG_PTR *ULONG_PTR
+// PULONG32 *ULONG32
+// PULONG64 *ULONG64
+// PUSHORT *USHORT
+// PVOID unsafe.Pointer
+// PWCHAR *WCHAR
+// PWORD *WORD
+// PWSTR *WCHAR
+// QWORD uint64
+// SC_HANDLE HANDLE
+// SC_LOCK LPVOID
+// SERVICE_STATUS_HANDLE HANDLE
+// SHORT int16
+// SIZE_T ULONG_PTR
+// SSIZE_T LONG_PTR
+// TBYTE WCHAR
+// TCHAR WCHAR
+// UCHAR uint8
+// UHALF_PTR struct{} // ???
+// UINT uint32
+// UINT_PTR uintptr
+// UINT8 uint8
+// UINT16 uint16
+// UINT32 uint32
+// UINT64 uint64
+// ULONG uint32
+// ULONGLONG uint64
+// ULONG_PTR uintptr
+// ULONG32 uint32
+// ULONG64 uint64
+// USHORT uint16
+// USN LONGLONG
+// WCHAR uint16
+// WORD uint16
+// WPARAM UINT_PTR
+type (
+ ATOM uint16
+ BOOL int32
+ COLORREF uint32
+ DWM_FRAME_COUNT uint64
+ DWORD uint32
+ HACCEL HANDLE
+ HANDLE uintptr
+ HBITMAP HANDLE
+ HBRUSH HANDLE
+ HCURSOR HANDLE
+ HDC HANDLE
+ HDROP HANDLE
+ HDWP HANDLE
+ HENHMETAFILE HANDLE
+ HFONT HANDLE
+ HGDIOBJ HANDLE
+ HGLOBAL HANDLE
+ HGLRC HANDLE
+ HHOOK HANDLE
+ HICON HANDLE
+ HIMAGELIST HANDLE
+ HINSTANCE HANDLE
+ HKEY HANDLE
+ HKL HANDLE
+ HMENU HANDLE
+ HMODULE HANDLE
+ HMONITOR HANDLE
+ HPEN HANDLE
+ HRESULT int32
+ HRGN HANDLE
+ HRSRC HANDLE
+ HTHUMBNAIL HANDLE
+ HWND HANDLE
+ LPARAM uintptr
+ LPCVOID unsafe.Pointer
+ LRESULT uintptr
+ PVOID unsafe.Pointer
+ QPC_TIME uint64
+ ULONG_PTR uintptr
+ WPARAM uintptr
+ TRACEHANDLE uintptr
+)
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805.aspx
+type POINT struct {
+ X, Y int32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162897.aspx
+type RECT struct {
+ Left, Top, Right, Bottom int32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577.aspx
+type WNDCLASSEX struct {
+ Size uint32
+ Style uint32
+ WndProc uintptr
+ ClsExtra int32
+ WndExtra int32
+ Instance HINSTANCE
+ Icon HICON
+ Cursor HCURSOR
+ Background HBRUSH
+ MenuName *uint16
+ ClassName *uint16
+ IconSm HICON
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644958.aspx
+type MSG struct {
+ Hwnd HWND
+ Message uint32
+ WParam uintptr
+ LParam uintptr
+ Time uint32
+ Pt POINT
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145037.aspx
+type LOGFONT struct {
+ Height int32
+ Width int32
+ Escapement int32
+ Orientation int32
+ Weight int32
+ Italic byte
+ Underline byte
+ StrikeOut byte
+ CharSet byte
+ OutPrecision byte
+ ClipPrecision byte
+ Quality byte
+ PitchAndFamily byte
+ FaceName [LF_FACESIZE]uint16
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839.aspx
+type OPENFILENAME struct {
+ StructSize uint32
+ Owner HWND
+ Instance HINSTANCE
+ Filter *uint16
+ CustomFilter *uint16
+ MaxCustomFilter uint32
+ FilterIndex uint32
+ File *uint16
+ MaxFile uint32
+ FileTitle *uint16
+ MaxFileTitle uint32
+ InitialDir *uint16
+ Title *uint16
+ Flags uint32
+ FileOffset uint16
+ FileExtension uint16
+ DefExt *uint16
+ CustData uintptr
+ FnHook uintptr
+ TemplateName *uint16
+ PvReserved unsafe.Pointer
+ DwReserved uint32
+ FlagsEx uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205.aspx
+type BROWSEINFO struct {
+ Owner HWND
+ Root *uint16
+ DisplayName *uint16
+ Title *uint16
+ Flags uint32
+ CallbackFunc uintptr
+ LParam uintptr
+ Image int32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx
+type GUID struct {
+ Data1 uint32
+ Data2 uint16
+ Data3 uint16
+ Data4 [8]byte
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221627.aspx
+type VARIANT struct {
+ VT uint16 // 2
+ WReserved1 uint16 // 4
+ WReserved2 uint16 // 6
+ WReserved3 uint16 // 8
+ Val int64 // 16
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221416.aspx
+type DISPPARAMS struct {
+ Rgvarg uintptr
+ RgdispidNamedArgs uintptr
+ CArgs uint32
+ CNamedArgs uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221133.aspx
+type EXCEPINFO struct {
+ WCode uint16
+ WReserved uint16
+ BstrSource *uint16
+ BstrDescription *uint16
+ BstrHelpFile *uint16
+ DwHelpContext uint32
+ PvReserved uintptr
+ PfnDeferredFillIn uintptr
+ Scode int32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145035.aspx
+type LOGBRUSH struct {
+ LbStyle uint32
+ LbColor COLORREF
+ LbHatch uintptr
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565.aspx
+type DEVMODE struct {
+ DmDeviceName [CCHDEVICENAME]uint16
+ DmSpecVersion uint16
+ DmDriverVersion uint16
+ DmSize uint16
+ DmDriverExtra uint16
+ DmFields uint32
+ DmOrientation int16
+ DmPaperSize int16
+ DmPaperLength int16
+ DmPaperWidth int16
+ DmScale int16
+ DmCopies int16
+ DmDefaultSource int16
+ DmPrintQuality int16
+ DmColor int16
+ DmDuplex int16
+ DmYResolution int16
+ DmTTOption int16
+ DmCollate int16
+ DmFormName [CCHFORMNAME]uint16
+ DmLogPixels uint16
+ DmBitsPerPel uint32
+ DmPelsWidth uint32
+ DmPelsHeight uint32
+ DmDisplayFlags uint32
+ DmDisplayFrequency uint32
+ DmICMMethod uint32
+ DmICMIntent uint32
+ DmMediaType uint32
+ DmDitherType uint32
+ DmReserved1 uint32
+ DmReserved2 uint32
+ DmPanningWidth uint32
+ DmPanningHeight uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376.aspx
+type BITMAPINFOHEADER struct {
+ BiSize uint32
+ BiWidth int32
+ BiHeight int32
+ BiPlanes uint16
+ BiBitCount uint16
+ BiCompression uint32
+ BiSizeImage uint32
+ BiXPelsPerMeter int32
+ BiYPelsPerMeter int32
+ BiClrUsed uint32
+ BiClrImportant uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162938.aspx
+type RGBQUAD struct {
+ RgbBlue byte
+ RgbGreen byte
+ RgbRed byte
+ RgbReserved byte
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183375.aspx
+type BITMAPINFO struct {
+ BmiHeader BITMAPINFOHEADER
+ BmiColors *RGBQUAD
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183371.aspx
+type BITMAP struct {
+ BmType int32
+ BmWidth int32
+ BmHeight int32
+ BmWidthBytes int32
+ BmPlanes uint16
+ BmBitsPixel uint16
+ BmBits unsafe.Pointer
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183567.aspx
+type DIBSECTION struct {
+ DsBm BITMAP
+ DsBmih BITMAPINFOHEADER
+ DsBitfields [3]uint32
+ DshSection HANDLE
+ DsOffset uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162607.aspx
+type ENHMETAHEADER struct {
+ IType uint32
+ NSize uint32
+ RclBounds RECT
+ RclFrame RECT
+ DSignature uint32
+ NVersion uint32
+ NBytes uint32
+ NRecords uint32
+ NHandles uint16
+ SReserved uint16
+ NDescription uint32
+ OffDescription uint32
+ NPalEntries uint32
+ SzlDevice SIZE
+ SzlMillimeters SIZE
+ CbPixelFormat uint32
+ OffPixelFormat uint32
+ BOpenGL uint32
+ SzlMicrometers SIZE
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145106.aspx
+type SIZE struct {
+ CX, CY int32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145132.aspx
+type TEXTMETRIC struct {
+ TmHeight int32
+ TmAscent int32
+ TmDescent int32
+ TmInternalLeading int32
+ TmExternalLeading int32
+ TmAveCharWidth int32
+ TmMaxCharWidth int32
+ TmWeight int32
+ TmOverhang int32
+ TmDigitizedAspectX int32
+ TmDigitizedAspectY int32
+ TmFirstChar uint16
+ TmLastChar uint16
+ TmDefaultChar uint16
+ TmBreakChar uint16
+ TmItalic byte
+ TmUnderlined byte
+ TmStruckOut byte
+ TmPitchAndFamily byte
+ TmCharSet byte
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183574.aspx
+type DOCINFO struct {
+ CbSize int32
+ LpszDocName *uint16
+ LpszOutput *uint16
+ LpszDatatype *uint16
+ FwType uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775514.aspx
+type NMHDR struct {
+ HwndFrom HWND
+ IdFrom uintptr
+ Code uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774743.aspx
+type LVCOLUMN struct {
+ Mask uint32
+ Fmt int32
+ Cx int32
+ PszText *uint16
+ CchTextMax int32
+ ISubItem int32
+ IImage int32
+ IOrder int32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774760.aspx
+type LVITEM struct {
+ Mask uint32
+ IItem int32
+ ISubItem int32
+ State uint32
+ StateMask uint32
+ PszText *uint16
+ CchTextMax int32
+ IImage int32
+ LParam uintptr
+ IIndent int32
+ IGroupId int32
+ CColumns uint32
+ PuColumns uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774754.aspx
+type LVHITTESTINFO struct {
+ Pt POINT
+ Flags uint32
+ IItem int32
+ ISubItem int32
+ IGroup int32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774771.aspx
+type NMITEMACTIVATE struct {
+ Hdr NMHDR
+ IItem int32
+ ISubItem int32
+ UNewState uint32
+ UOldState uint32
+ UChanged uint32
+ PtAction POINT
+ LParam uintptr
+ UKeyFlags uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774773.aspx
+type NMLISTVIEW struct {
+ Hdr NMHDR
+ IItem int32
+ ISubItem int32
+ UNewState uint32
+ UOldState uint32
+ UChanged uint32
+ PtAction POINT
+ LParam uintptr
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774780.aspx
+type NMLVDISPINFO struct {
+ Hdr NMHDR
+ Item LVITEM
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775507.aspx
+type INITCOMMONCONTROLSEX struct {
+ DwSize uint32
+ DwICC uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb760256.aspx
+type TOOLINFO struct {
+ CbSize uint32
+ UFlags uint32
+ Hwnd HWND
+ UId uintptr
+ Rect RECT
+ Hinst HINSTANCE
+ LpszText *uint16
+ LParam uintptr
+ LpReserved unsafe.Pointer
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms645604.aspx
+type TRACKMOUSEEVENT struct {
+ CbSize uint32
+ DwFlags uint32
+ HwndTrack HWND
+ DwHoverTime uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534067.aspx
+type GdiplusStartupInput struct {
+ GdiplusVersion uint32
+ DebugEventCallback uintptr
+ SuppressBackgroundThread BOOL
+ SuppressExternalCodecs BOOL
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534068.aspx
+type GdiplusStartupOutput struct {
+ NotificationHook uintptr
+ NotificationUnhook uintptr
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162768.aspx
+type PAINTSTRUCT struct {
+ Hdc HDC
+ FErase BOOL
+ RcPaint RECT
+ FRestore BOOL
+ FIncUpdate BOOL
+ RgbReserved [32]byte
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms684225.aspx
+type MODULEENTRY32 struct {
+ Size uint32
+ ModuleID uint32
+ ProcessID uint32
+ GlblcntUsage uint32
+ ProccntUsage uint32
+ ModBaseAddr *uint8
+ ModBaseSize uint32
+ HModule HMODULE
+ SzModule [MAX_MODULE_NAME32 + 1]uint16
+ SzExePath [MAX_PATH]uint16
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx
+type FILETIME struct {
+ DwLowDateTime uint32
+ DwHighDateTime uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682119.aspx
+type COORD struct {
+ X, Y int16
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686311.aspx
+type SMALL_RECT struct {
+ Left, Top, Right, Bottom int16
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093.aspx
+type CONSOLE_SCREEN_BUFFER_INFO struct {
+ DwSize COORD
+ DwCursorPosition COORD
+ WAttributes uint16
+ SrWindow SMALL_RECT
+ DwMaximumWindowSize COORD
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773244.aspx
+type MARGINS struct {
+ CxLeftWidth, CxRightWidth, CyTopHeight, CyBottomHeight int32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969500.aspx
+type DWM_BLURBEHIND struct {
+ DwFlags uint32
+ fEnable BOOL
+ hRgnBlur HRGN
+ fTransitionOnMaximized BOOL
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969501.aspx
+type DWM_PRESENT_PARAMETERS struct {
+ cbSize uint32
+ fQueue BOOL
+ cRefreshStart DWM_FRAME_COUNT
+ cBuffer uint32
+ fUseSourceRate BOOL
+ rateSource UNSIGNED_RATIO
+ cRefreshesPerFrame uint32
+ eSampling DWM_SOURCE_FRAME_SAMPLING
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969502.aspx
+type DWM_THUMBNAIL_PROPERTIES struct {
+ dwFlags uint32
+ rcDestination RECT
+ rcSource RECT
+ opacity byte
+ fVisible BOOL
+ fSourceClientAreaOnly BOOL
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969503.aspx
+type DWM_TIMING_INFO struct {
+ cbSize uint32
+ rateRefresh UNSIGNED_RATIO
+ qpcRefreshPeriod QPC_TIME
+ rateCompose UNSIGNED_RATIO
+ qpcVBlank QPC_TIME
+ cRefresh DWM_FRAME_COUNT
+ cDXRefresh uint32
+ qpcCompose QPC_TIME
+ cFrame DWM_FRAME_COUNT
+ cDXPresent uint32
+ cRefreshFrame DWM_FRAME_COUNT
+ cFrameSubmitted DWM_FRAME_COUNT
+ cDXPresentSubmitted uint32
+ cFrameConfirmed DWM_FRAME_COUNT
+ cDXPresentConfirmed uint32
+ cRefreshConfirmed DWM_FRAME_COUNT
+ cDXRefreshConfirmed uint32
+ cFramesLate DWM_FRAME_COUNT
+ cFramesOutstanding uint32
+ cFrameDisplayed DWM_FRAME_COUNT
+ qpcFrameDisplayed QPC_TIME
+ cRefreshFrameDisplayed DWM_FRAME_COUNT
+ cFrameComplete DWM_FRAME_COUNT
+ qpcFrameComplete QPC_TIME
+ cFramePending DWM_FRAME_COUNT
+ qpcFramePending QPC_TIME
+ cFramesDisplayed DWM_FRAME_COUNT
+ cFramesComplete DWM_FRAME_COUNT
+ cFramesPending DWM_FRAME_COUNT
+ cFramesAvailable DWM_FRAME_COUNT
+ cFramesDropped DWM_FRAME_COUNT
+ cFramesMissed DWM_FRAME_COUNT
+ cRefreshNextDisplayed DWM_FRAME_COUNT
+ cRefreshNextPresented DWM_FRAME_COUNT
+ cRefreshesDisplayed DWM_FRAME_COUNT
+ cRefreshesPresented DWM_FRAME_COUNT
+ cRefreshStarted DWM_FRAME_COUNT
+ cPixelsReceived uint64
+ cPixelsDrawn uint64
+ cBuffersEmpty DWM_FRAME_COUNT
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd389402.aspx
+type MilMatrix3x2D struct {
+ S_11, S_12, S_21, S_22 float64
+ DX, DY float64
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969505.aspx
+type UNSIGNED_RATIO struct {
+ uiNumerator uint32
+ uiDenominator uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms632603.aspx
+type CREATESTRUCT struct {
+ CreateParams uintptr
+ Instance HINSTANCE
+ Menu HMENU
+ Parent HWND
+ Cy, Cx int32
+ Y, X int32
+ Style int32
+ Name *uint16
+ Class *uint16
+ dwExStyle uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145065.aspx
+type MONITORINFO struct {
+ CbSize uint32
+ RcMonitor RECT
+ RcWork RECT
+ DwFlags uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145066.aspx
+type MONITORINFOEX struct {
+ MONITORINFO
+ SzDevice [CCHDEVICENAME]uint16
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/dd368826.aspx
+type PIXELFORMATDESCRIPTOR struct {
+ Size uint16
+ Version uint16
+ DwFlags uint32
+ IPixelType byte
+ ColorBits byte
+ RedBits, RedShift byte
+ GreenBits, GreenShift byte
+ BlueBits, BlueShift byte
+ AlphaBits, AlphaShift byte
+ AccumBits byte
+ AccumRedBits byte
+ AccumGreenBits byte
+ AccumBlueBits byte
+ AccumAlphaBits byte
+ DepthBits, StencilBits byte
+ AuxBuffers byte
+ ILayerType byte
+ Reserved byte
+ DwLayerMask uint32
+ DwVisibleMask uint32
+ DwDamageMask uint32
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
+type INPUT struct {
+ Type uint32
+ Mi MOUSEINPUT
+ Ki KEYBDINPUT
+ Hi HARDWAREINPUT
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx
+type MOUSEINPUT struct {
+ Dx int32
+ Dy int32
+ MouseData uint32
+ DwFlags uint32
+ Time uint32
+ DwExtraInfo uintptr
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646271(v=vs.85).aspx
+type KEYBDINPUT struct {
+ WVk uint16
+ WScan uint16
+ DwFlags uint32
+ Time uint32
+ DwExtraInfo uintptr
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646269(v=vs.85).aspx
+type HARDWAREINPUT struct {
+ UMsg uint32
+ WParamL uint16
+ WParamH uint16
+}
+
+type KbdInput struct {
+ typ uint32
+ ki KEYBDINPUT
+}
+
+type MouseInput struct {
+ typ uint32
+ mi MOUSEINPUT
+}
+
+type HardwareInput struct {
+ typ uint32
+ hi HARDWAREINPUT
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx
+type SYSTEMTIME struct {
+ Year uint16
+ Month uint16
+ DayOfWeek uint16
+ Day uint16
+ Hour uint16
+ Minute uint16
+ Second uint16
+ Milliseconds uint16
+}
+
+// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644967(v=vs.85).aspx
+type KBDLLHOOKSTRUCT struct {
+ VkCode DWORD
+ ScanCode DWORD
+ Flags DWORD
+ Time DWORD
+ DwExtraInfo ULONG_PTR
+}
+
+type HOOKPROC func(int, WPARAM, LPARAM) LRESULT
+
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms633498(v=vs.85).aspx
+type WNDENUMPROC func(HWND, LPARAM) LRESULT
diff --git a/vendor/github.com/AllenDang/w32/user32.go b/vendor/github.com/AllenDang/w32/user32.go
new file mode 100644
index 0000000..1d1a0ab
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/user32.go
@@ -0,0 +1,1046 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+var (
+ moduser32 = syscall.NewLazyDLL("user32.dll")
+
+ procRegisterClassEx = moduser32.NewProc("RegisterClassExW")
+ procLoadIcon = moduser32.NewProc("LoadIconW")
+ procLoadCursor = moduser32.NewProc("LoadCursorW")
+ procShowWindow = moduser32.NewProc("ShowWindow")
+ procUpdateWindow = moduser32.NewProc("UpdateWindow")
+ procCreateWindowEx = moduser32.NewProc("CreateWindowExW")
+ procAdjustWindowRect = moduser32.NewProc("AdjustWindowRect")
+ procAdjustWindowRectEx = moduser32.NewProc("AdjustWindowRectEx")
+ procDestroyWindow = moduser32.NewProc("DestroyWindow")
+ procDefWindowProc = moduser32.NewProc("DefWindowProcW")
+ procDefDlgProc = moduser32.NewProc("DefDlgProcW")
+ procPostQuitMessage = moduser32.NewProc("PostQuitMessage")
+ procGetMessage = moduser32.NewProc("GetMessageW")
+ procTranslateMessage = moduser32.NewProc("TranslateMessage")
+ procDispatchMessage = moduser32.NewProc("DispatchMessageW")
+ procSendMessage = moduser32.NewProc("SendMessageW")
+ procSendMessageTimeout = moduser32.NewProc("SendMessageTimeout")
+ procPostMessage = moduser32.NewProc("PostMessageW")
+ procWaitMessage = moduser32.NewProc("WaitMessage")
+ procSetWindowText = moduser32.NewProc("SetWindowTextW")
+ procGetWindowTextLength = moduser32.NewProc("GetWindowTextLengthW")
+ procGetWindowText = moduser32.NewProc("GetWindowTextW")
+ procGetWindowRect = moduser32.NewProc("GetWindowRect")
+ procMoveWindow = moduser32.NewProc("MoveWindow")
+ procScreenToClient = moduser32.NewProc("ScreenToClient")
+ procCallWindowProc = moduser32.NewProc("CallWindowProcW")
+ procSetWindowLong = moduser32.NewProc("SetWindowLongW")
+ procSetWindowLongPtr = moduser32.NewProc("SetWindowLongW")
+ procGetWindowLong = moduser32.NewProc("GetWindowLongW")
+ procGetWindowLongPtr = moduser32.NewProc("GetWindowLongW")
+ procEnableWindow = moduser32.NewProc("EnableWindow")
+ procIsWindowEnabled = moduser32.NewProc("IsWindowEnabled")
+ procIsWindowVisible = moduser32.NewProc("IsWindowVisible")
+ procSetFocus = moduser32.NewProc("SetFocus")
+ procInvalidateRect = moduser32.NewProc("InvalidateRect")
+ procGetClientRect = moduser32.NewProc("GetClientRect")
+ procGetDC = moduser32.NewProc("GetDC")
+ procReleaseDC = moduser32.NewProc("ReleaseDC")
+ procSetCapture = moduser32.NewProc("SetCapture")
+ procReleaseCapture = moduser32.NewProc("ReleaseCapture")
+ procGetWindowThreadProcessId = moduser32.NewProc("GetWindowThreadProcessId")
+ procMessageBox = moduser32.NewProc("MessageBoxW")
+ procGetSystemMetrics = moduser32.NewProc("GetSystemMetrics")
+ procCopyRect = moduser32.NewProc("CopyRect")
+ procEqualRect = moduser32.NewProc("EqualRect")
+ procInflateRect = moduser32.NewProc("InflateRect")
+ procIntersectRect = moduser32.NewProc("IntersectRect")
+ procIsRectEmpty = moduser32.NewProc("IsRectEmpty")
+ procOffsetRect = moduser32.NewProc("OffsetRect")
+ procPtInRect = moduser32.NewProc("PtInRect")
+ procSetRect = moduser32.NewProc("SetRect")
+ procSetRectEmpty = moduser32.NewProc("SetRectEmpty")
+ procSubtractRect = moduser32.NewProc("SubtractRect")
+ procUnionRect = moduser32.NewProc("UnionRect")
+ procCreateDialogParam = moduser32.NewProc("CreateDialogParamW")
+ procDialogBoxParam = moduser32.NewProc("DialogBoxParamW")
+ procGetDlgItem = moduser32.NewProc("GetDlgItem")
+ procDrawIcon = moduser32.NewProc("DrawIcon")
+ procClientToScreen = moduser32.NewProc("ClientToScreen")
+ procIsDialogMessage = moduser32.NewProc("IsDialogMessageW")
+ procIsWindow = moduser32.NewProc("IsWindow")
+ procEndDialog = moduser32.NewProc("EndDialog")
+ procPeekMessage = moduser32.NewProc("PeekMessageW")
+ procTranslateAccelerator = moduser32.NewProc("TranslateAcceleratorW")
+ procSetWindowPos = moduser32.NewProc("SetWindowPos")
+ procFillRect = moduser32.NewProc("FillRect")
+ procDrawText = moduser32.NewProc("DrawTextW")
+ procAddClipboardFormatListener = moduser32.NewProc("AddClipboardFormatListener")
+ procRemoveClipboardFormatListener = moduser32.NewProc("RemoveClipboardFormatListener")
+ procOpenClipboard = moduser32.NewProc("OpenClipboard")
+ procCloseClipboard = moduser32.NewProc("CloseClipboard")
+ procEnumClipboardFormats = moduser32.NewProc("EnumClipboardFormats")
+ procGetClipboardData = moduser32.NewProc("GetClipboardData")
+ procSetClipboardData = moduser32.NewProc("SetClipboardData")
+ procEmptyClipboard = moduser32.NewProc("EmptyClipboard")
+ procGetClipboardFormatName = moduser32.NewProc("GetClipboardFormatNameW")
+ procIsClipboardFormatAvailable = moduser32.NewProc("IsClipboardFormatAvailable")
+ procBeginPaint = moduser32.NewProc("BeginPaint")
+ procEndPaint = moduser32.NewProc("EndPaint")
+ procGetKeyboardState = moduser32.NewProc("GetKeyboardState")
+ procMapVirtualKey = moduser32.NewProc("MapVirtualKeyExW")
+ procGetAsyncKeyState = moduser32.NewProc("GetAsyncKeyState")
+ procToAscii = moduser32.NewProc("ToAscii")
+ procSwapMouseButton = moduser32.NewProc("SwapMouseButton")
+ procGetCursorPos = moduser32.NewProc("GetCursorPos")
+ procSetCursorPos = moduser32.NewProc("SetCursorPos")
+ procSetCursor = moduser32.NewProc("SetCursor")
+ procCreateIcon = moduser32.NewProc("CreateIcon")
+ procDestroyIcon = moduser32.NewProc("DestroyIcon")
+ procMonitorFromPoint = moduser32.NewProc("MonitorFromPoint")
+ procMonitorFromRect = moduser32.NewProc("MonitorFromRect")
+ procMonitorFromWindow = moduser32.NewProc("MonitorFromWindow")
+ procGetMonitorInfo = moduser32.NewProc("GetMonitorInfoW")
+ procEnumDisplayMonitors = moduser32.NewProc("EnumDisplayMonitors")
+ procEnumDisplaySettingsEx = moduser32.NewProc("EnumDisplaySettingsExW")
+ procChangeDisplaySettingsEx = moduser32.NewProc("ChangeDisplaySettingsExW")
+ procSendInput = moduser32.NewProc("SendInput")
+ procSetWindowsHookEx = moduser32.NewProc("SetWindowsHookExW")
+ procUnhookWindowsHookEx = moduser32.NewProc("UnhookWindowsHookEx")
+ procCallNextHookEx = moduser32.NewProc("CallNextHookEx")
+ procSetForegroundWindow = moduser32.NewProc("SetForegroundWindow")
+ procFindWindowW = moduser32.NewProc("FindWindowW")
+ procFindWindowExW = moduser32.NewProc("FindWindowExW")
+ procGetClassName = moduser32.NewProc("GetClassNameW")
+ procEnumChildWindows = moduser32.NewProc("EnumChildWindows")
+ procSetTimer = moduser32.NewProc("SetTimer")
+ procKillTimer = moduser32.NewProc("KillTimer")
+ procRedrawWindow = moduser32.NewProc("RedrawWindow")
+)
+
+func RegisterClassEx(wndClassEx *WNDCLASSEX) ATOM {
+ ret, _, _ := procRegisterClassEx.Call(uintptr(unsafe.Pointer(wndClassEx)))
+ return ATOM(ret)
+}
+
+func LoadIcon(instance HINSTANCE, iconName *uint16) HICON {
+ ret, _, _ := procLoadIcon.Call(
+ uintptr(instance),
+ uintptr(unsafe.Pointer(iconName)))
+
+ return HICON(ret)
+
+}
+
+func LoadCursor(instance HINSTANCE, cursorName *uint16) HCURSOR {
+ ret, _, _ := procLoadCursor.Call(
+ uintptr(instance),
+ uintptr(unsafe.Pointer(cursorName)))
+
+ return HCURSOR(ret)
+
+}
+
+func GetClassNameW(hwnd HWND) string {
+ buf := make([]uint16, 255)
+ procGetClassName.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(255))
+
+ return syscall.UTF16ToString(buf)
+}
+
+func SetForegroundWindow(hwnd HWND) bool {
+ ret, _, _ := procSetForegroundWindow.Call(
+ uintptr(hwnd))
+
+ return ret != 0
+}
+
+func ShowWindow(hwnd HWND, cmdshow int) bool {
+ ret, _, _ := procShowWindow.Call(
+ uintptr(hwnd),
+ uintptr(cmdshow))
+
+ return ret != 0
+
+}
+
+func UpdateWindow(hwnd HWND) bool {
+ ret, _, _ := procUpdateWindow.Call(
+ uintptr(hwnd))
+ return ret != 0
+}
+
+func CreateWindowEx(exStyle uint, className, windowName *uint16,
+ style uint, x, y, width, height int, parent HWND, menu HMENU,
+ instance HINSTANCE, param unsafe.Pointer) HWND {
+ ret, _, _ := procCreateWindowEx.Call(
+ uintptr(exStyle),
+ uintptr(unsafe.Pointer(className)),
+ uintptr(unsafe.Pointer(windowName)),
+ uintptr(style),
+ uintptr(x),
+ uintptr(y),
+ uintptr(width),
+ uintptr(height),
+ uintptr(parent),
+ uintptr(menu),
+ uintptr(instance),
+ uintptr(param))
+
+ return HWND(ret)
+}
+
+func FindWindowExW(hwndParent, hwndChildAfter HWND, className, windowName *uint16) HWND {
+ ret, _, _ := procFindWindowExW.Call(
+ uintptr(hwndParent),
+ uintptr(hwndChildAfter),
+ uintptr(unsafe.Pointer(className)),
+ uintptr(unsafe.Pointer(windowName)))
+
+ return HWND(ret)
+}
+
+func FindWindowW(className, windowName *uint16) HWND {
+ ret, _, _ := procFindWindowW.Call(
+ uintptr(unsafe.Pointer(className)),
+ uintptr(unsafe.Pointer(windowName)))
+
+ return HWND(ret)
+}
+
+func EnumChildWindows(hWndParent HWND, lpEnumFunc WNDENUMPROC, lParam LPARAM) bool {
+ ret, _, _ := procEnumChildWindows.Call(
+ uintptr(hWndParent),
+ uintptr(syscall.NewCallback(lpEnumFunc)),
+ uintptr(lParam),
+ )
+
+ return ret != 0
+}
+
+func AdjustWindowRectEx(rect *RECT, style uint, menu bool, exStyle uint) bool {
+ ret, _, _ := procAdjustWindowRectEx.Call(
+ uintptr(unsafe.Pointer(rect)),
+ uintptr(style),
+ uintptr(BoolToBOOL(menu)),
+ uintptr(exStyle))
+
+ return ret != 0
+}
+
+func AdjustWindowRect(rect *RECT, style uint, menu bool) bool {
+ ret, _, _ := procAdjustWindowRect.Call(
+ uintptr(unsafe.Pointer(rect)),
+ uintptr(style),
+ uintptr(BoolToBOOL(menu)))
+
+ return ret != 0
+}
+
+func DestroyWindow(hwnd HWND) bool {
+ ret, _, _ := procDestroyWindow.Call(
+ uintptr(hwnd))
+
+ return ret != 0
+}
+
+func DefWindowProc(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr {
+ ret, _, _ := procDefWindowProc.Call(
+ uintptr(hwnd),
+ uintptr(msg),
+ wParam,
+ lParam)
+
+ return ret
+}
+
+func DefDlgProc(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr {
+ ret, _, _ := procDefDlgProc.Call(
+ uintptr(hwnd),
+ uintptr(msg),
+ wParam,
+ lParam)
+
+ return ret
+}
+
+func PostQuitMessage(exitCode int) {
+ procPostQuitMessage.Call(
+ uintptr(exitCode))
+}
+
+func GetMessage(msg *MSG, hwnd HWND, msgFilterMin, msgFilterMax uint32) int {
+ ret, _, _ := procGetMessage.Call(
+ uintptr(unsafe.Pointer(msg)),
+ uintptr(hwnd),
+ uintptr(msgFilterMin),
+ uintptr(msgFilterMax))
+
+ return int(ret)
+}
+
+func TranslateMessage(msg *MSG) bool {
+ ret, _, _ := procTranslateMessage.Call(
+ uintptr(unsafe.Pointer(msg)))
+
+ return ret != 0
+
+}
+
+func DispatchMessage(msg *MSG) uintptr {
+ ret, _, _ := procDispatchMessage.Call(
+ uintptr(unsafe.Pointer(msg)))
+
+ return ret
+
+}
+
+func SendMessage(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr {
+ ret, _, _ := procSendMessage.Call(
+ uintptr(hwnd),
+ uintptr(msg),
+ wParam,
+ lParam)
+
+ return ret
+}
+
+func SendMessageTimeout(hwnd HWND, msg uint32, wParam, lParam uintptr, fuFlags, uTimeout uint32) uintptr {
+ ret, _, _ := procSendMessageTimeout.Call(
+ uintptr(hwnd),
+ uintptr(msg),
+ wParam,
+ lParam,
+ uintptr(fuFlags),
+ uintptr(uTimeout))
+
+ return ret
+}
+
+func PostMessage(hwnd HWND, msg uint32, wParam, lParam uintptr) bool {
+ ret, _, _ := procPostMessage.Call(
+ uintptr(hwnd),
+ uintptr(msg),
+ wParam,
+ lParam)
+
+ return ret != 0
+}
+
+func WaitMessage() bool {
+ ret, _, _ := procWaitMessage.Call()
+ return ret != 0
+}
+
+func SetWindowText(hwnd HWND, text string) {
+ procSetWindowText.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))))
+}
+
+func GetWindowTextLength(hwnd HWND) int {
+ ret, _, _ := procGetWindowTextLength.Call(
+ uintptr(hwnd))
+
+ return int(ret)
+}
+
+func GetWindowText(hwnd HWND) string {
+ textLen := GetWindowTextLength(hwnd) + 1
+
+ buf := make([]uint16, textLen)
+ procGetWindowText.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(textLen))
+
+ return syscall.UTF16ToString(buf)
+}
+
+func GetWindowRect(hwnd HWND) *RECT {
+ var rect RECT
+ procGetWindowRect.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(&rect)))
+
+ return &rect
+}
+
+func MoveWindow(hwnd HWND, x, y, width, height int, repaint bool) bool {
+ ret, _, _ := procMoveWindow.Call(
+ uintptr(hwnd),
+ uintptr(x),
+ uintptr(y),
+ uintptr(width),
+ uintptr(height),
+ uintptr(BoolToBOOL(repaint)))
+
+ return ret != 0
+
+}
+
+func ScreenToClient(hwnd HWND, x, y int) (X, Y int, ok bool) {
+ pt := POINT{X: int32(x), Y: int32(y)}
+ ret, _, _ := procScreenToClient.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(&pt)))
+
+ return int(pt.X), int(pt.Y), ret != 0
+}
+
+func CallWindowProc(preWndProc uintptr, hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr {
+ ret, _, _ := procCallWindowProc.Call(
+ preWndProc,
+ uintptr(hwnd),
+ uintptr(msg),
+ wParam,
+ lParam)
+
+ return ret
+}
+
+func SetWindowLong(hwnd HWND, index int, value uint32) uint32 {
+ ret, _, _ := procSetWindowLong.Call(
+ uintptr(hwnd),
+ uintptr(index),
+ uintptr(value))
+
+ return uint32(ret)
+}
+
+func SetWindowLongPtr(hwnd HWND, index int, value uintptr) uintptr {
+ ret, _, _ := procSetWindowLongPtr.Call(
+ uintptr(hwnd),
+ uintptr(index),
+ value)
+
+ return ret
+}
+
+func GetWindowLong(hwnd HWND, index int) int32 {
+ ret, _, _ := procGetWindowLong.Call(
+ uintptr(hwnd),
+ uintptr(index))
+
+ return int32(ret)
+}
+
+func GetWindowLongPtr(hwnd HWND, index int) uintptr {
+ ret, _, _ := procGetWindowLongPtr.Call(
+ uintptr(hwnd),
+ uintptr(index))
+
+ return ret
+}
+
+func EnableWindow(hwnd HWND, b bool) bool {
+ ret, _, _ := procEnableWindow.Call(
+ uintptr(hwnd),
+ uintptr(BoolToBOOL(b)))
+ return ret != 0
+}
+
+func IsWindowEnabled(hwnd HWND) bool {
+ ret, _, _ := procIsWindowEnabled.Call(
+ uintptr(hwnd))
+
+ return ret != 0
+}
+
+func IsWindowVisible(hwnd HWND) bool {
+ ret, _, _ := procIsWindowVisible.Call(
+ uintptr(hwnd))
+
+ return ret != 0
+}
+
+func SetFocus(hwnd HWND) HWND {
+ ret, _, _ := procSetFocus.Call(
+ uintptr(hwnd))
+
+ return HWND(ret)
+}
+
+func InvalidateRect(hwnd HWND, rect *RECT, erase bool) bool {
+ ret, _, _ := procInvalidateRect.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(rect)),
+ uintptr(BoolToBOOL(erase)))
+
+ return ret != 0
+}
+
+func GetClientRect(hwnd HWND) *RECT {
+ var rect RECT
+ ret, _, _ := procGetClientRect.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(&rect)))
+
+ if ret == 0 {
+ panic(fmt.Sprintf("GetClientRect(%d) failed", hwnd))
+ }
+
+ return &rect
+}
+
+func GetDC(hwnd HWND) HDC {
+ ret, _, _ := procGetDC.Call(
+ uintptr(hwnd))
+
+ return HDC(ret)
+}
+
+func ReleaseDC(hwnd HWND, hDC HDC) bool {
+ ret, _, _ := procReleaseDC.Call(
+ uintptr(hwnd),
+ uintptr(hDC))
+
+ return ret != 0
+}
+
+func SetCapture(hwnd HWND) HWND {
+ ret, _, _ := procSetCapture.Call(
+ uintptr(hwnd))
+
+ return HWND(ret)
+}
+
+func ReleaseCapture() bool {
+ ret, _, _ := procReleaseCapture.Call()
+
+ return ret != 0
+}
+
+func GetWindowThreadProcessId(hwnd HWND) (HANDLE, int) {
+ var processId int
+ ret, _, _ := procGetWindowThreadProcessId.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(&processId)))
+
+ return HANDLE(ret), processId
+}
+
+func MessageBox(hwnd HWND, title, caption string, flags uint) int {
+ ret, _, _ := procMessageBox.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))),
+ uintptr(flags))
+
+ return int(ret)
+}
+
+func GetSystemMetrics(index int) int {
+ ret, _, _ := procGetSystemMetrics.Call(
+ uintptr(index))
+
+ return int(ret)
+}
+
+func CopyRect(dst, src *RECT) bool {
+ ret, _, _ := procCopyRect.Call(
+ uintptr(unsafe.Pointer(dst)),
+ uintptr(unsafe.Pointer(src)))
+
+ return ret != 0
+}
+
+func EqualRect(rect1, rect2 *RECT) bool {
+ ret, _, _ := procEqualRect.Call(
+ uintptr(unsafe.Pointer(rect1)),
+ uintptr(unsafe.Pointer(rect2)))
+
+ return ret != 0
+}
+
+func InflateRect(rect *RECT, dx, dy int) bool {
+ ret, _, _ := procInflateRect.Call(
+ uintptr(unsafe.Pointer(rect)),
+ uintptr(dx),
+ uintptr(dy))
+
+ return ret != 0
+}
+
+func IntersectRect(dst, src1, src2 *RECT) bool {
+ ret, _, _ := procIntersectRect.Call(
+ uintptr(unsafe.Pointer(dst)),
+ uintptr(unsafe.Pointer(src1)),
+ uintptr(unsafe.Pointer(src2)))
+
+ return ret != 0
+}
+
+func IsRectEmpty(rect *RECT) bool {
+ ret, _, _ := procIsRectEmpty.Call(
+ uintptr(unsafe.Pointer(rect)))
+
+ return ret != 0
+}
+
+func OffsetRect(rect *RECT, dx, dy int) bool {
+ ret, _, _ := procOffsetRect.Call(
+ uintptr(unsafe.Pointer(rect)),
+ uintptr(dx),
+ uintptr(dy))
+
+ return ret != 0
+}
+
+func PtInRect(rect *RECT, x, y int) bool {
+ pt := POINT{X: int32(x), Y: int32(y)}
+ ret, _, _ := procPtInRect.Call(
+ uintptr(unsafe.Pointer(rect)),
+ uintptr(unsafe.Pointer(&pt)))
+
+ return ret != 0
+}
+
+func SetRect(rect *RECT, left, top, right, bottom int) bool {
+ ret, _, _ := procSetRect.Call(
+ uintptr(unsafe.Pointer(rect)),
+ uintptr(left),
+ uintptr(top),
+ uintptr(right),
+ uintptr(bottom))
+
+ return ret != 0
+}
+
+func SetRectEmpty(rect *RECT) bool {
+ ret, _, _ := procSetRectEmpty.Call(
+ uintptr(unsafe.Pointer(rect)))
+
+ return ret != 0
+}
+
+func SubtractRect(dst, src1, src2 *RECT) bool {
+ ret, _, _ := procSubtractRect.Call(
+ uintptr(unsafe.Pointer(dst)),
+ uintptr(unsafe.Pointer(src1)),
+ uintptr(unsafe.Pointer(src2)))
+
+ return ret != 0
+}
+
+func UnionRect(dst, src1, src2 *RECT) bool {
+ ret, _, _ := procUnionRect.Call(
+ uintptr(unsafe.Pointer(dst)),
+ uintptr(unsafe.Pointer(src1)),
+ uintptr(unsafe.Pointer(src2)))
+
+ return ret != 0
+}
+
+func CreateDialog(hInstance HINSTANCE, lpTemplate *uint16, hWndParent HWND, lpDialogProc uintptr) HWND {
+ ret, _, _ := procCreateDialogParam.Call(
+ uintptr(hInstance),
+ uintptr(unsafe.Pointer(lpTemplate)),
+ uintptr(hWndParent),
+ lpDialogProc,
+ 0)
+
+ return HWND(ret)
+}
+
+func DialogBox(hInstance HINSTANCE, lpTemplateName *uint16, hWndParent HWND, lpDialogProc uintptr) int {
+ ret, _, _ := procDialogBoxParam.Call(
+ uintptr(hInstance),
+ uintptr(unsafe.Pointer(lpTemplateName)),
+ uintptr(hWndParent),
+ lpDialogProc,
+ 0)
+
+ return int(ret)
+}
+
+func GetDlgItem(hDlg HWND, nIDDlgItem int) HWND {
+ ret, _, _ := procGetDlgItem.Call(
+ uintptr(unsafe.Pointer(hDlg)),
+ uintptr(nIDDlgItem))
+
+ return HWND(ret)
+}
+
+func DrawIcon(hDC HDC, x, y int, hIcon HICON) bool {
+ ret, _, _ := procDrawIcon.Call(
+ uintptr(unsafe.Pointer(hDC)),
+ uintptr(x),
+ uintptr(y),
+ uintptr(unsafe.Pointer(hIcon)))
+
+ return ret != 0
+}
+
+func ClientToScreen(hwnd HWND, x, y int) (int, int) {
+ pt := POINT{X: int32(x), Y: int32(y)}
+
+ procClientToScreen.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(&pt)))
+
+ return int(pt.X), int(pt.Y)
+}
+
+func IsDialogMessage(hwnd HWND, msg *MSG) bool {
+ ret, _, _ := procIsDialogMessage.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(msg)))
+
+ return ret != 0
+}
+
+func IsWindow(hwnd HWND) bool {
+ ret, _, _ := procIsWindow.Call(
+ uintptr(hwnd))
+
+ return ret != 0
+}
+
+func EndDialog(hwnd HWND, nResult uintptr) bool {
+ ret, _, _ := procEndDialog.Call(
+ uintptr(hwnd),
+ nResult)
+
+ return ret != 0
+}
+
+func PeekMessage(lpMsg *MSG, hwnd HWND, wMsgFilterMin, wMsgFilterMax, wRemoveMsg uint32) bool {
+ ret, _, _ := procPeekMessage.Call(
+ uintptr(unsafe.Pointer(lpMsg)),
+ uintptr(hwnd),
+ uintptr(wMsgFilterMin),
+ uintptr(wMsgFilterMax),
+ uintptr(wRemoveMsg))
+
+ return ret != 0
+}
+
+func TranslateAccelerator(hwnd HWND, hAccTable HACCEL, lpMsg *MSG) bool {
+ ret, _, _ := procTranslateAccelerator.Call(
+ uintptr(hwnd),
+ uintptr(hAccTable),
+ uintptr(unsafe.Pointer(lpMsg)))
+
+ return ret != 0
+}
+
+func SetWindowPos(hwnd, hWndInsertAfter HWND, x, y, cx, cy int, uFlags uint) bool {
+ ret, _, _ := procSetWindowPos.Call(
+ uintptr(hwnd),
+ uintptr(hWndInsertAfter),
+ uintptr(x),
+ uintptr(y),
+ uintptr(cx),
+ uintptr(cy),
+ uintptr(uFlags))
+
+ return ret != 0
+}
+
+func FillRect(hDC HDC, lprc *RECT, hbr HBRUSH) bool {
+ ret, _, _ := procFillRect.Call(
+ uintptr(hDC),
+ uintptr(unsafe.Pointer(lprc)),
+ uintptr(hbr))
+
+ return ret != 0
+}
+
+func DrawText(hDC HDC, text string, uCount int, lpRect *RECT, uFormat uint) int {
+ ret, _, _ := procDrawText.Call(
+ uintptr(hDC),
+ uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))),
+ uintptr(uCount),
+ uintptr(unsafe.Pointer(lpRect)),
+ uintptr(uFormat))
+
+ return int(ret)
+}
+
+func AddClipboardFormatListener(hwnd HWND) bool {
+ ret, _, _ := procAddClipboardFormatListener.Call(
+ uintptr(hwnd))
+ return ret != 0
+}
+
+func RemoveClipboardFormatListener(hwnd HWND) bool {
+ ret, _, _ := procRemoveClipboardFormatListener.Call(
+ uintptr(hwnd))
+ return ret != 0
+}
+
+func OpenClipboard(hWndNewOwner HWND) bool {
+ ret, _, _ := procOpenClipboard.Call(
+ uintptr(hWndNewOwner))
+ return ret != 0
+}
+
+func CloseClipboard() bool {
+ ret, _, _ := procCloseClipboard.Call()
+ return ret != 0
+}
+
+func EnumClipboardFormats(format uint) uint {
+ ret, _, _ := procEnumClipboardFormats.Call(
+ uintptr(format))
+ return uint(ret)
+}
+
+func GetClipboardData(uFormat uint) HANDLE {
+ ret, _, _ := procGetClipboardData.Call(
+ uintptr(uFormat))
+ return HANDLE(ret)
+}
+
+func SetClipboardData(uFormat uint, hMem HANDLE) HANDLE {
+ ret, _, _ := procSetClipboardData.Call(
+ uintptr(uFormat),
+ uintptr(hMem))
+ return HANDLE(ret)
+}
+
+func EmptyClipboard() bool {
+ ret, _, _ := procEmptyClipboard.Call()
+ return ret != 0
+}
+
+func GetClipboardFormatName(format uint) (string, bool) {
+ cchMaxCount := 255
+ buf := make([]uint16, cchMaxCount)
+ ret, _, _ := procGetClipboardFormatName.Call(
+ uintptr(format),
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(cchMaxCount))
+
+ if ret > 0 {
+ return syscall.UTF16ToString(buf), true
+ }
+
+ return "Requested format does not exist or is predefined", false
+}
+
+func IsClipboardFormatAvailable(format uint) bool {
+ ret, _, _ := procIsClipboardFormatAvailable.Call(uintptr(format))
+ return ret != 0
+}
+
+func BeginPaint(hwnd HWND, paint *PAINTSTRUCT) HDC {
+ ret, _, _ := procBeginPaint.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(paint)))
+ return HDC(ret)
+}
+
+func EndPaint(hwnd HWND, paint *PAINTSTRUCT) {
+ procEndPaint.Call(
+ uintptr(hwnd),
+ uintptr(unsafe.Pointer(paint)))
+}
+
+func GetKeyboardState(lpKeyState *[]byte) bool {
+ ret, _, _ := procGetKeyboardState.Call(
+ uintptr(unsafe.Pointer(&(*lpKeyState)[0])))
+ return ret != 0
+}
+
+func MapVirtualKeyEx(uCode, uMapType uint, dwhkl HKL) uint {
+ ret, _, _ := procMapVirtualKey.Call(
+ uintptr(uCode),
+ uintptr(uMapType),
+ uintptr(dwhkl))
+ return uint(ret)
+}
+
+func GetAsyncKeyState(vKey int) uint16 {
+ ret, _, _ := procGetAsyncKeyState.Call(uintptr(vKey))
+ return uint16(ret)
+}
+
+func ToAscii(uVirtKey, uScanCode uint, lpKeyState *byte, lpChar *uint16, uFlags uint) int {
+ ret, _, _ := procToAscii.Call(
+ uintptr(uVirtKey),
+ uintptr(uScanCode),
+ uintptr(unsafe.Pointer(lpKeyState)),
+ uintptr(unsafe.Pointer(lpChar)),
+ uintptr(uFlags))
+ return int(ret)
+}
+
+func SwapMouseButton(fSwap bool) bool {
+ ret, _, _ := procSwapMouseButton.Call(
+ uintptr(BoolToBOOL(fSwap)))
+ return ret != 0
+}
+
+func GetCursorPos() (x, y int, ok bool) {
+ pt := POINT{}
+ ret, _, _ := procGetCursorPos.Call(uintptr(unsafe.Pointer(&pt)))
+ return int(pt.X), int(pt.Y), ret != 0
+}
+
+func SetCursorPos(x, y int) bool {
+ ret, _, _ := procSetCursorPos.Call(
+ uintptr(x),
+ uintptr(y),
+ )
+ return ret != 0
+}
+
+func SetCursor(cursor HCURSOR) HCURSOR {
+ ret, _, _ := procSetCursor.Call(
+ uintptr(cursor),
+ )
+ return HCURSOR(ret)
+}
+
+func CreateIcon(instance HINSTANCE, nWidth, nHeight int, cPlanes, cBitsPerPixel byte, ANDbits, XORbits *byte) HICON {
+ ret, _, _ := procCreateIcon.Call(
+ uintptr(instance),
+ uintptr(nWidth),
+ uintptr(nHeight),
+ uintptr(cPlanes),
+ uintptr(cBitsPerPixel),
+ uintptr(unsafe.Pointer(ANDbits)),
+ uintptr(unsafe.Pointer(XORbits)),
+ )
+ return HICON(ret)
+}
+
+func DestroyIcon(icon HICON) bool {
+ ret, _, _ := procDestroyIcon.Call(
+ uintptr(icon),
+ )
+ return ret != 0
+}
+
+func MonitorFromPoint(x, y int, dwFlags uint32) HMONITOR {
+ ret, _, _ := procMonitorFromPoint.Call(
+ uintptr(x),
+ uintptr(y),
+ uintptr(dwFlags),
+ )
+ return HMONITOR(ret)
+}
+
+func MonitorFromRect(rc *RECT, dwFlags uint32) HMONITOR {
+ ret, _, _ := procMonitorFromRect.Call(
+ uintptr(unsafe.Pointer(rc)),
+ uintptr(dwFlags),
+ )
+ return HMONITOR(ret)
+}
+
+func MonitorFromWindow(hwnd HWND, dwFlags uint32) HMONITOR {
+ ret, _, _ := procMonitorFromWindow.Call(
+ uintptr(hwnd),
+ uintptr(dwFlags),
+ )
+ return HMONITOR(ret)
+}
+
+func GetMonitorInfo(hMonitor HMONITOR, lmpi *MONITORINFO) bool {
+ ret, _, _ := procGetMonitorInfo.Call(
+ uintptr(hMonitor),
+ uintptr(unsafe.Pointer(lmpi)),
+ )
+ return ret != 0
+}
+
+func EnumDisplayMonitors(hdc HDC, clip *RECT, fnEnum, dwData uintptr) bool {
+ ret, _, _ := procEnumDisplayMonitors.Call(
+ uintptr(hdc),
+ uintptr(unsafe.Pointer(clip)),
+ fnEnum,
+ dwData,
+ )
+ return ret != 0
+}
+
+func EnumDisplaySettingsEx(szDeviceName *uint16, iModeNum uint32, devMode *DEVMODE, dwFlags uint32) bool {
+ ret, _, _ := procEnumDisplaySettingsEx.Call(
+ uintptr(unsafe.Pointer(szDeviceName)),
+ uintptr(iModeNum),
+ uintptr(unsafe.Pointer(devMode)),
+ uintptr(dwFlags),
+ )
+ return ret != 0
+}
+
+func ChangeDisplaySettingsEx(szDeviceName *uint16, devMode *DEVMODE, hwnd HWND, dwFlags uint32, lParam uintptr) int32 {
+ ret, _, _ := procChangeDisplaySettingsEx.Call(
+ uintptr(unsafe.Pointer(szDeviceName)),
+ uintptr(unsafe.Pointer(devMode)),
+ uintptr(hwnd),
+ uintptr(dwFlags),
+ lParam,
+ )
+ return int32(ret)
+}
+
+func SetWindowsHookEx(idHook int, lpfn HOOKPROC, hMod HINSTANCE, dwThreadId DWORD) HHOOK {
+ ret, _, _ := procSetWindowsHookEx.Call(
+ uintptr(idHook),
+ uintptr(syscall.NewCallback(lpfn)),
+ uintptr(hMod),
+ uintptr(dwThreadId),
+ )
+ return HHOOK(ret)
+}
+
+func UnhookWindowsHookEx(hhk HHOOK) bool {
+ ret, _, _ := procUnhookWindowsHookEx.Call(
+ uintptr(hhk),
+ )
+ return ret != 0
+}
+
+func CallNextHookEx(hhk HHOOK, nCode int, wParam WPARAM, lParam LPARAM) LRESULT {
+ ret, _, _ := procCallNextHookEx.Call(
+ uintptr(hhk),
+ uintptr(nCode),
+ uintptr(wParam),
+ uintptr(lParam),
+ )
+ return LRESULT(ret)
+}
+
+func SetTimer(hwnd HWND, nIDEvent uint32, uElapse uint32, lpTimerProc uintptr) uintptr {
+ ret, _, _ := procSetTimer.Call(
+ uintptr(hwnd),
+ uintptr(nIDEvent),
+ uintptr(uElapse),
+ lpTimerProc,
+ )
+ return ret
+}
+
+func KillTimer(hwnd HWND, nIDEvent uint32) bool {
+ ret, _, _ := procKillTimer.Call(
+ uintptr(hwnd),
+ uintptr(nIDEvent),
+ )
+ return ret != 0
+}
+
+// it will panic when the function fails
+func RedrawWindow(hWnd HWND, lpRect *RECT, hrgnUpdate HRGN, flag uint32) {
+ ret, _, _ := procRedrawWindow.Call(
+ uintptr(hWnd),
+ uintptr(unsafe.Pointer(lpRect)),
+ uintptr(hrgnUpdate),
+ flag,
+ )
+ if ret!=0{
+ panic("RedrawWindow fail")
+ }
+ return
+} \ No newline at end of file
diff --git a/vendor/github.com/AllenDang/w32/utils.go b/vendor/github.com/AllenDang/w32/utils.go
new file mode 100644
index 0000000..4fb5b6c
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/utils.go
@@ -0,0 +1,201 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+import (
+ "syscall"
+ "unicode/utf16"
+ "unsafe"
+)
+
+func MakeIntResource(id uint16) *uint16 {
+ return (*uint16)(unsafe.Pointer(uintptr(id)))
+}
+
+func LOWORD(dw uint32) uint16 {
+ return uint16(dw)
+}
+
+func HIWORD(dw uint32) uint16 {
+ return uint16(dw >> 16 & 0xffff)
+}
+
+func BoolToBOOL(value bool) BOOL {
+ if value {
+ return 1
+ }
+
+ return 0
+}
+
+func UTF16PtrToString(cstr *uint16) string {
+ if cstr != nil {
+ us := make([]uint16, 0, 256)
+ for p := uintptr(unsafe.Pointer(cstr)); ; p += 2 {
+ u := *(*uint16)(unsafe.Pointer(p))
+ if u == 0 {
+ return string(utf16.Decode(us))
+ }
+ us = append(us, u)
+ }
+ }
+
+ return ""
+}
+
+func ComAddRef(unknown *IUnknown) int32 {
+ ret, _, _ := syscall.Syscall(unknown.lpVtbl.pAddRef, 1,
+ uintptr(unsafe.Pointer(unknown)),
+ 0,
+ 0)
+ return int32(ret)
+}
+
+func ComRelease(unknown *IUnknown) int32 {
+ ret, _, _ := syscall.Syscall(unknown.lpVtbl.pRelease, 1,
+ uintptr(unsafe.Pointer(unknown)),
+ 0,
+ 0)
+ return int32(ret)
+}
+
+func ComQueryInterface(unknown *IUnknown, id *GUID) *IDispatch {
+ var disp *IDispatch
+ hr, _, _ := syscall.Syscall(unknown.lpVtbl.pQueryInterface, 3,
+ uintptr(unsafe.Pointer(unknown)),
+ uintptr(unsafe.Pointer(id)),
+ uintptr(unsafe.Pointer(&disp)))
+ if hr != 0 {
+ panic("Invoke QieryInterface error.")
+ }
+ return disp
+}
+
+func ComGetIDsOfName(disp *IDispatch, names []string) []int32 {
+ wnames := make([]*uint16, len(names))
+ dispid := make([]int32, len(names))
+ for i := 0; i < len(names); i++ {
+ wnames[i] = syscall.StringToUTF16Ptr(names[i])
+ }
+ hr, _, _ := syscall.Syscall6(disp.lpVtbl.pGetIDsOfNames, 6,
+ uintptr(unsafe.Pointer(disp)),
+ uintptr(unsafe.Pointer(IID_NULL)),
+ uintptr(unsafe.Pointer(&wnames[0])),
+ uintptr(len(names)),
+ uintptr(GetUserDefaultLCID()),
+ uintptr(unsafe.Pointer(&dispid[0])))
+ if hr != 0 {
+ panic("Invoke GetIDsOfName error.")
+ }
+ return dispid
+}
+
+func ComInvoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT) {
+ var dispparams DISPPARAMS
+
+ if dispatch&DISPATCH_PROPERTYPUT != 0 {
+ dispnames := [1]int32{DISPID_PROPERTYPUT}
+ dispparams.RgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0]))
+ dispparams.CNamedArgs = 1
+ }
+ var vargs []VARIANT
+ if len(params) > 0 {
+ vargs = make([]VARIANT, len(params))
+ for i, v := range params {
+ //n := len(params)-i-1
+ n := len(params) - i - 1
+ VariantInit(&vargs[n])
+ switch v.(type) {
+ case bool:
+ if v.(bool) {
+ vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0xffff}
+ } else {
+ vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0}
+ }
+ case *bool:
+ vargs[n] = VARIANT{VT_BOOL | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*bool))))}
+ case byte:
+ vargs[n] = VARIANT{VT_I1, 0, 0, 0, int64(v.(byte))}
+ case *byte:
+ vargs[n] = VARIANT{VT_I1 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*byte))))}
+ case int16:
+ vargs[n] = VARIANT{VT_I2, 0, 0, 0, int64(v.(int16))}
+ case *int16:
+ vargs[n] = VARIANT{VT_I2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int16))))}
+ case uint16:
+ vargs[n] = VARIANT{VT_UI2, 0, 0, 0, int64(v.(int16))}
+ case *uint16:
+ vargs[n] = VARIANT{VT_UI2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint16))))}
+ case int, int32:
+ vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(int))}
+ case *int, *int32:
+ vargs[n] = VARIANT{VT_I4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int))))}
+ case uint, uint32:
+ vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(uint))}
+ case *uint, *uint32:
+ vargs[n] = VARIANT{VT_UI4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint))))}
+ case int64:
+ vargs[n] = VARIANT{VT_I8, 0, 0, 0, v.(int64)}
+ case *int64:
+ vargs[n] = VARIANT{VT_I8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int64))))}
+ case uint64:
+ vargs[n] = VARIANT{VT_UI8, 0, 0, 0, int64(v.(uint64))}
+ case *uint64:
+ vargs[n] = VARIANT{VT_UI8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint64))))}
+ case float32:
+ vargs[n] = VARIANT{VT_R4, 0, 0, 0, int64(v.(float32))}
+ case *float32:
+ vargs[n] = VARIANT{VT_R4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float32))))}
+ case float64:
+ vargs[n] = VARIANT{VT_R8, 0, 0, 0, int64(v.(float64))}
+ case *float64:
+ vargs[n] = VARIANT{VT_R8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float64))))}
+ case string:
+ vargs[n] = VARIANT{VT_BSTR, 0, 0, 0, int64(uintptr(unsafe.Pointer(SysAllocString(v.(string)))))}
+ case *string:
+ vargs[n] = VARIANT{VT_BSTR | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*string))))}
+ case *IDispatch:
+ vargs[n] = VARIANT{VT_DISPATCH, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*IDispatch))))}
+ case **IDispatch:
+ vargs[n] = VARIANT{VT_DISPATCH | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(**IDispatch))))}
+ case nil:
+ vargs[n] = VARIANT{VT_NULL, 0, 0, 0, 0}
+ case *VARIANT:
+ vargs[n] = VARIANT{VT_VARIANT | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*VARIANT))))}
+ default:
+ panic("unknown type")
+ }
+ }
+ dispparams.Rgvarg = uintptr(unsafe.Pointer(&vargs[0]))
+ dispparams.CArgs = uint32(len(params))
+ }
+
+ var ret VARIANT
+ var excepInfo EXCEPINFO
+ VariantInit(&ret)
+ hr, _, _ := syscall.Syscall9(disp.lpVtbl.pInvoke, 8,
+ uintptr(unsafe.Pointer(disp)),
+ uintptr(dispid),
+ uintptr(unsafe.Pointer(IID_NULL)),
+ uintptr(GetUserDefaultLCID()),
+ uintptr(dispatch),
+ uintptr(unsafe.Pointer(&dispparams)),
+ uintptr(unsafe.Pointer(&ret)),
+ uintptr(unsafe.Pointer(&excepInfo)),
+ 0)
+ if hr != 0 {
+ if excepInfo.BstrDescription != nil {
+ bs := UTF16PtrToString(excepInfo.BstrDescription)
+ panic(bs)
+ }
+ }
+ for _, varg := range vargs {
+ if varg.VT == VT_BSTR && varg.Val != 0 {
+ SysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val)))))
+ }
+ }
+ result = &ret
+ return
+}
diff --git a/vendor/github.com/AllenDang/w32/vars.go b/vendor/github.com/AllenDang/w32/vars.go
new file mode 100644
index 0000000..2dab2e3
--- /dev/null
+++ b/vendor/github.com/AllenDang/w32/vars.go
@@ -0,0 +1,13 @@
+// Copyright 2010-2012 The W32 Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package w32
+
+var (
+ IID_NULL = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
+ IID_IUnknown = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
+ IID_IDispatch = &GUID{0x00020400, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
+ IID_IConnectionPointContainer = &GUID{0xB196B284, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}}
+ IID_IConnectionPoint = &GUID{0xB196B286, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}}
+)
diff --git a/vendor/github.com/ProtonMail/go-autostart/LICENSE b/vendor/github.com/ProtonMail/go-autostart/LICENSE
new file mode 100644
index 0000000..f9e1447
--- /dev/null
+++ b/vendor/github.com/ProtonMail/go-autostart/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 ProtonMail
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/ProtonMail/go-autostart/README.md b/vendor/github.com/ProtonMail/go-autostart/README.md
new file mode 100644
index 0000000..580862f
--- /dev/null
+++ b/vendor/github.com/ProtonMail/go-autostart/README.md
@@ -0,0 +1,51 @@
+# go-autostart
+
+[![GoDoc](https://godoc.org/github.com/ProtonMail/go-autostart?status.svg)](https://godoc.org/github.com/ProtonMail/go-autostart)
+
+A Go library to run a command after login.
+
+## Usage
+
+```go
+package main
+
+import (
+ "log"
+ "github.com/ProtonMail/go-autostart"
+)
+
+func main() {
+ app := &autostart.App{
+ Name: "test",
+ DisplayName: "Just a Test App",
+ Exec: []string{"bash", "-c", "echo autostart >> ~/autostart.txt"},
+ }
+
+ if app.IsEnabled() {
+ log.Println("App is already enabled, removing it...")
+
+ if err := app.Disable(); err != nil {
+ log.Fatal(err)
+ }
+ } else {
+ log.Println("Enabling app...")
+
+ if err := app.Enable(); err != nil {
+ log.Fatal(err)
+ }
+ }
+
+ log.Println("Done!")
+}
+```
+
+## Behavior
+
+* On Linux and BSD, it creates a `.desktop` file in `$XDG_CONFIG_HOME/autostart`
+ (i.e. `$HOME/.config/autostart`). See http://askubuntu.com/questions/48321/how-do-i-start-applications-automatically-on-login
+* On macOS, it creates a `launchd` job. See http://blog.gordn.org/2015/03/implementing-run-on-login-for-your-node.html
+* On Windows, it creates a link to the program in `%USERPROFILE%\Start Menu\Programs\Startup`
+
+## License
+
+MIT
diff --git a/vendor/github.com/ProtonMail/go-autostart/autostart.go b/vendor/github.com/ProtonMail/go-autostart/autostart.go
new file mode 100644
index 0000000..7b7d6de
--- /dev/null
+++ b/vendor/github.com/ProtonMail/go-autostart/autostart.go
@@ -0,0 +1,13 @@
+package autostart
+
+// An application that will be started when the user logs in.
+type App struct {
+ // Unique identifier for the app.
+ Name string
+ // The command to execute, followed by its arguments.
+ Exec []string
+ // The app name.
+ DisplayName string
+ // The app icon.
+ Icon string
+}
diff --git a/vendor/github.com/ProtonMail/go-autostart/autostart_darwin.go b/vendor/github.com/ProtonMail/go-autostart/autostart_darwin.go
new file mode 100644
index 0000000..b2e0518
--- /dev/null
+++ b/vendor/github.com/ProtonMail/go-autostart/autostart_darwin.go
@@ -0,0 +1,66 @@
+package autostart
+
+import (
+ "os"
+ "path/filepath"
+ "text/template"
+)
+
+const jobTemplate = `<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>Label</key>
+ <string>{{.Name}}</string>
+ <key>ProgramArguments</key>
+ <array>
+ {{range .Exec -}}
+ <string>{{.}}</string>
+ {{end}}
+ </array>
+ <key>RunAtLoad</key>
+ <true/>
+ </dict>
+</plist>`
+
+var launchDir string
+
+func init() {
+ launchDir = filepath.Join(os.Getenv("HOME"), "Library", "LaunchAgents")
+}
+
+func (a *App) path() string {
+ return filepath.Join(launchDir, a.Name+".plist")
+}
+
+// IsEnabled Check is app enabled startup.
+func (a *App) IsEnabled() bool {
+ _, err := os.Stat(a.path())
+ return err == nil
+}
+
+// Enable this app on startup.
+func (a *App) Enable() error {
+ t := template.Must(template.New("job").Parse(jobTemplate))
+
+ if err := os.MkdirAll(launchDir, 0777); err != nil {
+ return err
+ }
+ f, err := os.Create(a.path())
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ if err := t.Execute(f, a); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// Disable this app on startup.
+func (a *App) Disable() error {
+
+ return os.Remove(a.path())
+}
diff --git a/vendor/github.com/ProtonMail/go-autostart/autostart_windows.c b/vendor/github.com/ProtonMail/go-autostart/autostart_windows.c
new file mode 100644
index 0000000..a61618c
--- /dev/null
+++ b/vendor/github.com/ProtonMail/go-autostart/autostart_windows.c
@@ -0,0 +1,51 @@
+#include <windows.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <objbase.h>
+#include <shlobj.h>
+
+uint64_t CreateShortcut(char *shortcutA, char *path, char *args) {
+ IShellLink* pISL;
+ IPersistFile* pIPF;
+ HRESULT hr;
+
+ CoInitializeEx(NULL, COINIT_MULTITHREADED);
+
+ // Shortcut filename: convert ANSI to unicode
+ WORD shortcutW[MAX_PATH];
+ int nChar = MultiByteToWideChar(CP_ACP, 0, shortcutA, -1, shortcutW, MAX_PATH);
+
+ hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (LPVOID*)&pISL);
+ if (!SUCCEEDED(hr)) {
+ return hr+0x01000000;
+ }
+
+ // See https://msdn.microsoft.com/en-us/library/windows/desktop/bb774950(v=vs.85).aspx
+ hr = pISL->lpVtbl->SetPath(pISL, path);
+ if (!SUCCEEDED(hr)) {
+ return hr+0x02000000;
+ }
+
+ hr = pISL->lpVtbl->SetArguments(pISL, args);
+ if (!SUCCEEDED(hr)) {
+ return hr+0x03000000;
+ }
+
+ // Save the shortcut
+ hr = pISL->lpVtbl->QueryInterface(pISL, &IID_IPersistFile, (void**)&pIPF);
+ if (!SUCCEEDED(hr)) {
+ return hr+0x04000000;
+ }
+
+ hr = pIPF->lpVtbl->Save(pIPF, shortcutW, FALSE);
+ if (!SUCCEEDED(hr)) {
+ return hr+0x05000000;
+ }
+
+ pIPF->lpVtbl->Release(pIPF);
+ pISL->lpVtbl->Release(pISL);
+
+ return 0x0;
+}
diff --git a/vendor/github.com/ProtonMail/go-autostart/autostart_windows.go b/vendor/github.com/ProtonMail/go-autostart/autostart_windows.go
new file mode 100644
index 0000000..3c14609
--- /dev/null
+++ b/vendor/github.com/ProtonMail/go-autostart/autostart_windows.go
@@ -0,0 +1,52 @@
+package autostart
+
+// #cgo LDFLAGS: -lole32 -luuid
+/*
+#define WIN32_LEAN_AND_MEAN
+#include <stdint.h>
+#include <windows.h>
+
+uint64_t CreateShortcut(char *shortcutA, char *path, char *args);
+*/
+import "C"
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+var startupDir string
+
+func init() {
+ startupDir = filepath.Join(os.Getenv("USERPROFILE"), "AppData", "Roaming", "Microsoft", "Windows", "Start Menu", "Programs", "Startup")
+}
+
+func (a *App) path() string {
+ return filepath.Join(startupDir, a.Name+".lnk")
+}
+
+func (a *App) IsEnabled() bool {
+ _, err := os.Stat(a.path())
+ return err == nil
+}
+
+func (a *App) Enable() error {
+ path := a.Exec[0]
+ args := strings.Join(a.Exec[1:], " ")
+
+ if err := os.MkdirAll(startupDir, 0777); err != nil {
+ return err
+ }
+ res := C.CreateShortcut(C.CString(a.path()), C.CString(path), C.CString(args))
+ if res != 0 {
+ return errors.New(fmt.Sprintf("autostart: cannot create shortcut '%s' error code: 0x%.8x", a.path(), res))
+ }
+ return nil
+}
+
+func (a *App) Disable() error {
+ return os.Remove(a.path())
+}
diff --git a/vendor/github.com/ProtonMail/go-autostart/autostart_xdg.go b/vendor/github.com/ProtonMail/go-autostart/autostart_xdg.go
new file mode 100644
index 0000000..39306a5
--- /dev/null
+++ b/vendor/github.com/ProtonMail/go-autostart/autostart_xdg.go
@@ -0,0 +1,69 @@
+// +build !windows,!darwin
+
+package autostart
+
+import (
+ "os"
+ "path/filepath"
+ "text/template"
+)
+
+const desktopTemplate = `[Desktop Entry]
+Type=Application
+Name={{.DisplayName}}
+Exec={{.Exec}}
+{{- if .Icon}}
+Icon={{.Icon}}{{end}}
+X-GNOME-Autostart-enabled=true
+`
+
+var autostartDir string
+
+func init() {
+ if os.Getenv("XDG_CONFIG_HOME") != "" {
+ autostartDir = os.Getenv("XDG_CONFIG_HOME")
+ } else {
+ autostartDir = filepath.Join(os.Getenv("HOME"), ".config")
+ }
+ autostartDir = filepath.Join(autostartDir, "autostart")
+}
+
+func (a *App) path() string {
+ return filepath.Join(autostartDir, a.Name+".desktop")
+}
+
+// Check if the app is enabled on startup.
+func (a *App) IsEnabled() bool {
+ _, err := os.Stat(a.path())
+ return err == nil
+}
+
+type app struct {
+ *App
+}
+
+// Override App.Exec to return a string.
+func (a *app) Exec() string {
+ return quote(a.App.Exec)
+}
+
+// Enable this app on startup.
+func (a *App) Enable() error {
+ t := template.Must(template.New("desktop").Parse(desktopTemplate))
+
+ if err := os.MkdirAll(autostartDir, 0777); err != nil {
+ return err
+ }
+ f, err := os.Create(a.path())
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ return t.Execute(f, &app{a})
+}
+
+// Disable this app on startup.
+func (a *App) Disable() error {
+ return os.Remove(a.path())
+}
diff --git a/vendor/github.com/ProtonMail/go-autostart/quote.go b/vendor/github.com/ProtonMail/go-autostart/quote.go
new file mode 100644
index 0000000..b906eed
--- /dev/null
+++ b/vendor/github.com/ProtonMail/go-autostart/quote.go
@@ -0,0 +1,16 @@
+// +build !darwin
+
+package autostart
+
+import (
+ "strconv"
+ "strings"
+)
+
+func quote(args []string) string {
+ for i, v := range args {
+ args[i] = strconv.Quote(v)
+ }
+
+ return strings.Join(args, " ")
+}
diff --git a/vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/demuxer.go b/vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/demuxer.go
new file mode 100644
index 0000000..c57964e
--- /dev/null
+++ b/vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/demuxer.go
@@ -0,0 +1,63 @@
+package demux
+
+import (
+ "bufio"
+ "io"
+)
+
+var readErrSynthEvent = []byte("FATAL:Error reading from OpenVPN")
+
+// Demultiplex reads from the given io.Reader, assumed to be the client
+// end of an OpenVPN Management Protocol connection, and splits it into
+// distinct messages from OpenVPN.
+//
+// It then writes the raw message buffers into either replyCh or eventCh
+// depending on whether each message is a reply to a client command or
+// an asynchronous event notification.
+//
+// The buffers written to replyCh are entire raw message lines (without the
+// trailing newlines), while the buffers written to eventCh are the raw
+// event strings with the prototcol's leading '>' indicator omitted.
+//
+// The caller should usually provide buffered channels of sufficient buffer
+// depth so that the reply channel will not be starved by slow event
+// processing.
+//
+// Once the io.Reader signals EOF, eventCh will be closed, then replyCh
+// will be closed, and then this function will return.
+//
+// As a special case, if a non-EOF error occurs while reading from the
+// io.Reader then a synthetic "FATAL" event will be written to eventCh
+// before the two buffers are closed and the function returns. This
+// synthetic message will have the error message "Error reading from OpenVPN".
+func Demultiplex(r io.Reader, replyCh, eventCh chan<- []byte) {
+ scanner := bufio.NewScanner(r)
+ for scanner.Scan() {
+ buf := scanner.Bytes()
+
+ if len(buf) < 1 {
+ // Should never happen but we'll be robust and ignore this,
+ // rather than crashing below.
+ continue
+ }
+
+ // Asynchronous messages always start with > to differentiate
+ // them from replies.
+ if buf[0] == '>' {
+ // Trim off the > when we post the message, since it's
+ // redundant after we've demuxed.
+ eventCh <- buf[1:]
+ } else {
+ replyCh <- buf
+ }
+ }
+
+ if err := scanner.Err(); err != nil {
+ // Generate a synthetic FATAL event so that the caller can
+ // see that the connection was not gracefully closed.
+ eventCh <- readErrSynthEvent
+ }
+
+ close(eventCh)
+ close(replyCh)
+}
diff --git a/vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/demuxer_test.go b/vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/demuxer_test.go
new file mode 100644
index 0000000..45edac6
--- /dev/null
+++ b/vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/demuxer_test.go
@@ -0,0 +1,218 @@
+package demux
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "reflect"
+ "testing"
+)
+
+func TestDemultiplex(t *testing.T) {
+ type TestCase struct {
+ Input []string
+ ExpectedReplies []string
+ ExpectedEvents []string
+ }
+
+ testCases := []TestCase{
+ {
+ Input: []string{},
+ ExpectedReplies: []string{},
+ ExpectedEvents: []string{},
+ },
+ {
+ Input: []string{
+ "SUCCESS: foo bar baz",
+ },
+ ExpectedReplies: []string{
+ "SUCCESS: foo bar baz",
+ },
+ ExpectedEvents: []string{},
+ },
+ {
+ Input: []string{
+ ">STATE:1234,ASSIGN_IP,,10.0.0.1,",
+ },
+ ExpectedReplies: []string{},
+ ExpectedEvents: []string{
+ "STATE:1234,ASSIGN_IP,,10.0.0.1,",
+ },
+ },
+ {
+ Input: []string{
+ ">STATE:1234,ASSIGN_IP,,10.0.0.1,",
+ ">STATE:5678,ASSIGN_IP,,10.0.0.1,",
+ ">STATE:9012,ASSIGN_IP,,10.0.0.1,",
+ },
+ ExpectedReplies: []string{},
+ ExpectedEvents: []string{
+ "STATE:1234,ASSIGN_IP,,10.0.0.1,",
+ "STATE:5678,ASSIGN_IP,,10.0.0.1,",
+ "STATE:9012,ASSIGN_IP,,10.0.0.1,",
+ },
+ },
+ {
+ Input: []string{
+ ">STATE:1234,ASSIGN_IP,,10.0.0.1,",
+ "SUCCESS: foo bar baz",
+ ">STATE:5678,ASSIGN_IP,,10.0.0.1,",
+ },
+ ExpectedReplies: []string{
+ "SUCCESS: foo bar baz",
+ },
+ ExpectedEvents: []string{
+ "STATE:1234,ASSIGN_IP,,10.0.0.1,",
+ "STATE:5678,ASSIGN_IP,,10.0.0.1,",
+ },
+ },
+ {
+ Input: []string{
+ "SUCCESS: foo bar baz",
+ ">STATE:1234,ASSIGN_IP,,10.0.0.1,",
+ "SUCCESS: baz bar foo",
+ },
+ ExpectedReplies: []string{
+ "SUCCESS: foo bar baz",
+ "SUCCESS: baz bar foo",
+ },
+ ExpectedEvents: []string{
+ "STATE:1234,ASSIGN_IP,,10.0.0.1,",
+ },
+ },
+ }
+
+ for i, testCase := range testCases {
+ r := mockReader(testCase.Input)
+ gotReplies, gotEvents := captureMsgs(r)
+
+ if !reflect.DeepEqual(gotReplies, testCase.ExpectedReplies) {
+ t.Errorf(
+ "test %d returned incorrect replies\ngot %#v\nwant %#v",
+ i, gotReplies, testCase.ExpectedReplies,
+ )
+ }
+
+ if !reflect.DeepEqual(gotEvents, testCase.ExpectedEvents) {
+ t.Errorf(
+ "test %d returned incorrect events\ngot %#v\nwant %#v",
+ i, gotEvents, testCase.ExpectedEvents,
+ )
+ }
+ }
+}
+
+func TestDemultiplex_error(t *testing.T) {
+ r := &alwaysErroringReader{}
+
+ gotReplies, gotEvents := captureMsgs(r)
+
+ expectedReplies := []string{}
+ expectedEvents := []string{
+ "FATAL:Error reading from OpenVPN",
+ }
+
+ if !reflect.DeepEqual(gotReplies, expectedReplies) {
+ t.Errorf(
+ "incorrect replies\ngot %#v\nwant %#v",
+ gotReplies, expectedReplies,
+ )
+ }
+
+ if !reflect.DeepEqual(gotEvents, expectedEvents) {
+ t.Errorf(
+ "incorrect events\ngot %#v\nwant %#v",
+ gotEvents, expectedEvents,
+ )
+ }
+}
+
+func mockReader(msgs []string) io.Reader {
+ var buf []byte
+ for _, msg := range msgs {
+ buf = append(buf, []byte(msg)...)
+ buf = append(buf, '\n')
+ }
+ return bytes.NewReader(buf)
+}
+
+func captureMsgs(r io.Reader) (replies, events []string) {
+ replyCh := make(chan []byte)
+ eventCh := make(chan []byte)
+
+ replies = make([]string, 0)
+ events = make([]string, 0)
+
+ go Demultiplex(r, replyCh, eventCh)
+
+ for replyCh != nil || eventCh != nil {
+ select {
+
+ case msg, ok := <-replyCh:
+ if ok {
+ replies = append(replies, string(msg))
+ } else {
+ replyCh = nil
+ }
+
+ case msg, ok := <-eventCh:
+ if ok {
+ events = append(events, string(msg))
+ } else {
+ eventCh = nil
+ }
+
+ }
+
+ }
+
+ return replies, events
+}
+
+type alwaysErroringReader struct{}
+
+func (r *alwaysErroringReader) Read(buf []byte) (int, error) {
+ return 0, fmt.Errorf("mock error")
+}
+
+// Somewhat-contrived example of blocking for a reply while concurrently
+// processing asynchronous events.
+func ExampleDemultiplex() {
+ // In a real caller we would have a net.IPConn as our reader,
+ // but we'll use a bytes reader here as a test.
+ r := bytes.NewReader([]byte(
+ // A reply to a hypothetical command interspersed between
+ // two asynchronous events.
+ ">HOLD:Waiting for hold release\nSUCCESS: foo\n>FATAL:baz\n",
+ ))
+
+ // No strong need for buffering on this channel because usually
+ // a message sender will immediately block waiting for the
+ // associated response message.
+ replyCh := make(chan []byte)
+
+ // Make sure the event channel buffer is deep enough that slow event
+ // processing won't significantly delay synchronous replies. If you
+ // process events quickly, or if you aren't sending any commands
+ // concurrently with acting on events, then this is not so important.
+ eventCh := make(chan []byte, 10)
+
+ // Start demultiplexing the message stream in the background.
+ // This goroutine will exit once the reader signals EOF.
+ go Demultiplex(r, replyCh, eventCh)
+
+ // Some coroutine has sent a hypothetical message to OpenVPN,
+ // and it can directly block until the associated reply arrives.
+ // The events will be concurrently handled by our event loop
+ // below while we wait for the reply to show up.
+ go func() {
+ replyMsgBuf := <-replyCh
+ fmt.Printf("Command reply: %s\n", string(replyMsgBuf))
+ }()
+
+ // Main event loop deals with the async events as they arrive,
+ // independently of any commands that are pending.
+ for msgBuf := range eventCh {
+ fmt.Printf("Event: %s\n", string(msgBuf))
+ }
+}
diff --git a/vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/doc.go b/vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/doc.go
new file mode 100644
index 0000000..263a267
--- /dev/null
+++ b/vendor/github.com/apparentlymart/go-openvpn-mgmt/demux/doc.go
@@ -0,0 +1,12 @@
+// Package demux implements low-level demultiplexing of the stream of
+// messages sent from OpenVPN on the management channel.
+//
+// OpenVPN's protocol includes two different kinds of message from the OpenVPN
+// process: replies to commands sent by the management client, and asynchronous
+// event notifications.
+//
+// This package's purpose is to split these messages into two separate streams,
+// so that functions executing command/response sequences can just block
+// on the reply channel while an event loop elsewhere deals with any async
+// events that might show up.
+package demux
diff --git a/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/client.go b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/client.go
new file mode 100644
index 0000000..7768004
--- /dev/null
+++ b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/client.go
@@ -0,0 +1,303 @@
+package openvpn
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "net"
+ "strconv"
+ "time"
+
+ "github.com/apparentlymart/go-openvpn-mgmt/demux"
+)
+
+var newline = []byte{'\n'}
+var successPrefix = []byte("SUCCESS: ")
+var errorPrefix = []byte("ERROR: ")
+var endMessage = []byte("END")
+
+type MgmtClient struct {
+ wr io.Writer
+ replies <-chan []byte
+}
+
+// NewClient creates a new MgmtClient that communicates via the given
+// io.ReadWriter and emits events on the given channel.
+//
+// eventCh should be a buffered channel with a sufficient buffer depth
+// such that it cannot be filled under the expected event volume. Event
+// volume depends on which events are enabled and how they are configured;
+// some of the event-enabling functions have further discussion how frequently
+// events are likely to be emitted, but the caller should also factor in
+// how long its own event *processing* will take, since slow event
+// processing will create back-pressure that could cause this buffer to
+// fill faster.
+//
+// It probably goes without saying given the previous paragraph, but the
+// caller *must* constantly read events from eventCh to avoid its buffer
+// becoming full. Events and replies are received on the same channel
+// from OpenVPN, so if writing to eventCh blocks then this will also block
+// responses from the client's various command methods.
+//
+// eventCh will be closed to signal the closing of the client connection,
+// whether due to graceful shutdown or to an error. In the case of error,
+// a FatalEvent will be emitted on the channel as the last event before it
+// is closed. Connection errors may also concurrently surface as error
+// responses from the client's various command methods, should an error
+// occur while we await a reply.
+func NewClient(conn io.ReadWriter, eventCh chan<- Event) *MgmtClient {
+ replyCh := make(chan []byte)
+ rawEventCh := make(chan []byte) // not buffered because eventCh should be
+
+ go demux.Demultiplex(conn, replyCh, rawEventCh)
+
+ // Get raw events and upgrade them into proper event types before
+ // passing them on to the caller's event channel.
+ go func() {
+ for raw := range rawEventCh {
+ eventCh <- upgradeEvent(raw)
+ }
+ close(eventCh)
+ }()
+
+ return &MgmtClient{
+ // replyCh acts as the reader for our ReadWriter, so we only
+ // need to retain the io.Writer for it, so we can send commands.
+ wr: conn,
+ replies: replyCh,
+ }
+}
+
+// Dial is a convenience wrapper around NewClient that handles the common
+// case of opening an TCP/IP socket to an OpenVPN management port and creating
+// a client for it.
+//
+// See the NewClient docs for discussion about the requirements for eventCh.
+//
+// OpenVPN will create a suitable management port if launched with the
+// following command line option:
+//
+// --management <ipaddr> <port>
+//
+// Address may an IPv4 address, an IPv6 address, or a hostname that resolves
+// to either of these, followed by a colon and then a port number.
+//
+// When running on Unix systems it's possible to instead connect to a Unix
+// domain socket. To do this, pass an absolute path to the socket as
+// the target address, having run OpenVPN with the following options:
+//
+// --management /path/to/socket unix
+//
+func Dial(addr string, eventCh chan<- Event) (*MgmtClient, error) {
+ proto := "tcp"
+ if len(addr) > 0 && addr[0] == '/' {
+ proto = "unix"
+ }
+ conn, err := net.Dial(proto, addr)
+ if err != nil {
+ return nil, err
+ }
+
+ return NewClient(conn, eventCh), nil
+}
+
+// HoldRelease instructs OpenVPN to release any management hold preventing
+// it from proceeding, but to retain the state of the hold flag such that
+// the daemon will hold again if it needs to reconnect for any reason.
+//
+// OpenVPN can be instructed to activate a management hold on startup by
+// running it with the following option:
+//
+// --management-hold
+//
+// Instructing OpenVPN to hold gives your client a chance to connect and
+// do any necessary configuration before a connection proceeds, thus avoiding
+// the problem of missed events.
+//
+// When OpenVPN begins holding, or when a new management client connects while
+// a hold is already in effect, a HoldEvent will be emitted on the event
+// channel.
+func (c *MgmtClient) HoldRelease() error {
+ _, err := c.simpleCommand("hold release")
+ return err
+}
+
+// SetStateEvents either enables or disables asynchronous events for changes
+// in the OpenVPN connection state.
+//
+// When enabled, a StateEvent will be emitted from the event channel each
+// time the connection state changes. See StateEvent for more information
+// on the event structure.
+func (c *MgmtClient) SetStateEvents(on bool) error {
+ var err error
+ if on {
+ _, err = c.simpleCommand("state on")
+ } else {
+ _, err = c.simpleCommand("state off")
+ }
+ return err
+}
+
+// SetEchoEvents either enables or disables asynchronous events for "echo"
+// commands sent from a remote server to our managed OpenVPN client.
+//
+// When enabled, an EchoEvent will be emitted from the event channel each
+// time the server sends an echo command. See EchoEvent for more information.
+func (c *MgmtClient) SetEchoEvents(on bool) error {
+ var err error
+ if on {
+ _, err = c.simpleCommand("echo on")
+ } else {
+ _, err = c.simpleCommand("echo off")
+ }
+ return err
+}
+
+// SetByteCountEvents either enables or disables ongoing asynchronous events
+// for information on OpenVPN bandwidth usage.
+//
+// When enabled, a ByteCountEvent will be emitted at given time interval,
+// (which may only be whole seconds) describing how many bytes have been
+// transferred in each direction See ByteCountEvent for more information.
+//
+// Set the time interval to zero in order to disable byte count events.
+func (c *MgmtClient) SetByteCountEvents(interval time.Duration) error {
+ msg := fmt.Sprintf("bytecount %d", int(interval.Seconds()))
+ _, err := c.simpleCommand(msg)
+ return err
+}
+
+// SendSignal sends a signal to the OpenVPN process via the management
+// channel. In effect this causes the OpenVPN process to send a signal to
+// itself on our behalf.
+//
+// OpenVPN accepts a subset of the usual UNIX signal names, including
+// "SIGHUP", "SIGTERM", "SIGUSR1" and "SIGUSR2". See the OpenVPN manual
+// page for the meaning of each.
+//
+// Behavior is undefined if the given signal name is not entirely uppercase
+// letters. In particular, including newlines in the string is likely to
+// cause very unpredictable behavior.
+func (c *MgmtClient) SendSignal(name string) error {
+ msg := fmt.Sprintf("signal %q", name)
+ _, err := c.simpleCommand(msg)
+ return err
+}
+
+// LatestState retrieves the most recent StateEvent from the server. This
+// can either be used to poll the state or it can be used to determine the
+// initial state after calling SetStateEvents(true) but before the first
+// state event is delivered.
+func (c *MgmtClient) LatestState() (*StateEvent, error) {
+ err := c.sendCommand([]byte("state"))
+ if err != nil {
+ return nil, err
+ }
+
+ payload, err := c.readCommandResponsePayload()
+ if err != nil {
+ return nil, err
+ }
+
+ if len(payload) != 1 {
+ return nil, fmt.Errorf("Malformed OpenVPN 'state' response")
+ }
+
+ return &StateEvent{
+ body: payload[0],
+ }, nil
+}
+
+// Pid retrieves the process id of the connected OpenVPN process.
+func (c *MgmtClient) Pid() (int, error) {
+ raw, err := c.simpleCommand("pid")
+ if err != nil {
+ return 0, err
+ }
+
+ if !bytes.HasPrefix(raw, []byte("pid=")) {
+ return 0, fmt.Errorf("malformed response from OpenVPN")
+ }
+
+ pid, err := strconv.Atoi(string(raw[4:]))
+ if err != nil {
+ return 0, fmt.Errorf("error parsing pid from OpenVPN: %s", err)
+ }
+
+ return pid, nil
+}
+
+func (c *MgmtClient) sendCommand(cmd []byte) error {
+ _, err := c.wr.Write(cmd)
+ if err != nil {
+ return err
+ }
+ _, err = c.wr.Write(newline)
+ return err
+}
+
+// sendCommandPayload can be called after sendCommand for
+// commands that expect a multi-line input payload.
+//
+// The buffer given in 'payload' *must* end with a newline,
+// or else the protocol will be broken.
+func (c *MgmtClient) sendCommandPayload(payload []byte) error {
+ _, err := c.wr.Write(payload)
+ if err != nil {
+ return err
+ }
+ _, err = c.wr.Write(endMessage)
+ if err != nil {
+ return err
+ }
+ _, err = c.wr.Write(newline)
+ return err
+}
+
+func (c *MgmtClient) readCommandResult() ([]byte, error) {
+ reply, ok := <-c.replies
+ if !ok {
+ return nil, fmt.Errorf("connection closed while awaiting result")
+ }
+
+ if bytes.HasPrefix(reply, successPrefix) {
+ result := reply[len(successPrefix):]
+ return result, nil
+ }
+
+ if bytes.HasPrefix(reply, errorPrefix) {
+ message := reply[len(errorPrefix):]
+ return nil, ErrorFromServer(message)
+ }
+
+ return nil, fmt.Errorf("malformed result message")
+}
+
+func (c *MgmtClient) readCommandResponsePayload() ([][]byte, error) {
+ lines := make([][]byte, 0, 10)
+
+ for {
+ line, ok := <-c.replies
+ if !ok {
+ // We'll give the caller whatever we got before the connection
+ // closed, in case it's useful for debugging.
+ return lines, fmt.Errorf("connection closed before END recieved")
+ }
+
+ if bytes.Equal(line, endMessage) {
+ break
+ }
+
+ lines = append(lines, line)
+ }
+
+ return lines, nil
+}
+
+func (c *MgmtClient) simpleCommand(cmd string) ([]byte, error) {
+ err := c.sendCommand([]byte(cmd))
+ if err != nil {
+ return nil, err
+ }
+ return c.readCommandResult()
+}
diff --git a/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/error.go b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/error.go
new file mode 100644
index 0000000..554e2ef
--- /dev/null
+++ b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/error.go
@@ -0,0 +1,11 @@
+package openvpn
+
+type ErrorFromServer []byte
+
+func (err ErrorFromServer) Error() string {
+ return string(err)
+}
+
+func (err ErrorFromServer) String() string {
+ return string(err)
+}
diff --git a/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event.go b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event.go
new file mode 100644
index 0000000..66625f3
--- /dev/null
+++ b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event.go
@@ -0,0 +1,299 @@
+package openvpn
+
+import (
+ "bytes"
+ "fmt"
+ "strconv"
+)
+
+var eventSep = []byte(":")
+var fieldSep = []byte(",")
+var byteCountEventKW = []byte("BYTECOUNT")
+var byteCountCliEventKW = []byte("BYTECOUNT_CLI")
+var clientEventKW = []byte("CLIENT")
+var echoEventKW = []byte("ECHO")
+var fatalEventKW = []byte("FATAL")
+var holdEventKW = []byte("HOLD")
+var infoEventKW = []byte("INFO")
+var logEventKW = []byte("LOG")
+var needOkEventKW = []byte("NEED-OK")
+var needStrEventKW = []byte("NEED-STR")
+var passwordEventKW = []byte("PASSWORD")
+var stateEventKW = []byte("STATE")
+
+type Event interface {
+ String() string
+}
+
+// UnknownEvent represents an event of a type that this package doesn't
+// know about.
+//
+// Future versions of this library may learn about new event types, so a
+// caller should exercise caution when making use of events of this type
+// to access unsupported behavior. Backward-compatibility is *not*
+// guaranteed for events of this type.
+type UnknownEvent struct {
+ keyword []byte
+ body []byte
+}
+
+func (e *UnknownEvent) Type() string {
+ return string(e.keyword)
+}
+
+func (e *UnknownEvent) Body() string {
+ return string(e.body)
+}
+
+func (e *UnknownEvent) String() string {
+ return fmt.Sprintf("%s: %s", e.keyword, e.body)
+}
+
+// MalformedEvent represents a message from the OpenVPN process that is
+// presented as an event but does not comply with the expected event syntax.
+//
+// Events of this type should never be seen but robust callers will accept
+// and ignore them, possibly generating some kind of debugging message.
+//
+// One reason for potentially seeing events of this type is when the target
+// program is actually not an OpenVPN process at all, but in fact this client
+// has been connected to a different sort of server by mistake.
+type MalformedEvent struct {
+ raw []byte
+}
+
+func (e *MalformedEvent) String() string {
+ return fmt.Sprintf("Malformed Event %q", e.raw)
+}
+
+// HoldEvent is a notification that the OpenVPN process is in a management
+// hold and will not continue connecting until the hold is released, e.g.
+// by calling client.HoldRelease()
+type HoldEvent struct {
+ body []byte
+}
+
+func (e *HoldEvent) String() string {
+ return string(e.body)
+}
+
+// StateEvent is a notification of a change of connection state. It can be
+// used, for example, to detect if the OpenVPN connection has been interrupted
+// and the OpenVPN process is attempting to reconnect.
+type StateEvent struct {
+ body []byte
+
+ // bodyParts is populated only on first request, giving us the
+ // separate comma-separated elements of the message. Not all
+ // fields are populated for all states.
+ bodyParts [][]byte
+}
+
+func (e *StateEvent) RawTimestamp() string {
+ parts := e.parts()
+ return string(parts[0])
+}
+
+func (e *StateEvent) NewState() string {
+ parts := e.parts()
+ return string(parts[1])
+}
+
+func (e *StateEvent) Description() string {
+ parts := e.parts()
+ return string(parts[2])
+}
+
+// LocalTunnelAddr returns the IP address of the local interface within
+// the tunnel, as a string that can be parsed using net.ParseIP.
+//
+// This field is only populated for events whose NewState returns
+// either ASSIGN_IP or CONNECTED.
+func (e *StateEvent) LocalTunnelAddr() string {
+ parts := e.parts()
+ return string(parts[3])
+}
+
+// RemoteAddr returns the non-tunnel IP address of the remote
+// system that has connected to the local OpenVPN process.
+//
+// This field is only populated for events whose NewState returns
+// CONNECTED.
+func (e *StateEvent) RemoteAddr() string {
+ parts := e.parts()
+ return string(parts[4])
+}
+
+func (e *StateEvent) String() string {
+ newState := e.NewState()
+ switch newState {
+ case "ASSIGN_IP":
+ return fmt.Sprintf("%s: %s", newState, e.LocalTunnelAddr())
+ case "CONNECTED":
+ return fmt.Sprintf("%s: %s", newState, e.RemoteAddr())
+ default:
+ desc := e.Description()
+ if desc != "" {
+ return fmt.Sprintf("%s: %s", newState, desc)
+ } else {
+ return newState
+ }
+ }
+}
+
+func (e *StateEvent) parts() [][]byte {
+ if e.bodyParts == nil {
+ // State messages currently have only five segments, but
+ // we'll ask for 5 so any additional fields that might show
+ // up in newer versions will gather in an element we're
+ // not actually using.
+ e.bodyParts = bytes.SplitN(e.body, fieldSep, 6)
+
+ // Prevent crash if the server has sent us a malformed
+ // status message. This should never actually happen if
+ // the server is behaving itself.
+ if len(e.bodyParts) < 5 {
+ expanded := make([][]byte, 5)
+ copy(expanded, e.bodyParts)
+ e.bodyParts = expanded
+ }
+ }
+ return e.bodyParts
+}
+
+// EchoEvent is emitted by an OpenVPN process running in client mode when
+// an "echo" command is pushed to it by the server it has connected to.
+//
+// The format of the echo message is free-form, since this message type is
+// intended to pass application-specific data from the server-side config
+// into whatever client is consuming the management prototcol.
+//
+// This event is emitted only if the management client has turned on events
+// of this type using client.SetEchoEvents(true)
+type EchoEvent struct {
+ body []byte
+}
+
+func (e *EchoEvent) RawTimestamp() string {
+ sepIndex := bytes.Index(e.body, fieldSep)
+ if sepIndex == -1 {
+ return ""
+ }
+ return string(e.body[:sepIndex])
+}
+
+func (e *EchoEvent) Message() string {
+ sepIndex := bytes.Index(e.body, fieldSep)
+ if sepIndex == -1 {
+ return ""
+ }
+ return string(e.body[sepIndex+1:])
+}
+
+func (e *EchoEvent) String() string {
+ return fmt.Sprintf("ECHO: %s", e.Message())
+}
+
+// ByteCountEvent represents a periodic snapshot of data transfer in bytes
+// on a VPN connection.
+//
+// For OpenVPN *servers*, events are emitted for each client and the method
+// ClientId identifies thet client.
+//
+// For other OpenVPN modes, events are emitted only once per interval for the
+// single connection managed by the target process, and ClientId returns
+// the empty string.
+type ByteCountEvent struct {
+ hasClient bool
+ body []byte
+
+ // populated on first call to parts()
+ bodyParts [][]byte
+}
+
+func (e *ByteCountEvent) ClientId() string {
+ if !e.hasClient {
+ return ""
+ }
+
+ return string(e.parts()[0])
+}
+
+func (e *ByteCountEvent) BytesIn() int {
+ index := 0
+ if e.hasClient {
+ index = 1
+ }
+ str := string(e.parts()[index])
+ val, _ := strconv.Atoi(str)
+ // Ignore error, since this should never happen if OpenVPN is
+ // behaving itself.
+ return val
+}
+
+func (e *ByteCountEvent) BytesOut() int {
+ index := 1
+ if e.hasClient {
+ index = 2
+ }
+ str := string(e.parts()[index])
+ val, _ := strconv.Atoi(str)
+ // Ignore error, since this should never happen if OpenVPN is
+ // behaving itself.
+ return val
+}
+
+func (e *ByteCountEvent) String() string {
+ if e.hasClient {
+ return fmt.Sprintf("Client %s: %d in, %d out", e.ClientId(), e.BytesIn(), e.BytesOut())
+ } else {
+ return fmt.Sprintf("%d in, %d out", e.BytesIn(), e.BytesOut())
+ }
+}
+
+func (e *ByteCountEvent) parts() [][]byte {
+ if e.bodyParts == nil {
+ e.bodyParts = bytes.SplitN(e.body, fieldSep, 4)
+
+ wantCount := 2
+ if e.hasClient {
+ wantCount = 3
+ }
+
+ // Prevent crash if the server has sent us a malformed
+ // message. This should never actually happen if the
+ // server is behaving itself.
+ if len(e.bodyParts) < wantCount {
+ expanded := make([][]byte, wantCount)
+ copy(expanded, e.bodyParts)
+ e.bodyParts = expanded
+ }
+ }
+ return e.bodyParts
+}
+
+func upgradeEvent(raw []byte) Event {
+ splitIdx := bytes.Index(raw, eventSep)
+ if splitIdx == -1 {
+ // Should never happen, but we'll handle it robustly if it does.
+ return &MalformedEvent{raw}
+ }
+
+ keyword := raw[:splitIdx]
+ body := raw[splitIdx+1:]
+
+ switch {
+ case bytes.Equal(keyword, stateEventKW):
+ return &StateEvent{body: body}
+ case bytes.Equal(keyword, holdEventKW):
+ return &HoldEvent{body}
+ case bytes.Equal(keyword, echoEventKW):
+ return &EchoEvent{body}
+ case bytes.Equal(keyword, byteCountEventKW):
+ return &ByteCountEvent{hasClient: false, body: body}
+ case bytes.Equal(keyword, byteCountCliEventKW):
+ return &ByteCountEvent{hasClient: true, body: body}
+ default:
+ return &UnknownEvent{keyword, body}
+ }
+}
diff --git a/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go
new file mode 100644
index 0000000..81a02e1
--- /dev/null
+++ b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go
@@ -0,0 +1,346 @@
+package openvpn
+
+import (
+ "fmt"
+ "testing"
+)
+
+// A key requirement of our event parsing is that it must never cause a
+// panic, even if the OpenVPN process sends us malformed garbage.
+//
+// Therefore most of the tests in here are testing various tortured error
+// cases, which are all expected to produce an event object, though the
+// contents of that event object will be nonsensical if the OpenVPN server
+// sends something nonsensical.
+
+func TestMalformedEvent(t *testing.T) {
+ testCases := [][]byte{
+ []byte(""),
+ []byte("HTTP/1.1 200 OK"),
+ []byte(" "),
+ []byte("\x00"),
+ }
+
+ for i, testCase := range testCases {
+ event := upgradeEvent(testCase)
+
+ var malformed *MalformedEvent
+ var ok bool
+ if malformed, ok = event.(*MalformedEvent); !ok {
+ t.Errorf("test %d got %T; want %T", i, event, malformed)
+ continue
+ }
+
+ wantString := fmt.Sprintf("Malformed Event %q", testCase)
+ if gotString := malformed.String(); gotString != wantString {
+ t.Errorf("test %d String returned %q; want %q", i, gotString, wantString)
+ }
+ }
+}
+
+func TestUnknownEvent(t *testing.T) {
+ type TestCase struct {
+ Input []byte
+ WantType string
+ WantBody string
+ }
+ testCases := []TestCase{
+ {
+ Input: []byte("DUMMY:baz"),
+ WantType: "DUMMY",
+ WantBody: "baz",
+ },
+ {
+ Input: []byte("DUMMY:"),
+ WantType: "DUMMY",
+ WantBody: "",
+ },
+ {
+ Input: []byte("DUMMY:abc,123,456"),
+ WantType: "DUMMY",
+ WantBody: "abc,123,456",
+ },
+ }
+
+ for i, testCase := range testCases {
+ event := upgradeEvent(testCase.Input)
+
+ var unk *UnknownEvent
+ var ok bool
+ if unk, ok = event.(*UnknownEvent); !ok {
+ t.Errorf("test %d got %T; want %T", i, event, unk)
+ continue
+ }
+
+ if got, want := unk.Type(), testCase.WantType; got != want {
+ t.Errorf("test %d Type returned %q; want %q", i, got, want)
+ }
+ if got, want := unk.Body(), testCase.WantBody; got != want {
+ t.Errorf("test %d Body returned %q; want %q", i, got, want)
+ }
+ }
+}
+
+func TestHoldEvent(t *testing.T) {
+ testCases := [][]byte{
+ []byte("HOLD:"),
+ []byte("HOLD:waiting for hold release"),
+ }
+
+ for i, testCase := range testCases {
+ event := upgradeEvent(testCase)
+
+ var hold *HoldEvent
+ var ok bool
+ if hold, ok = event.(*HoldEvent); !ok {
+ t.Errorf("test %d got %T; want %T", i, event, hold)
+ continue
+ }
+ }
+}
+
+func TestEchoEvent(t *testing.T) {
+ type TestCase struct {
+ Input []byte
+ WantTimestamp string
+ WantMessage string
+ }
+ testCases := []TestCase{
+ {
+ Input: []byte("ECHO:123,foo"),
+ WantTimestamp: "123",
+ WantMessage: "foo",
+ },
+ {
+ Input: []byte("ECHO:123,"),
+ WantTimestamp: "123",
+ WantMessage: "",
+ },
+ {
+ Input: []byte("ECHO:,foo"),
+ WantTimestamp: "",
+ WantMessage: "foo",
+ },
+ {
+ Input: []byte("ECHO:,"),
+ WantTimestamp: "",
+ WantMessage: "",
+ },
+ {
+ Input: []byte("ECHO:"),
+ WantTimestamp: "",
+ WantMessage: "",
+ },
+ }
+
+ for i, testCase := range testCases {
+ event := upgradeEvent(testCase.Input)
+
+ var echo *EchoEvent
+ var ok bool
+ if echo, ok = event.(*EchoEvent); !ok {
+ t.Errorf("test %d got %T; want %T", i, event, echo)
+ continue
+ }
+
+ if got, want := echo.RawTimestamp(), testCase.WantTimestamp; got != want {
+ t.Errorf("test %d RawTimestamp returned %q; want %q", i, got, want)
+ }
+ if got, want := echo.Message(), testCase.WantMessage; got != want {
+ t.Errorf("test %d Message returned %q; want %q", i, got, want)
+ }
+ }
+}
+
+func TestStateEvent(t *testing.T) {
+ type TestCase struct {
+ Input []byte
+ WantTimestamp string
+ WantState string
+ WantDesc string
+ WantLocalAddr string
+ WantRemoteAddr string
+ }
+ testCases := []TestCase{
+ {
+ Input: []byte("STATE:"),
+ WantTimestamp: "",
+ WantState: "",
+ WantDesc: "",
+ WantLocalAddr: "",
+ WantRemoteAddr: "",
+ },
+ {
+ Input: []byte("STATE:,"),
+ WantTimestamp: "",
+ WantState: "",
+ WantDesc: "",
+ WantLocalAddr: "",
+ WantRemoteAddr: "",
+ },
+ {
+ Input: []byte("STATE:,,,,"),
+ WantTimestamp: "",
+ WantState: "",
+ WantDesc: "",
+ WantLocalAddr: "",
+ WantRemoteAddr: "",
+ },
+ {
+ Input: []byte("STATE:123,CONNECTED,good,172.16.0.1,192.168.4.1"),
+ WantTimestamp: "123",
+ WantState: "CONNECTED",
+ WantDesc: "good",
+ WantLocalAddr: "172.16.0.1",
+ WantRemoteAddr: "192.168.4.1",
+ },
+ {
+ Input: []byte("STATE:123,RECONNECTING,SIGHUP,,"),
+ WantTimestamp: "123",
+ WantState: "RECONNECTING",
+ WantDesc: "SIGHUP",
+ WantLocalAddr: "",
+ WantRemoteAddr: "",
+ },
+ {
+ Input: []byte("STATE:123,RECONNECTING,SIGHUP,,,extra"),
+ WantTimestamp: "123",
+ WantState: "RECONNECTING",
+ WantDesc: "SIGHUP",
+ WantLocalAddr: "",
+ WantRemoteAddr: "",
+ },
+ }
+
+ for i, testCase := range testCases {
+ event := upgradeEvent(testCase.Input)
+
+ var st *StateEvent
+ var ok bool
+ if st, ok = event.(*StateEvent); !ok {
+ t.Errorf("test %d got %T; want %T", i, event, st)
+ continue
+ }
+
+ if got, want := st.RawTimestamp(), testCase.WantTimestamp; got != want {
+ t.Errorf("test %d RawTimestamp returned %q; want %q", i, got, want)
+ }
+ if got, want := st.NewState(), testCase.WantState; got != want {
+ t.Errorf("test %d NewState returned %q; want %q", i, got, want)
+ }
+ if got, want := st.Description(), testCase.WantDesc; got != want {
+ t.Errorf("test %d Description returned %q; want %q", i, got, want)
+ }
+ if got, want := st.LocalTunnelAddr(), testCase.WantLocalAddr; got != want {
+ t.Errorf("test %d LocalTunnelAddr returned %q; want %q", i, got, want)
+ }
+ if got, want := st.RemoteAddr(), testCase.WantRemoteAddr; got != want {
+ t.Errorf("test %d RemoteAddr returned %q; want %q", i, got, want)
+ }
+ }
+}
+
+func TestByteCountEvent(t *testing.T) {
+ type TestCase struct {
+ Input []byte
+ WantClientId string
+ WantBytesIn int
+ WantBytesOut int
+ }
+ testCases := []TestCase{
+ {
+ Input: []byte("BYTECOUNT:"),
+ WantClientId: "",
+ WantBytesIn: 0,
+ WantBytesOut: 0,
+ },
+ {
+ Input: []byte("BYTECOUNT:123,456"),
+ WantClientId: "",
+ WantBytesIn: 123,
+ WantBytesOut: 456,
+ },
+ {
+ Input: []byte("BYTECOUNT:,"),
+ WantClientId: "",
+ WantBytesIn: 0,
+ WantBytesOut: 0,
+ },
+ {
+ Input: []byte("BYTECOUNT:5,"),
+ WantClientId: "",
+ WantBytesIn: 5,
+ WantBytesOut: 0,
+ },
+ {
+ Input: []byte("BYTECOUNT:,6"),
+ WantClientId: "",
+ WantBytesIn: 0,
+ WantBytesOut: 6,
+ },
+ {
+ Input: []byte("BYTECOUNT:6"),
+ WantClientId: "",
+ WantBytesIn: 6,
+ WantBytesOut: 0,
+ },
+ {
+ Input: []byte("BYTECOUNT:wrong,bad"),
+ WantClientId: "",
+ WantBytesIn: 0,
+ WantBytesOut: 0,
+ },
+ {
+ Input: []byte("BYTECOUNT:1,2,3"),
+ WantClientId: "",
+ WantBytesIn: 1,
+ WantBytesOut: 2,
+ },
+ {
+ // Intentionally malformed BYTECOUNT event sent as BYTECOUNT_CLI
+ Input: []byte("BYTECOUNT_CLI:123,456"),
+ WantClientId: "123",
+ WantBytesIn: 456,
+ WantBytesOut: 0,
+ },
+ {
+ Input: []byte("BYTECOUNT_CLI:"),
+ WantClientId: "",
+ WantBytesIn: 0,
+ WantBytesOut: 0,
+ },
+ {
+ Input: []byte("BYTECOUNT_CLI:abc123,123,456"),
+ WantClientId: "abc123",
+ WantBytesIn: 123,
+ WantBytesOut: 456,
+ },
+ {
+ Input: []byte("BYTECOUNT_CLI:abc123,123"),
+ WantClientId: "abc123",
+ WantBytesIn: 123,
+ WantBytesOut: 0,
+ },
+ }
+
+ for i, testCase := range testCases {
+ event := upgradeEvent(testCase.Input)
+
+ var bc *ByteCountEvent
+ var ok bool
+ if bc, ok = event.(*ByteCountEvent); !ok {
+ t.Errorf("test %d got %T; want %T", i, event, bc)
+ continue
+ }
+
+ if got, want := bc.ClientId(), testCase.WantClientId; got != want {
+ t.Errorf("test %d ClientId returned %q; want %q", i, got, want)
+ }
+ if got, want := bc.BytesIn(), testCase.WantBytesIn; got != want {
+ t.Errorf("test %d BytesIn returned %d; want %d", i, got, want)
+ }
+ if got, want := bc.BytesOut(), testCase.WantBytesOut; got != want {
+ t.Errorf("test %d BytesOut returned %d; want %d", i, got, want)
+ }
+ }
+}
diff --git a/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/server.go b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/server.go
new file mode 100644
index 0000000..d7defd4
--- /dev/null
+++ b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/server.go
@@ -0,0 +1,172 @@
+package openvpn
+
+import (
+ "net"
+ "time"
+)
+
+// MgmtListener accepts incoming connections from OpenVPN.
+//
+// The primary way to instantiate this type is via the function Listen.
+// See its documentation for more information.
+type MgmtListener struct {
+ l net.Listener
+}
+
+// NewMgmtListener constructs a MgmtListener from an already-established
+// net.Listener. In most cases it will be more convenient to use
+// the function Listen.
+func NewMgmtListener(l net.Listener) *MgmtListener {
+ return &MgmtListener{l}
+}
+
+// Listen opens a listen port and awaits incoming connections from OpenVPN
+// processes.
+//
+// OpenVPN will behave in this manner when launched with the following options:
+//
+// --management ipaddr port --management-client
+//
+// Note that in this case the terminology is slightly confusing, since from
+// the standpoint of TCP/IP it is OpenVPN that is the client and our program
+// that is the server, but once the connection is established the channel
+// is indistinguishable from the situation where OpenVPN exposed a management
+// *server* and we connected to it. Thus we still refer to our program as
+// the "client" and OpenVPN as the "server" once the connection is established.
+//
+// When running on Unix systems it's possible to instead listen on a Unix
+// domain socket. To do this, pass an absolute path to the socket as
+// the listen address, and then run OpenVPN with the following options:
+//
+// --management /path/to/socket unix --management-client
+//
+func Listen(laddr string) (*MgmtListener, error) {
+ proto := "tcp"
+ if len(laddr) > 0 && laddr[0] == '/' {
+ proto = "unix"
+ }
+ listener, err := net.Listen(proto, laddr)
+ if err != nil {
+ return nil, err
+ }
+
+ return NewMgmtListener(listener), nil
+}
+
+// Accept waits for and returns the next connection.
+func (l *MgmtListener) Accept() (*IncomingConn, error) {
+ conn, err := l.l.Accept()
+ if err != nil {
+ return nil, err
+ }
+
+ return &IncomingConn{conn}, nil
+}
+
+// Close closes the listener. Any blocked Accept operations
+// will be blocked and each will return an error.
+func (l *MgmtListener) Close() error {
+ return l.l.Close()
+}
+
+// Addr returns the listener's network address.
+func (l *MgmtListener) Addr() net.Addr {
+ return l.l.Addr()
+}
+
+// Serve will await new connections and call the given handler
+// for each.
+//
+// Serve does not return unless the listen port is closed; a non-nil
+// error is always returned.
+func (l *MgmtListener) Serve(handler IncomingConnHandler) error {
+ defer l.Close()
+
+ var tempDelay time.Duration
+
+ for {
+ incoming, err := l.Accept()
+ if err != nil {
+ if ne, ok := err.(net.Error); ok && ne.Temporary() {
+ if tempDelay == 0 {
+ tempDelay = 5 * time.Millisecond
+ } else {
+ tempDelay *= 2
+ }
+ if max := 1 * time.Second; tempDelay > max {
+ tempDelay = max
+ }
+
+ // Wait a while before we try again.
+ time.Sleep(tempDelay)
+ continue
+ } else {
+ // Listen socket is permanently closed or errored,
+ // so it's time for us to exit.
+ return err
+ }
+ }
+
+ // always reset our retry delay once we successfully read
+ tempDelay = 0
+
+ go handler.ServeOpenVPNMgmt(*incoming)
+ }
+}
+
+type IncomingConn struct {
+ conn net.Conn
+}
+
+// Open initiates communication with the connected OpenVPN process,
+// and establishes the channel on which events will be delivered.
+//
+// See the documentation for NewClient for discussion about the requirements
+// for eventCh.
+func (ic IncomingConn) Open(eventCh chan<- Event) *MgmtClient {
+ return NewClient(ic.conn, eventCh)
+}
+
+// Close abruptly closes the socket connected to the OpenVPN process.
+//
+// This is a rather abrasive way to close the channel, intended for rejecting
+// unwanted incoming clients that may or may not speak the OpenVPN protocol.
+//
+// Once communication is accepted and established, it is generally better
+// to close the connection gracefully using commands on the client returned
+// from Open.
+func (ic IncomingConn) Close() error {
+ return ic.conn.Close()
+}
+
+type IncomingConnHandler interface {
+ ServeOpenVPNMgmt(IncomingConn)
+}
+
+// IncomingConnHandlerFunc is an adapter to allow the use of ordinary
+// functions as connection handlers.
+//
+// Given a function with the appropriate signature, IncomingConnHandlerFunc(f)
+// is an IncomingConnHandler that calls f.
+type IncomingConnHandlerFunc func(IncomingConn)
+
+func (f IncomingConnHandlerFunc) ServeOpenVPNMgmt(i IncomingConn) {
+ f(i)
+}
+
+// ListenAndServe creates a MgmtListener for the given listen address
+// and then calls AcceptAndServe on it.
+//
+// This is just a convenience wrapper. See the AcceptAndServe method for
+// more details. Just as with AcceptAndServe, this function does not return
+// except on error; in addition to the error cases handled by AcceptAndServe,
+// this function may also fail if the listen socket cannot be established
+// in the first place.
+func ListenAndServe(laddr string, handler IncomingConnHandler) error {
+ listener, err := Listen(laddr)
+ if err != nil {
+ return err
+ }
+
+ return listener.Serve(handler)
+}
diff --git a/vendor/github.com/getlantern/context/LICENSE b/vendor/github.com/getlantern/context/LICENSE
new file mode 100644
index 0000000..5dc6c26
--- /dev/null
+++ b/vendor/github.com/getlantern/context/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2016 Brave New Software Project, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/vendor/github.com/getlantern/context/README.md b/vendor/github.com/getlantern/context/README.md
new file mode 100644
index 0000000..978c9e0
--- /dev/null
+++ b/vendor/github.com/getlantern/context/README.md
@@ -0,0 +1,6 @@
+# context [![Travis CI Status](https://travis-ci.org/getlantern/context.svg?branch=master)](https://travis-ci.org/getlantern/context)&nbsp;[![Coverage Status](https://coveralls.io/repos/getlantern/context/badge.png?branch=master)](https://coveralls.io/r/getlantern/context)
+
+Provides goroutine-based context state inspired by https://github.com/tylerb/gls
+and https://github.com/jtolds/gls. It uses the same basic hack as tylerb's
+library, but adds a stack abstraction that allows nested contexts similar to
+jtolds' library, but using `Enter()` and `Exit()` instead of callback functions.
diff --git a/vendor/github.com/getlantern/context/context.go b/vendor/github.com/getlantern/context/context.go
new file mode 100644
index 0000000..c77f129
--- /dev/null
+++ b/vendor/github.com/getlantern/context/context.go
@@ -0,0 +1,309 @@
+// Package context provides a mechanism for transparently tracking contextual
+// state associated to the current goroutine and even across goroutines.
+package context
+
+import (
+ "sync"
+)
+
+// Manager provides the ability to create and access Contexts.
+type Manager interface {
+ // Enter enters a new level on the current Context stack, creating a new Context
+ // if necessary.
+ Enter() Context
+
+ // Go starts the given function on a new goroutine but sharing the context of
+ // the current goroutine (if it has one).
+ Go(func())
+
+ // PutGlobal puts the given key->value pair into the global context.
+ PutGlobal(key string, value interface{})
+
+ // PutGlobalDynamic puts a key->value pair into the global context where the
+ // value is generated by a function that gets evaluated at every Read. If the
+ // value is a map[string]interface{}, we will unpack the map and set each
+ // contained key->value pair independently.
+ PutGlobalDynamic(key string, valueFN func() interface{})
+
+ // AsMap returns a map containing all values from the supplied obj if it is a
+ // Contextual, plus any addition values from along the stack, plus globals if so
+ // specified.
+ AsMap(obj interface{}, includeGlobals bool) Map
+}
+
+type manager struct {
+ contexts map[uint64]*context
+ mxContexts sync.RWMutex
+ global Map
+ mxGlobal sync.RWMutex
+}
+
+// NewManager creates a new Manager
+func NewManager() Manager {
+ return &manager{
+ contexts: make(map[uint64]*context),
+ global: make(Map),
+ }
+}
+
+// Contextual is an interface for anything that maintains its own context.
+type Contextual interface {
+ // Fill fills the given Map with all of this Contextual's context
+ Fill(m Map)
+}
+
+// Map is a map of key->value pairs.
+type Map map[string]interface{}
+
+// Fill implements the method from the Contextual interface.
+func (_m Map) Fill(m Map) {
+ for key, value := range _m {
+ m[key] = value
+ }
+}
+
+// Context is a context containing key->value pairs
+type Context interface {
+ // Enter enters a new level on this Context stack.
+ Enter() Context
+
+ // Go starts the given function on a new goroutine.
+ Go(fn func())
+
+ // Exit exits the current level on this Context stack.
+ Exit()
+
+ // Put puts a key->value pair into the current level of the context stack.
+ Put(key string, value interface{}) Context
+
+ // PutIfAbsent puts the given key->value pair into the current level of the
+ // context stack if and only if that key is defined nowhere within the context
+ // stack (including parent contexts).
+ PutIfAbsent(key string, value interface{}) Context
+
+ // PutDynamic puts a key->value pair into the current level of the context
+ // stack where the value is generated by a function that gets evaluated at
+ // every Read. If the value is a map[string]interface{}, we will unpack the
+ // map and set each contained key->value pair independently.
+ PutDynamic(key string, valueFN func() interface{}) Context
+
+ // Fill fills the given map with data from this Context
+ Fill(m Map)
+
+ // AsMap returns a map containing all values from the supplied obj if it is a
+ // Contextual, plus any addition values from along the stack, plus globals if
+ // so specified.
+ AsMap(obj interface{}, includeGlobals bool) Map
+}
+
+type context struct {
+ cm *manager
+ id uint64
+ parent *context
+ branchedFrom *context
+ data Map
+ mx sync.RWMutex
+}
+
+type dynval struct {
+ fn func() interface{}
+}
+
+func (cm *manager) Enter() Context {
+ return cm.enter(curGoroutineID())
+}
+
+func (cm *manager) enter(id uint64) *context {
+ cm.mxContexts.Lock()
+ parentOrNil := cm.contexts[id]
+ c := cm.makeContext(id, parentOrNil, nil)
+ cm.contexts[id] = c
+ cm.mxContexts.Unlock()
+ return c
+}
+
+func (cm *manager) exit(id uint64, parent *context) {
+ cm.mxContexts.Lock()
+ if parent == nil {
+ delete(cm.contexts, id)
+ } else {
+ cm.contexts[id] = parent
+ }
+ cm.mxContexts.Unlock()
+}
+
+func (cm *manager) branch(id uint64, from *context) {
+ next := cm.makeContext(id, nil, from)
+ cm.mxContexts.Lock()
+ cm.contexts[id] = next
+ cm.mxContexts.Unlock()
+}
+
+func (cm *manager) merge(id uint64) {
+ cm.mxContexts.Lock()
+ delete(cm.contexts, id)
+ cm.mxContexts.Unlock()
+}
+
+func (c *context) Enter() Context {
+ c.mx.RLock()
+ id := c.id
+ c.mx.RUnlock()
+ return c.cm.enter(id)
+}
+
+func (c *context) Go(fn func()) {
+ go func() {
+ id := curGoroutineID()
+ c.cm.branch(id, c)
+ fn()
+ c.cm.merge(id)
+ }()
+}
+
+func (cm *manager) Go(fn func()) {
+ c := cm.currentContext()
+ if c != nil {
+ c.Go(fn)
+ } else {
+ go fn()
+ }
+}
+
+func (cm *manager) makeContext(id uint64, parent *context, branchedFrom *context) *context {
+ return &context{
+ cm: cm,
+ id: id,
+ parent: parent,
+ branchedFrom: branchedFrom,
+ data: make(Map),
+ }
+}
+
+func (c *context) Exit() {
+ c.mx.RLock()
+ id := c.id
+ parent := c.parent
+ c.mx.RUnlock()
+ c.cm.exit(id, parent)
+}
+
+func (c *context) Put(key string, value interface{}) Context {
+ c.mx.Lock()
+ c.data[key] = value
+ c.mx.Unlock()
+ return c
+}
+
+func (c *context) PutIfAbsent(key string, value interface{}) Context {
+ for ctx := c; ctx != nil; {
+ ctx.mx.RLock()
+ _, exists := ctx.data[key]
+ next := ctx.parent
+ if next == nil {
+ next = ctx.branchedFrom
+ }
+ ctx.mx.RUnlock()
+ if exists {
+ return c
+ }
+ ctx = next
+ }
+
+ // Value not set, set it
+ return c.Put(key, value)
+}
+
+func (c *context) PutDynamic(key string, valueFN func() interface{}) Context {
+ value := &dynval{valueFN}
+ c.mx.Lock()
+ c.data[key] = value
+ c.mx.Unlock()
+ return c
+}
+
+func (cm *manager) PutGlobal(key string, value interface{}) {
+ cm.mxGlobal.Lock()
+ cm.global[key] = value
+ cm.mxGlobal.Unlock()
+}
+
+func (cm *manager) PutGlobalDynamic(key string, valueFN func() interface{}) {
+ value := &dynval{valueFN}
+ cm.mxGlobal.Lock()
+ cm.global[key] = value
+ cm.mxGlobal.Unlock()
+}
+
+func (c *context) Fill(m Map) {
+ for ctx := c; ctx != nil; {
+ ctx.mx.RLock()
+ fill(m, ctx.data)
+ next := ctx.parent
+ if next == nil {
+ next = ctx.branchedFrom
+ }
+ ctx.mx.RUnlock()
+ ctx = next
+ }
+}
+
+func (cm *manager) AsMap(obj interface{}, includeGlobals bool) Map {
+ return cm.currentContext().asMap(cm, obj, includeGlobals)
+}
+
+func (c *context) AsMap(obj interface{}, includeGlobals bool) Map {
+ return c.asMap(c.cm, obj, includeGlobals)
+}
+
+func (c *context) asMap(cm *manager, obj interface{}, includeGlobals bool) Map {
+ result := make(Map, 0)
+ cl, ok := obj.(Contextual)
+ if ok {
+ cl.Fill(result)
+ }
+ if c != nil {
+ c.Fill(result)
+ }
+ if includeGlobals {
+ cm.mxGlobal.RLock()
+ fill(result, cm.global)
+ cm.mxGlobal.RUnlock()
+ }
+ return result
+}
+
+func fill(m Map, from Map) {
+ if m != nil {
+ doFill := func(key string, _value interface{}) {
+ switch value := _value.(type) {
+ case map[string]interface{}:
+ for k, v := range value {
+ m[k] = v
+ }
+ default:
+ m[key] = value
+ }
+ }
+
+ for key, value := range from {
+ _, alreadyRead := m[key]
+ if !alreadyRead {
+ switch v := value.(type) {
+ case *dynval:
+ doFill(key, v.fn())
+ default:
+ doFill(key, v)
+ }
+ }
+ }
+ }
+}
+
+func (cm *manager) currentContext() *context {
+ id := curGoroutineID()
+ cm.mxContexts.RLock()
+ c := cm.contexts[id]
+ cm.mxContexts.RUnlock()
+ return c
+}
diff --git a/vendor/github.com/getlantern/context/context_test.go b/vendor/github.com/getlantern/context/context_test.go
new file mode 100644
index 0000000..9fb86f3
--- /dev/null
+++ b/vendor/github.com/getlantern/context/context_test.go
@@ -0,0 +1,160 @@
+package context
+
+import (
+ "sync"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestStack(t *testing.T) {
+ cm := NewManager()
+ _cm := cm.(*manager)
+ // Put globals first
+ cm.PutGlobal("a", -1) // This will get overriden in specific contexts
+ cm.PutGlobal("ga", "i")
+ cm.PutGlobalDynamic("gb", func() interface{} { return "ii" })
+ cm.PutGlobalDynamic("gm", func() interface{} { return map[string]interface{}{"gm3": "iii", "gm4": "iv"} })
+
+ // Use a Map as a Contextual
+ var contextual = Map{
+ "a": 0, // This will override whatever is in specific contexts
+ "contextual": "special",
+ }
+
+ c := cm.Enter()
+ c.Put("a", 1)
+ penultimate := cm.Enter().
+ Put("b", 2)
+ c = cm.Enter().
+ PutDynamic("c", func() interface{} { return 4 }).
+ PutIfAbsent("d", 5).
+ PutIfAbsent("a", 11)
+
+ // Put something in the penultimate context and make sure it doesn't override
+ // what's set in the ultimate context
+ penultimate.Put("c", 3)
+
+ var assertMutex sync.Mutex
+ doAssertContents := func(expected Map, actual Map, scope string) {
+ assertMutex.Lock()
+ assert.Equal(t, expected, actual, scope)
+ assertMutex.Unlock()
+ }
+
+ assertContents := func(expected Map) {
+ doAssertContents(expected, cm.AsMap(nil, false), "AsMapwith(nil, false)")
+ expected["ga"] = "i"
+ expected["gb"] = "ii"
+ expected["gm3"] = "iii"
+ expected["gm4"] = "iv"
+ _, exists := expected["a"]
+ if !exists {
+ expected["a"] = -1
+ }
+ doAssertContents(expected, cm.AsMap(nil, true), "AsMap(nil, true)")
+ expected["a"] = 0
+ expected["contextual"] = "special"
+ doAssertContents(expected, cm.AsMap(contextual, true), "AsMapWith(contextual, true)")
+ delete(expected, "ga")
+ delete(expected, "gb")
+ delete(expected, "gm3")
+ delete(expected, "gm4")
+ doAssertContents(expected, cm.AsMap(contextual, false), "AsMapWith(contextual, false)")
+ }
+
+ assertContents(Map{
+ "a": 1,
+ "b": 2,
+ "c": 4,
+ "d": 5,
+ })
+
+ var wg sync.WaitGroup
+ wg.Add(1)
+ cm.Go(func() {
+ defer cm.Enter().Put("e", 6).Exit()
+ assertContents(Map{
+ "a": 1,
+ "b": 2,
+ "c": 4,
+ "d": 5,
+ "e": 6,
+ })
+ wg.Done()
+ })
+ wg.Wait()
+
+ wg.Add(1)
+ cm.Go(func() {
+ // This goroutine doesn't Exit. Still, we shouldn't leak anything.
+ wg.Done()
+ })
+ wg.Wait()
+
+ assertContents(Map{
+ "a": 1,
+ "b": 2,
+ "c": 4,
+ "d": 5,
+ })
+
+ c.Exit()
+ c = _cm.currentContext()
+ assert.NotNil(t, c)
+ assertContents(Map{
+ "a": 1,
+ "b": 2,
+ "c": 3,
+ })
+
+ c.Exit()
+ c = _cm.currentContext()
+ assert.NotNil(t, c)
+ assertContents(Map{
+ "a": 1,
+ })
+
+ // Last exit
+ c.Exit()
+ assert.Nil(t, _cm.currentContext())
+ assertContents(Map{})
+
+ // Exit again, just for good measure
+ c.Exit()
+ assert.Nil(t, _cm.currentContext())
+ assertContents(Map{})
+
+ // Spawn a goroutine with no existing contexts
+ wg.Add(1)
+ cm.Go(func() {
+ defer cm.Enter().Put("f", 7).Exit()
+ assertContents(Map{
+ "f": 7,
+ })
+ wg.Done()
+ })
+ wg.Wait()
+
+ _cm.mxContexts.Lock()
+ assert.Empty(t, _cm.contexts, "No contexts should be left")
+ _cm.mxContexts.Unlock()
+}
+
+func BenchmarkPut(b *testing.B) {
+ cm := NewManager()
+ c := cm.Enter()
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ c.Put("key", "value")
+ }
+}
+
+func BenchmarkAsMap(b *testing.B) {
+ cm := NewManager()
+ cm.Enter().Put("a", 1).Put("b", 2)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ cm.AsMap(nil, true)
+ }
+}
diff --git a/vendor/github.com/getlantern/context/gotrack.go b/vendor/github.com/getlantern/context/gotrack.go
new file mode 100644
index 0000000..7f92346
--- /dev/null
+++ b/vendor/github.com/getlantern/context/gotrack.go
@@ -0,0 +1,130 @@
+package context
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "runtime"
+ "strconv"
+ "sync"
+)
+
+// Sourced https://github.com/bradfitz/http2/blob/dc0c5c000ec33e263612939744d51a3b68b9cece/gotrack.go
+var goroutineSpace = []byte("goroutine ")
+var littleBuf = sync.Pool{
+ New: func() interface{} {
+ buf := make([]byte, 64)
+ return &buf
+ },
+}
+
+func curGoroutineID() uint64 {
+ bp := littleBuf.Get().(*[]byte)
+ defer littleBuf.Put(bp)
+ b := *bp
+ b = b[:runtime.Stack(b, false)]
+ // Parse the 4707 out of "goroutine 4707 ["
+ b = bytes.TrimPrefix(b, goroutineSpace)
+ i := bytes.IndexByte(b, ' ')
+ if i < 0 {
+ panic(fmt.Sprintf("No space found in %q", b))
+ }
+ b = b[:i]
+ n, err := parseUintBytes(b, 10, 64)
+ if err != nil {
+ panic(fmt.Sprintf("Failed to parse goroutine ID out of %q: %v", b, err))
+ }
+ return n
+}
+
+// parseUintBytes is like strconv.ParseUint, but using a []byte.
+func parseUintBytes(s []byte, base int, bitSize int) (n uint64, err error) {
+ var cutoff, maxVal uint64
+
+ if bitSize == 0 {
+ bitSize = int(strconv.IntSize)
+ }
+
+ s0 := s
+ switch {
+ case len(s) < 1:
+ err = strconv.ErrSyntax
+ return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err}
+
+ case 2 <= base && base <= 36:
+ // valid base; nothing to do
+
+ case base == 0:
+ // Look for octal, hex prefix.
+ switch {
+ case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'):
+ base = 16
+ s = s[2:]
+ if len(s) < 1 {
+ err = strconv.ErrSyntax
+ return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err}
+ }
+ case s[0] == '0':
+ base = 8
+ default:
+ base = 10
+ }
+
+ default:
+ err = errors.New("invalid base " + strconv.Itoa(base))
+ return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err}
+ }
+
+ n = 0
+ cutoff = cutoff64(base)
+ maxVal = 1<<uint(bitSize) - 1
+
+ for i := 0; i < len(s); i++ {
+ var v byte
+ d := s[i]
+ switch {
+ case '0' <= d && d <= '9':
+ v = d - '0'
+ case 'a' <= d && d <= 'z':
+ v = d - 'a' + 10
+ case 'A' <= d && d <= 'Z':
+ v = d - 'A' + 10
+ default:
+ n = 0
+ err = strconv.ErrSyntax
+ return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err}
+ }
+ if int(v) >= base {
+ n = 0
+ err = strconv.ErrSyntax
+ return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err}
+ }
+
+ if n >= cutoff {
+ // n*base overflows
+ n = 1<<64 - 1
+ err = strconv.ErrRange
+ return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err}
+ }
+ n *= uint64(base)
+
+ n1 := n + uint64(v)
+ if n1 < n || n1 > maxVal {
+ // n+v overflows
+ n = 1<<64 - 1
+ err = strconv.ErrRange
+ return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err}
+ }
+ n = n1
+ }
+
+ return n, nil
+}
+
+// Return the first number n such that n*base >= 1<<64.
+func cutoff64(base int) uint64 {
+ if base < 2 {
+ return 0
+ }
+ return (1<<64-1)/uint64(base) + 1
+}
diff --git a/vendor/github.com/getlantern/errors/errors.go b/vendor/github.com/getlantern/errors/errors.go
new file mode 100644
index 0000000..8b2b84f
--- /dev/null
+++ b/vendor/github.com/getlantern/errors/errors.go
@@ -0,0 +1,566 @@
+/*
+Package errors defines error types used across Lantern project.
+
+ n, err := Foo()
+ if err != nil {
+ return n, errors.New("Unable to do Foo: %v", err)
+ }
+
+or
+
+ n, err := Foo()
+ return n, errors.Wrap(err)
+
+New() method will create a new error with err as its cause. Wrap will wrap err,
+returning nil if err is nil. If err is an error from Go's standard library,
+errors will extract details from that error, at least the Go type name and the
+return value of err.Error().
+
+One can record the operation on which the error occurred using Op():
+
+ return n, errors.New("Unable to do Foo: %v", err).Op("FooDooer")
+
+One can also record additional data:
+
+ return n, errors.
+ New("Unable to do Foo: %v", err).
+ Op("FooDooer").
+ With("mydata", "myvalue").
+ With("moredata", 5)
+
+When used with github.com/getlantern/ops, Error captures its current context
+and propagates that data for use in calling layers.
+
+When used with github.com/getlantern/golog, Error provides stacktraces:
+
+ Hello World
+ at github.com/getlantern/errors.TestNewWithCause (errors_test.go:999)
+ at testing.tRunner (testing.go:999)
+ at runtime.goexit (asm_amd999.s:999)
+ Caused by: World
+ at github.com/getlantern/errors.buildCause (errors_test.go:999)
+ at github.com/getlantern/errors.TestNewWithCause (errors_test.go:999)
+ at testing.tRunner (testing.go:999)
+ at runtime.goexit (asm_amd999.s:999)
+ Caused by: orld
+ Caused by: ld
+ at github.com/getlantern/errors.buildSubSubCause (errors_test.go:999)
+ at github.com/getlantern/errors.buildSubCause (errors_test.go:999)
+ at github.com/getlantern/errors.buildCause (errors_test.go:999)
+ at github.com/getlantern/errors.TestNewWithCause (errors_test.go:999)
+ at testing.tRunner (testing.go:999)
+ at runtime.goexit (asm_amd999.s:999)
+ Caused by: d
+
+It's the caller's responsibility to avoid race conditions accessing the same
+error instance from multiple goroutines.
+*/
+package errors
+
+import (
+ "bufio"
+ "bytes"
+ "crypto/tls"
+ "crypto/x509"
+ "encoding/hex"
+ "encoding/json"
+ "fmt"
+ "io"
+ "net"
+ "net/http"
+ "net/textproto"
+ "net/url"
+ "os"
+ "os/exec"
+ "reflect"
+ "runtime"
+ "strconv"
+ "strings"
+ "syscall"
+ "time"
+ "unicode"
+
+ "github.com/getlantern/context"
+ "github.com/getlantern/hidden"
+ "github.com/getlantern/ops"
+ "github.com/go-stack/stack"
+)
+
+// Error wraps system and application defined errors in unified structure for
+// reporting and logging. It's not meant to be created directly. User New(),
+// Wrap() and Report() instead.
+type Error interface {
+ error
+ context.Contextual
+
+ // ErrorClean returns a non-parameterized version of the error whenever
+ // possible. For example, if the error text is:
+ //
+ // unable to dial www.google.com caused by: i/o timeout
+ //
+ // ErrorClean might return:
+ //
+ // unable to dial %v caused by: %v
+ //
+ // This can be useful when performing analytics on the error.
+ ErrorClean() string
+
+ // MultiLinePrinter implements the interface golog.MultiLine
+ MultiLinePrinter() func(buf *bytes.Buffer) bool
+
+ // Op attaches a hint of the operation triggers this Error. Many error types
+ // returned by net and os package have Op pre-filled.
+ Op(op string) Error
+
+ // With attaches arbitrary field to the error. keys will be normalized as
+ // underscore_divided_words, so all characters except letters and numbers will
+ // be replaced with underscores, and all letters will be lowercased.
+ With(key string, value interface{}) Error
+
+ // RootCause returns the bottom-most cause of this Error. If the Error
+ // resulted from wrapping a plain error, the wrapped error will be returned as
+ // the cause.
+ RootCause() error
+}
+
+type structured struct {
+ id uint64
+ hiddenID string
+ data context.Map
+ context context.Map
+ wrapped error
+ cause Error
+ callStack stack.CallStack
+}
+
+// New creates an Error with supplied description and format arguments to the
+// description. If any of the arguments is an error, we use that as the cause.
+func New(desc string, args ...interface{}) Error {
+ return NewOffset(1, desc, args...)
+}
+
+// NewOffset is like New but offsets the stack by the given offset. This is
+// useful for utilities like golog that may create errors on behalf of others.
+func NewOffset(offset int, desc string, args ...interface{}) Error {
+ var cause error
+ for _, arg := range args {
+ err, isError := arg.(error)
+ if isError {
+ cause = err
+ break
+ }
+ }
+ e := buildError(desc, fmt.Sprintf(desc, args...), nil, Wrap(cause))
+ e.attachStack(2 + offset)
+ return e
+}
+
+// Wrap creates an Error based on the information in an error instance. It
+// returns nil if the error passed in is nil, so we can simply call
+// errors.Wrap(s.l.Close()) regardless there's an error or not. If the error is
+// already wrapped, it is returned as is.
+func Wrap(err error) Error {
+ return wrapSkipFrames(err, 1)
+}
+
+// Fill implements the method from the context.Contextual interface.
+func (e *structured) Fill(m context.Map) {
+ if e != nil {
+ if e.cause != nil {
+ // Include data from cause, which supercedes context
+ e.cause.Fill(m)
+ }
+ // Include the context, which supercedes the cause
+ for key, value := range e.context {
+ m[key] = value
+ }
+ // Now include the error's data, which supercedes everything
+ for key, value := range e.data {
+ m[key] = value
+ }
+ }
+}
+
+func (e *structured) Op(op string) Error {
+ e.data["error_op"] = op
+ return e
+}
+
+func (e *structured) With(key string, value interface{}) Error {
+ parts := strings.FieldsFunc(key, func(c rune) bool {
+ return !unicode.IsLetter(c) && !unicode.IsNumber(c)
+ })
+ k := strings.ToLower(strings.Join(parts, "_"))
+ if k == "error" || k == "error_op" {
+ // Never overwrite these
+ return e
+ }
+ switch actual := value.(type) {
+ case string, int, bool, time.Time:
+ e.data[k] = actual
+ default:
+ e.data[k] = fmt.Sprint(actual)
+ }
+ return e
+}
+
+func (e *structured) RootCause() error {
+ if e.cause == nil {
+ if e.wrapped != nil {
+ return e.wrapped
+ }
+ return e
+ }
+ return e.cause.RootCause()
+}
+
+func (e *structured) ErrorClean() string {
+ return e.data["error"].(string)
+}
+
+// Error satisfies the error interface
+func (e *structured) Error() string {
+ return e.data["error_text"].(string) + e.hiddenID
+}
+
+func (e *structured) MultiLinePrinter() func(buf *bytes.Buffer) bool {
+ first := true
+ indent := false
+ err := e
+ stackPosition := 0
+ switchedCause := false
+ return func(buf *bytes.Buffer) bool {
+ if indent {
+ buf.WriteString(" ")
+ }
+ if first {
+ buf.WriteString(e.Error())
+ first = false
+ indent = true
+ return true
+ }
+ if switchedCause {
+ fmt.Fprintf(buf, "Caused by: %v", err)
+ if err.callStack != nil && len(err.callStack) > 0 {
+ switchedCause = false
+ indent = true
+ return true
+ }
+ if err.cause == nil {
+ return false
+ }
+ err = err.cause.(*structured)
+ return true
+ }
+ if stackPosition < len(err.callStack) {
+ buf.WriteString("at ")
+ call := err.callStack[stackPosition]
+ fmt.Fprintf(buf, "%+n (%s:%d)", call, call, call)
+ stackPosition++
+ }
+ if stackPosition >= len(err.callStack) {
+ switch cause := err.cause.(type) {
+ case *structured:
+ err = cause
+ indent = false
+ stackPosition = 0
+ switchedCause = true
+ default:
+ return false
+ }
+ }
+ return err != nil
+ }
+}
+
+func wrapSkipFrames(err error, skip int) Error {
+ if err == nil {
+ return nil
+ }
+
+ // Look for *structureds
+ if e, ok := err.(*structured); ok {
+ return e
+ }
+
+ var cause Error
+ // Look for hidden *structureds
+ hiddenIDs, err2 := hidden.Extract(err.Error())
+ if err2 == nil && len(hiddenIDs) > 0 {
+ // Take the first hidden ID as our cause
+ cause = get(hiddenIDs[0])
+ }
+
+ // Create a new *structured
+ return buildError("", "", err, cause)
+}
+
+func (e *structured) attachStack(skip int) {
+ call := stack.Caller(skip)
+ e.callStack = stack.Trace().TrimBelow(call)
+ e.data["error_location"] = fmt.Sprintf("%+n (%s:%d)", call, call, call)
+}
+
+func buildError(desc string, fullText string, wrapped error, cause Error) *structured {
+ e := &structured{
+ data: make(context.Map),
+ // We capture the current context to allow it to propagate to higher layers.
+ context: ops.AsMap(nil, false),
+ wrapped: wrapped,
+ cause: cause,
+ }
+ e.save()
+
+ errorType := "errors.Error"
+ if wrapped != nil {
+ op, goType, wrappedDesc, extra := parseError(wrapped)
+ if desc == "" {
+ desc = wrappedDesc
+ }
+ e.Op(op)
+ errorType = goType
+ if extra != nil {
+ for key, value := range extra {
+ e.data[key] = value
+ }
+ }
+ }
+
+ cleanedDesc := hidden.Clean(desc)
+ e.data["error"] = cleanedDesc
+ if fullText != "" {
+ e.data["error_text"] = hidden.Clean(fullText)
+ } else {
+ e.data["error_text"] = cleanedDesc
+ }
+ e.data["error_type"] = errorType
+
+ return e
+}
+
+func parseError(err error) (op string, goType string, desc string, extra map[string]string) {
+ extra = make(map[string]string)
+
+ // interfaces
+ if _, ok := err.(net.Error); ok {
+ if opError, ok := err.(*net.OpError); ok {
+ op = opError.Op
+ if opError.Source != nil {
+ extra["remote_addr"] = opError.Source.String()
+ }
+ if opError.Addr != nil {
+ extra["local_addr"] = opError.Addr.String()
+ }
+ extra["network"] = opError.Net
+ err = opError.Err
+ }
+ switch actual := err.(type) {
+ case *net.AddrError:
+ goType = "net.AddrError"
+ desc = actual.Err
+ extra["addr"] = actual.Addr
+ case *net.DNSError:
+ goType = "net.DNSError"
+ desc = actual.Err
+ extra["domain"] = actual.Name
+ if actual.Server != "" {
+ extra["dns_server"] = actual.Server
+ }
+ case *net.InvalidAddrError:
+ goType = "net.InvalidAddrError"
+ desc = actual.Error()
+ case *net.ParseError:
+ goType = "net.ParseError"
+ desc = "invalid " + actual.Type
+ extra["text_to_parse"] = actual.Text
+ case net.UnknownNetworkError:
+ goType = "net.UnknownNetworkError"
+ desc = "unknown network"
+ case syscall.Errno:
+ goType = "syscall.Errno"
+ desc = actual.Error()
+ case *url.Error:
+ goType = "url.Error"
+ desc = actual.Err.Error()
+ op = actual.Op
+ default:
+ goType = reflect.TypeOf(err).String()
+ desc = err.Error()
+ }
+ return
+ }
+ if _, ok := err.(runtime.Error); ok {
+ desc = err.Error()
+ switch err.(type) {
+ case *runtime.TypeAssertionError:
+ goType = "runtime.TypeAssertionError"
+ default:
+ goType = reflect.TypeOf(err).String()
+ }
+ return
+ }
+
+ // structs
+ switch actual := err.(type) {
+ case *http.ProtocolError:
+ desc = actual.ErrorString
+ if name, ok := httpProtocolErrors[err]; ok {
+ goType = name
+ } else {
+ goType = "http.ProtocolError"
+ }
+ case url.EscapeError, *url.EscapeError:
+ goType = "url.EscapeError"
+ desc = "invalid URL escape"
+ case url.InvalidHostError, *url.InvalidHostError:
+ goType = "url.InvalidHostError"
+ desc = "invalid character in host name"
+ case *textproto.Error:
+ goType = "textproto.Error"
+ desc = actual.Error()
+ case textproto.ProtocolError, *textproto.ProtocolError:
+ goType = "textproto.ProtocolError"
+ desc = actual.Error()
+
+ case tls.RecordHeaderError:
+ goType = "tls.RecordHeaderError"
+ desc = actual.Msg
+ extra["header"] = hex.EncodeToString(actual.RecordHeader[:])
+ case x509.CertificateInvalidError:
+ goType = "x509.CertificateInvalidError"
+ desc = actual.Error()
+ case x509.ConstraintViolationError:
+ goType = "x509.ConstraintViolationError"
+ desc = actual.Error()
+ case x509.HostnameError:
+ goType = "x509.HostnameError"
+ desc = actual.Error()
+ extra["host"] = actual.Host
+ case x509.InsecureAlgorithmError:
+ goType = "x509.InsecureAlgorithmError"
+ desc = actual.Error()
+ case x509.SystemRootsError:
+ goType = "x509.SystemRootsError"
+ desc = actual.Error()
+ case x509.UnhandledCriticalExtension:
+ goType = "x509.UnhandledCriticalExtension"
+ desc = actual.Error()
+ case x509.UnknownAuthorityError:
+ goType = "x509.UnknownAuthorityError"
+ desc = actual.Error()
+ case hex.InvalidByteError:
+ goType = "hex.InvalidByteError"
+ desc = "invalid byte"
+ case *json.InvalidUTF8Error:
+ goType = "json.InvalidUTF8Error"
+ desc = "invalid UTF-8 in string"
+ case *json.InvalidUnmarshalError:
+ goType = "json.InvalidUnmarshalError"
+ desc = actual.Error()
+ case *json.MarshalerError:
+ goType = "json.MarshalerError"
+ desc = actual.Error()
+ case *json.SyntaxError:
+ goType = "json.SyntaxError"
+ desc = actual.Error()
+ case *json.UnmarshalFieldError:
+ goType = "json.UnmarshalFieldError"
+ desc = actual.Error()
+ case *json.UnmarshalTypeError:
+ goType = "json.UnmarshalTypeError"
+ desc = actual.Error()
+ case *json.UnsupportedTypeError:
+ goType = "json.UnsupportedTypeError"
+ desc = actual.Error()
+ case *json.UnsupportedValueError:
+ goType = "json.UnsupportedValueError"
+ desc = actual.Error()
+
+ case *os.LinkError:
+ goType = "os.LinkError"
+ desc = actual.Error()
+ case *os.PathError:
+ goType = "os.PathError"
+ op = actual.Op
+ desc = actual.Err.Error()
+ case *os.SyscallError:
+ goType = "os.SyscallError"
+ op = actual.Syscall
+ desc = actual.Err.Error()
+ case *exec.Error:
+ goType = "exec.Error"
+ desc = actual.Err.Error()
+ case *exec.ExitError:
+ goType = "exec.ExitError"
+ desc = actual.Error()
+ // TODO: limit the length
+ extra["stderr"] = string(actual.Stderr)
+ case *strconv.NumError:
+ goType = "strconv.NumError"
+ desc = actual.Err.Error()
+ extra["function"] = actual.Func
+ case *time.ParseError:
+ goType = "time.ParseError"
+ desc = actual.Message
+ default:
+ desc = err.Error()
+ if t, ok := miscErrors[err]; ok {
+ goType = t
+ return
+ }
+ goType = reflect.TypeOf(err).String()
+ }
+ return
+}
+
+var httpProtocolErrors = map[error]string{
+ http.ErrHeaderTooLong: "http.ErrHeaderTooLong",
+ http.ErrShortBody: "http.ErrShortBody",
+ http.ErrNotSupported: "http.ErrNotSupported",
+ http.ErrUnexpectedTrailer: "http.ErrUnexpectedTrailer",
+ http.ErrMissingContentLength: "http.ErrMissingContentLength",
+ http.ErrNotMultipart: "http.ErrNotMultipart",
+ http.ErrMissingBoundary: "http.ErrMissingBoundary",
+}
+
+var miscErrors = map[error]string{
+ bufio.ErrInvalidUnreadByte: "bufio.ErrInvalidUnreadByte",
+ bufio.ErrInvalidUnreadRune: "bufio.ErrInvalidUnreadRune",
+ bufio.ErrBufferFull: "bufio.ErrBufferFull",
+ bufio.ErrNegativeCount: "bufio.ErrNegativeCount",
+ bufio.ErrTooLong: "bufio.ErrTooLong",
+ bufio.ErrNegativeAdvance: "bufio.ErrNegativeAdvance",
+ bufio.ErrAdvanceTooFar: "bufio.ErrAdvanceTooFar",
+ bufio.ErrFinalToken: "bufio.ErrFinalToken",
+
+ http.ErrWriteAfterFlush: "http.ErrWriteAfterFlush",
+ http.ErrBodyNotAllowed: "http.ErrBodyNotAllowed",
+ http.ErrHijacked: "http.ErrHijacked",
+ http.ErrContentLength: "http.ErrContentLength",
+ http.ErrBodyReadAfterClose: "http.ErrBodyReadAfterClose",
+ http.ErrHandlerTimeout: "http.ErrHandlerTimeout",
+ http.ErrLineTooLong: "http.ErrLineTooLong",
+ http.ErrMissingFile: "http.ErrMissingFile",
+ http.ErrNoCookie: "http.ErrNoCookie",
+ http.ErrNoLocation: "http.ErrNoLocation",
+ http.ErrSkipAltProtocol: "http.ErrSkipAltProtocol",
+
+ io.EOF: "io.EOF",
+ io.ErrClosedPipe: "io.ErrClosedPipe",
+ io.ErrNoProgress: "io.ErrNoProgress",
+ io.ErrShortBuffer: "io.ErrShortBuffer",
+ io.ErrShortWrite: "io.ErrShortWrite",
+ io.ErrUnexpectedEOF: "io.ErrUnexpectedEOF",
+
+ os.ErrInvalid: "os.ErrInvalid",
+ os.ErrPermission: "os.ErrPermission",
+ os.ErrExist: "os.ErrExist",
+ os.ErrNotExist: "os.ErrNotExist",
+
+ exec.ErrNotFound: "exec.ErrNotFound",
+
+ x509.ErrUnsupportedAlgorithm: "x509.ErrUnsupportedAlgorithm",
+ x509.IncorrectPasswordError: "x509.IncorrectPasswordError",
+
+ hex.ErrLength: "hex.ErrLength",
+}
diff --git a/vendor/github.com/getlantern/errors/errors_test.go b/vendor/github.com/getlantern/errors/errors_test.go
new file mode 100644
index 0000000..7c4887a
--- /dev/null
+++ b/vendor/github.com/getlantern/errors/errors_test.go
@@ -0,0 +1,142 @@
+package errors
+
+import (
+ "bytes"
+ "fmt"
+ "regexp"
+ "testing"
+
+ "github.com/getlantern/context"
+ "github.com/getlantern/hidden"
+ "github.com/getlantern/ops"
+ "github.com/stretchr/testify/assert"
+)
+
+var (
+ replaceNumbers = regexp.MustCompile("[0-9]+")
+)
+
+func TestFull(t *testing.T) {
+ var firstErr Error
+
+ // Iterate past the size of the hidden buffer
+ for i := 0; i < len(hiddenErrors)*2; i++ {
+ op := ops.Begin("op1").Set("ca", 100).Set("cd", 100)
+ e := New("Hello %v", "There").Op("My Op").With("DaTa_1", 1)
+ op.End()
+ if firstErr == nil {
+ firstErr = e
+ }
+ assert.Equal(t, "Hello There", e.Error()[:11])
+ op = ops.Begin("op2").Set("ca", 200).Set("cb", 200).Set("cc", 200)
+ e3 := Wrap(fmt.Errorf("I'm wrapping your text: %v", e)).Op("outer op").With("dATA+1", i).With("cb", 300)
+ op.End()
+ assert.Equal(t, e, e3.(*structured).cause, "Wrapping a regular error should have extracted the contained *Error")
+ m := make(context.Map)
+ e3.Fill(m)
+ assert.Equal(t, i, m["data_1"], "Error's data should dominate all")
+ assert.Equal(t, 200, m["ca"], "Error's context should dominate cause")
+ assert.Equal(t, 300, m["cb"], "Error's data should dominate its context")
+ assert.Equal(t, 200, m["cc"], "Error's context should come through")
+ assert.Equal(t, 100, m["cd"], "Cause's context should come through")
+ assert.Equal(t, "My Op", e.(*structured).data["error_op"], "Op should be available from cause")
+
+ for _, call := range e3.(*structured).callStack {
+ t.Logf("at %v", call)
+ }
+ }
+
+ e3 := Wrap(fmt.Errorf("I'm wrapping your text: %v", firstErr)).With("a", 2)
+ assert.Nil(t, e3.(*structured).cause, "Wrapping an *Error that's no longer buffered should have yielded no cause")
+}
+
+func TestNewWithCause(t *testing.T) {
+ cause := buildCause()
+ outer := New("Hello %v", cause)
+ assert.Equal(t, "Hello World", hidden.Clean(outer.Error()))
+ assert.Equal(t, "Hello %v", outer.(*structured).ErrorClean())
+ assert.Equal(t,
+ "github.com/getlantern/errors.TestNewWithCause (errors_test.go:999)",
+ replaceNumbers.ReplaceAllString(outer.(*structured).data["error_location"].(string), "999"))
+ assert.Equal(t, cause, outer.(*structured).cause)
+
+ // Make sure that stacktrace prints out okay
+ buf := &bytes.Buffer{}
+ print := outer.MultiLinePrinter()
+ for {
+ more := print(buf)
+ buf.WriteByte('\n')
+ if !more {
+ break
+ }
+ }
+ expected := `Hello World
+ at github.com/getlantern/errors.TestNewWithCause (errors_test.go:999)
+ at testing.tRunner (testing.go:999)
+ at runtime.goexit (asm_amd999.s:999)
+Caused by: World
+ at github.com/getlantern/errors.buildCause (errors_test.go:999)
+ at github.com/getlantern/errors.TestNewWithCause (errors_test.go:999)
+ at testing.tRunner (testing.go:999)
+ at runtime.goexit (asm_amd999.s:999)
+Caused by: orld
+Caused by: ld
+ at github.com/getlantern/errors.buildSubSubCause (errors_test.go:999)
+ at github.com/getlantern/errors.buildSubCause (errors_test.go:999)
+ at github.com/getlantern/errors.buildCause (errors_test.go:999)
+ at github.com/getlantern/errors.TestNewWithCause (errors_test.go:999)
+ at testing.tRunner (testing.go:999)
+ at runtime.goexit (asm_amd999.s:999)
+Caused by: d
+`
+
+ assert.Equal(t, expected, replaceNumbers.ReplaceAllString(hidden.Clean(buf.String()), "999"))
+ assert.Equal(t, buildSubSubSubCause(), outer.RootCause())
+}
+
+func buildCause() Error {
+ return New("W%v", buildSubCause())
+}
+
+func buildSubCause() error {
+ return fmt.Errorf("or%v", buildSubSubCause())
+}
+
+func buildSubSubCause() error {
+ return New("l%v", buildSubSubSubCause())
+}
+
+func buildSubSubSubCause() error {
+ return fmt.Errorf("d")
+}
+
+func TestWrapNil(t *testing.T) {
+ assert.Nil(t, doWrapNil())
+}
+
+func doWrapNil() error {
+ return Wrap(nil)
+}
+
+func TestHiddenWithCause(t *testing.T) {
+ e1 := fmt.Errorf("I failed %v", "dude")
+ e2 := New("I wrap: %v", e1)
+ e3 := fmt.Errorf("Hiding %v", e2)
+ // clear hidden buffer
+ hiddenErrors = make([]*structured, 100)
+ e4 := Wrap(e3)
+ e5 := New("I'm really outer: %v", e4)
+
+ buf := &bytes.Buffer{}
+ print := e5.MultiLinePrinter()
+ for {
+ more := print(buf)
+ buf.WriteByte('\n')
+ if !more {
+ break
+ }
+ }
+ fmt.Println(buf.String())
+ // We're not asserting the output because we're just making sure that printing
+ // doesn't panic. If we get to this point without panicking, we're happy.
+}
diff --git a/vendor/github.com/getlantern/errors/hide.go b/vendor/github.com/getlantern/errors/hide.go
new file mode 100644
index 0000000..f10d863
--- /dev/null
+++ b/vendor/github.com/getlantern/errors/hide.go
@@ -0,0 +1,50 @@
+package errors
+
+import (
+ "encoding/binary"
+ "sync"
+
+ "github.com/getlantern/hidden"
+)
+
+var (
+ hiddenErrors = make([]*structured, 100)
+ nextID = uint64(0)
+ hiddenMutex sync.RWMutex
+)
+
+// This trick saves the error to a ring buffer and embeds a non-printing
+// hiddenID in the error's description, so that if the errors is later wrapped
+// by a standard error using something like
+// fmt.Errorf("An error occurred: %v", thisError), we can subsequently extract
+// the error simply using the hiddenID in the string.
+func (e *structured) save() {
+ hiddenMutex.Lock()
+ b := make([]byte, 8)
+ binary.BigEndian.PutUint64(b, nextID)
+ e.id = nextID
+ e.hiddenID = hidden.ToString(b)
+ hiddenErrors[idxForID(nextID)] = e
+ nextID++
+ hiddenMutex.Unlock()
+}
+
+func get(hiddenID []byte) Error {
+ if len(hiddenID) != 8 {
+ return nil
+ }
+ id := binary.BigEndian.Uint64(hiddenID)
+ hiddenMutex.RLock()
+ err := hiddenErrors[idxForID(id)]
+ hiddenMutex.RUnlock()
+ if err != nil && err.id == id {
+ // Found it!
+ return err
+ }
+ // buffer has rolled over
+ return nil
+}
+
+func idxForID(id uint64) int {
+ return int(id % uint64(len(hiddenErrors)))
+}
diff --git a/vendor/github.com/getlantern/golog/LICENSE b/vendor/github.com/getlantern/golog/LICENSE
new file mode 100644
index 0000000..3ee0162
--- /dev/null
+++ b/vendor/github.com/getlantern/golog/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2014 Brave New Software Project, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/vendor/github.com/getlantern/golog/README.md b/vendor/github.com/getlantern/golog/README.md
new file mode 100644
index 0000000..88fe677
--- /dev/null
+++ b/vendor/github.com/getlantern/golog/README.md
@@ -0,0 +1,6 @@
+golog [![Travis CI Status](https://travis-ci.org/getlantern/golog.svg?branch=master)](https://travis-ci.org/getlantern/golog)&nbsp;[![Coverage Status](https://coveralls.io/repos/getlantern/golog/badge.png)](https://coveralls.io/r/getlantern/golog)&nbsp;[![GoDoc](https://godoc.org/github.com/getlantern/golog?status.png)](http://godoc.org/github.com/getlantern/golog)
+==========
+Provides logging used in many getlantern components.
+
+[GoDoc](https://godoc.org/github.com/getlantern/golog)
+
diff --git a/vendor/github.com/getlantern/golog/golog.go b/vendor/github.com/getlantern/golog/golog.go
new file mode 100644
index 0000000..143e904
--- /dev/null
+++ b/vendor/github.com/getlantern/golog/golog.go
@@ -0,0 +1,458 @@
+// Package golog implements logging functions that log errors to stderr and
+// debug messages to stdout. Trace logging is also supported.
+// Trace logs go to stdout as well, but they are only written if the program
+// is run with environment variable "TRACE=true".
+// A stack dump will be printed after the message if "PRINT_STACK=true".
+package golog
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "log"
+ "os"
+ "path/filepath"
+ "runtime"
+ "sort"
+ "strconv"
+ "strings"
+ "sync"
+ "sync/atomic"
+
+ "github.com/getlantern/errors"
+ "github.com/getlantern/hidden"
+ "github.com/getlantern/ops"
+ "github.com/oxtoacart/bpool"
+)
+
+const (
+ // ERROR is an error Severity
+ ERROR = 500
+
+ // FATAL is an error Severity
+ FATAL = 600
+)
+
+var (
+ outs atomic.Value
+ reporters []ErrorReporter
+ reportersMutex sync.RWMutex
+
+ bufferPool = bpool.NewBufferPool(200)
+
+ onFatal atomic.Value
+)
+
+// Severity is a level of error (higher values are more severe)
+type Severity int
+
+func (s Severity) String() string {
+ switch s {
+ case ERROR:
+ return "ERROR"
+ case FATAL:
+ return "FATAL"
+ default:
+ return "UNKNOWN"
+ }
+}
+
+func init() {
+ DefaultOnFatal()
+ ResetOutputs()
+}
+
+func SetOutputs(errorOut io.Writer, debugOut io.Writer) {
+ outs.Store(&outputs{
+ ErrorOut: errorOut,
+ DebugOut: debugOut,
+ })
+}
+
+func ResetOutputs() {
+ SetOutputs(os.Stderr, os.Stdout)
+}
+
+func GetOutputs() *outputs {
+ return outs.Load().(*outputs)
+}
+
+// RegisterReporter registers the given ErrorReporter. All logged Errors are
+// sent to this reporter.
+func RegisterReporter(reporter ErrorReporter) {
+ reportersMutex.Lock()
+ reporters = append(reporters, reporter)
+ reportersMutex.Unlock()
+}
+
+// OnFatal configures golog to call the given function on any FATAL error. By
+// default, golog calls os.Exit(1) on any FATAL error.
+func OnFatal(fn func(err error)) {
+ onFatal.Store(fn)
+}
+
+// DefaultOnFatal enables the default behavior for OnFatal
+func DefaultOnFatal() {
+ onFatal.Store(func(err error) {
+ os.Exit(1)
+ })
+}
+
+type outputs struct {
+ ErrorOut io.Writer
+ DebugOut io.Writer
+}
+
+// MultiLine is an interface for arguments that support multi-line output.
+type MultiLine interface {
+ // MultiLinePrinter returns a function that can be used to print the
+ // multi-line output. The returned function writes one line to the buffer and
+ // returns true if there are more lines to write. This function does not need
+ // to take care of trailing carriage returns, golog handles that
+ // automatically.
+ MultiLinePrinter() func(buf *bytes.Buffer) bool
+}
+
+// ErrorReporter is a function to which the logger will report errors.
+// It the given error and corresponding message along with associated ops
+// context. This should return quickly as it executes on the critical code
+// path. The recommended approach is to buffer as much as possible and discard
+// new reports if the buffer becomes saturated.
+type ErrorReporter func(err error, linePrefix string, severity Severity, ctx map[string]interface{})
+
+type Logger interface {
+ // Debug logs to stdout
+ Debug(arg interface{})
+ // Debugf logs to stdout
+ Debugf(message string, args ...interface{})
+
+ // Error logs to stderr
+ Error(arg interface{}) error
+ // Errorf logs to stderr. It returns the first argument that's an error, or
+ // a new error built using fmt.Errorf if none of the arguments are errors.
+ Errorf(message string, args ...interface{}) error
+
+ // Fatal logs to stderr and then exits with status 1
+ Fatal(arg interface{})
+ // Fatalf logs to stderr and then exits with status 1
+ Fatalf(message string, args ...interface{})
+
+ // Trace logs to stderr only if TRACE=true
+ Trace(arg interface{})
+ // Tracef logs to stderr only if TRACE=true
+ Tracef(message string, args ...interface{})
+
+ // TraceOut provides access to an io.Writer to which trace information can
+ // be streamed. If running with environment variable "TRACE=true", TraceOut
+ // will point to os.Stderr, otherwise it will point to a ioutil.Discared.
+ // Each line of trace information will be prefixed with this Logger's
+ // prefix.
+ TraceOut() io.Writer
+
+ // IsTraceEnabled() indicates whether or not tracing is enabled for this
+ // logger.
+ IsTraceEnabled() bool
+
+ // AsStdLogger returns an standard logger
+ AsStdLogger() *log.Logger
+}
+
+func LoggerFor(prefix string) Logger {
+ l := &logger{
+ prefix: prefix + ": ",
+ pc: make([]uintptr, 10),
+ }
+
+ trace := os.Getenv("TRACE")
+ l.traceOn, _ = strconv.ParseBool(trace)
+ if !l.traceOn {
+ prefixes := strings.Split(trace, ",")
+ for _, p := range prefixes {
+ if prefix == strings.Trim(p, " ") {
+ l.traceOn = true
+ break
+ }
+ }
+ }
+ if l.traceOn {
+ l.traceOut = l.newTraceWriter()
+ } else {
+ l.traceOut = ioutil.Discard
+ }
+
+ printStack := os.Getenv("PRINT_STACK")
+ l.printStack, _ = strconv.ParseBool(printStack)
+
+ return l
+}
+
+type logger struct {
+ prefix string
+ traceOn bool
+ traceOut io.Writer
+ printStack bool
+ outs atomic.Value
+ pc []uintptr
+ funcForPc *runtime.Func
+}
+
+// attaches the file and line number corresponding to
+// the log message
+func (l *logger) linePrefix(skipFrames int) string {
+ runtime.Callers(skipFrames, l.pc)
+ funcForPc := runtime.FuncForPC(l.pc[0])
+ file, line := funcForPc.FileLine(l.pc[0] - 1)
+ return fmt.Sprintf("%s%s:%d ", l.prefix, filepath.Base(file), line)
+}
+
+func (l *logger) print(out io.Writer, skipFrames int, severity string, arg interface{}) string {
+ buf := bufferPool.Get()
+ defer bufferPool.Put(buf)
+
+ linePrefix := l.linePrefix(skipFrames)
+ writeHeader := func() {
+ buf.WriteString(severity)
+ buf.WriteString(" ")
+ buf.WriteString(linePrefix)
+ }
+ if arg != nil {
+ ml, isMultiline := arg.(MultiLine)
+ if !isMultiline {
+ writeHeader()
+ fmt.Fprintf(buf, "%v", arg)
+ printContext(buf, arg)
+ buf.WriteByte('\n')
+ } else {
+ mlp := ml.MultiLinePrinter()
+ first := true
+ for {
+ writeHeader()
+ more := mlp(buf)
+ if first {
+ printContext(buf, arg)
+ first = false
+ }
+ buf.WriteByte('\n')
+ if !more {
+ break
+ }
+ }
+ }
+ }
+ b := []byte(hidden.Clean(buf.String()))
+ _, err := out.Write(b)
+ if err != nil {
+ errorOnLogging(err)
+ }
+ if l.printStack {
+ l.doPrintStack()
+ }
+
+ return linePrefix
+}
+
+func (l *logger) printf(out io.Writer, skipFrames int, severity string, err error, message string, args ...interface{}) string {
+ buf := bufferPool.Get()
+ defer bufferPool.Put(buf)
+
+ linePrefix := l.linePrefix(skipFrames)
+ buf.WriteString(severity)
+ buf.WriteString(" ")
+ buf.WriteString(linePrefix)
+ fmt.Fprintf(buf, message, args...)
+ printContext(buf, err)
+ buf.WriteByte('\n')
+ b := []byte(hidden.Clean(buf.String()))
+ _, err2 := out.Write(b)
+ if err2 != nil {
+ errorOnLogging(err)
+ }
+ if l.printStack {
+ l.doPrintStack()
+ }
+ return linePrefix
+}
+
+func (l *logger) Debug(arg interface{}) {
+ l.print(GetOutputs().DebugOut, 4, "DEBUG", arg)
+}
+
+func (l *logger) Debugf(message string, args ...interface{}) {
+ l.printf(GetOutputs().DebugOut, 4, "DEBUG", nil, message, args...)
+}
+
+func (l *logger) Error(arg interface{}) error {
+ return l.errorSkipFrames(arg, 1, ERROR)
+}
+
+func (l *logger) Errorf(message string, args ...interface{}) error {
+ return l.errorSkipFrames(errors.NewOffset(1, message, args...), 1, ERROR)
+}
+
+func (l *logger) Fatal(arg interface{}) {
+ fatal(l.errorSkipFrames(arg, 1, FATAL))
+}
+
+func (l *logger) Fatalf(message string, args ...interface{}) {
+ fatal(l.errorSkipFrames(errors.NewOffset(1, message, args...), 1, FATAL))
+}
+
+func fatal(err error) {
+ fn := onFatal.Load().(func(err error))
+ fn(err)
+}
+
+func (l *logger) errorSkipFrames(arg interface{}, skipFrames int, severity Severity) error {
+ var err error
+ switch e := arg.(type) {
+ case error:
+ err = e
+ default:
+ err = fmt.Errorf("%v", e)
+ }
+ linePrefix := l.print(GetOutputs().ErrorOut, skipFrames+4, severity.String(), err)
+ return report(err, linePrefix, severity)
+}
+
+func (l *logger) Trace(arg interface{}) {
+ if l.traceOn {
+ l.print(GetOutputs().DebugOut, 4, "TRACE", arg)
+ }
+}
+
+func (l *logger) Tracef(message string, args ...interface{}) {
+ if l.traceOn {
+ l.printf(GetOutputs().DebugOut, 4, "TRACE", nil, message, args...)
+ }
+}
+
+func (l *logger) TraceOut() io.Writer {
+ return l.traceOut
+}
+
+func (l *logger) IsTraceEnabled() bool {
+ return l.traceOn
+}
+
+func (l *logger) newTraceWriter() io.Writer {
+ pr, pw := io.Pipe()
+ br := bufio.NewReader(pr)
+
+ if !l.traceOn {
+ return pw
+ }
+ go func() {
+ defer func() {
+ if err := pr.Close(); err != nil {
+ errorOnLogging(err)
+ }
+ }()
+ defer func() {
+ if err := pw.Close(); err != nil {
+ errorOnLogging(err)
+ }
+ }()
+
+ for {
+ line, err := br.ReadString('\n')
+ if err == nil {
+ // Log the line (minus the trailing newline)
+ l.print(GetOutputs().DebugOut, 6, "TRACE", line[:len(line)-1])
+ } else {
+ l.printf(GetOutputs().DebugOut, 6, "TRACE", nil, "TraceWriter closed due to unexpected error: %v", err)
+ return
+ }
+ }
+ }()
+
+ return pw
+}
+
+type errorWriter struct {
+ l *logger
+}
+
+// Write implements method of io.Writer, due to different call depth,
+// it will not log correct file and line prefix
+func (w *errorWriter) Write(p []byte) (n int, err error) {
+ s := string(p)
+ if s[len(s)-1] == '\n' {
+ s = s[:len(s)-1]
+ }
+ w.l.print(GetOutputs().ErrorOut, 6, "ERROR", s)
+ return len(p), nil
+}
+
+func (l *logger) AsStdLogger() *log.Logger {
+ return log.New(&errorWriter{l}, "", 0)
+}
+
+func (l *logger) doPrintStack() {
+ var b []byte
+ buf := bytes.NewBuffer(b)
+ for _, pc := range l.pc {
+ funcForPc := runtime.FuncForPC(pc)
+ if funcForPc == nil {
+ break
+ }
+ name := funcForPc.Name()
+ if strings.HasPrefix(name, "runtime.") {
+ break
+ }
+ file, line := funcForPc.FileLine(pc)
+ fmt.Fprintf(buf, "\t%s\t%s: %d\n", name, file, line)
+ }
+ if _, err := buf.WriteTo(os.Stderr); err != nil {
+ errorOnLogging(err)
+ }
+}
+
+func errorOnLogging(err error) {
+ fmt.Fprintf(os.Stderr, "Unable to log: %v\n", err)
+}
+
+func printContext(buf *bytes.Buffer, err interface{}) {
+ // Note - we don't include globals when printing in order to avoid polluting the text log
+ values := ops.AsMap(err, false)
+ if len(values) == 0 {
+ return
+ }
+ buf.WriteString(" [")
+ var keys []string
+ for key := range values {
+ keys = append(keys, key)
+ }
+ sort.Strings(keys)
+ for i, key := range keys {
+ value := values[key]
+ if i > 0 {
+ buf.WriteString(" ")
+ }
+ buf.WriteString(key)
+ buf.WriteString("=")
+ fmt.Fprintf(buf, "%v", value)
+ }
+ buf.WriteByte(']')
+}
+
+func report(err error, linePrefix string, severity Severity) error {
+ var reportersCopy []ErrorReporter
+ reportersMutex.RLock()
+ if len(reporters) > 0 {
+ reportersCopy = make([]ErrorReporter, len(reporters))
+ copy(reportersCopy, reporters)
+ }
+ reportersMutex.RUnlock()
+
+ if len(reportersCopy) > 0 {
+ ctx := ops.AsMap(err, true)
+ ctx["severity"] = severity.String()
+ for _, reporter := range reportersCopy {
+ // We include globals when reporting
+ reporter(err, linePrefix, severity, ctx)
+ }
+ }
+ return err
+}
diff --git a/vendor/github.com/getlantern/golog/golog_test.go b/vendor/github.com/getlantern/golog/golog_test.go
new file mode 100644
index 0000000..bce36e8
--- /dev/null
+++ b/vendor/github.com/getlantern/golog/golog_test.go
@@ -0,0 +1,224 @@
+package golog
+
+import (
+ "bytes"
+ "io"
+ "io/ioutil"
+ "os"
+ "regexp"
+ "strings"
+ "sync"
+ "testing"
+ "time"
+
+ "github.com/getlantern/errors"
+ "github.com/getlantern/ops"
+
+ "github.com/stretchr/testify/assert"
+)
+
+var (
+ expectedLog = "SEVERITY myprefix: golog_test.go:999 Hello world\nSEVERITY myprefix: golog_test.go:999 Hello true [cvarA=a cvarB=b op=name root_op=name]\n"
+ expectedErrorLog = `ERROR myprefix: golog_test.go:999 Hello world [cvarC=c cvarD=d error=Hello %v error_location=github.com/getlantern/golog.TestError (golog_test.go:999) error_text=Hello world error_type=errors.Error op=name root_op=name]
+ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.TestError (golog_test.go:999)
+ERROR myprefix: golog_test.go:999 at testing.tRunner (testing.go:999)
+ERROR myprefix: golog_test.go:999 at runtime.goexit (asm_amd999.s:999)
+ERROR myprefix: golog_test.go:999 Caused by: world
+ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.errorReturner (golog_test.go:999)
+ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.TestError (golog_test.go:999)
+ERROR myprefix: golog_test.go:999 at testing.tRunner (testing.go:999)
+ERROR myprefix: golog_test.go:999 at runtime.goexit (asm_amd999.s:999)
+ERROR myprefix: golog_test.go:999 Hello true [cvarA=a cvarB=b cvarC=c error=%v %v error_location=github.com/getlantern/golog.TestError (golog_test.go:999) error_text=Hello true error_type=errors.Error op=name999 root_op=name999]
+ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.TestError (golog_test.go:999)
+ERROR myprefix: golog_test.go:999 at testing.tRunner (testing.go:999)
+ERROR myprefix: golog_test.go:999 at runtime.goexit (asm_amd999.s:999)
+ERROR myprefix: golog_test.go:999 Caused by: Hello
+ERROR myprefix: golog_test.go:999 at github.com/getlantern/golog.TestError (golog_test.go:999)
+ERROR myprefix: golog_test.go:999 at testing.tRunner (testing.go:999)
+ERROR myprefix: golog_test.go:999 at runtime.goexit (asm_amd999.s:999)
+`
+ expectedTraceLog = "TRACE myprefix: golog_test.go:999 Hello world\nTRACE myprefix: golog_test.go:999 Hello true\nTRACE myprefix: golog_test.go:999 Gravy\nTRACE myprefix: golog_test.go:999 TraceWriter closed due to unexpected error: EOF\n"
+ expectedStdLog = expectedLog
+)
+
+var (
+ replaceNumbers = regexp.MustCompile("[0-9]+")
+)
+
+func init() {
+ ops.SetGlobal("global", "shouldn't show up")
+}
+
+func expected(severity string, log string) string {
+ return strings.Replace(log, "SEVERITY", severity, -1)
+}
+
+func normalized(log string) string {
+ return replaceNumbers.ReplaceAllString(log, "999")
+}
+
+func TestReport(t *testing.T) {
+ SetOutputs(ioutil.Discard, ioutil.Discard)
+ OnFatal(func(err error) {
+ // ignore (prevents test from exiting)
+ })
+
+ errors := 0
+ fatals := 0
+ RegisterReporter(func(err error, linePrefix string, severity Severity, ctx map[string]interface{}) {
+ switch severity {
+ case ERROR:
+ errors++
+ case FATAL:
+ fatals++
+ }
+ })
+ l := LoggerFor("reporting")
+ l.Error("Some error")
+ l.Fatal("Fatal error")
+ assert.Equal(t, 1, errors)
+ assert.Equal(t, 1, fatals)
+}
+
+func TestDebug(t *testing.T) {
+ out := newBuffer()
+ SetOutputs(ioutil.Discard, out)
+ l := LoggerFor("myprefix")
+ l.Debug("Hello world")
+ defer ops.Begin("name").Set("cvarA", "a").Set("cvarB", "b").End()
+ l.Debugf("Hello %v", true)
+ assert.Equal(t, expected("DEBUG", expectedLog), out.String())
+}
+
+func TestError(t *testing.T) {
+ out := newBuffer()
+ SetOutputs(out, ioutil.Discard)
+ l := LoggerFor("myprefix")
+ ctx := ops.Begin("name").Set("cvarC", "c")
+ err := errorReturner()
+ err1 := errors.New("Hello %v", err)
+ err2 := errors.New("Hello")
+ ctx.End()
+ l.Error(err1)
+ defer ops.Begin("name2").Set("cvarA", "a").Set("cvarB", "b").End()
+ l.Errorf("%v %v", err2, true)
+ t.Log(out.String())
+ assert.Equal(t, expectedErrorLog, out.String())
+}
+
+func errorReturner() error {
+ defer ops.Begin("name").Set("cvarD", "d").End()
+ return errors.New("world")
+}
+
+func TestTraceEnabled(t *testing.T) {
+ originalTrace := os.Getenv("TRACE")
+ err := os.Setenv("TRACE", "true")
+ if err != nil {
+ t.Fatalf("Unable to set trace to true")
+ }
+ defer func() {
+ if err := os.Setenv("TRACE", originalTrace); err != nil {
+ t.Fatalf("Unable to set TRACE environment variable: %v", err)
+ }
+ }()
+
+ out := newBuffer()
+ SetOutputs(ioutil.Discard, out)
+ l := LoggerFor("myprefix")
+ l.Trace("Hello world")
+ l.Tracef("Hello %v", true)
+ tw := l.TraceOut()
+ if _, err := tw.Write([]byte("Gravy\n")); err != nil {
+ t.Fatalf("Unable to write: %v", err)
+ }
+ if err := tw.(io.Closer).Close(); err != nil {
+ t.Fatalf("Unable to close: %v", err)
+ }
+
+ // Give trace writer a moment to catch up
+ time.Sleep(50 * time.Millisecond)
+ assert.Regexp(t, expected("TRACE", expectedTraceLog), out.String())
+}
+
+func TestTraceDisabled(t *testing.T) {
+ originalTrace := os.Getenv("TRACE")
+ err := os.Setenv("TRACE", "false")
+ if err != nil {
+ t.Fatalf("Unable to set trace to false")
+ }
+ defer func() {
+ if err := os.Setenv("TRACE", originalTrace); err != nil {
+ t.Fatalf("Unable to set TRACE environment variable: %v", err)
+ }
+ }()
+
+ out := newBuffer()
+ SetOutputs(ioutil.Discard, out)
+ l := LoggerFor("myprefix")
+ l.Trace("Hello world")
+ l.Tracef("Hello %v", true)
+ if _, err := l.TraceOut().Write([]byte("Gravy\n")); err != nil {
+ t.Fatalf("Unable to write: %v", err)
+ }
+
+ // Give trace writer a moment to catch up
+ time.Sleep(50 * time.Millisecond)
+
+ assert.Equal(t, "", out.String(), "Nothing should have been logged")
+}
+
+func TestAsStdLogger(t *testing.T) {
+ out := newBuffer()
+ SetOutputs(out, ioutil.Discard)
+ l := LoggerFor("myprefix")
+ stdlog := l.AsStdLogger()
+ stdlog.Print("Hello world")
+ defer ops.Begin("name").Set("cvarA", "a").Set("cvarB", "b").End()
+ stdlog.Printf("Hello %v", true)
+ assert.Equal(t, expected("ERROR", expectedStdLog), out.String())
+}
+
+// TODO: TraceWriter appears to have been broken since we added line numbers
+// func TestTraceWriter(t *testing.T) {
+// originalTrace := os.Getenv("TRACE")
+// err := os.Setenv("TRACE", "true")
+// if err != nil {
+// t.Fatalf("Unable to set trace to true")
+// }
+// defer func() {
+// if err := os.Setenv("TRACE", originalTrace); err != nil {
+// t.Fatalf("Unable to set TRACE environment variable: %v", err)
+// }
+// }()
+//
+// out := newBuffer()
+// SetOutputs(ioutil.Discard, out)
+// l := LoggerFor("myprefix")
+// trace := l.TraceOut()
+// trace.Write([]byte("Hello world\n"))
+// defer ops.Begin().Set("cvarA", "a").Set("cvarB", "b").End()
+// trace.Write([]byte("Hello true\n"))
+// assert.Equal(t, expected("TRACE", expectedStdLog), out.String())
+// }
+
+func newBuffer() *synchronizedbuffer {
+ return &synchronizedbuffer{orig: &bytes.Buffer{}}
+}
+
+type synchronizedbuffer struct {
+ orig *bytes.Buffer
+ mutex sync.RWMutex
+}
+
+func (buf *synchronizedbuffer) Write(p []byte) (int, error) {
+ buf.mutex.Lock()
+ defer buf.mutex.Unlock()
+ return buf.orig.Write(p)
+}
+
+func (buf *synchronizedbuffer) String() string {
+ buf.mutex.RLock()
+ defer buf.mutex.RUnlock()
+ return normalized(buf.orig.String())
+}
diff --git a/vendor/github.com/getlantern/hex/hex.go b/vendor/github.com/getlantern/hex/hex.go
new file mode 100644
index 0000000..d1270e9
--- /dev/null
+++ b/vendor/github.com/getlantern/hex/hex.go
@@ -0,0 +1,107 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package hex implements hexadecimal encoding and decoding. It's taken almost
+// verbatim from golang/encoding/hex, however it allows using a different set
+// of encoding characters than the standard 0-F.
+package hex
+
+import (
+ "errors"
+ "fmt"
+)
+
+// DefaultEncoding behaves just like golang/encoding/hex.
+var DefaultEncoding = NewEncoding("0123456789abcdef")
+
+// An Encoding that uses a specific table of encoding characters.
+type Encoding struct {
+ hextable string
+}
+
+// NewEncoding constructs an Encoding using the given hextable.
+func NewEncoding(hextable string) *Encoding {
+ return &Encoding{hextable}
+}
+
+// EncodedLen returns the length of an encoding of n source bytes.
+func EncodedLen(n int) int { return n * 2 }
+
+// Encode encodes src into EncodedLen(len(src))
+// bytes of dst. As a convenience, it returns the number
+// of bytes written to dst, but this value is always EncodedLen(len(src)).
+// Encode implements hexadecimal encoding.
+func (e *Encoding) Encode(dst, src []byte) int {
+ for i, v := range src {
+ dst[i*2] = e.hextable[v>>4]
+ dst[i*2+1] = e.hextable[v&0x0f]
+ }
+
+ return len(src) * 2
+}
+
+// ErrLength results from decoding an odd length slice.
+var ErrLength = errors.New("encoding/hex: odd length hex string")
+
+// InvalidByteError values describe errors resulting from an invalid byte in a hex string.
+type InvalidByteError byte
+
+func (e InvalidByteError) Error() string {
+ return fmt.Sprintf("encoding/hex: invalid byte: %#U", rune(e))
+}
+
+func DecodedLen(x int) int { return x / 2 }
+
+// Decode decodes src into DecodedLen(len(src)) bytes, returning the actual
+// number of bytes written to dst.
+//
+// If Decode encounters invalid input, it returns an error describing the failure.
+func (e *Encoding) Decode(dst, src []byte) (int, error) {
+ if len(src)%2 == 1 {
+ return 0, ErrLength
+ }
+
+ for i := 0; i < len(src)/2; i++ {
+ a, ok := e.fromHexChar(src[i*2])
+ if !ok {
+ return 0, InvalidByteError(src[i*2])
+ }
+ b, ok := e.fromHexChar(src[i*2+1])
+ if !ok {
+ return 0, InvalidByteError(src[i*2+1])
+ }
+ dst[i] = (a << 4) | b
+ }
+
+ return len(src) / 2, nil
+}
+
+// fromHexChar converts a hex character into its value and a success flag.
+func (e *Encoding) fromHexChar(c byte) (byte, bool) {
+ for i, ch := range []byte(e.hextable) {
+ if ch == c {
+ return byte(i), true
+ }
+ }
+
+ return 0, false
+}
+
+// EncodeToString returns the hexadecimal encoding of src.
+func (e *Encoding) EncodeToString(src []byte) string {
+ dst := make([]byte, EncodedLen(len(src)))
+ e.Encode(dst, src)
+ return string(dst)
+}
+
+// DecodeString returns the bytes represented by the hexadecimal string s.
+func (e *Encoding) DecodeString(s string) ([]byte, error) {
+ src := []byte(s)
+ dst := make([]byte, DecodedLen(len(src)))
+ _, err := e.Decode(dst, src)
+ if err != nil {
+ return nil, err
+ }
+ return dst, nil
+}
diff --git a/vendor/github.com/getlantern/hidden/hidden.go b/vendor/github.com/getlantern/hidden/hidden.go
new file mode 100644
index 0000000..0c52b08
--- /dev/null
+++ b/vendor/github.com/getlantern/hidden/hidden.go
@@ -0,0 +1,66 @@
+// Package hidden provides the ability to "hide" binary data in a string using
+// a hex encoding with non-printing characters. Hidden data is demarcated with
+// a leading and trailing NUL character.
+package hidden
+
+import (
+ "bytes"
+ "fmt"
+ "regexp"
+
+ "github.com/getlantern/hex"
+)
+
+// 16 non-printing characters
+const hextable = "\x01\x02\x03\x04\x05\x06\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17"
+
+var (
+ hexencoding = hex.NewEncoding(hextable)
+
+ re *regexp.Regexp
+)
+
+func init() {
+ var err error
+ re, err = regexp.Compile(fmt.Sprintf("\x00[%v]+\x00", hextable))
+ if err != nil {
+ panic(err)
+ }
+}
+
+// ToString encodes the given data as a hidden string, including leadnig and
+// trailing NULs.
+func ToString(data []byte) string {
+ buf := bytes.NewBuffer(make([]byte, 0, 2+hex.EncodedLen(len(data))))
+ // Leading NUL
+ buf.WriteByte(0)
+ buf.WriteString(hexencoding.EncodeToString(data))
+ // Trailing NUL
+ buf.WriteByte(0)
+ return buf.String()
+}
+
+// FromString extracts the hidden data from a string, which is expected to
+// contain leading and trailing NULs.
+func FromString(str string) ([]byte, error) {
+ return hexencoding.DecodeString(str[1 : len(str)-1])
+}
+
+// Extract extracts all hidden data from an arbitrary string.
+func Extract(str string) ([][]byte, error) {
+ m := re.FindAllString(str, -1)
+ result := make([][]byte, 0, len(m))
+ for _, s := range m {
+ b, err := FromString(s)
+ if err != nil {
+ return nil, err
+ }
+ result = append(result, b)
+ }
+ return result, nil
+}
+
+// Clean removes any hidden data from an arbitrary string.
+func Clean(str string) string {
+ return re.ReplaceAllString(str, "")
+}
diff --git a/vendor/github.com/getlantern/hidden/hidden_test.go b/vendor/github.com/getlantern/hidden/hidden_test.go
new file mode 100644
index 0000000..420ce64
--- /dev/null
+++ b/vendor/github.com/getlantern/hidden/hidden_test.go
@@ -0,0 +1,33 @@
+package hidden
+
+import (
+ "encoding/binary"
+ "fmt"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestRoundTrip(t *testing.T) {
+ str := "H"
+ encoded := ToString([]byte(str))
+ rt, err := FromString(encoded)
+ if assert.NoError(t, err) {
+ assert.Equal(t, str, string(rt))
+ }
+}
+
+func TestExtract(t *testing.T) {
+ a := []byte("Here is my string")
+ b := make([]byte, 8)
+ binary.BigEndian.PutUint64(b, 56)
+ str := fmt.Sprintf("hidden%s data%s is fun", ToString(a), ToString(b))
+ t.Log(str)
+ out, err := Extract(str)
+ if assert.NoError(t, err) {
+ if assert.Len(t, out, 2) {
+ assert.Equal(t, out, [][]byte{a, b})
+ }
+ }
+ assert.Equal(t, "hidden data is fun", Clean(str))
+}
diff --git a/vendor/github.com/getlantern/ops/ops.go b/vendor/github.com/getlantern/ops/ops.go
new file mode 100644
index 0000000..136302d
--- /dev/null
+++ b/vendor/github.com/getlantern/ops/ops.go
@@ -0,0 +1,154 @@
+// Package ops provides a facility for tracking the processing of operations,
+// including contextual metadata about the operation and their final success or
+// failure. An op is assumed to have succeeded if by the time of calling Exit()
+// no errors have been reported. The final status can be reported to a metrics
+// facility.
+package ops
+
+import (
+ "sync"
+ "sync/atomic"
+
+ "github.com/getlantern/context"
+)
+
+var (
+ cm = context.NewManager()
+ reporters []Reporter
+ reportersMutex sync.RWMutex
+)
+
+// Reporter is a function that reports the success or failure of an Op. If
+// failure is nil, the Op can be considered successful.
+type Reporter func(failure error, ctx map[string]interface{})
+
+// Op represents an operation that's being performed. It mimics the API of
+// context.Context.
+type Op interface {
+ // Begin marks the beginning of an Op under this Op.
+ Begin(name string) Op
+
+ // Go starts the given function on a new goroutine.
+ Go(fn func())
+
+ // End marks the end of this op, at which point the Op will report its success
+ // or failure to all registered Reporters.
+ End()
+
+ // Cancel cancels this op so that even if End() is called later, it will not
+ // report its success or failure.
+ Cancel()
+
+ // Set puts a key->value pair into the current Op's context.
+ Set(key string, value interface{}) Op
+
+ // SetDynamic puts a key->value pair into the current Op's context, where the
+ // value is generated by a function that gets evaluated at every Read.
+ SetDynamic(key string, valueFN func() interface{}) Op
+
+ // FailIf marks this Op as failed if the given err is not nil. If FailIf is
+ // called multiple times, the latest error will be reported as the failure.
+ // Returns the original error for convenient chaining.
+ FailIf(err error) error
+}
+
+type op struct {
+ ctx context.Context
+ canceled bool
+ failure atomic.Value
+}
+
+// RegisterReporter registers the given reporter.
+func RegisterReporter(reporter Reporter) {
+ reportersMutex.Lock()
+ reporters = append(reporters, reporter)
+ reportersMutex.Unlock()
+}
+
+// Begin marks the beginning of a new Op.
+func Begin(name string) Op {
+ return &op{ctx: cm.Enter().Put("op", name).PutIfAbsent("root_op", name)}
+}
+
+func (o *op) Begin(name string) Op {
+ return &op{ctx: o.ctx.Enter().Put("op", name).PutIfAbsent("root_op", name)}
+}
+
+func (o *op) Go(fn func()) {
+ o.ctx.Go(fn)
+}
+
+// Go mimics the method from context.Manager.
+func Go(fn func()) {
+ cm.Go(fn)
+}
+
+func (o *op) Cancel() {
+ o.canceled = true
+}
+
+func (o *op) End() {
+ if o.canceled {
+ return
+ }
+
+ var reportersCopy []Reporter
+ reportersMutex.RLock()
+ if len(reporters) > 0 {
+ reportersCopy = make([]Reporter, len(reporters))
+ copy(reportersCopy, reporters)
+ }
+ reportersMutex.RUnlock()
+
+ if len(reportersCopy) > 0 {
+ var failure error
+ _failure := o.failure.Load()
+ ctx := o.ctx.AsMap(_failure, true)
+ if _failure != nil {
+ failure = _failure.(error)
+ _, errorSet := ctx["error"]
+ if !errorSet {
+ ctx["error"] = failure.Error()
+ }
+ }
+ for _, reporter := range reportersCopy {
+ reporter(failure, ctx)
+ }
+ }
+
+ o.ctx.Exit()
+}
+
+func (o *op) Set(key string, value interface{}) Op {
+ o.ctx.Put(key, value)
+ return o
+}
+
+// SetGlobal puts a key->value pair into the global context, which is inherited
+// by all Ops.
+func SetGlobal(key string, value interface{}) {
+ cm.PutGlobal(key, value)
+}
+
+func (o *op) SetDynamic(key string, valueFN func() interface{}) Op {
+ o.ctx.PutDynamic(key, valueFN)
+ return o
+}
+
+// SetGlobalDynamic is like SetGlobal but uses a function to derive the value
+// at read time.
+func SetGlobalDynamic(key string, valueFN func() interface{}) {
+ cm.PutGlobalDynamic(key, valueFN)
+}
+
+// AsMap mimics the method from context.Manager.
+func AsMap(obj interface{}, includeGlobals bool) context.Map {
+ return cm.AsMap(obj, includeGlobals)
+}
+
+func (o *op) FailIf(err error) error {
+ if err != nil {
+ o.failure.Store(err)
+ }
+ return err
+}
diff --git a/vendor/github.com/getlantern/ops/ops_test.go b/vendor/github.com/getlantern/ops/ops_test.go
new file mode 100644
index 0000000..1c16e73
--- /dev/null
+++ b/vendor/github.com/getlantern/ops/ops_test.go
@@ -0,0 +1,76 @@
+package ops_test
+
+import (
+ "sync"
+ "testing"
+
+ "github.com/getlantern/errors"
+ "github.com/getlantern/ops"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestSuccess(t *testing.T) {
+ var reportedFailure error
+ var reportedCtx map[string]interface{}
+ report := func(failure error, ctx map[string]interface{}) {
+ reportedFailure = failure
+ reportedCtx = ctx
+ }
+
+ ops.RegisterReporter(report)
+ ops.SetGlobal("g", "g1")
+ op := ops.Begin("test_success").Set("a", 1).SetDynamic("b", func() interface{} { return 2 })
+ defer op.End()
+ innerOp := op.Begin("inside")
+ innerOp.FailIf(nil)
+ innerOp.End()
+
+ assert.Nil(t, reportedFailure)
+ expectedCtx := map[string]interface{}{
+ "op": "inside",
+ "root_op": "test_success",
+ "g": "g1",
+ "a": 1,
+ "b": 2,
+ }
+ assert.Equal(t, expectedCtx, reportedCtx)
+}
+
+func TestFailure(t *testing.T) {
+ doTestFailure(t, false)
+}
+
+func TestCancel(t *testing.T) {
+ doTestFailure(t, true)
+}
+
+func doTestFailure(t *testing.T, cancel bool) {
+ var reportedFailure error
+ var reportedCtx map[string]interface{}
+ report := func(failure error, ctx map[string]interface{}) {
+ reportedFailure = failure
+ reportedCtx = ctx
+ }
+
+ ops.RegisterReporter(report)
+ op := ops.Begin("test_failure")
+ var wg sync.WaitGroup
+ wg.Add(1)
+ op.Go(func() {
+ op.FailIf(errors.New("I failed").With("errorcontext", 5))
+ wg.Done()
+ })
+ wg.Wait()
+ if cancel {
+ op.Cancel()
+ }
+ op.End()
+
+ if cancel {
+ assert.Nil(t, reportedFailure)
+ assert.Nil(t, reportedCtx)
+ } else {
+ assert.Contains(t, reportedFailure.Error(), "I failed")
+ assert.Equal(t, 5, reportedCtx["errorcontext"])
+ }
+}
diff --git a/vendor/github.com/go-stack/stack/LICENSE.md b/vendor/github.com/go-stack/stack/LICENSE.md
new file mode 100644
index 0000000..2abf98e
--- /dev/null
+++ b/vendor/github.com/go-stack/stack/LICENSE.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Chris Hines
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/go-stack/stack/README.md b/vendor/github.com/go-stack/stack/README.md
new file mode 100644
index 0000000..f11cccc
--- /dev/null
+++ b/vendor/github.com/go-stack/stack/README.md
@@ -0,0 +1,38 @@
+[![GoDoc](https://godoc.org/github.com/go-stack/stack?status.svg)](https://godoc.org/github.com/go-stack/stack)
+[![Go Report Card](https://goreportcard.com/badge/go-stack/stack)](https://goreportcard.com/report/go-stack/stack)
+[![TravisCI](https://travis-ci.org/go-stack/stack.svg?branch=master)](https://travis-ci.org/go-stack/stack)
+[![Coverage Status](https://coveralls.io/repos/github/go-stack/stack/badge.svg?branch=master)](https://coveralls.io/github/go-stack/stack?branch=master)
+
+# stack
+
+Package stack implements utilities to capture, manipulate, and format call
+stacks. It provides a simpler API than package runtime.
+
+The implementation takes care of the minutia and special cases of interpreting
+the program counter (pc) values returned by runtime.Callers.
+
+## Versioning
+
+Package stack publishes releases via [semver](http://semver.org/) compatible Git
+tags prefixed with a single 'v'. The master branch always contains the latest
+release. The develop branch contains unreleased commits.
+
+## Formatting
+
+Package stack's types implement fmt.Formatter, which provides a simple and
+flexible way to declaratively configure formatting when used with logging or
+error tracking packages.
+
+```go
+func DoTheThing() {
+ c := stack.Caller(0)
+ log.Print(c) // "source.go:10"
+ log.Printf("%+v", c) // "pkg/path/source.go:10"
+ log.Printf("%n", c) // "DoTheThing"
+
+ s := stack.Trace().TrimRuntime()
+ log.Print(s) // "[source.go:15 caller.go:42 main.go:14]"
+}
+```
+
+See the docs for all of the supported formatting options.
diff --git a/vendor/github.com/go-stack/stack/format_test.go b/vendor/github.com/go-stack/stack/format_test.go
new file mode 100644
index 0000000..013ad67
--- /dev/null
+++ b/vendor/github.com/go-stack/stack/format_test.go
@@ -0,0 +1,21 @@
+// +build go1.2
+
+package stack_test
+
+import (
+ "fmt"
+
+ "github.com/go-stack/stack"
+)
+
+func Example_callFormat() {
+ logCaller("%+s")
+ logCaller("%v %[1]n()")
+ // Output:
+ // github.com/go-stack/stack/format_test.go
+ // format_test.go:13 Example_callFormat()
+}
+
+func logCaller(format string) {
+ fmt.Printf(format+"\n", stack.Caller(1))
+}
diff --git a/vendor/github.com/go-stack/stack/go.mod b/vendor/github.com/go-stack/stack/go.mod
new file mode 100644
index 0000000..96a53a1
--- /dev/null
+++ b/vendor/github.com/go-stack/stack/go.mod
@@ -0,0 +1 @@
+module github.com/go-stack/stack
diff --git a/vendor/github.com/go-stack/stack/stack-go19_test.go b/vendor/github.com/go-stack/stack/stack-go19_test.go
new file mode 100644
index 0000000..d7aeea2
--- /dev/null
+++ b/vendor/github.com/go-stack/stack/stack-go19_test.go
@@ -0,0 +1,67 @@
+// +build go1.9
+
+package stack_test
+
+import (
+ "runtime"
+ "testing"
+
+ "github.com/go-stack/stack"
+)
+
+func TestCallerInlinedPanic(t *testing.T) {
+ t.Parallel()
+
+ var line int
+
+ defer func() {
+ if recover() != nil {
+ var pcs [32]uintptr
+ n := runtime.Callers(1, pcs[:])
+ frames := runtime.CallersFrames(pcs[:n])
+ // count frames to runtime.sigpanic
+ panicIdx := 0
+ for {
+ f, more := frames.Next()
+ if f.Function == "runtime.sigpanic" {
+ break
+ }
+ panicIdx++
+ if !more {
+ t.Fatal("no runtime.sigpanic entry on the stack")
+ }
+ }
+
+ c := stack.Caller(panicIdx)
+ if got, want := c.Frame().Function, "runtime.sigpanic"; got != want {
+ t.Errorf("sigpanic frame: got name == %v, want name == %v", got, want)
+ }
+
+ c1 := stack.Caller(panicIdx + 1)
+ if got, want := c1.Frame().Function, "github.com/go-stack/stack_test.inlinablePanic"; got != want {
+ t.Errorf("TestCallerInlinedPanic frame: got name == %v, want name == %v", got, want)
+ }
+ if got, want := c1.Frame().Line, line; got != want {
+ t.Errorf("TestCallerInlinedPanic frame: got line == %v, want line == %v", got, want)
+ }
+ }
+ }()
+
+ doPanic(t, &line)
+ t.Fatal("failed to panic")
+}
+
+func doPanic(t *testing.T, panicLine *int) {
+ _, _, line, ok := runtime.Caller(0)
+ *panicLine = line + 11 // adjust to match line of panic below
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+ inlinablePanic()
+}
+
+func inlinablePanic() {
+ // Initiate a sigpanic.
+ var x *uintptr
+ _ = *x
+}
diff --git a/vendor/github.com/go-stack/stack/stack.go b/vendor/github.com/go-stack/stack/stack.go
new file mode 100644
index 0000000..ac3b93b
--- /dev/null
+++ b/vendor/github.com/go-stack/stack/stack.go
@@ -0,0 +1,400 @@
+// +build go1.7
+
+// Package stack implements utilities to capture, manipulate, and format call
+// stacks. It provides a simpler API than package runtime.
+//
+// The implementation takes care of the minutia and special cases of
+// interpreting the program counter (pc) values returned by runtime.Callers.
+//
+// Package stack's types implement fmt.Formatter, which provides a simple and
+// flexible way to declaratively configure formatting when used with logging
+// or error tracking packages.
+package stack
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "io"
+ "runtime"
+ "strconv"
+ "strings"
+)
+
+// Call records a single function invocation from a goroutine stack.
+type Call struct {
+ frame runtime.Frame
+}
+
+// Caller returns a Call from the stack of the current goroutine. The argument
+// skip is the number of stack frames to ascend, with 0 identifying the
+// calling function.
+func Caller(skip int) Call {
+ // As of Go 1.9 we need room for up to three PC entries.
+ //
+ // 0. An entry for the stack frame prior to the target to check for
+ // special handling needed if that prior entry is runtime.sigpanic.
+ // 1. A possible second entry to hold metadata about skipped inlined
+ // functions. If inline functions were not skipped the target frame
+ // PC will be here.
+ // 2. A third entry for the target frame PC when the second entry
+ // is used for skipped inline functions.
+ var pcs [3]uintptr
+ n := runtime.Callers(skip+1, pcs[:])
+ frames := runtime.CallersFrames(pcs[:n])
+ frame, _ := frames.Next()
+ frame, _ = frames.Next()
+
+ return Call{
+ frame: frame,
+ }
+}
+
+// String implements fmt.Stinger. It is equivalent to fmt.Sprintf("%v", c).
+func (c Call) String() string {
+ return fmt.Sprint(c)
+}
+
+// MarshalText implements encoding.TextMarshaler. It formats the Call the same
+// as fmt.Sprintf("%v", c).
+func (c Call) MarshalText() ([]byte, error) {
+ if c.frame == (runtime.Frame{}) {
+ return nil, ErrNoFunc
+ }
+
+ buf := bytes.Buffer{}
+ fmt.Fprint(&buf, c)
+ return buf.Bytes(), nil
+}
+
+// ErrNoFunc means that the Call has a nil *runtime.Func. The most likely
+// cause is a Call with the zero value.
+var ErrNoFunc = errors.New("no call stack information")
+
+// Format implements fmt.Formatter with support for the following verbs.
+//
+// %s source file
+// %d line number
+// %n function name
+// %k last segment of the package path
+// %v equivalent to %s:%d
+//
+// It accepts the '+' and '#' flags for most of the verbs as follows.
+//
+// %+s path of source file relative to the compile time GOPATH,
+// or the module path joined to the path of source file relative
+// to module root
+// %#s full path of source file
+// %+n import path qualified function name
+// %+k full package path
+// %+v equivalent to %+s:%d
+// %#v equivalent to %#s:%d
+func (c Call) Format(s fmt.State, verb rune) {
+ if c.frame == (runtime.Frame{}) {
+ fmt.Fprintf(s, "%%!%c(NOFUNC)", verb)
+ return
+ }
+
+ switch verb {
+ case 's', 'v':
+ file := c.frame.File
+ switch {
+ case s.Flag('#'):
+ // done
+ case s.Flag('+'):
+ file = pkgFilePath(&c.frame)
+ default:
+ const sep = "/"
+ if i := strings.LastIndex(file, sep); i != -1 {
+ file = file[i+len(sep):]
+ }
+ }
+ io.WriteString(s, file)
+ if verb == 'v' {
+ buf := [7]byte{':'}
+ s.Write(strconv.AppendInt(buf[:1], int64(c.frame.Line), 10))
+ }
+
+ case 'd':
+ buf := [6]byte{}
+ s.Write(strconv.AppendInt(buf[:0], int64(c.frame.Line), 10))
+
+ case 'k':
+ name := c.frame.Function
+ const pathSep = "/"
+ start, end := 0, len(name)
+ if i := strings.LastIndex(name, pathSep); i != -1 {
+ start = i + len(pathSep)
+ }
+ const pkgSep = "."
+ if i := strings.Index(name[start:], pkgSep); i != -1 {
+ end = start + i
+ }
+ if s.Flag('+') {
+ start = 0
+ }
+ io.WriteString(s, name[start:end])
+
+ case 'n':
+ name := c.frame.Function
+ if !s.Flag('+') {
+ const pathSep = "/"
+ if i := strings.LastIndex(name, pathSep); i != -1 {
+ name = name[i+len(pathSep):]
+ }
+ const pkgSep = "."
+ if i := strings.Index(name, pkgSep); i != -1 {
+ name = name[i+len(pkgSep):]
+ }
+ }
+ io.WriteString(s, name)
+ }
+}
+
+// Frame returns the call frame infomation for the Call.
+func (c Call) Frame() runtime.Frame {
+ return c.frame
+}
+
+// PC returns the program counter for this call frame; multiple frames may
+// have the same PC value.
+//
+// Deprecated: Use Call.Frame instead.
+func (c Call) PC() uintptr {
+ return c.frame.PC
+}
+
+// CallStack records a sequence of function invocations from a goroutine
+// stack.
+type CallStack []Call
+
+// String implements fmt.Stinger. It is equivalent to fmt.Sprintf("%v", cs).
+func (cs CallStack) String() string {
+ return fmt.Sprint(cs)
+}
+
+var (
+ openBracketBytes = []byte("[")
+ closeBracketBytes = []byte("]")
+ spaceBytes = []byte(" ")
+)
+
+// MarshalText implements encoding.TextMarshaler. It formats the CallStack the
+// same as fmt.Sprintf("%v", cs).
+func (cs CallStack) MarshalText() ([]byte, error) {
+ buf := bytes.Buffer{}
+ buf.Write(openBracketBytes)
+ for i, pc := range cs {
+ if i > 0 {
+ buf.Write(spaceBytes)
+ }
+ fmt.Fprint(&buf, pc)
+ }
+ buf.Write(closeBracketBytes)
+ return buf.Bytes(), nil
+}
+
+// Format implements fmt.Formatter by printing the CallStack as square brackets
+// ([, ]) surrounding a space separated list of Calls each formatted with the
+// supplied verb and options.
+func (cs CallStack) Format(s fmt.State, verb rune) {
+ s.Write(openBracketBytes)
+ for i, pc := range cs {
+ if i > 0 {
+ s.Write(spaceBytes)
+ }
+ pc.Format(s, verb)
+ }
+ s.Write(closeBracketBytes)
+}
+
+// Trace returns a CallStack for the current goroutine with element 0
+// identifying the calling function.
+func Trace() CallStack {
+ var pcs [512]uintptr
+ n := runtime.Callers(1, pcs[:])
+
+ frames := runtime.CallersFrames(pcs[:n])
+ cs := make(CallStack, 0, n)
+
+ // Skip extra frame retrieved just to make sure the runtime.sigpanic
+ // special case is handled.
+ frame, more := frames.Next()
+
+ for more {
+ frame, more = frames.Next()
+ cs = append(cs, Call{frame: frame})
+ }
+
+ return cs
+}
+
+// TrimBelow returns a slice of the CallStack with all entries below c
+// removed.
+func (cs CallStack) TrimBelow(c Call) CallStack {
+ for len(cs) > 0 && cs[0] != c {
+ cs = cs[1:]
+ }
+ return cs
+}
+
+// TrimAbove returns a slice of the CallStack with all entries above c
+// removed.
+func (cs CallStack) TrimAbove(c Call) CallStack {
+ for len(cs) > 0 && cs[len(cs)-1] != c {
+ cs = cs[:len(cs)-1]
+ }
+ return cs
+}
+
+// pkgIndex returns the index that results in file[index:] being the path of
+// file relative to the compile time GOPATH, and file[:index] being the
+// $GOPATH/src/ portion of file. funcName must be the name of a function in
+// file as returned by runtime.Func.Name.
+func pkgIndex(file, funcName string) int {
+ // As of Go 1.6.2 there is no direct way to know the compile time GOPATH
+ // at runtime, but we can infer the number of path segments in the GOPATH.
+ // We note that runtime.Func.Name() returns the function name qualified by
+ // the import path, which does not include the GOPATH. Thus we can trim
+ // segments from the beginning of the file path until the number of path
+ // separators remaining is one more than the number of path separators in
+ // the function name. For example, given:
+ //
+ // GOPATH /home/user
+ // file /home/user/src/pkg/sub/file.go
+ // fn.Name() pkg/sub.Type.Method
+ //
+ // We want to produce:
+ //
+ // file[:idx] == /home/user/src/
+ // file[idx:] == pkg/sub/file.go
+ //
+ // From this we can easily see that fn.Name() has one less path separator
+ // than our desired result for file[idx:]. We count separators from the
+ // end of the file path until it finds two more than in the function name
+ // and then move one character forward to preserve the initial path
+ // segment without a leading separator.
+ const sep = "/"
+ i := len(file)
+ for n := strings.Count(funcName, sep) + 2; n > 0; n-- {
+ i = strings.LastIndex(file[:i], sep)
+ if i == -1 {
+ i = -len(sep)
+ break
+ }
+ }
+ // get back to 0 or trim the leading separator
+ return i + len(sep)
+}
+
+// pkgFilePath returns the frame's filepath relative to the compile-time GOPATH,
+// or its module path joined to its path relative to the module root.
+//
+// As of Go 1.11 there is no direct way to know the compile time GOPATH or
+// module paths at runtime, but we can piece together the desired information
+// from available information. We note that runtime.Frame.Function contains the
+// function name qualified by the package path, which includes the module path
+// but not the GOPATH. We can extract the package path from that and append the
+// last segments of the file path to arrive at the desired package qualified
+// file path. For example, given:
+//
+// GOPATH /home/user
+// import path pkg/sub
+// frame.File /home/user/src/pkg/sub/file.go
+// frame.Function pkg/sub.Type.Method
+// Desired return pkg/sub/file.go
+//
+// It appears that we simply need to trim ".Type.Method" from frame.Function and
+// append "/" + path.Base(file).
+//
+// But there are other wrinkles. Although it is idiomatic to do so, the internal
+// name of a package is not required to match the last segment of its import
+// path. In addition, the introduction of modules in Go 1.11 allows working
+// without a GOPATH. So we also must make these work right:
+//
+// GOPATH /home/user
+// import path pkg/go-sub
+// package name sub
+// frame.File /home/user/src/pkg/go-sub/file.go
+// frame.Function pkg/sub.Type.Method
+// Desired return pkg/go-sub/file.go
+//
+// Module path pkg/v2
+// import path pkg/v2/go-sub
+// package name sub
+// frame.File /home/user/cloned-pkg/go-sub/file.go
+// frame.Function pkg/v2/sub.Type.Method
+// Desired return pkg/v2/go-sub/file.go
+//
+// We can handle all of these situations by using the package path extracted
+// from frame.Function up to, but not including, the last segment as the prefix
+// and the last two segments of frame.File as the suffix of the returned path.
+// This preserves the existing behavior when working in a GOPATH without modules
+// and a semantically equivalent behavior when used in module aware project.
+func pkgFilePath(frame *runtime.Frame) string {
+ pre := pkgPrefix(frame.Function)
+ post := pathSuffix(frame.File)
+ if pre == "" {
+ return post
+ }
+ return pre + "/" + post
+}
+
+// pkgPrefix returns the import path of the function's package with the final
+// segment removed.
+func pkgPrefix(funcName string) string {
+ const pathSep = "/"
+ end := strings.LastIndex(funcName, pathSep)
+ if end == -1 {
+ return ""
+ }
+ return funcName[:end]
+}
+
+// pathSuffix returns the last two segments of path.
+func pathSuffix(path string) string {
+ const pathSep = "/"
+ lastSep := strings.LastIndex(path, pathSep)
+ if lastSep == -1 {
+ return path
+ }
+ return path[strings.LastIndex(path[:lastSep], pathSep)+1:]
+}
+
+var runtimePath string
+
+func init() {
+ var pcs [3]uintptr
+ runtime.Callers(0, pcs[:])
+ frames := runtime.CallersFrames(pcs[:])
+ frame, _ := frames.Next()
+ file := frame.File
+
+ idx := pkgIndex(frame.File, frame.Function)
+
+ runtimePath = file[:idx]
+ if runtime.GOOS == "windows" {
+ runtimePath = strings.ToLower(runtimePath)
+ }
+}
+
+func inGoroot(c Call) bool {
+ file := c.frame.File
+ if len(file) == 0 || file[0] == '?' {
+ return true
+ }
+ if runtime.GOOS == "windows" {
+ file = strings.ToLower(file)
+ }
+ return strings.HasPrefix(file, runtimePath) || strings.HasSuffix(file, "/_testmain.go")
+}
+
+// TrimRuntime returns a slice of the CallStack with the topmost entries from
+// the go runtime removed. It considers any calls originating from unknown
+// files, files under GOROOT, or _testmain.go as part of the runtime.
+func (cs CallStack) TrimRuntime() CallStack {
+ for len(cs) > 0 && inGoroot(cs[len(cs)-1]) {
+ cs = cs[:len(cs)-1]
+ }
+ return cs
+}
diff --git a/vendor/github.com/go-stack/stack/stack_test.go b/vendor/github.com/go-stack/stack/stack_test.go
new file mode 100644
index 0000000..44f3a7d
--- /dev/null
+++ b/vendor/github.com/go-stack/stack/stack_test.go
@@ -0,0 +1,582 @@
+package stack_test
+
+import (
+ "fmt"
+ "io/ioutil"
+ "path"
+ "path/filepath"
+ "reflect"
+ "runtime"
+ "strings"
+ "testing"
+
+ "github.com/go-stack/stack"
+)
+
+func TestCaller(t *testing.T) {
+ t.Parallel()
+
+ c := stack.Caller(0)
+ _, file, line, ok := runtime.Caller(0)
+ line--
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+
+ if got, want := c.Frame().File, file; got != want {
+ t.Errorf("got file == %v, want file == %v", got, want)
+ }
+
+ if got, want := c.Frame().Line, line; got != want {
+ t.Errorf("got line == %v, want line == %v", got, want)
+ }
+}
+
+func f3(f1 func() stack.Call) stack.Call {
+ return f2(f1)
+}
+
+func f2(f1 func() stack.Call) stack.Call {
+ return f1()
+}
+
+func TestCallerMidstackInlined(t *testing.T) {
+ t.Parallel()
+
+ _, _, line, ok := runtime.Caller(0)
+ line -= 10 // adjust to return f1() line inside f2()
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+
+ c := f3(func() stack.Call {
+ return stack.Caller(2)
+ })
+
+ if got, want := c.Frame().Line, line; got != want {
+ t.Errorf("got line == %v, want line == %v", got, want)
+ }
+ if got, want := c.Frame().Function, "github.com/go-stack/stack_test.f3"; got != want {
+ t.Errorf("got func name == %v, want func name == %v", got, want)
+ }
+}
+
+func TestCallerPanic(t *testing.T) {
+ t.Parallel()
+
+ var (
+ line int
+ ok bool
+ )
+
+ defer func() {
+ if recover() != nil {
+ var pcs [32]uintptr
+ n := runtime.Callers(1, pcs[:])
+ frames := runtime.CallersFrames(pcs[:n])
+ // count frames to runtime.sigpanic
+ panicIdx := 0
+ for {
+ f, more := frames.Next()
+ if f.Function == "runtime.sigpanic" {
+ break
+ }
+ panicIdx++
+ if !more {
+ t.Fatal("no runtime.sigpanic entry on the stack")
+ }
+ }
+ c := stack.Caller(panicIdx)
+ if got, want := c.Frame().Function, "runtime.sigpanic"; got != want {
+ t.Errorf("sigpanic frame: got name == %v, want name == %v", got, want)
+ }
+ c1 := stack.Caller(panicIdx + 1)
+ if got, want := c1.Frame().Function, "github.com/go-stack/stack_test.TestCallerPanic"; got != want {
+ t.Errorf("TestCallerPanic frame: got name == %v, want name == %v", got, want)
+ }
+ if got, want := c1.Frame().Line, line; got != want {
+ t.Errorf("TestCallerPanic frame: got line == %v, want line == %v", got, want)
+ }
+ }
+ }()
+
+ _, _, line, ok = runtime.Caller(0)
+ line += 7 // adjust to match line of panic below
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+ // Initiate a sigpanic.
+ var x *uintptr
+ _ = *x
+}
+
+type tholder struct {
+ trace func() stack.CallStack
+}
+
+func (th *tholder) traceLabyrinth() stack.CallStack {
+ for {
+ return th.trace()
+ }
+}
+
+func TestTrace(t *testing.T) {
+ t.Parallel()
+
+ _, _, line, ok := runtime.Caller(0)
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+
+ fh := tholder{
+ trace: func() stack.CallStack {
+ cs := stack.Trace()
+ return cs
+ },
+ }
+
+ cs := fh.traceLabyrinth()
+
+ lines := []int{line + 7, line - 7, line + 12}
+
+ for i, line := range lines {
+ if got, want := cs[i].Frame().Line, line; got != want {
+ t.Errorf("got line[%d] == %v, want line[%d] == %v", i, got, i, want)
+ }
+ }
+}
+
+// Test stack handling originating from a sigpanic.
+func TestTracePanic(t *testing.T) {
+ t.Parallel()
+
+ var (
+ line int
+ ok bool
+ )
+
+ defer func() {
+ if recover() != nil {
+ trace := stack.Trace()
+
+ // find runtime.sigpanic
+ panicIdx := -1
+ for i, c := range trace {
+ if c.Frame().Function == "runtime.sigpanic" {
+ panicIdx = i
+ break
+ }
+ }
+ if panicIdx == -1 {
+ t.Fatal("no runtime.sigpanic entry on the stack")
+ }
+ if got, want := trace[panicIdx].Frame().Function, "runtime.sigpanic"; got != want {
+ t.Errorf("sigpanic frame: got name == %v, want name == %v", got, want)
+ }
+ if got, want := trace[panicIdx+1].Frame().Function, "github.com/go-stack/stack_test.TestTracePanic"; got != want {
+ t.Errorf("TestTracePanic frame: got name == %v, want name == %v", got, want)
+ }
+ if got, want := trace[panicIdx+1].Frame().Line, line; got != want {
+ t.Errorf("TestTracePanic frame: got line == %v, want line == %v", got, want)
+ }
+ }
+ }()
+
+ _, _, line, ok = runtime.Caller(0)
+ line += 7 // adjust to match line of panic below
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+ // Initiate a sigpanic.
+ var x *uintptr
+ _ = *x
+}
+
+const importPath = "github.com/go-stack/stack"
+
+type testType struct{}
+
+func (tt testType) testMethod() (c stack.Call, file string, line int, ok bool) {
+ c = stack.Caller(0)
+ _, file, line, ok = runtime.Caller(0)
+ line--
+ return
+}
+
+func TestCallFormat(t *testing.T) {
+ t.Parallel()
+
+ c := stack.Caller(0)
+ _, file, line, ok := runtime.Caller(0)
+ line--
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+ relFile := path.Join(importPath, filepath.Base(file))
+
+ c2, file2, line2, ok2 := testType{}.testMethod()
+ if !ok2 {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+ relFile2 := path.Join(importPath, filepath.Base(file2))
+
+ data := []struct {
+ c stack.Call
+ desc string
+ fmt string
+ out string
+ }{
+ {stack.Call{}, "error", "%s", "%!s(NOFUNC)"},
+
+ {c, "func", "%s", path.Base(file)},
+ {c, "func", "%+s", relFile},
+ {c, "func", "%#s", file},
+ {c, "func", "%d", fmt.Sprint(line)},
+ {c, "func", "%n", "TestCallFormat"},
+ {c, "func", "%+n", "github.com/go-stack/stack_test.TestCallFormat"},
+ {c, "func", "%k", "stack_test"},
+ {c, "func", "%+k", "github.com/go-stack/stack_test"},
+ {c, "func", "%v", fmt.Sprint(path.Base(file), ":", line)},
+ {c, "func", "%+v", fmt.Sprint(relFile, ":", line)},
+ {c, "func", "%#v", fmt.Sprint(file, ":", line)},
+
+ {c2, "meth", "%s", path.Base(file2)},
+ {c2, "meth", "%+s", relFile2},
+ {c2, "meth", "%#s", file2},
+ {c2, "meth", "%d", fmt.Sprint(line2)},
+ {c2, "meth", "%n", "testType.testMethod"},
+ {c2, "meth", "%+n", "github.com/go-stack/stack_test.testType.testMethod"},
+ {c2, "meth", "%k", "stack_test"},
+ {c2, "meth", "%+k", "github.com/go-stack/stack_test"},
+ {c2, "meth", "%v", fmt.Sprint(path.Base(file2), ":", line2)},
+ {c2, "meth", "%+v", fmt.Sprint(relFile2, ":", line2)},
+ {c2, "meth", "%#v", fmt.Sprint(file2, ":", line2)},
+ }
+
+ for _, d := range data {
+ got := fmt.Sprintf(d.fmt, d.c)
+ if got != d.out {
+ t.Errorf("fmt.Sprintf(%q, Call(%s)) = %s, want %s", d.fmt, d.desc, got, d.out)
+ }
+ }
+}
+
+func TestCallString(t *testing.T) {
+ t.Parallel()
+
+ c := stack.Caller(0)
+ _, file, line, ok := runtime.Caller(0)
+ line--
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+
+ c2, file2, line2, ok2 := testType{}.testMethod()
+ if !ok2 {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+
+ data := []struct {
+ c stack.Call
+ desc string
+ out string
+ }{
+ {stack.Call{}, "error", "%!v(NOFUNC)"},
+ {c, "func", fmt.Sprint(path.Base(file), ":", line)},
+ {c2, "meth", fmt.Sprint(path.Base(file2), ":", line2)},
+ }
+
+ for _, d := range data {
+ got := d.c.String()
+ if got != d.out {
+ t.Errorf("got %s, want %s", got, d.out)
+ }
+ }
+}
+
+func TestCallMarshalText(t *testing.T) {
+ t.Parallel()
+
+ c := stack.Caller(0)
+ _, file, line, ok := runtime.Caller(0)
+ line--
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+
+ c2, file2, line2, ok2 := testType{}.testMethod()
+ if !ok2 {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+
+ data := []struct {
+ c stack.Call
+ desc string
+ out []byte
+ err error
+ }{
+ {stack.Call{}, "error", nil, stack.ErrNoFunc},
+ {c, "func", []byte(fmt.Sprint(path.Base(file), ":", line)), nil},
+ {c2, "meth", []byte(fmt.Sprint(path.Base(file2), ":", line2)), nil},
+ }
+
+ for _, d := range data {
+ text, err := d.c.MarshalText()
+ if got, want := err, d.err; got != want {
+ t.Errorf("%s: got err %v, want err %v", d.desc, got, want)
+ }
+ if got, want := text, d.out; !reflect.DeepEqual(got, want) {
+ t.Errorf("%s: got %s, want %s", d.desc, got, want)
+ }
+ }
+}
+
+func TestCallStackString(t *testing.T) {
+ cs, line0 := getTrace(t)
+ _, file, line1, ok := runtime.Caller(0)
+ line1--
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+ file = path.Base(file)
+ if got, want := cs.String(), fmt.Sprintf("[%s:%d %s:%d]", file, line0, file, line1); got != want {
+ t.Errorf("\n got %v\nwant %v", got, want)
+ }
+}
+
+func TestCallStackMarshalText(t *testing.T) {
+ cs, line0 := getTrace(t)
+ _, file, line1, ok := runtime.Caller(0)
+ line1--
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+ file = path.Base(file)
+ text, _ := cs.MarshalText()
+ if got, want := text, []byte(fmt.Sprintf("[%s:%d %s:%d]", file, line0, file, line1)); !reflect.DeepEqual(got, want) {
+ t.Errorf("\n got %v\nwant %v", got, want)
+ }
+}
+
+func getTrace(t *testing.T) (stack.CallStack, int) {
+ cs := stack.Trace().TrimRuntime()
+ _, _, line, ok := runtime.Caller(0)
+ line--
+ if !ok {
+ t.Fatal("runtime.Caller(0) failed")
+ }
+ return cs, line
+}
+
+func TestTrimAbove(t *testing.T) {
+ trace := trimAbove()
+ if got, want := len(trace), 2; got != want {
+ t.Fatalf("got len(trace) == %v, want %v, trace: %n", got, want, trace)
+ }
+ if got, want := fmt.Sprintf("%n", trace[1]), "TestTrimAbove"; got != want {
+ t.Errorf("got %q, want %q", got, want)
+ }
+}
+
+func trimAbove() stack.CallStack {
+ call := stack.Caller(1)
+ trace := stack.Trace()
+ return trace.TrimAbove(call)
+}
+
+func TestTrimBelow(t *testing.T) {
+ trace := trimBelow()
+ if got, want := fmt.Sprintf("%n", trace[0]), "TestTrimBelow"; got != want {
+ t.Errorf("got %q, want %q", got, want)
+ }
+}
+
+func trimBelow() stack.CallStack {
+ call := stack.Caller(1)
+ trace := stack.Trace()
+ return trace.TrimBelow(call)
+}
+
+func TestTrimRuntime(t *testing.T) {
+ trace := stack.Trace().TrimRuntime()
+ if got, want := len(trace), 1; got != want {
+ t.Errorf("got len(trace) == %v, want %v, goroot: %q, trace: %#v", got, want, runtime.GOROOT(), trace)
+ }
+}
+
+func BenchmarkCallVFmt(b *testing.B) {
+ c := stack.Caller(0)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fmt.Fprint(ioutil.Discard, c)
+ }
+}
+
+func BenchmarkCallPlusVFmt(b *testing.B) {
+ c := stack.Caller(0)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fmt.Fprintf(ioutil.Discard, "%+v", c)
+ }
+}
+
+func BenchmarkCallSharpVFmt(b *testing.B) {
+ c := stack.Caller(0)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fmt.Fprintf(ioutil.Discard, "%#v", c)
+ }
+}
+
+func BenchmarkCallSFmt(b *testing.B) {
+ c := stack.Caller(0)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fmt.Fprintf(ioutil.Discard, "%s", c)
+ }
+}
+
+func BenchmarkCallPlusSFmt(b *testing.B) {
+ c := stack.Caller(0)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fmt.Fprintf(ioutil.Discard, "%+s", c)
+ }
+}
+
+func BenchmarkCallSharpSFmt(b *testing.B) {
+ c := stack.Caller(0)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fmt.Fprintf(ioutil.Discard, "%#s", c)
+ }
+}
+
+func BenchmarkCallDFmt(b *testing.B) {
+ c := stack.Caller(0)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fmt.Fprintf(ioutil.Discard, "%d", c)
+ }
+}
+
+func BenchmarkCallNFmt(b *testing.B) {
+ c := stack.Caller(0)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fmt.Fprintf(ioutil.Discard, "%n", c)
+ }
+}
+
+func BenchmarkCallPlusNFmt(b *testing.B) {
+ c := stack.Caller(0)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fmt.Fprintf(ioutil.Discard, "%+n", c)
+ }
+}
+
+func BenchmarkCaller(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ stack.Caller(0)
+ }
+}
+
+func BenchmarkTrace(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ stack.Trace()
+ }
+}
+
+func deepStack(depth int, b *testing.B) stack.CallStack {
+ if depth > 0 {
+ return deepStack(depth-1, b)
+ }
+ b.StartTimer()
+ s := stack.Trace()
+ return s
+}
+
+func BenchmarkTrace10(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ b.StopTimer()
+ deepStack(10, b)
+ }
+}
+
+func BenchmarkTrace50(b *testing.B) {
+ b.StopTimer()
+ for i := 0; i < b.N; i++ {
+ deepStack(50, b)
+ }
+}
+
+func BenchmarkTrace100(b *testing.B) {
+ b.StopTimer()
+ for i := 0; i < b.N; i++ {
+ deepStack(100, b)
+ }
+}
+
+////////////////
+// Benchmark functions followed by formatting
+////////////////
+
+func BenchmarkCallerAndVFmt(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ fmt.Fprint(ioutil.Discard, stack.Caller(0))
+ }
+}
+
+func BenchmarkTraceAndVFmt(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ fmt.Fprint(ioutil.Discard, stack.Trace())
+ }
+}
+
+func BenchmarkTrace10AndVFmt(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ b.StopTimer()
+ fmt.Fprint(ioutil.Discard, deepStack(10, b))
+ }
+}
+
+////////////////
+// Baseline against package runtime.
+////////////////
+
+func BenchmarkRuntimeCaller(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ runtime.Caller(0)
+ }
+}
+
+func BenchmarkRuntimeCallerAndFmt(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ _, file, line, _ := runtime.Caller(0)
+ const sep = "/"
+ if i := strings.LastIndex(file, sep); i != -1 {
+ file = file[i+len(sep):]
+ }
+ fmt.Fprint(ioutil.Discard, file, ":", line)
+ }
+}
+
+func BenchmarkFuncForPC(b *testing.B) {
+ pc, _, _, _ := runtime.Caller(0)
+ pc--
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ runtime.FuncForPC(pc)
+ }
+}
+
+func BenchmarkFuncFileLine(b *testing.B) {
+ pc, _, _, _ := runtime.Caller(0)
+ pc--
+ fn := runtime.FuncForPC(pc)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ fn.FileLine(pc)
+ }
+}
diff --git a/vendor/github.com/gotk3/gotk3/LICENSE b/vendor/github.com/gotk3/gotk3/LICENSE
new file mode 100644
index 0000000..c58347d
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/LICENSE
@@ -0,0 +1,14 @@
+Copyright (c) 2013-2014 Conformal Systems LLC.
+Copyright (c) 2015-2018 gotk3 contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/vendor/github.com/gotk3/gotk3/cairo/antialias.go b/vendor/github.com/gotk3/gotk3/cairo/antialias.go
new file mode 100644
index 0000000..e740df0
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/antialias.go
@@ -0,0 +1,27 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+import (
+ "unsafe"
+)
+
+// Antialias is a representation of Cairo's cairo_antialias_t.
+type Antialias int
+
+const (
+ ANTIALIAS_DEFAULT Antialias = C.CAIRO_ANTIALIAS_DEFAULT
+ ANTIALIAS_NONE Antialias = C.CAIRO_ANTIALIAS_NONE
+ ANTIALIAS_GRAY Antialias = C.CAIRO_ANTIALIAS_GRAY
+ ANTIALIAS_SUBPIXEL Antialias = C.CAIRO_ANTIALIAS_SUBPIXEL
+ // ANTIALIAS_FAST Antialias = C.CAIRO_ANTIALIAS_FAST (since 1.12)
+ // ANTIALIAS_GOOD Antialias = C.CAIRO_ANTIALIAS_GOOD (since 1.12)
+ // ANTIALIAS_BEST Antialias = C.CAIRO_ANTIALIAS_BEST (since 1.12)
+)
+
+func marshalAntialias(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Antialias(c), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/cairo.go b/vendor/github.com/gotk3/gotk3/cairo/cairo.go
new file mode 100644
index 0000000..ba014bd
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/cairo.go
@@ -0,0 +1,65 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// Package cairo implements Go bindings for Cairo. Supports version 1.10 and
+// later.
+package cairo
+
+// #cgo pkg-config: cairo cairo-gobject gobject-2.0
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Enums
+ {glib.Type(C.cairo_gobject_antialias_get_type()), marshalAntialias},
+ {glib.Type(C.cairo_gobject_content_get_type()), marshalContent},
+ {glib.Type(C.cairo_gobject_fill_rule_get_type()), marshalFillRule},
+ {glib.Type(C.cairo_gobject_line_cap_get_type()), marshalLineCap},
+ {glib.Type(C.cairo_gobject_line_join_get_type()), marshalLineJoin},
+ {glib.Type(C.cairo_gobject_operator_get_type()), marshalOperator},
+ {glib.Type(C.cairo_gobject_status_get_type()), marshalStatus},
+ {glib.Type(C.cairo_gobject_surface_type_get_type()), marshalSurfaceType},
+
+ // Boxed
+ {glib.Type(C.cairo_gobject_context_get_type()), marshalContext},
+ {glib.Type(C.cairo_gobject_surface_get_type()), marshalSurface},
+ }
+ glib.RegisterGValueMarshalers(tm)
+}
+
+// Constants
+
+// Content is a representation of Cairo's cairo_content_t.
+type Content int
+
+const (
+ CONTENT_COLOR Content = C.CAIRO_CONTENT_COLOR
+ CONTENT_ALPHA Content = C.CAIRO_CONTENT_ALPHA
+ CONTENT_COLOR_ALPHA Content = C.CAIRO_CONTENT_COLOR_ALPHA
+)
+
+func marshalContent(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Content(c), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/canvas.go b/vendor/github.com/gotk3/gotk3/cairo/canvas.go
new file mode 100644
index 0000000..254e405
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/canvas.go
@@ -0,0 +1,418 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+
+import (
+ "reflect"
+ "runtime"
+ "unsafe"
+)
+
+// Context is a representation of Cairo's cairo_t.
+type Context struct {
+ context *C.cairo_t
+}
+
+// native returns a pointer to the underlying cairo_t.
+func (v *Context) native() *C.cairo_t {
+ if v == nil {
+ return nil
+ }
+ return v.context
+}
+
+func (v *Context) GetCContext() *C.cairo_t {
+ return v.native()
+}
+
+// Native returns a pointer to the underlying cairo_t.
+func (v *Context) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalContext(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ context := (*C.cairo_t)(unsafe.Pointer(c))
+ return wrapContext(context), nil
+}
+
+func wrapContext(context *C.cairo_t) *Context {
+ return &Context{context}
+}
+
+func WrapContext(p uintptr) *Context {
+ context := (*C.cairo_t)(unsafe.Pointer(p))
+ return wrapContext(context)
+}
+
+// Closes the context. The context must not be used afterwards.
+func (v *Context) Close() {
+ v.destroy()
+}
+
+// Create is a wrapper around cairo_create().
+func Create(target *Surface) *Context {
+ c := C.cairo_create(target.native())
+ ctx := wrapContext(c)
+ runtime.SetFinalizer(ctx, (*Context).destroy)
+ return ctx
+}
+
+// reference is a wrapper around cairo_reference().
+func (v *Context) reference() {
+ v.context = C.cairo_reference(v.native())
+}
+
+// destroy is a wrapper around cairo_destroy().
+func (v *Context) destroy() {
+ if v.context != nil {
+ C.cairo_destroy(v.native())
+ v.context = nil
+ }
+}
+
+// Status is a wrapper around cairo_status().
+func (v *Context) Status() Status {
+ c := C.cairo_status(v.native())
+ return Status(c)
+}
+
+// Save is a wrapper around cairo_save().
+func (v *Context) Save() {
+ C.cairo_save(v.native())
+}
+
+// Restore is a wrapper around cairo_restore().
+func (v *Context) Restore() {
+ C.cairo_restore(v.native())
+}
+
+// GetTarget is a wrapper around cairo_get_target().
+func (v *Context) GetTarget() *Surface {
+ c := C.cairo_get_target(v.native())
+ s := wrapSurface(c)
+ s.reference()
+ runtime.SetFinalizer(s, (*Surface).destroy)
+ return s
+}
+
+// PushGroup is a wrapper around cairo_push_group().
+func (v *Context) PushGroup() {
+ C.cairo_push_group(v.native())
+}
+
+// PushGroupWithContent is a wrapper around cairo_push_group_with_content().
+func (v *Context) PushGroupWithContent(content Content) {
+ C.cairo_push_group_with_content(v.native(), C.cairo_content_t(content))
+}
+
+// TODO(jrick) PopGroup (depends on Pattern)
+
+// PopGroupToSource is a wrapper around cairo_pop_group_to_source().
+func (v *Context) PopGroupToSource() {
+ C.cairo_pop_group_to_source(v.native())
+}
+
+// GetGroupTarget is a wrapper around cairo_get_group_target().
+func (v *Context) GetGroupTarget() *Surface {
+ c := C.cairo_get_group_target(v.native())
+ s := wrapSurface(c)
+ s.reference()
+ runtime.SetFinalizer(s, (*Surface).destroy)
+ return s
+}
+
+// SetSource is a wrapper around cairo_set_source().
+func (v *Context) SetSource(p *Pattern) {
+ C.cairo_set_source(v.native(), p.native())
+}
+
+// SetSourceRGB is a wrapper around cairo_set_source_rgb().
+func (v *Context) SetSourceRGB(red, green, blue float64) {
+ C.cairo_set_source_rgb(v.native(), C.double(red), C.double(green),
+ C.double(blue))
+}
+
+// SetSourceRGBA is a wrapper around cairo_set_source_rgba().
+func (v *Context) SetSourceRGBA(red, green, blue, alpha float64) {
+ C.cairo_set_source_rgba(v.native(), C.double(red), C.double(green),
+ C.double(blue), C.double(alpha))
+}
+
+// TODO(jrick) SetSource (depends on Pattern)
+
+// SetSourceSurface is a wrapper around cairo_set_source_surface().
+func (v *Context) SetSourceSurface(surface *Surface, x, y float64) {
+ C.cairo_set_source_surface(v.native(), surface.native(), C.double(x),
+ C.double(y))
+}
+
+// TODO(jrick) GetSource (depends on Pattern)
+
+// SetAntialias is a wrapper around cairo_set_antialias().
+func (v *Context) SetAntialias(antialias Antialias) {
+ C.cairo_set_antialias(v.native(), C.cairo_antialias_t(antialias))
+}
+
+// GetAntialias is a wrapper around cairo_get_antialias().
+func (v *Context) GetAntialias() Antialias {
+ c := C.cairo_get_antialias(v.native())
+ return Antialias(c)
+}
+
+// SetDash is a wrapper around cairo_set_dash().
+func (v *Context) SetDash(dashes []float64, offset float64) {
+ header := (*reflect.SliceHeader)(unsafe.Pointer(&dashes))
+ cdashes := (*C.double)(unsafe.Pointer(header.Data))
+ C.cairo_set_dash(v.native(), cdashes, C.int(header.Len),
+ C.double(offset))
+}
+
+// GetDashCount is a wrapper around cairo_get_dash_count().
+func (v *Context) GetDashCount() int {
+ c := C.cairo_get_dash_count(v.native())
+ return int(c)
+}
+
+// GetDash is a wrapper around cairo_get_dash().
+func (v *Context) GetDash() (dashes []float64, offset float64) {
+ dashCount := v.GetDashCount()
+ cdashes := (*C.double)(C.calloc(8, C.size_t(dashCount)))
+ var coffset C.double
+ C.cairo_get_dash(v.native(), cdashes, &coffset)
+ header := (*reflect.SliceHeader)((unsafe.Pointer(&dashes)))
+ header.Data = uintptr(unsafe.Pointer(cdashes))
+ header.Len = dashCount
+ header.Cap = dashCount
+ return dashes, float64(coffset)
+}
+
+// SetFillRule is a wrapper around cairo_set_fill_rule().
+func (v *Context) SetFillRule(fillRule FillRule) {
+ C.cairo_set_fill_rule(v.native(), C.cairo_fill_rule_t(fillRule))
+}
+
+// GetFillRule is a wrapper around cairo_get_fill_rule().
+func (v *Context) GetFillRule() FillRule {
+ c := C.cairo_get_fill_rule(v.native())
+ return FillRule(c)
+}
+
+// SetLineCap is a wrapper around cairo_set_line_cap().
+func (v *Context) SetLineCap(lineCap LineCap) {
+ C.cairo_set_line_cap(v.native(), C.cairo_line_cap_t(lineCap))
+}
+
+// GetLineCap is a wrapper around cairo_get_line_cap().
+func (v *Context) GetLineCap() LineCap {
+ c := C.cairo_get_line_cap(v.native())
+ return LineCap(c)
+}
+
+// SetLineJoin is a wrapper around cairo_set_line_join().
+func (v *Context) SetLineJoin(lineJoin LineJoin) {
+ C.cairo_set_line_join(v.native(), C.cairo_line_join_t(lineJoin))
+}
+
+// GetLineJoin is a wrapper around cairo_get_line_join().
+func (v *Context) GetLineJoin() LineJoin {
+ c := C.cairo_get_line_join(v.native())
+ return LineJoin(c)
+}
+
+// SetLineWidth is a wrapper around cairo_set_line_width().
+func (v *Context) SetLineWidth(width float64) {
+ C.cairo_set_line_width(v.native(), C.double(width))
+}
+
+// GetLineWidth is a wrapper cairo_get_line_width().
+func (v *Context) GetLineWidth() float64 {
+ c := C.cairo_get_line_width(v.native())
+ return float64(c)
+}
+
+// SetMiterLimit is a wrapper around cairo_set_miter_limit().
+func (v *Context) SetMiterLimit(limit float64) {
+ C.cairo_set_miter_limit(v.native(), C.double(limit))
+}
+
+// GetMiterLimit is a wrapper around cairo_get_miter_limit().
+func (v *Context) GetMiterLimit() float64 {
+ c := C.cairo_get_miter_limit(v.native())
+ return float64(c)
+}
+
+// SetOperator is a wrapper around cairo_set_operator().
+func (v *Context) SetOperator(op Operator) {
+ C.cairo_set_operator(v.native(), C.cairo_operator_t(op))
+}
+
+// GetOperator is a wrapper around cairo_get_operator().
+func (v *Context) GetOperator() Operator {
+ c := C.cairo_get_operator(v.native())
+ return Operator(c)
+}
+
+// SetTolerance is a wrapper around cairo_set_tolerance().
+func (v *Context) SetTolerance(tolerance float64) {
+ C.cairo_set_tolerance(v.native(), C.double(tolerance))
+}
+
+// GetTolerance is a wrapper around cairo_get_tolerance().
+func (v *Context) GetTolerance() float64 {
+ c := C.cairo_get_tolerance(v.native())
+ return float64(c)
+}
+
+// Clip is a wrapper around cairo_clip().
+func (v *Context) Clip() {
+ C.cairo_clip(v.native())
+}
+
+// ClipPreserve is a wrapper around cairo_clip_preserve().
+func (v *Context) ClipPreserve() {
+ C.cairo_clip_preserve(v.native())
+}
+
+// ClipExtents is a wrapper around cairo_clip_extents().
+func (v *Context) ClipExtents() (x1, y1, x2, y2 float64) {
+ var cx1, cy1, cx2, cy2 C.double
+ C.cairo_clip_extents(v.native(), &cx1, &cy1, &cx2, &cy2)
+ return float64(cx1), float64(cy1), float64(cx2), float64(cy2)
+}
+
+// InClip is a wrapper around cairo_in_clip().
+func (v *Context) InClip(x, y float64) bool {
+ c := C.cairo_in_clip(v.native(), C.double(x), C.double(y))
+ return gobool(c)
+}
+
+// ResetClip is a wrapper around cairo_reset_clip().
+func (v *Context) ResetClip() {
+ C.cairo_reset_clip(v.native())
+}
+
+// Rectangle is a wrapper around cairo_rectangle().
+func (v *Context) Rectangle(x, y, w, h float64) {
+ C.cairo_rectangle(v.native(), C.double(x), C.double(y), C.double(w), C.double(h))
+}
+
+// Arc is a wrapper around cairo_arc().
+func (v *Context) Arc(xc, yc, radius, angle1, angle2 float64) {
+ C.cairo_arc(v.native(), C.double(xc), C.double(yc), C.double(radius), C.double(angle1), C.double(angle2))
+}
+
+// ArcNegative is a wrapper around cairo_arc_negative().
+func (v *Context) ArcNegative(xc, yc, radius, angle1, angle2 float64) {
+ C.cairo_arc_negative(v.native(), C.double(xc), C.double(yc), C.double(radius), C.double(angle1), C.double(angle2))
+}
+
+// LineTo is a wrapper around cairo_line_to().
+func (v *Context) LineTo(x, y float64) {
+ C.cairo_line_to(v.native(), C.double(x), C.double(y))
+}
+
+// CurveTo is a wrapper around cairo_curve_to().
+func (v *Context) CurveTo(x1, y1, x2, y2, x3, y3 float64) {
+ C.cairo_curve_to(v.native(), C.double(x1), C.double(y1), C.double(x2), C.double(y2), C.double(x3), C.double(y3))
+}
+
+// MoveTo is a wrapper around cairo_move_to().
+func (v *Context) MoveTo(x, y float64) {
+ C.cairo_move_to(v.native(), C.double(x), C.double(y))
+}
+
+// TODO(jrick) CopyRectangleList (depends on RectangleList)
+
+// Fill is a wrapper around cairo_fill().
+func (v *Context) Fill() {
+ C.cairo_fill(v.native())
+}
+
+// ClosePath is a wrapper around cairo_close_path().
+func (v *Context) ClosePath() {
+ C.cairo_close_path(v.native())
+}
+
+// NewPath is a wrapper around cairo_new_path().
+func (v *Context) NewPath() {
+ C.cairo_new_path(v.native())
+}
+
+// GetCurrentPoint is a wrapper around cairo_get_current_point().
+func (v *Context) GetCurrentPoint() (x, y float64) {
+ C.cairo_get_current_point(v.native(), (*C.double)(&x), (*C.double)(&y))
+ return
+}
+
+// FillPreserve is a wrapper around cairo_fill_preserve().
+func (v *Context) FillPreserve() {
+ C.cairo_fill_preserve(v.native())
+}
+
+// FillExtents is a wrapper around cairo_fill_extents().
+func (v *Context) FillExtents() (x1, y1, x2, y2 float64) {
+ var cx1, cy1, cx2, cy2 C.double
+ C.cairo_fill_extents(v.native(), &cx1, &cy1, &cx2, &cy2)
+ return float64(cx1), float64(cy1), float64(cx2), float64(cy2)
+}
+
+// InFill is a wrapper around cairo_in_fill().
+func (v *Context) InFill(x, y float64) bool {
+ c := C.cairo_in_fill(v.native(), C.double(x), C.double(y))
+ return gobool(c)
+}
+
+// TODO(jrick) Mask (depends on Pattern)
+
+// MaskSurface is a wrapper around cairo_mask_surface().
+func (v *Context) MaskSurface(surface *Surface, surfaceX, surfaceY float64) {
+ C.cairo_mask_surface(v.native(), surface.native(), C.double(surfaceX),
+ C.double(surfaceY))
+}
+
+// Paint is a wrapper around cairo_paint().
+func (v *Context) Paint() {
+ C.cairo_paint(v.native())
+}
+
+// PaintWithAlpha is a wrapper around cairo_paint_with_alpha().
+func (v *Context) PaintWithAlpha(alpha float64) {
+ C.cairo_paint_with_alpha(v.native(), C.double(alpha))
+}
+
+// Stroke is a wrapper around cairo_stroke().
+func (v *Context) Stroke() {
+ C.cairo_stroke(v.native())
+}
+
+// StrokePreserve is a wrapper around cairo_stroke_preserve().
+func (v *Context) StrokePreserve() {
+ C.cairo_stroke_preserve(v.native())
+}
+
+// StrokeExtents is a wrapper around cairo_stroke_extents().
+func (v *Context) StrokeExtents() (x1, y1, x2, y2 float64) {
+ var cx1, cy1, cx2, cy2 C.double
+ C.cairo_stroke_extents(v.native(), &cx1, &cy1, &cx2, &cy2)
+ return float64(cx1), float64(cy1), float64(cx2), float64(cy2)
+}
+
+// InStroke is a wrapper around cairo_in_stroke().
+func (v *Context) InStroke(x, y float64) bool {
+ c := C.cairo_in_stroke(v.native(), C.double(x), C.double(y))
+ return gobool(c)
+}
+
+// CopyPage is a wrapper around cairo_copy_page().
+func (v *Context) CopyPage() {
+ C.cairo_copy_page(v.native())
+}
+
+// ShowPage is a wrapper around cairo_show_page().
+func (v *Context) ShowPage() {
+ C.cairo_show_page(v.native())
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/errors.go b/vendor/github.com/gotk3/gotk3/cairo/errors.go
new file mode 100644
index 0000000..1e48a8a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/errors.go
@@ -0,0 +1,7 @@
+package cairo
+
+type ErrorStatus Status
+
+func (e ErrorStatus) Error() string {
+ return StatusToString(Status(e))
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/fillrule.go b/vendor/github.com/gotk3/gotk3/cairo/fillrule.go
new file mode 100644
index 0000000..c0e3ba4
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/fillrule.go
@@ -0,0 +1,22 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+import (
+ "unsafe"
+)
+
+// FillRule is a representation of Cairo's cairo_fill_rule_t.
+type FillRule int
+
+const (
+ FILL_RULE_WINDING FillRule = C.CAIRO_FILL_RULE_WINDING
+ FILL_RULE_EVEN_ODD FillRule = C.CAIRO_FILL_RULE_EVEN_ODD
+)
+
+func marshalFillRule(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return FillRule(c), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/format.go b/vendor/github.com/gotk3/gotk3/cairo/format.go
new file mode 100644
index 0000000..595f715
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/format.go
@@ -0,0 +1,27 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+import (
+ "unsafe"
+)
+
+// Format is a representation of Cairo's cairo_format_t.
+type Format int
+
+const (
+ FORMAT_INVALID Format = C.CAIRO_FORMAT_INVALID
+ FORMAT_ARGB32 Format = C.CAIRO_FORMAT_ARGB32
+ FORMAT_RGB24 Format = C.CAIRO_FORMAT_RGB24
+ FORMAT_A8 Format = C.CAIRO_FORMAT_A8
+ FORMAT_A1 Format = C.CAIRO_FORMAT_A1
+ FORMAT_RGB16_565 Format = C.CAIRO_FORMAT_RGB16_565
+ FORMAT_RGB30 Format = C.CAIRO_FORMAT_RGB30
+)
+
+func marshalFormat(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Format(c), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/linecap.go b/vendor/github.com/gotk3/gotk3/cairo/linecap.go
new file mode 100644
index 0000000..553465a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/linecap.go
@@ -0,0 +1,23 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+import (
+ "unsafe"
+)
+
+// LineCap is a representation of Cairo's cairo_line_cap_t.
+type LineCap int
+
+const (
+ LINE_CAP_BUTT LineCap = C.CAIRO_LINE_CAP_BUTT
+ LINE_CAP_ROUND LineCap = C.CAIRO_LINE_CAP_ROUND
+ LINE_CAP_SQUARE LineCap = C.CAIRO_LINE_CAP_SQUARE
+)
+
+func marshalLineCap(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return LineCap(c), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/linejoin.go b/vendor/github.com/gotk3/gotk3/cairo/linejoin.go
new file mode 100644
index 0000000..3a05920
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/linejoin.go
@@ -0,0 +1,23 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+import (
+ "unsafe"
+)
+
+// LineJoin is a representation of Cairo's cairo_line_join_t.
+type LineJoin int
+
+const (
+ LINE_JOIN_MITER LineJoin = C.CAIRO_LINE_JOIN_MITER
+ LINE_JOIN_ROUND LineJoin = C.CAIRO_LINE_JOIN_ROUND
+ LINE_JOIN_BEVEL LineJoin = C.CAIRO_LINE_JOIN_BEVEL
+)
+
+func marshalLineJoin(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return LineJoin(c), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/matrix.go b/vendor/github.com/gotk3/gotk3/cairo/matrix.go
new file mode 100644
index 0000000..a934df6
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/matrix.go
@@ -0,0 +1,98 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+
+import (
+ "unsafe"
+)
+
+// Matrix struct
+type Matrix struct {
+ Xx, Yx float64
+ Xy, Yy float64
+ X0, Y0 float64
+}
+
+// NewMatrix creates a new identiy matrix
+func NewMatrix(xx, yx, xy, yy, x0, y0 float64) *Matrix {
+ return &Matrix{
+ Xx: xx,
+ Yx: yx,
+ Xy: xy,
+ Yy: yy,
+ X0: x0,
+ Y0: y0,
+ }
+}
+
+// Native returns native c pointer to a matrix
+func (m *Matrix) native() *C.cairo_matrix_t {
+ return (*C.cairo_matrix_t)(unsafe.Pointer(m))
+}
+
+// Native returns native c pointer to a matrix
+func (m *Matrix) Native() uintptr {
+ return uintptr(unsafe.Pointer(m.native()))
+}
+
+// InitIdentity initializes this matrix to identity matrix
+func (m *Matrix) InitIdentity() {
+ C.cairo_matrix_init_identity(m.native())
+}
+
+// InitTranslate initializes a matrix with the given translation
+func (m *Matrix) InitTranslate(tx, ty float64) {
+ C.cairo_matrix_init_translate(m.native(), C.double(tx), C.double(ty))
+}
+
+// InitScale initializes a matrix with the give scale
+func (m *Matrix) InitScale(sx, sy float64) {
+ C.cairo_matrix_init_scale(m.native(), C.double(sx), C.double(sy))
+}
+
+// InitRotate initializes a matrix with the given rotation
+func (m *Matrix) InitRotate(radians float64) {
+ C.cairo_matrix_init_rotate(m.native(), C.double(radians))
+}
+
+// Translate translates a matrix by the given amount
+func (m *Matrix) Translate(tx, ty float64) {
+ C.cairo_matrix_translate(m.native(), C.double(tx), C.double(ty))
+}
+
+// Scale scales the matrix by the given amounts
+func (m *Matrix) Scale(sx, sy float64) {
+ C.cairo_matrix_scale(m.native(), C.double(sx), C.double(sy))
+}
+
+// Rotate rotates the matrix by the given amount
+func (m *Matrix) Rotate(radians float64) {
+ C.cairo_matrix_rotate(m.native(), C.double(radians))
+}
+
+// Invert inverts the matrix
+func (m *Matrix) Invert() {
+ C.cairo_matrix_invert(m.native())
+}
+
+// Multiply multiplies the matrix by another matrix
+func (m *Matrix) Multiply(a, b Matrix) {
+ C.cairo_matrix_multiply(m.native(), a.native(), b.native())
+}
+
+// TransformDistance ...
+func (m *Matrix) TransformDistance(dx, dy float64) (float64, float64) {
+ C.cairo_matrix_transform_distance(m.native(),
+ (*C.double)(unsafe.Pointer(&dx)), (*C.double)(unsafe.Pointer(&dy)))
+ return dx, dy
+}
+
+// TransformPoint ...
+func (m *Matrix) TransformPoint(x, y float64) (float64, float64) {
+ C.cairo_matrix_transform_point(m.native(),
+ (*C.double)(unsafe.Pointer(&x)), (*C.double)(unsafe.Pointer(&y)))
+ return x, y
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/mimetype.go b/vendor/github.com/gotk3/gotk3/cairo/mimetype.go
new file mode 100644
index 0000000..406273e
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/mimetype.go
@@ -0,0 +1,13 @@
+package cairo
+
+// MimeType is a representation of Cairo's CAIRO_MIME_TYPE_*
+// preprocessor constants.
+type MimeType string
+
+const (
+ MIME_TYPE_JP2 MimeType = "image/jp2"
+ MIME_TYPE_JPEG MimeType = "image/jpeg"
+ MIME_TYPE_PNG MimeType = "image/png"
+ MIME_TYPE_URI MimeType = "image/x-uri"
+ MIME_TYPE_UNIQUE_ID MimeType = "application/x-cairo.uuid"
+)
diff --git a/vendor/github.com/gotk3/gotk3/cairo/operator.go b/vendor/github.com/gotk3/gotk3/cairo/operator.go
new file mode 100644
index 0000000..b71cbf4
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/operator.go
@@ -0,0 +1,49 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+import (
+ "unsafe"
+)
+
+// Operator is a representation of Cairo's cairo_operator_t.
+type Operator int
+
+const (
+ OPERATOR_CLEAR Operator = C.CAIRO_OPERATOR_CLEAR
+ OPERATOR_SOURCE Operator = C.CAIRO_OPERATOR_SOURCE
+ OPERATOR_OVER Operator = C.CAIRO_OPERATOR_OVER
+ OPERATOR_IN Operator = C.CAIRO_OPERATOR_IN
+ OPERATOR_OUT Operator = C.CAIRO_OPERATOR_OUT
+ OPERATOR_ATOP Operator = C.CAIRO_OPERATOR_ATOP
+ OPERATOR_DEST Operator = C.CAIRO_OPERATOR_DEST
+ OPERATOR_DEST_OVER Operator = C.CAIRO_OPERATOR_DEST_OVER
+ OPERATOR_DEST_IN Operator = C.CAIRO_OPERATOR_DEST_IN
+ OPERATOR_DEST_OUT Operator = C.CAIRO_OPERATOR_DEST_OUT
+ OPERATOR_DEST_ATOP Operator = C.CAIRO_OPERATOR_DEST_ATOP
+ OPERATOR_XOR Operator = C.CAIRO_OPERATOR_XOR
+ OPERATOR_ADD Operator = C.CAIRO_OPERATOR_ADD
+ OPERATOR_SATURATE Operator = C.CAIRO_OPERATOR_SATURATE
+ OPERATOR_MULTIPLY Operator = C.CAIRO_OPERATOR_MULTIPLY
+ OPERATOR_SCREEN Operator = C.CAIRO_OPERATOR_SCREEN
+ OPERATOR_OVERLAY Operator = C.CAIRO_OPERATOR_OVERLAY
+ OPERATOR_DARKEN Operator = C.CAIRO_OPERATOR_DARKEN
+ OPERATOR_LIGHTEN Operator = C.CAIRO_OPERATOR_LIGHTEN
+ OPERATOR_COLOR_DODGE Operator = C.CAIRO_OPERATOR_COLOR_DODGE
+ OPERATOR_COLOR_BURN Operator = C.CAIRO_OPERATOR_COLOR_BURN
+ OPERATOR_HARD_LIGHT Operator = C.CAIRO_OPERATOR_HARD_LIGHT
+ OPERATOR_SOFT_LIGHT Operator = C.CAIRO_OPERATOR_SOFT_LIGHT
+ OPERATOR_DIFFERENCE Operator = C.CAIRO_OPERATOR_DIFFERENCE
+ OPERATOR_EXCLUSION Operator = C.CAIRO_OPERATOR_EXCLUSION
+ OPERATOR_HSL_HUE Operator = C.CAIRO_OPERATOR_HSL_HUE
+ OPERATOR_HSL_SATURATION Operator = C.CAIRO_OPERATOR_HSL_SATURATION
+ OPERATOR_HSL_COLOR Operator = C.CAIRO_OPERATOR_HSL_COLOR
+ OPERATOR_HSL_LUMINOSITY Operator = C.CAIRO_OPERATOR_HSL_LUMINOSITY
+)
+
+func marshalOperator(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Operator(c), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/pattern.go b/vendor/github.com/gotk3/gotk3/cairo/pattern.go
new file mode 100644
index 0000000..229567c
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/pattern.go
@@ -0,0 +1,112 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+
+import (
+ "runtime"
+ "unsafe"
+)
+
+//--------------------------------------------[ cairo_pattern_t == Pattern ]--
+
+// Pattern is a representation of Cairo's cairo_pattern_t.
+type Pattern struct {
+ pattern *C.cairo_pattern_t
+}
+
+// NewPatternFromRGB is a wrapper around cairo_pattern_create_rgb().
+func NewPatternFromRGB(red, green, blue float64) (*Pattern, error) {
+ c := C.cairo_pattern_create_rgb(C.double(red), C.double(green), C.double(blue))
+ return newPatternFromNative(c)
+}
+
+// NewPatternFromRGBA is a wrapper around cairo_pattern_create_rgba().
+func NewPatternFromRGBA(red, green, blue, alpha float64) (*Pattern, error) {
+ c := C.cairo_pattern_create_rgba(C.double(red), C.double(green), C.double(blue), C.double(alpha))
+ return newPatternFromNative(c)
+}
+
+// NewPatternForSurface is a wrapper around cairo_pattern_create_for_surface().
+func NewPatternForSurface(s *Surface) (*Pattern, error) {
+ c := C.cairo_pattern_create_for_surface(s.native())
+ return newPatternFromNative(c)
+}
+
+// NewPatternLinear is a wrapper around cairo_pattern_create_linear().
+func NewPatternLinear(x0, y0, x1, y1 float64) (*Pattern, error) {
+ c := C.cairo_pattern_create_linear(C.double(x0), C.double(y0), C.double(x1), C.double(y1))
+ return newPatternFromNative(c)
+}
+
+// NewPatternRadial is a wrapper around cairo_pattern_create_radial().
+func NewPatternRadial(x0, y0, r0, x1, y1, r1 float64) (*Pattern, error) {
+ c := C.cairo_pattern_create_radial(C.double(x0), C.double(y0), C.double(r0),
+ C.double(x1), C.double(y1), C.double(r1))
+ return newPatternFromNative(c)
+}
+
+func newPatternFromNative(patternNative *C.cairo_pattern_t) (*Pattern, error) {
+ ptr := wrapPattern(patternNative)
+ e := ptr.Status().ToError()
+ if e != nil {
+ return nil, e
+ }
+ runtime.SetFinalizer(ptr, (*Pattern).destroy)
+ return ptr, nil
+}
+
+// native returns a pointer to the underlying cairo_pattern_t.
+func (v *Pattern) native() *C.cairo_pattern_t {
+ if v == nil {
+ return nil
+ }
+ return v.pattern
+}
+
+// Native returns a pointer to the underlying cairo_pattern_t.
+func (v *Pattern) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalPattern(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ pattern := (*C.cairo_pattern_t)(unsafe.Pointer(c))
+ return wrapPattern(pattern), nil
+}
+
+func wrapPattern(pattern *C.cairo_pattern_t) *Pattern {
+ return &Pattern{pattern}
+}
+
+// reference is a wrapper around cairo_pattern_reference().
+func (v *Pattern) reference() {
+ v.pattern = C.cairo_pattern_reference(v.native())
+}
+
+// destroy is a wrapper around cairo_pattern_destroy().
+func (v *Pattern) destroy() {
+ C.cairo_pattern_destroy(v.native())
+}
+
+// Status is a wrapper around cairo_pattern_status().
+func (v *Pattern) Status() Status {
+ c := C.cairo_pattern_status(v.native())
+ return Status(c)
+}
+
+// AddColorStopRGB is a wrapper around cairo_pattern_add_color_stop_rgb().
+func (v *Pattern) AddColorStopRGB(offset, red, green, blue float64) error {
+ C.cairo_pattern_add_color_stop_rgb(v.native(), C.double(offset),
+ C.double(red), C.double(green), C.double(blue))
+ return v.Status().ToError()
+}
+
+// AddColorStopRGBA is a wrapper around cairo_pattern_add_color_stop_rgba().
+func (v *Pattern) AddColorStopRGBA(offset, red, green, blue, alpha float64) error {
+ C.cairo_pattern_add_color_stop_rgba(v.native(), C.double(offset),
+ C.double(red), C.double(green), C.double(blue), C.double(alpha))
+ return v.Status().ToError()
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/status.go b/vendor/github.com/gotk3/gotk3/cairo/status.go
new file mode 100644
index 0000000..64b00c3
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/status.go
@@ -0,0 +1,124 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+import (
+ "errors"
+ "strings"
+ "unsafe"
+)
+
+// Status is a representation of Cairo's cairo_status_t.
+type Status int
+
+const (
+ STATUS_SUCCESS Status = C.CAIRO_STATUS_SUCCESS
+ STATUS_NO_MEMORY Status = C.CAIRO_STATUS_NO_MEMORY
+ STATUS_INVALID_RESTORE Status = C.CAIRO_STATUS_INVALID_RESTORE
+ STATUS_INVALID_POP_GROUP Status = C.CAIRO_STATUS_INVALID_POP_GROUP
+ STATUS_NO_CURRENT_POINT Status = C.CAIRO_STATUS_NO_CURRENT_POINT
+ STATUS_INVALID_MATRIX Status = C.CAIRO_STATUS_INVALID_MATRIX
+ STATUS_INVALID_STATUS Status = C.CAIRO_STATUS_INVALID_STATUS
+ STATUS_NULL_POINTER Status = C.CAIRO_STATUS_NULL_POINTER
+ STATUS_INVALID_STRING Status = C.CAIRO_STATUS_INVALID_STRING
+ STATUS_INVALID_PATH_DATA Status = C.CAIRO_STATUS_INVALID_PATH_DATA
+ STATUS_READ_ERROR Status = C.CAIRO_STATUS_READ_ERROR
+ STATUS_WRITE_ERROR Status = C.CAIRO_STATUS_WRITE_ERROR
+ STATUS_SURFACE_FINISHED Status = C.CAIRO_STATUS_SURFACE_FINISHED
+ STATUS_SURFACE_TYPE_MISMATCH Status = C.CAIRO_STATUS_SURFACE_TYPE_MISMATCH
+ STATUS_PATTERN_TYPE_MISMATCH Status = C.CAIRO_STATUS_PATTERN_TYPE_MISMATCH
+ STATUS_INVALID_CONTENT Status = C.CAIRO_STATUS_INVALID_CONTENT
+ STATUS_INVALID_FORMAT Status = C.CAIRO_STATUS_INVALID_FORMAT
+ STATUS_INVALID_VISUAL Status = C.CAIRO_STATUS_INVALID_VISUAL
+ STATUS_FILE_NOT_FOUND Status = C.CAIRO_STATUS_FILE_NOT_FOUND
+ STATUS_INVALID_DASH Status = C.CAIRO_STATUS_INVALID_DASH
+ STATUS_INVALID_DSC_COMMENT Status = C.CAIRO_STATUS_INVALID_DSC_COMMENT
+ STATUS_INVALID_INDEX Status = C.CAIRO_STATUS_INVALID_INDEX
+ STATUS_CLIP_NOT_REPRESENTABLE Status = C.CAIRO_STATUS_CLIP_NOT_REPRESENTABLE
+ STATUS_TEMP_FILE_ERROR Status = C.CAIRO_STATUS_TEMP_FILE_ERROR
+ STATUS_INVALID_STRIDE Status = C.CAIRO_STATUS_INVALID_STRIDE
+ STATUS_FONT_TYPE_MISMATCH Status = C.CAIRO_STATUS_FONT_TYPE_MISMATCH
+ STATUS_USER_FONT_IMMUTABLE Status = C.CAIRO_STATUS_USER_FONT_IMMUTABLE
+ STATUS_USER_FONT_ERROR Status = C.CAIRO_STATUS_USER_FONT_ERROR
+ STATUS_NEGATIVE_COUNT Status = C.CAIRO_STATUS_NEGATIVE_COUNT
+ STATUS_INVALID_CLUSTERS Status = C.CAIRO_STATUS_INVALID_CLUSTERS
+ STATUS_INVALID_SLANT Status = C.CAIRO_STATUS_INVALID_SLANT
+ STATUS_INVALID_WEIGHT Status = C.CAIRO_STATUS_INVALID_WEIGHT
+ STATUS_INVALID_SIZE Status = C.CAIRO_STATUS_INVALID_SIZE
+ STATUS_USER_FONT_NOT_IMPLEMENTED Status = C.CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED
+ STATUS_DEVICE_TYPE_MISMATCH Status = C.CAIRO_STATUS_DEVICE_TYPE_MISMATCH
+ STATUS_DEVICE_ERROR Status = C.CAIRO_STATUS_DEVICE_ERROR
+ // STATUS_INVALID_MESH_CONSTRUCTION Status = C.CAIRO_STATUS_INVALID_MESH_CONSTRUCTION (since 1.12)
+ // STATUS_DEVICE_FINISHED Status = C.CAIRO_STATUS_DEVICE_FINISHED (since 1.12)
+)
+
+var key_Status = map[Status]string{
+
+ STATUS_SUCCESS: "CAIRO_STATUS_SUCCESS",
+ STATUS_NO_MEMORY: "CAIRO_STATUS_NO_MEMORY",
+ STATUS_INVALID_RESTORE: "CAIRO_STATUS_INVALID_RESTORE",
+ STATUS_INVALID_POP_GROUP: "CAIRO_STATUS_INVALID_POP_GROUP",
+ STATUS_NO_CURRENT_POINT: "CAIRO_STATUS_NO_CURRENT_POINT",
+ STATUS_INVALID_MATRIX: "CAIRO_STATUS_INVALID_MATRIX",
+ STATUS_INVALID_STATUS: "CAIRO_STATUS_INVALID_STATUS",
+ STATUS_NULL_POINTER: "CAIRO_STATUS_NULL_POINTER",
+ STATUS_INVALID_STRING: "CAIRO_STATUS_INVALID_STRING",
+ STATUS_INVALID_PATH_DATA: "CAIRO_STATUS_INVALID_PATH_DATA",
+ STATUS_READ_ERROR: "CAIRO_STATUS_READ_ERROR",
+ STATUS_WRITE_ERROR: "CAIRO_STATUS_WRITE_ERROR",
+ STATUS_SURFACE_FINISHED: "CAIRO_STATUS_SURFACE_FINISHED",
+ STATUS_SURFACE_TYPE_MISMATCH: "CAIRO_STATUS_SURFACE_TYPE_MISMATCH",
+ STATUS_PATTERN_TYPE_MISMATCH: "CAIRO_STATUS_PATTERN_TYPE_MISMATCH",
+ STATUS_INVALID_CONTENT: "CAIRO_STATUS_INVALID_CONTENT",
+ STATUS_INVALID_FORMAT: "CAIRO_STATUS_INVALID_FORMAT",
+ STATUS_INVALID_VISUAL: "CAIRO_STATUS_INVALID_VISUAL",
+ STATUS_FILE_NOT_FOUND: "CAIRO_STATUS_FILE_NOT_FOUND",
+ STATUS_INVALID_DASH: "CAIRO_STATUS_INVALID_DASH",
+ STATUS_INVALID_DSC_COMMENT: "CAIRO_STATUS_INVALID_DSC_COMMENT",
+ STATUS_INVALID_INDEX: "CAIRO_STATUS_INVALID_INDEX",
+ STATUS_CLIP_NOT_REPRESENTABLE: "CAIRO_STATUS_CLIP_NOT_REPRESENTABLE",
+ STATUS_TEMP_FILE_ERROR: "CAIRO_STATUS_TEMP_FILE_ERROR",
+ STATUS_INVALID_STRIDE: "CAIRO_STATUS_INVALID_STRIDE",
+ STATUS_FONT_TYPE_MISMATCH: "CAIRO_STATUS_FONT_TYPE_MISMATCH",
+ STATUS_USER_FONT_IMMUTABLE: "CAIRO_STATUS_USER_FONT_IMMUTABLE",
+ STATUS_USER_FONT_ERROR: "CAIRO_STATUS_USER_FONT_ERROR",
+ STATUS_NEGATIVE_COUNT: "CAIRO_STATUS_NEGATIVE_COUNT",
+ STATUS_INVALID_CLUSTERS: "CAIRO_STATUS_INVALID_CLUSTERS",
+ STATUS_INVALID_SLANT: "CAIRO_STATUS_INVALID_SLANT",
+ STATUS_INVALID_WEIGHT: "CAIRO_STATUS_INVALID_WEIGHT",
+ STATUS_INVALID_SIZE: "CAIRO_STATUS_INVALID_SIZE",
+ STATUS_USER_FONT_NOT_IMPLEMENTED: "CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED",
+ STATUS_DEVICE_TYPE_MISMATCH: "CAIRO_STATUS_DEVICE_TYPE_MISMATCH",
+ STATUS_DEVICE_ERROR: "CAIRO_STATUS_DEVICE_ERROR",
+}
+
+func StatusToString(status Status) string {
+ s, ok := key_Status[status]
+ if !ok {
+ s = "CAIRO_STATUS_UNDEFINED"
+ }
+ return s
+}
+
+func marshalStatus(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Status(c), nil
+}
+
+// String returns a readable status messsage usable in texts.
+func (s Status) String() string {
+ str := StatusToString(s)
+ str = strings.Replace(str, "CAIRO_STATUS_", "", 1)
+ str = strings.Replace(str, "_", " ", 0)
+ return strings.ToLower(str)
+}
+
+// ToError returns the error for the status. Returns nil if success.
+func (s Status) ToError() error {
+ if s == STATUS_SUCCESS {
+ return nil
+ }
+ return errors.New(s.String())
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/surface.go b/vendor/github.com/gotk3/gotk3/cairo/surface.go
new file mode 100644
index 0000000..c9bd55a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/surface.go
@@ -0,0 +1,275 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+// #include <cairo-pdf.h>
+import "C"
+
+import (
+ "runtime"
+ "unsafe"
+)
+
+// TODO(jrick) SetUserData (depends on UserDataKey and DestroyFunc)
+
+// TODO(jrick) GetUserData (depends on UserDataKey)
+
+/*
+ * cairo_surface_t
+ */
+
+// Surface is a representation of Cairo's cairo_surface_t.
+type Surface struct {
+ surface *C.cairo_surface_t
+}
+
+func NewSurfaceFromPNG(fileName string) (*Surface, error) {
+
+ cstr := C.CString(fileName)
+ defer C.free(unsafe.Pointer(cstr))
+
+ surfaceNative := C.cairo_image_surface_create_from_png(cstr)
+
+ status := Status(C.cairo_surface_status(surfaceNative))
+ if status != STATUS_SUCCESS {
+ return nil, ErrorStatus(status)
+ }
+
+ return &Surface{surfaceNative}, nil
+}
+
+// CreateImageSurface is a wrapper around cairo_image_surface_create().
+func CreateImageSurface(format Format, width, height int) *Surface {
+ c := C.cairo_image_surface_create(C.cairo_format_t(format),
+ C.int(width), C.int(height))
+ s := wrapSurface(c)
+ runtime.SetFinalizer(s, (*Surface).destroy)
+ return s
+}
+
+/// Create a new PDF surface.
+func CreatePDFSurface(fileName string, width float64, height float64) (*Surface, error) {
+ cstr := C.CString(fileName)
+ defer C.free(unsafe.Pointer(cstr))
+
+ surfaceNative := C.cairo_pdf_surface_create(cstr, C.double(width), C.double(height))
+
+ status := Status(C.cairo_surface_status(surfaceNative))
+ if status != STATUS_SUCCESS {
+ return nil, ErrorStatus(status)
+ }
+
+ s := wrapSurface(surfaceNative)
+
+ runtime.SetFinalizer(s, (*Surface).destroy)
+
+ return s, nil
+}
+
+// native returns a pointer to the underlying cairo_surface_t.
+func (v *Surface) native() *C.cairo_surface_t {
+ if v == nil {
+ return nil
+ }
+ return v.surface
+}
+
+// Native returns a pointer to the underlying cairo_surface_t.
+func (v *Surface) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalSurface(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return WrapSurface(uintptr(c)), nil
+}
+
+func wrapSurface(surface *C.cairo_surface_t) *Surface {
+ return &Surface{surface}
+}
+
+// NewSurface creates a gotk3 cairo Surface from a pointer to a
+// C cairo_surface_t. This is primarily designed for use with other
+// gotk3 packages and should be avoided by applications.
+func NewSurface(s uintptr, needsRef bool) *Surface {
+ surface := WrapSurface(s)
+ if needsRef {
+ surface.reference()
+ }
+ runtime.SetFinalizer(surface, (*Surface).destroy)
+ return surface
+}
+
+func WrapSurface(s uintptr) *Surface {
+ ptr := (*C.cairo_surface_t)(unsafe.Pointer(s))
+ return wrapSurface(ptr)
+}
+
+// Closes the surface. The surface must not be used afterwards.
+func (v *Surface) Close() {
+ v.destroy()
+}
+
+// CreateSimilar is a wrapper around cairo_surface_create_similar().
+func (v *Surface) CreateSimilar(content Content, width, height int) *Surface {
+ c := C.cairo_surface_create_similar(v.native(),
+ C.cairo_content_t(content), C.int(width), C.int(height))
+ s := wrapSurface(c)
+ runtime.SetFinalizer(s, (*Surface).destroy)
+ return s
+}
+
+// TODO cairo_surface_create_similar_image (since 1.12)
+
+// CreateForRectangle is a wrapper around cairo_surface_create_for_rectangle().
+func (v *Surface) CreateForRectangle(x, y, width, height float64) *Surface {
+ c := C.cairo_surface_create_for_rectangle(v.native(), C.double(x),
+ C.double(y), C.double(width), C.double(height))
+ s := wrapSurface(c)
+ runtime.SetFinalizer(s, (*Surface).destroy)
+ return s
+}
+
+// reference is a wrapper around cairo_surface_reference().
+func (v *Surface) reference() {
+ v.surface = C.cairo_surface_reference(v.native())
+}
+
+// destroy is a wrapper around cairo_surface_destroy().
+func (v *Surface) destroy() {
+ if v.surface != nil {
+ C.cairo_surface_destroy(v.native())
+ v.surface = nil
+ }
+}
+
+// Status is a wrapper around cairo_surface_status().
+func (v *Surface) Status() Status {
+ c := C.cairo_surface_status(v.native())
+ return Status(c)
+}
+
+// Flush is a wrapper around cairo_surface_flush().
+func (v *Surface) Flush() {
+ C.cairo_surface_flush(v.native())
+}
+
+// TODO(jrick) GetDevice (requires Device bindings)
+
+// TODO(jrick) GetFontOptions (require FontOptions bindings)
+
+// TODO(jrick) GetContent (requires Content bindings)
+
+// MarkDirty is a wrapper around cairo_surface_mark_dirty().
+func (v *Surface) MarkDirty() {
+ C.cairo_surface_mark_dirty(v.native())
+}
+
+// MarkDirtyRectangle is a wrapper around cairo_surface_mark_dirty_rectangle().
+func (v *Surface) MarkDirtyRectangle(x, y, width, height int) {
+ C.cairo_surface_mark_dirty_rectangle(v.native(), C.int(x), C.int(y),
+ C.int(width), C.int(height))
+}
+
+// SetDeviceOffset is a wrapper around cairo_surface_set_device_offset().
+func (v *Surface) SetDeviceOffset(x, y float64) {
+ C.cairo_surface_set_device_offset(v.native(), C.double(x), C.double(y))
+}
+
+// GetDeviceOffset is a wrapper around cairo_surface_get_device_offset().
+func (v *Surface) GetDeviceOffset() (x, y float64) {
+ var xOffset, yOffset C.double
+ C.cairo_surface_get_device_offset(v.native(), &xOffset, &yOffset)
+ return float64(xOffset), float64(yOffset)
+}
+
+// SetFallbackResolution is a wrapper around
+// cairo_surface_set_fallback_resolution().
+func (v *Surface) SetFallbackResolution(xPPI, yPPI float64) {
+ C.cairo_surface_set_fallback_resolution(v.native(), C.double(xPPI),
+ C.double(yPPI))
+}
+
+// GetFallbackResolution is a wrapper around
+// cairo_surface_get_fallback_resolution().
+func (v *Surface) GetFallbackResolution() (xPPI, yPPI float64) {
+ var x, y C.double
+ C.cairo_surface_get_fallback_resolution(v.native(), &x, &y)
+ return float64(x), float64(y)
+}
+
+// GetType is a wrapper around cairo_surface_get_type().
+func (v *Surface) GetType() SurfaceType {
+ c := C.cairo_surface_get_type(v.native())
+ return SurfaceType(c)
+}
+
+// TODO(jrick) SetUserData (depends on UserDataKey and DestroyFunc)
+
+// TODO(jrick) GetUserData (depends on UserDataKey)
+
+// CopyPage is a wrapper around cairo_surface_copy_page().
+func (v *Surface) CopyPage() {
+ C.cairo_surface_copy_page(v.native())
+}
+
+// ShowPage is a wrapper around cairo_surface_show_page().
+func (v *Surface) ShowPage() {
+ C.cairo_surface_show_page(v.native())
+}
+
+// HasShowTextGlyphs is a wrapper around cairo_surface_has_show_text_glyphs().
+func (v *Surface) HasShowTextGlyphs() bool {
+ c := C.cairo_surface_has_show_text_glyphs(v.native())
+ return gobool(c)
+}
+
+// TODO(jrick) SetMimeData (depends on DestroyFunc)
+
+// GetMimeData is a wrapper around cairo_surface_get_mime_data(). The
+// returned mimetype data is returned as a Go byte slice.
+func (v *Surface) GetMimeData(mimeType MimeType) []byte {
+ cstr := C.CString(string(mimeType))
+ defer C.free(unsafe.Pointer(cstr))
+ var data *C.uchar
+ var length C.ulong
+ C.cairo_surface_get_mime_data(v.native(), cstr, &data, &length)
+ return C.GoBytes(unsafe.Pointer(data), C.int(length))
+}
+
+// WriteToPNG is a wrapper around cairo_surface_write_png(). It writes the Cairo
+// surface to the given file in PNG format.
+func (v *Surface) WriteToPNG(fileName string) error {
+ cstr := C.CString(fileName)
+ defer C.free(unsafe.Pointer(cstr))
+
+ status := Status(C.cairo_surface_write_to_png(v.surface, cstr))
+
+ if status != STATUS_SUCCESS {
+ return ErrorStatus(status)
+ }
+
+ return nil
+}
+
+// TODO(jrick) SupportsMimeType (since 1.12)
+
+// TODO(jrick) MapToImage (since 1.12)
+
+// TODO(jrick) UnmapImage (since 1.12)
+
+// GetHeight is a wrapper around cairo_image_surface_get_height().
+func (v *Surface) GetHeight() int {
+ return int(C.cairo_image_surface_get_height(v.surface))
+}
+
+// GetWidth is a wrapper around cairo_image_surface_get_width().
+func (v *Surface) GetWidth() int {
+ return int(C.cairo_image_surface_get_width(v.surface))
+}
+
+// GetData is a wrapper around cairo_image_surface_get_data().
+func (v *Surface) GetData() unsafe.Pointer {
+ return unsafe.Pointer(C.cairo_image_surface_get_data(v.surface))
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/surfacetype.go b/vendor/github.com/gotk3/gotk3/cairo/surfacetype.go
new file mode 100644
index 0000000..a1421eb
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/surfacetype.go
@@ -0,0 +1,45 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+import (
+ "unsafe"
+)
+
+// SurfaceType is a representation of Cairo's cairo_surface_type_t.
+type SurfaceType int
+
+const (
+ SURFACE_TYPE_IMAGE SurfaceType = C.CAIRO_SURFACE_TYPE_IMAGE
+ SURFACE_TYPE_PDF SurfaceType = C.CAIRO_SURFACE_TYPE_PDF
+ SURFACE_TYPE_PS SurfaceType = C.CAIRO_SURFACE_TYPE_PS
+ SURFACE_TYPE_XLIB SurfaceType = C.CAIRO_SURFACE_TYPE_XLIB
+ SURFACE_TYPE_XCB SurfaceType = C.CAIRO_SURFACE_TYPE_XCB
+ SURFACE_TYPE_GLITZ SurfaceType = C.CAIRO_SURFACE_TYPE_GLITZ
+ SURFACE_TYPE_QUARTZ SurfaceType = C.CAIRO_SURFACE_TYPE_QUARTZ
+ SURFACE_TYPE_WIN32 SurfaceType = C.CAIRO_SURFACE_TYPE_WIN32
+ SURFACE_TYPE_BEOS SurfaceType = C.CAIRO_SURFACE_TYPE_BEOS
+ SURFACE_TYPE_DIRECTFB SurfaceType = C.CAIRO_SURFACE_TYPE_DIRECTFB
+ SURFACE_TYPE_SVG SurfaceType = C.CAIRO_SURFACE_TYPE_SVG
+ SURFACE_TYPE_OS2 SurfaceType = C.CAIRO_SURFACE_TYPE_OS2
+ SURFACE_TYPE_WIN32_PRINTING SurfaceType = C.CAIRO_SURFACE_TYPE_WIN32_PRINTING
+ SURFACE_TYPE_QUARTZ_IMAGE SurfaceType = C.CAIRO_SURFACE_TYPE_QUARTZ_IMAGE
+ SURFACE_TYPE_SCRIPT SurfaceType = C.CAIRO_SURFACE_TYPE_SCRIPT
+ SURFACE_TYPE_QT SurfaceType = C.CAIRO_SURFACE_TYPE_QT
+ SURFACE_TYPE_RECORDING SurfaceType = C.CAIRO_SURFACE_TYPE_RECORDING
+ SURFACE_TYPE_VG SurfaceType = C.CAIRO_SURFACE_TYPE_VG
+ SURFACE_TYPE_GL SurfaceType = C.CAIRO_SURFACE_TYPE_GL
+ SURFACE_TYPE_DRM SurfaceType = C.CAIRO_SURFACE_TYPE_DRM
+ SURFACE_TYPE_TEE SurfaceType = C.CAIRO_SURFACE_TYPE_TEE
+ SURFACE_TYPE_XML SurfaceType = C.CAIRO_SURFACE_TYPE_XML
+ SURFACE_TYPE_SKIA SurfaceType = C.CAIRO_SURFACE_TYPE_SKIA
+ SURFACE_TYPE_SUBSURFACE SurfaceType = C.CAIRO_SURFACE_TYPE_SUBSURFACE
+ // SURFACE_TYPE_COGL SurfaceType = C.CAIRO_SURFACE_TYPE_COGL (since 1.12)
+)
+
+func marshalSurfaceType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return SurfaceType(c), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/text.go b/vendor/github.com/gotk3/gotk3/cairo/text.go
new file mode 100644
index 0000000..ab0e201
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/text.go
@@ -0,0 +1,125 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+
+import (
+ "unsafe"
+)
+
+// FontSlant is a representation of Cairo's cairo_font_slant_t
+type FontSlant int
+
+const (
+ FONT_SLANT_NORMAL FontSlant = C.CAIRO_FONT_SLANT_NORMAL
+ FONT_SLANT_ITALIC FontSlant = C.CAIRO_FONT_SLANT_ITALIC
+ FONT_SLANT_OBLIQUE FontSlant = C.CAIRO_FONT_SLANT_OBLIQUE
+)
+
+// FontWeight is a representation of Cairo's cairo_font_weight_t
+type FontWeight int
+
+const (
+ FONT_WEIGHT_NORMAL FontWeight = C.CAIRO_FONT_WEIGHT_NORMAL
+ FONT_WEIGHT_BOLD FontWeight = C.CAIRO_FONT_WEIGHT_BOLD
+)
+
+func (v *Context) SelectFontFace(family string, slant FontSlant, weight FontWeight) {
+ cstr := C.CString(family)
+ defer C.free(unsafe.Pointer(cstr))
+ C.cairo_select_font_face(v.native(), (*C.char)(cstr), C.cairo_font_slant_t(slant), C.cairo_font_weight_t(weight))
+}
+
+func (v *Context) SetFontSize(size float64) {
+ C.cairo_set_font_size(v.native(), C.double(size))
+}
+
+// TODO: cairo_set_font_matrix
+
+// TODO: cairo_get_font_matrix
+
+// TODO: cairo_set_font_options
+
+// TODO: cairo_get_font_options
+
+// TODO: cairo_set_font_face
+
+// TODO: cairo_get_font_face
+
+// TODO: cairo_set_scaled_font
+
+// TODO: cairo_get_scaled_font
+
+func (v *Context) ShowText(utf8 string) {
+ cstr := C.CString(utf8)
+ defer C.free(unsafe.Pointer(cstr))
+ C.cairo_show_text(v.native(), (*C.char)(cstr))
+}
+
+// TODO: cairo_show_glyphs
+
+// TODO: cairo_show_text_glyphs
+
+type FontExtents struct {
+ Ascent float64
+ Descent float64
+ Height float64
+ MaxXAdvance float64
+ MaxYAdvance float64
+}
+
+func (v *Context) FontExtents() FontExtents {
+ var extents C.cairo_font_extents_t
+ C.cairo_font_extents(v.native(), &extents)
+ return FontExtents{
+ Ascent: float64(extents.ascent),
+ Descent: float64(extents.descent),
+ Height: float64(extents.height),
+ MaxXAdvance: float64(extents.max_x_advance),
+ MaxYAdvance: float64(extents.max_y_advance),
+ }
+}
+
+type TextExtents struct {
+ XBearing float64
+ YBearing float64
+ Width float64
+ Height float64
+ XAdvance float64
+ YAdvance float64
+}
+
+func (v *Context) TextExtents(utf8 string) TextExtents {
+ cstr := C.CString(utf8)
+ defer C.free(unsafe.Pointer(cstr))
+ var extents C.cairo_text_extents_t
+ C.cairo_text_extents(v.native(), (*C.char)(cstr), &extents)
+ return TextExtents{
+ XBearing: float64(extents.x_bearing),
+ YBearing: float64(extents.y_bearing),
+ Width: float64(extents.width),
+ Height: float64(extents.height),
+ XAdvance: float64(extents.x_advance),
+ YAdvance: float64(extents.y_advance),
+ }
+}
+
+// TODO: cairo_glyph_extents
+
+// TODO: cairo_toy_font_face_create
+
+// TODO: cairo_toy_font_face_get_family
+
+// TODO: cairo_toy_font_face_get_slant
+
+// TODO: cairo_toy_font_face_get_weight
+
+// TODO: cairo_glyph_allocate
+
+// TODO: cairo_glyph_free
+
+// TODO: cairo_text_cluster_allocate
+
+// TODO: cairo_text_cluster_free
diff --git a/vendor/github.com/gotk3/gotk3/cairo/translations.go b/vendor/github.com/gotk3/gotk3/cairo/translations.go
new file mode 100644
index 0000000..bfe5ad8
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/translations.go
@@ -0,0 +1,78 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+
+// Translate is a wrapper around cairo_translate.
+func (v *Context) Translate(tx, ty float64) {
+ C.cairo_translate(v.native(), C.double(tx), C.double(ty))
+}
+
+// Scale is a wrapper around cairo_scale.
+func (v *Context) Scale(sx, sy float64) {
+ C.cairo_scale(v.native(), C.double(sx), C.double(sy))
+}
+
+// Rotate is a wrapper around cairo_rotate.
+func (v *Context) Rotate(angle float64) {
+ C.cairo_rotate(v.native(), C.double(angle))
+}
+
+// Transform is a wrapper around cairo_transform.
+func (v *Context) Transform(matrix *Matrix) {
+ C.cairo_transform(v.native(), matrix.native())
+}
+
+// SetMatrix is a wrapper around cairo_set_matrix.
+func (v *Context) SetMatrix(matrix *Matrix) {
+ C.cairo_set_matrix(v.native(), matrix.native())
+}
+
+// GetMatrix is a wrapper around cairo_get_matrix.
+func (v *Context) GetMatrix() *Matrix {
+ var matrix C.cairo_matrix_t
+ C.cairo_get_matrix(v.native(), &matrix)
+ return &Matrix{
+ Xx: float64(matrix.xx),
+ Yx: float64(matrix.yx),
+ Xy: float64(matrix.xy),
+ Yy: float64(matrix.yy),
+ X0: float64(matrix.x0),
+ Y0: float64(matrix.y0),
+ }
+}
+
+// IdentityMatrix is a wrapper around cairo_identity_matrix().
+//
+// Resets the current transformation matrix (CTM) by setting it equal to the
+// identity matrix. That is, the user-space and device-space axes will be
+// aligned and one user-space unit will transform to one device-space unit.
+func (v *Context) IdentityMatrix() {
+ C.cairo_identity_matrix(v.native())
+}
+
+// UserToDevice is a wrapper around cairo_user_to_device.
+func (v *Context) UserToDevice(x, y float64) (float64, float64) {
+ C.cairo_user_to_device(v.native(), (*C.double)(&x), (*C.double)(&y))
+ return x, y
+}
+
+// UserToDeviceDistance is a wrapper around cairo_user_to_device_distance.
+func (v *Context) UserToDeviceDistance(dx, dy float64) (float64, float64) {
+ C.cairo_user_to_device_distance(v.native(), (*C.double)(&dx), (*C.double)(&dy))
+ return dx, dy
+}
+
+// DeviceToUser is a wrapper around cairo_device_to_user.
+func (v *Context) DeviceToUser(x, y float64) (float64, float64) {
+ C.cairo_device_to_user(v.native(), (*C.double)(&x), (*C.double)(&y))
+ return x, y
+}
+
+// DeviceToUserDistance is a wrapper around cairo_device_to_user_distance.
+func (v *Context) DeviceToUserDistance(x, y float64) (float64, float64) {
+ C.cairo_device_to_user_distance(v.native(), (*C.double)(&x), (*C.double)(&y))
+ return x, y
+}
diff --git a/vendor/github.com/gotk3/gotk3/cairo/util.go b/vendor/github.com/gotk3/gotk3/cairo/util.go
new file mode 100644
index 0000000..39adda7
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/cairo/util.go
@@ -0,0 +1,20 @@
+package cairo
+
+// #include <stdlib.h>
+// #include <cairo.h>
+// #include <cairo-gobject.h>
+import "C"
+
+func cairobool(b bool) C.cairo_bool_t {
+ if b {
+ return C.cairo_bool_t(1)
+ }
+ return C.cairo_bool_t(0)
+}
+
+func gobool(b C.cairo_bool_t) bool {
+ if b != 0 {
+ return true
+ }
+ return false
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/gdk.go b/vendor/github.com/gotk3/gotk3/gdk/gdk.go
new file mode 100644
index 0000000..8cef92b
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/gdk.go
@@ -0,0 +1,1864 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// Go bindings for GDK 3. Supports version 3.6 and later.
+package gdk
+
+// #cgo pkg-config: gdk-3.0 glib-2.0 gobject-2.0
+// #include <gdk/gdk.h>
+// #include "gdk.go.h"
+import "C"
+import (
+ "errors"
+ "reflect"
+ "runtime"
+ "strconv"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Enums
+ {glib.Type(C.gdk_drag_action_get_type()), marshalDragAction},
+ {glib.Type(C.gdk_colorspace_get_type()), marshalColorspace},
+ {glib.Type(C.gdk_event_type_get_type()), marshalEventType},
+ {glib.Type(C.gdk_interp_type_get_type()), marshalInterpType},
+ {glib.Type(C.gdk_modifier_type_get_type()), marshalModifierType},
+ {glib.Type(C.gdk_pixbuf_alpha_mode_get_type()), marshalPixbufAlphaMode},
+ {glib.Type(C.gdk_event_mask_get_type()), marshalEventMask},
+
+ // Objects/Interfaces
+ {glib.Type(C.gdk_device_get_type()), marshalDevice},
+ {glib.Type(C.gdk_cursor_get_type()), marshalCursor},
+ {glib.Type(C.gdk_device_manager_get_type()), marshalDeviceManager},
+ {glib.Type(C.gdk_display_get_type()), marshalDisplay},
+ {glib.Type(C.gdk_drag_context_get_type()), marshalDragContext},
+ {glib.Type(C.gdk_pixbuf_get_type()), marshalPixbuf},
+ {glib.Type(C.gdk_rgba_get_type()), marshalRGBA},
+ {glib.Type(C.gdk_screen_get_type()), marshalScreen},
+ {glib.Type(C.gdk_visual_get_type()), marshalVisual},
+ {glib.Type(C.gdk_window_get_type()), marshalWindow},
+
+ // Boxed
+ {glib.Type(C.gdk_event_get_type()), marshalEvent},
+ }
+ glib.RegisterGValueMarshalers(tm)
+}
+
+/*
+ * Type conversions
+ */
+
+func gbool(b bool) C.gboolean {
+ if b {
+ return C.gboolean(1)
+ }
+ return C.gboolean(0)
+}
+func gobool(b C.gboolean) bool {
+ if b != 0 {
+ return true
+ }
+ return false
+}
+
+/*
+ * Unexported vars
+ */
+
+var nilPtrErr = errors.New("cgo returned unexpected nil pointer")
+
+/*
+ * Constants
+ */
+
+// DragAction is a representation of GDK's GdkDragAction.
+type DragAction int
+
+const (
+ ACTION_DEFAULT DragAction = C.GDK_ACTION_DEFAULT
+ ACTION_COPY DragAction = C.GDK_ACTION_COPY
+ ACTION_MOVE DragAction = C.GDK_ACTION_MOVE
+ ACTION_LINK DragAction = C.GDK_ACTION_LINK
+ ACTION_PRIVATE DragAction = C.GDK_ACTION_PRIVATE
+ ACTION_ASK DragAction = C.GDK_ACTION_ASK
+)
+
+func marshalDragAction(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return DragAction(c), nil
+}
+
+// Colorspace is a representation of GDK's GdkColorspace.
+type Colorspace int
+
+const (
+ COLORSPACE_RGB Colorspace = C.GDK_COLORSPACE_RGB
+)
+
+func marshalColorspace(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Colorspace(c), nil
+}
+
+// InterpType is a representation of GDK's GdkInterpType.
+type InterpType int
+
+const (
+ INTERP_NEAREST InterpType = C.GDK_INTERP_NEAREST
+ INTERP_TILES InterpType = C.GDK_INTERP_TILES
+ INTERP_BILINEAR InterpType = C.GDK_INTERP_BILINEAR
+ INTERP_HYPER InterpType = C.GDK_INTERP_HYPER
+)
+
+// PixbufRotation is a representation of GDK's GdkPixbufRotation.
+type PixbufRotation int
+
+const (
+ PIXBUF_ROTATE_NONE PixbufRotation = C.GDK_PIXBUF_ROTATE_NONE
+ PIXBUF_ROTATE_COUNTERCLOCKWISE PixbufRotation = C.GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE
+ PIXBUF_ROTATE_UPSIDEDOWN PixbufRotation = C.GDK_PIXBUF_ROTATE_UPSIDEDOWN
+ PIXBUF_ROTATE_CLOCKWISE PixbufRotation = C.GDK_PIXBUF_ROTATE_CLOCKWISE
+)
+
+func marshalInterpType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return InterpType(c), nil
+}
+
+// ModifierType is a representation of GDK's GdkModifierType.
+type ModifierType uint
+
+const (
+ GDK_SHIFT_MASK ModifierType = C.GDK_SHIFT_MASK
+ GDK_LOCK_MASK = C.GDK_LOCK_MASK
+ GDK_CONTROL_MASK = C.GDK_CONTROL_MASK
+ GDK_MOD1_MASK = C.GDK_MOD1_MASK
+ GDK_MOD2_MASK = C.GDK_MOD2_MASK
+ GDK_MOD3_MASK = C.GDK_MOD3_MASK
+ GDK_MOD4_MASK = C.GDK_MOD4_MASK
+ GDK_MOD5_MASK = C.GDK_MOD5_MASK
+ GDK_BUTTON1_MASK = C.GDK_BUTTON1_MASK
+ GDK_BUTTON2_MASK = C.GDK_BUTTON2_MASK
+ GDK_BUTTON3_MASK = C.GDK_BUTTON3_MASK
+ GDK_BUTTON4_MASK = C.GDK_BUTTON4_MASK
+ GDK_BUTTON5_MASK = C.GDK_BUTTON5_MASK
+ GDK_SUPER_MASK = C.GDK_SUPER_MASK
+ GDK_HYPER_MASK = C.GDK_HYPER_MASK
+ GDK_META_MASK = C.GDK_META_MASK
+ GDK_RELEASE_MASK = C.GDK_RELEASE_MASK
+ GDK_MODIFIER_MASK = C.GDK_MODIFIER_MASK
+)
+
+func marshalModifierType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return ModifierType(c), nil
+}
+
+// PixbufAlphaMode is a representation of GDK's GdkPixbufAlphaMode.
+type PixbufAlphaMode int
+
+const (
+ GDK_PIXBUF_ALPHA_BILEVEL PixbufAlphaMode = C.GDK_PIXBUF_ALPHA_BILEVEL
+ GDK_PIXBUF_ALPHA_FULL PixbufAlphaMode = C.GDK_PIXBUF_ALPHA_FULL
+)
+
+func marshalPixbufAlphaMode(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PixbufAlphaMode(c), nil
+}
+
+// Selections
+const (
+ SELECTION_PRIMARY Atom = 1
+ SELECTION_SECONDARY Atom = 2
+ SELECTION_CLIPBOARD Atom = 69
+ TARGET_BITMAP Atom = 5
+ TARGET_COLORMAP Atom = 7
+ TARGET_DRAWABLE Atom = 17
+ TARGET_PIXMAP Atom = 20
+ TARGET_STRING Atom = 31
+ SELECTION_TYPE_ATOM Atom = 4
+ SELECTION_TYPE_BITMAP Atom = 5
+ SELECTION_TYPE_COLORMAP Atom = 7
+ SELECTION_TYPE_DRAWABLE Atom = 17
+ SELECTION_TYPE_INTEGER Atom = 19
+ SELECTION_TYPE_PIXMAP Atom = 20
+ SELECTION_TYPE_WINDOW Atom = 33
+ SELECTION_TYPE_STRING Atom = 31
+)
+
+// added by terrak
+// EventMask is a representation of GDK's GdkEventMask.
+type EventMask int
+
+const (
+ EXPOSURE_MASK EventMask = C.GDK_EXPOSURE_MASK
+ POINTER_MOTION_MASK EventMask = C.GDK_POINTER_MOTION_MASK
+ POINTER_MOTION_HINT_MASK EventMask = C.GDK_POINTER_MOTION_HINT_MASK
+ BUTTON_MOTION_MASK EventMask = C.GDK_BUTTON_MOTION_MASK
+ BUTTON1_MOTION_MASK EventMask = C.GDK_BUTTON1_MOTION_MASK
+ BUTTON2_MOTION_MASK EventMask = C.GDK_BUTTON2_MOTION_MASK
+ BUTTON3_MOTION_MASK EventMask = C.GDK_BUTTON3_MOTION_MASK
+ BUTTON_PRESS_MASK EventMask = C.GDK_BUTTON_PRESS_MASK
+ BUTTON_RELEASE_MASK EventMask = C.GDK_BUTTON_RELEASE_MASK
+ KEY_PRESS_MASK EventMask = C.GDK_KEY_PRESS_MASK
+ KEY_RELEASE_MASK EventMask = C.GDK_KEY_RELEASE_MASK
+ ENTER_NOTIFY_MASK EventMask = C.GDK_ENTER_NOTIFY_MASK
+ LEAVE_NOTIFY_MASK EventMask = C.GDK_LEAVE_NOTIFY_MASK
+ FOCUS_CHANGE_MASK EventMask = C.GDK_FOCUS_CHANGE_MASK
+ STRUCTURE_MASK EventMask = C.GDK_STRUCTURE_MASK
+ PROPERTY_CHANGE_MASK EventMask = C.GDK_PROPERTY_CHANGE_MASK
+ VISIBILITY_NOTIFY_MASK EventMask = C.GDK_VISIBILITY_NOTIFY_MASK
+ PROXIMITY_IN_MASK EventMask = C.GDK_PROXIMITY_IN_MASK
+ PROXIMITY_OUT_MASK EventMask = C.GDK_PROXIMITY_OUT_MASK
+ SUBSTRUCTURE_MASK EventMask = C.GDK_SUBSTRUCTURE_MASK
+ SCROLL_MASK EventMask = C.GDK_SCROLL_MASK
+ TOUCH_MASK EventMask = C.GDK_TOUCH_MASK
+ SMOOTH_SCROLL_MASK EventMask = C.GDK_SMOOTH_SCROLL_MASK
+ ALL_EVENTS_MASK EventMask = C.GDK_ALL_EVENTS_MASK
+)
+
+func marshalEventMask(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return EventMask(c), nil
+}
+
+// added by lazyshot
+// ScrollDirection is a representation of GDK's GdkScrollDirection
+
+type ScrollDirection int
+
+const (
+ SCROLL_UP ScrollDirection = C.GDK_SCROLL_UP
+ SCROLL_DOWN ScrollDirection = C.GDK_SCROLL_DOWN
+ SCROLL_LEFT ScrollDirection = C.GDK_SCROLL_LEFT
+ SCROLL_RIGHT ScrollDirection = C.GDK_SCROLL_RIGHT
+ SCROLL_SMOOTH ScrollDirection = C.GDK_SCROLL_SMOOTH
+)
+
+// WindowState is a representation of GDK's GdkWindowState
+type WindowState int
+
+const (
+ WINDOW_STATE_WITHDRAWN WindowState = C.GDK_WINDOW_STATE_WITHDRAWN
+ WINDOW_STATE_ICONIFIED WindowState = C.GDK_WINDOW_STATE_ICONIFIED
+ WINDOW_STATE_MAXIMIZED WindowState = C.GDK_WINDOW_STATE_MAXIMIZED
+ WINDOW_STATE_STICKY WindowState = C.GDK_WINDOW_STATE_STICKY
+ WINDOW_STATE_FULLSCREEN WindowState = C.GDK_WINDOW_STATE_FULLSCREEN
+ WINDOW_STATE_ABOVE WindowState = C.GDK_WINDOW_STATE_ABOVE
+ WINDOW_STATE_BELOW WindowState = C.GDK_WINDOW_STATE_BELOW
+ WINDOW_STATE_FOCUSED WindowState = C.GDK_WINDOW_STATE_FOCUSED
+ WINDOW_STATE_TILED WindowState = C.GDK_WINDOW_STATE_TILED
+)
+
+// WindowTypeHint is a representation of GDK's GdkWindowTypeHint
+type WindowTypeHint int
+
+const (
+ WINDOW_TYPE_HINT_NORMAL WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_NORMAL
+ WINDOW_TYPE_HINT_DIALOG WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_DIALOG
+ WINDOW_TYPE_HINT_MENU WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_MENU
+ WINDOW_TYPE_HINT_TOOLBAR WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_TOOLBAR
+ WINDOW_TYPE_HINT_SPLASHSCREEN WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_SPLASHSCREEN
+ WINDOW_TYPE_HINT_UTILITY WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_UTILITY
+ WINDOW_TYPE_HINT_DOCK WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_DOCK
+ WINDOW_TYPE_HINT_DESKTOP WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_DESKTOP
+ WINDOW_TYPE_HINT_DROPDOWN_MENU WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU
+ WINDOW_TYPE_HINT_POPUP_MENU WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_POPUP_MENU
+ WINDOW_TYPE_HINT_TOOLTIP WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_TOOLTIP
+ WINDOW_TYPE_HINT_NOTIFICATION WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_NOTIFICATION
+ WINDOW_TYPE_HINT_COMBO WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_COMBO
+ WINDOW_TYPE_HINT_DND WindowTypeHint = C.GDK_WINDOW_TYPE_HINT_DND
+)
+
+// CURRENT_TIME is a representation of GDK_CURRENT_TIME
+
+const CURRENT_TIME = C.GDK_CURRENT_TIME
+
+// GrabStatus is a representation of GdkGrabStatus
+
+type GrabStatus int
+
+const (
+ GRAB_SUCCESS GrabStatus = C.GDK_GRAB_SUCCESS
+ GRAB_ALREADY_GRABBED GrabStatus = C.GDK_GRAB_ALREADY_GRABBED
+ GRAB_INVALID_TIME GrabStatus = C.GDK_GRAB_INVALID_TIME
+ GRAB_FROZEN GrabStatus = C.GDK_GRAB_FROZEN
+ // Only exists since 3.16
+ // GRAB_FAILED GrabStatus = C.GDK_GRAB_FAILED
+ GRAB_FAILED GrabStatus = 5
+)
+
+// GrabOwnership is a representation of GdkGrabOwnership
+
+type GrabOwnership int
+
+const (
+ OWNERSHIP_NONE GrabOwnership = C.GDK_OWNERSHIP_NONE
+ OWNERSHIP_WINDOW GrabOwnership = C.GDK_OWNERSHIP_WINDOW
+ OWNERSHIP_APPLICATION GrabOwnership = C.GDK_OWNERSHIP_APPLICATION
+)
+
+// DeviceType is a representation of GdkDeviceType
+
+type DeviceType int
+
+const (
+ DEVICE_TYPE_MASTER DeviceType = C.GDK_DEVICE_TYPE_MASTER
+ DEVICE_TYPE_SLAVE DeviceType = C.GDK_DEVICE_TYPE_SLAVE
+ DEVICE_TYPE_FLOATING DeviceType = C.GDK_DEVICE_TYPE_FLOATING
+)
+
+// EventPropagation constants
+
+const (
+ GDK_EVENT_PROPAGATE bool = C.GDK_EVENT_PROPAGATE != 0
+ GDK_EVENT_STOP bool = C.GDK_EVENT_STOP != 0
+)
+
+/*
+ * GdkAtom
+ */
+
+// Atom is a representation of GDK's GdkAtom.
+type Atom uintptr
+
+// native returns the underlying GdkAtom.
+func (v Atom) native() C.GdkAtom {
+ return C.toGdkAtom(unsafe.Pointer(uintptr(v)))
+}
+
+func (v Atom) Name() string {
+ c := C.gdk_atom_name(v.native())
+ defer C.g_free(C.gpointer(c))
+ return C.GoString((*C.char)(c))
+}
+
+// GdkAtomIntern is a wrapper around gdk_atom_intern
+func GdkAtomIntern(atomName string, onlyIfExists bool) Atom {
+ cstr := C.CString(atomName)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gdk_atom_intern((*C.gchar)(cstr), gbool(onlyIfExists))
+ return Atom(uintptr(unsafe.Pointer(c)))
+}
+
+/*
+ * GdkDevice
+ */
+
+// Device is a representation of GDK's GdkDevice.
+type Device struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GdkDevice.
+func (v *Device) native() *C.GdkDevice {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkDevice(p)
+}
+
+// Native returns a pointer to the underlying GdkDevice.
+func (v *Device) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalDevice(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &Device{obj}, nil
+}
+
+/*
+ * GdkCursor
+ */
+
+// Cursor is a representation of GdkCursor.
+type Cursor struct {
+ *glib.Object
+}
+
+// CursorNewFromName is a wrapper around gdk_cursor_new_from_name().
+func CursorNewFromName(display *Display, name string) (*Cursor, error) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gdk_cursor_new_from_name(display.native(), (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Cursor{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// native returns a pointer to the underlying GdkCursor.
+func (v *Cursor) native() *C.GdkCursor {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkCursor(p)
+}
+
+// Native returns a pointer to the underlying GdkCursor.
+func (v *Cursor) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalCursor(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &Cursor{obj}, nil
+}
+
+/*
+ * GdkDeviceManager
+ */
+
+// DeviceManager is a representation of GDK's GdkDeviceManager.
+type DeviceManager struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GdkDeviceManager.
+func (v *DeviceManager) native() *C.GdkDeviceManager {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkDeviceManager(p)
+}
+
+// Native returns a pointer to the underlying GdkDeviceManager.
+func (v *DeviceManager) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalDeviceManager(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &DeviceManager{obj}, nil
+}
+
+// GetDisplay() is a wrapper around gdk_device_manager_get_display().
+func (v *DeviceManager) GetDisplay() (*Display, error) {
+ c := C.gdk_device_manager_get_display(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Display{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+/*
+ * GdkDisplay
+ */
+
+// Display is a representation of GDK's GdkDisplay.
+type Display struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GdkDisplay.
+func (v *Display) native() *C.GdkDisplay {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkDisplay(p)
+}
+
+// Native returns a pointer to the underlying GdkDisplay.
+func (v *Display) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalDisplay(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &Display{obj}, nil
+}
+
+func toDisplay(s *C.GdkDisplay) (*Display, error) {
+ if s == nil {
+ return nil, nilPtrErr
+ }
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(s))}
+ return &Display{obj}, nil
+}
+
+// DisplayOpen() is a wrapper around gdk_display_open().
+func DisplayOpen(displayName string) (*Display, error) {
+ cstr := C.CString(displayName)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gdk_display_open((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Display{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// DisplayGetDefault() is a wrapper around gdk_display_get_default().
+func DisplayGetDefault() (*Display, error) {
+ c := C.gdk_display_get_default()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Display{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// GetName() is a wrapper around gdk_display_get_name().
+func (v *Display) GetName() (string, error) {
+ c := C.gdk_display_get_name(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return C.GoString((*C.char)(c)), nil
+}
+
+// GetDefaultScreen() is a wrapper around gdk_display_get_default_screen().
+func (v *Display) GetDefaultScreen() (*Screen, error) {
+ c := C.gdk_display_get_default_screen(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Screen{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// DeviceIsGrabbed() is a wrapper around gdk_display_device_is_grabbed().
+func (v *Display) DeviceIsGrabbed(device *Device) bool {
+ c := C.gdk_display_device_is_grabbed(v.native(), device.native())
+ return gobool(c)
+}
+
+// Beep() is a wrapper around gdk_display_beep().
+func (v *Display) Beep() {
+ C.gdk_display_beep(v.native())
+}
+
+// Sync() is a wrapper around gdk_display_sync().
+func (v *Display) Sync() {
+ C.gdk_display_sync(v.native())
+}
+
+// Flush() is a wrapper around gdk_display_flush().
+func (v *Display) Flush() {
+ C.gdk_display_flush(v.native())
+}
+
+// Close() is a wrapper around gdk_display_close().
+func (v *Display) Close() {
+ C.gdk_display_close(v.native())
+}
+
+// IsClosed() is a wrapper around gdk_display_is_closed().
+func (v *Display) IsClosed() bool {
+ c := C.gdk_display_is_closed(v.native())
+ return gobool(c)
+}
+
+// GetEvent() is a wrapper around gdk_display_get_event().
+func (v *Display) GetEvent() (*Event, error) {
+ c := C.gdk_display_get_event(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ //The finalizer is not on the glib.Object but on the event.
+ e := &Event{c}
+ runtime.SetFinalizer(e, (*Event).free)
+ return e, nil
+}
+
+// PeekEvent() is a wrapper around gdk_display_peek_event().
+func (v *Display) PeekEvent() (*Event, error) {
+ c := C.gdk_display_peek_event(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ //The finalizer is not on the glib.Object but on the event.
+ e := &Event{c}
+ runtime.SetFinalizer(e, (*Event).free)
+ return e, nil
+}
+
+// PutEvent() is a wrapper around gdk_display_put_event().
+func (v *Display) PutEvent(event *Event) {
+ C.gdk_display_put_event(v.native(), event.native())
+}
+
+// HasPending() is a wrapper around gdk_display_has_pending().
+func (v *Display) HasPending() bool {
+ c := C.gdk_display_has_pending(v.native())
+ return gobool(c)
+}
+
+// SetDoubleClickTime() is a wrapper around gdk_display_set_double_click_time().
+func (v *Display) SetDoubleClickTime(msec uint) {
+ C.gdk_display_set_double_click_time(v.native(), C.guint(msec))
+}
+
+// SetDoubleClickDistance() is a wrapper around gdk_display_set_double_click_distance().
+func (v *Display) SetDoubleClickDistance(distance uint) {
+ C.gdk_display_set_double_click_distance(v.native(), C.guint(distance))
+}
+
+// SupportsColorCursor() is a wrapper around gdk_display_supports_cursor_color().
+func (v *Display) SupportsColorCursor() bool {
+ c := C.gdk_display_supports_cursor_color(v.native())
+ return gobool(c)
+}
+
+// SupportsCursorAlpha() is a wrapper around gdk_display_supports_cursor_alpha().
+func (v *Display) SupportsCursorAlpha() bool {
+ c := C.gdk_display_supports_cursor_alpha(v.native())
+ return gobool(c)
+}
+
+// GetDefaultCursorSize() is a wrapper around gdk_display_get_default_cursor_size().
+func (v *Display) GetDefaultCursorSize() uint {
+ c := C.gdk_display_get_default_cursor_size(v.native())
+ return uint(c)
+}
+
+// GetMaximalCursorSize() is a wrapper around gdk_display_get_maximal_cursor_size().
+func (v *Display) GetMaximalCursorSize() (width, height uint) {
+ var w, h C.guint
+ C.gdk_display_get_maximal_cursor_size(v.native(), &w, &h)
+ return uint(w), uint(h)
+}
+
+// GetDefaultGroup() is a wrapper around gdk_display_get_default_group().
+func (v *Display) GetDefaultGroup() (*Window, error) {
+ c := C.gdk_display_get_default_group(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Window{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// SupportsSelectionNotification() is a wrapper around
+// gdk_display_supports_selection_notification().
+func (v *Display) SupportsSelectionNotification() bool {
+ c := C.gdk_display_supports_selection_notification(v.native())
+ return gobool(c)
+}
+
+// RequestSelectionNotification() is a wrapper around
+// gdk_display_request_selection_notification().
+func (v *Display) RequestSelectionNotification(selection Atom) bool {
+ c := C.gdk_display_request_selection_notification(v.native(),
+ selection.native())
+ return gobool(c)
+}
+
+// SupportsClipboardPersistence() is a wrapper around
+// gdk_display_supports_clipboard_persistence().
+func (v *Display) SupportsClipboardPersistence() bool {
+ c := C.gdk_display_supports_clipboard_persistence(v.native())
+ return gobool(c)
+}
+
+// TODO(jrick)
+func (v *Display) StoreClipboard(clipboardWindow *Window, time uint32, targets ...Atom) {
+ panic("Not implemented")
+}
+
+// SupportsShapes() is a wrapper around gdk_display_supports_shapes().
+func (v *Display) SupportsShapes() bool {
+ c := C.gdk_display_supports_shapes(v.native())
+ return gobool(c)
+}
+
+// SupportsInputShapes() is a wrapper around gdk_display_supports_input_shapes().
+func (v *Display) SupportsInputShapes() bool {
+ c := C.gdk_display_supports_input_shapes(v.native())
+ return gobool(c)
+}
+
+// TODO(jrick) glib.AppLaunchContext GdkAppLaunchContext
+func (v *Display) GetAppLaunchContext() {
+ panic("Not implemented")
+}
+
+// NotifyStartupComplete() is a wrapper around gdk_display_notify_startup_complete().
+func (v *Display) NotifyStartupComplete(startupID string) {
+ cstr := C.CString(startupID)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gdk_display_notify_startup_complete(v.native(), (*C.gchar)(cstr))
+}
+
+// EventType is a representation of GDK's GdkEventType.
+// Do not confuse these event types with the signals that GTK+ widgets emit
+type EventType int
+
+func marshalEventType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return EventType(c), nil
+}
+
+const (
+ EVENT_NOTHING EventType = C.GDK_NOTHING
+ EVENT_DELETE EventType = C.GDK_DELETE
+ EVENT_DESTROY EventType = C.GDK_DESTROY
+ EVENT_EXPOSE EventType = C.GDK_EXPOSE
+ EVENT_MOTION_NOTIFY EventType = C.GDK_MOTION_NOTIFY
+ EVENT_BUTTON_PRESS EventType = C.GDK_BUTTON_PRESS
+ EVENT_2BUTTON_PRESS EventType = C.GDK_2BUTTON_PRESS
+ EVENT_DOUBLE_BUTTON_PRESS EventType = C.GDK_DOUBLE_BUTTON_PRESS
+ EVENT_3BUTTON_PRESS EventType = C.GDK_3BUTTON_PRESS
+ EVENT_TRIPLE_BUTTON_PRESS EventType = C.GDK_TRIPLE_BUTTON_PRESS
+ EVENT_BUTTON_RELEASE EventType = C.GDK_BUTTON_RELEASE
+ EVENT_KEY_PRESS EventType = C.GDK_KEY_PRESS
+ EVENT_KEY_RELEASE EventType = C.GDK_KEY_RELEASE
+ EVENT_LEAVE_NOTIFY EventType = C.GDK_ENTER_NOTIFY
+ EVENT_FOCUS_CHANGE EventType = C.GDK_FOCUS_CHANGE
+ EVENT_CONFIGURE EventType = C.GDK_CONFIGURE
+ EVENT_MAP EventType = C.GDK_MAP
+ EVENT_UNMAP EventType = C.GDK_UNMAP
+ EVENT_PROPERTY_NOTIFY EventType = C.GDK_PROPERTY_NOTIFY
+ EVENT_SELECTION_CLEAR EventType = C.GDK_SELECTION_CLEAR
+ EVENT_SELECTION_REQUEST EventType = C.GDK_SELECTION_REQUEST
+ EVENT_SELECTION_NOTIFY EventType = C.GDK_SELECTION_NOTIFY
+ EVENT_PROXIMITY_IN EventType = C.GDK_PROXIMITY_IN
+ EVENT_PROXIMITY_OUT EventType = C.GDK_PROXIMITY_OUT
+ EVENT_DRAG_ENTER EventType = C.GDK_DRAG_ENTER
+ EVENT_DRAG_LEAVE EventType = C.GDK_DRAG_LEAVE
+ EVENT_DRAG_MOTION EventType = C.GDK_DRAG_MOTION
+ EVENT_DRAG_STATUS EventType = C.GDK_DRAG_STATUS
+ EVENT_DROP_START EventType = C.GDK_DROP_START
+ EVENT_DROP_FINISHED EventType = C.GDK_DROP_FINISHED
+ EVENT_CLIENT_EVENT EventType = C.GDK_CLIENT_EVENT
+ EVENT_VISIBILITY_NOTIFY EventType = C.GDK_VISIBILITY_NOTIFY
+ EVENT_SCROLL EventType = C.GDK_SCROLL
+ EVENT_WINDOW_STATE EventType = C.GDK_WINDOW_STATE
+ EVENT_SETTING EventType = C.GDK_SETTING
+ EVENT_OWNER_CHANGE EventType = C.GDK_OWNER_CHANGE
+ EVENT_GRAB_BROKEN EventType = C.GDK_GRAB_BROKEN
+ EVENT_DAMAGE EventType = C.GDK_DAMAGE
+ EVENT_TOUCH_BEGIN EventType = C.GDK_TOUCH_BEGIN
+ EVENT_TOUCH_UPDATE EventType = C.GDK_TOUCH_UPDATE
+ EVENT_TOUCH_END EventType = C.GDK_TOUCH_END
+ EVENT_TOUCH_CANCEL EventType = C.GDK_TOUCH_CANCEL
+ EVENT_LAST EventType = C.GDK_EVENT_LAST
+)
+
+/*
+ * GDK Keyval
+ */
+
+// KeyvalFromName() is a wrapper around gdk_keyval_from_name().
+func KeyvalFromName(keyvalName string) uint {
+ str := (*C.gchar)(C.CString(keyvalName))
+ defer C.free(unsafe.Pointer(str))
+ return uint(C.gdk_keyval_from_name(str))
+}
+
+func KeyvalConvertCase(v uint) (lower, upper uint) {
+ var l, u C.guint
+ l = 0
+ u = 0
+ C.gdk_keyval_convert_case(C.guint(v), &l, &u)
+ return uint(l), uint(u)
+}
+
+func KeyvalIsLower(v uint) bool {
+ return gobool(C.gdk_keyval_is_lower(C.guint(v)))
+}
+
+func KeyvalIsUpper(v uint) bool {
+ return gobool(C.gdk_keyval_is_upper(C.guint(v)))
+}
+
+func KeyvalToLower(v uint) uint {
+ return uint(C.gdk_keyval_to_lower(C.guint(v)))
+}
+
+func KeyvalToUpper(v uint) uint {
+ return uint(C.gdk_keyval_to_upper(C.guint(v)))
+}
+
+func KeyvalToUnicode(v uint) rune {
+ return rune(C.gdk_keyval_to_unicode(C.guint(v)))
+}
+
+func UnicodeToKeyval(v rune) uint {
+ return uint(C.gdk_unicode_to_keyval(C.guint32(v)))
+}
+
+/*
+ * GdkDragContext
+ */
+
+// DragContext is a representation of GDK's GdkDragContext.
+type DragContext struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GdkDragContext.
+func (v *DragContext) native() *C.GdkDragContext {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkDragContext(p)
+}
+
+// Native returns a pointer to the underlying GdkDragContext.
+func (v *DragContext) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalDragContext(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &DragContext{obj}, nil
+}
+
+func (v *DragContext) ListTargets() *glib.List {
+ c := C.gdk_drag_context_list_targets(v.native())
+ return glib.WrapList(uintptr(unsafe.Pointer(c)))
+}
+
+/*
+ * GdkEvent
+ */
+
+// Event is a representation of GDK's GdkEvent.
+type Event struct {
+ GdkEvent *C.GdkEvent
+}
+
+// native returns a pointer to the underlying GdkEvent.
+func (v *Event) native() *C.GdkEvent {
+ if v == nil {
+ return nil
+ }
+ return v.GdkEvent
+}
+
+// Native returns a pointer to the underlying GdkEvent.
+func (v *Event) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalEvent(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return &Event{(*C.GdkEvent)(unsafe.Pointer(c))}, nil
+}
+
+func (v *Event) free() {
+ C.gdk_event_free(v.native())
+}
+
+/*
+ * GdkEventButton
+ */
+
+// EventButton is a representation of GDK's GdkEventButton.
+type EventButton struct {
+ *Event
+}
+
+func EventButtonNew() *EventButton {
+ ee := (*C.GdkEvent)(unsafe.Pointer(&C.GdkEventButton{}))
+ ev := Event{ee}
+ return &EventButton{&ev}
+}
+
+// EventButtonNewFromEvent returns an EventButton from an Event.
+//
+// Using widget.Connect() for a key related signal such as
+// "button-press-event" results in a *Event being passed as
+// the callback's second argument. The argument is actually a
+// *EventButton. EventButtonNewFromEvent provides a means of creating
+// an EventKey from the Event.
+func EventButtonNewFromEvent(event *Event) *EventButton {
+ ee := (*C.GdkEvent)(unsafe.Pointer(event.native()))
+ ev := Event{ee}
+ return &EventButton{&ev}
+}
+
+// Native returns a pointer to the underlying GdkEventButton.
+func (v *EventButton) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *EventButton) native() *C.GdkEventButton {
+ return (*C.GdkEventButton)(unsafe.Pointer(v.Event.native()))
+}
+
+func (v *EventButton) X() float64 {
+ c := v.native().x
+ return float64(c)
+}
+
+func (v *EventButton) Y() float64 {
+ c := v.native().y
+ return float64(c)
+}
+
+// XRoot returns the x coordinate of the pointer relative to the root of the screen.
+func (v *EventButton) XRoot() float64 {
+ c := v.native().x_root
+ return float64(c)
+}
+
+// YRoot returns the y coordinate of the pointer relative to the root of the screen.
+func (v *EventButton) YRoot() float64 {
+ c := v.native().y_root
+ return float64(c)
+}
+
+func (v *EventButton) Button() uint {
+ c := v.native().button
+ return uint(c)
+}
+
+func (v *EventButton) State() uint {
+ c := v.native().state
+ return uint(c)
+}
+
+// Time returns the time of the event in milliseconds.
+func (v *EventButton) Time() uint32 {
+ c := v.native().time
+ return uint32(c)
+}
+
+func (v *EventButton) Type() EventType {
+ c := v.native()._type
+ return EventType(c)
+}
+
+func (v *EventButton) MotionVal() (float64, float64) {
+ x := v.native().x
+ y := v.native().y
+ return float64(x), float64(y)
+}
+
+func (v *EventButton) MotionValRoot() (float64, float64) {
+ x := v.native().x_root
+ y := v.native().y_root
+ return float64(x), float64(y)
+}
+
+func (v *EventButton) ButtonVal() uint {
+ c := v.native().button
+ return uint(c)
+}
+
+/*
+ * GdkEventKey
+ */
+
+// EventKey is a representation of GDK's GdkEventKey.
+type EventKey struct {
+ *Event
+}
+
+func EventKeyNew() *EventKey {
+ ee := (*C.GdkEvent)(unsafe.Pointer(&C.GdkEventKey{}))
+ ev := Event{ee}
+ return &EventKey{&ev}
+}
+
+// EventKeyNewFromEvent returns an EventKey from an Event.
+//
+// Using widget.Connect() for a key related signal such as
+// "key-press-event" results in a *Event being passed as
+// the callback's second argument. The argument is actually a
+// *EventKey. EventKeyNewFromEvent provides a means of creating
+// an EventKey from the Event.
+func EventKeyNewFromEvent(event *Event) *EventKey {
+ ee := (*C.GdkEvent)(unsafe.Pointer(event.native()))
+ ev := Event{ee}
+ return &EventKey{&ev}
+}
+
+// Native returns a pointer to the underlying GdkEventKey.
+func (v *EventKey) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *EventKey) native() *C.GdkEventKey {
+ return (*C.GdkEventKey)(unsafe.Pointer(v.Event.native()))
+}
+
+func (v *EventKey) KeyVal() uint {
+ c := v.native().keyval
+ return uint(c)
+}
+
+func (v *EventKey) Type() EventType {
+ c := v.native()._type
+ return EventType(c)
+}
+
+func (v *EventKey) State() uint {
+ c := v.native().state
+ return uint(c)
+}
+
+/*
+ * GdkEventMotion
+ */
+
+type EventMotion struct {
+ *Event
+}
+
+func EventMotionNew() *EventMotion {
+ ee := (*C.GdkEvent)(unsafe.Pointer(&C.GdkEventMotion{}))
+ ev := Event{ee}
+ return &EventMotion{&ev}
+}
+
+// EventMotionNewFromEvent returns an EventMotion from an Event.
+//
+// Using widget.Connect() for a key related signal such as
+// "button-press-event" results in a *Event being passed as
+// the callback's second argument. The argument is actually a
+// *EventMotion. EventMotionNewFromEvent provides a means of creating
+// an EventKey from the Event.
+func EventMotionNewFromEvent(event *Event) *EventMotion {
+ ee := (*C.GdkEvent)(unsafe.Pointer(event.native()))
+ ev := Event{ee}
+ return &EventMotion{&ev}
+}
+
+// Native returns a pointer to the underlying GdkEventMotion.
+func (v *EventMotion) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *EventMotion) native() *C.GdkEventMotion {
+ return (*C.GdkEventMotion)(unsafe.Pointer(v.Event.native()))
+}
+
+func (v *EventMotion) MotionVal() (float64, float64) {
+ x := v.native().x
+ y := v.native().y
+ return float64(x), float64(y)
+}
+
+func (v *EventMotion) MotionValRoot() (float64, float64) {
+ x := v.native().x_root
+ y := v.native().y_root
+ return float64(x), float64(y)
+}
+
+// Time returns the time of the event in milliseconds.
+func (v *EventMotion) Time() uint32 {
+ c := v.native().time
+ return uint32(c)
+}
+
+func (v *EventMotion) Type() EventType {
+ c := v.native()._type
+ return EventType(c)
+}
+
+// A bit-mask representing the state of the modifier keys (e.g. Control, Shift
+// and Alt) and the pointer buttons. See gdk.ModifierType constants.
+func (v *EventMotion) State() ModifierType {
+ c := v.native().state
+ return ModifierType(c)
+}
+
+/*
+ * GdkEventScroll
+ */
+
+// EventScroll is a representation of GDK's GdkEventScroll.
+type EventScroll struct {
+ *Event
+}
+
+func EventScrollNew() *EventScroll {
+ ee := (*C.GdkEvent)(unsafe.Pointer(&C.GdkEventScroll{}))
+ ev := Event{ee}
+ return &EventScroll{&ev}
+}
+
+// EventScrollNewFromEvent returns an EventScroll from an Event.
+//
+// Using widget.Connect() for a key related signal such as
+// "button-press-event" results in a *Event being passed as
+// the callback's second argument. The argument is actually a
+// *EventScroll. EventScrollNewFromEvent provides a means of creating
+// an EventKey from the Event.
+func EventScrollNewFromEvent(event *Event) *EventScroll {
+ ee := (*C.GdkEvent)(unsafe.Pointer(event.native()))
+ ev := Event{ee}
+ return &EventScroll{&ev}
+}
+
+// Native returns a pointer to the underlying GdkEventScroll.
+func (v *EventScroll) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *EventScroll) native() *C.GdkEventScroll {
+ return (*C.GdkEventScroll)(unsafe.Pointer(v.Event.native()))
+}
+
+func (v *EventScroll) DeltaX() float64 {
+ return float64(v.native().delta_x)
+}
+
+func (v *EventScroll) DeltaY() float64 {
+ return float64(v.native().delta_y)
+}
+
+func (v *EventScroll) X() float64 {
+ return float64(v.native().x)
+}
+
+func (v *EventScroll) Y() float64 {
+ return float64(v.native().y)
+}
+
+func (v *EventScroll) Type() EventType {
+ c := v.native()._type
+ return EventType(c)
+}
+
+func (v *EventScroll) Direction() ScrollDirection {
+ c := v.native().direction
+ return ScrollDirection(c)
+}
+
+/*
+ * GdkEventWindowState
+ */
+
+// EventWindowState is a representation of GDK's GdkEventWindowState.
+type EventWindowState struct {
+ *Event
+}
+
+func EventWindowStateNew() *EventWindowState {
+ ee := (*C.GdkEvent)(unsafe.Pointer(&C.GdkEventWindowState{}))
+ ev := Event{ee}
+ return &EventWindowState{&ev}
+}
+
+// EventWindowStateNewFromEvent returns an EventWindowState from an Event.
+//
+// Using widget.Connect() for the
+// "window-state-event" signal results in a *Event being passed as
+// the callback's second argument. The argument is actually a
+// *EventWindowState. EventWindowStateNewFromEvent provides a means of creating
+// an EventWindowState from the Event.
+func EventWindowStateNewFromEvent(event *Event) *EventWindowState {
+ ee := (*C.GdkEvent)(unsafe.Pointer(event.native()))
+ ev := Event{ee}
+ return &EventWindowState{&ev}
+}
+
+// Native returns a pointer to the underlying GdkEventWindowState.
+func (v *EventWindowState) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *EventWindowState) native() *C.GdkEventWindowState {
+ return (*C.GdkEventWindowState)(unsafe.Pointer(v.Event.native()))
+}
+
+func (v *EventWindowState) Type() EventType {
+ c := v.native()._type
+ return EventType(c)
+}
+
+func (v *EventWindowState) ChangedMask() WindowState {
+ c := v.native().changed_mask
+ return WindowState(c)
+}
+
+func (v *EventWindowState) NewWindowState() WindowState {
+ c := v.native().new_window_state
+ return WindowState(c)
+}
+
+/*
+ * GdkGravity
+ */
+type GdkGravity int
+
+const (
+ GDK_GRAVITY_NORTH_WEST = C.GDK_GRAVITY_NORTH_WEST
+ GDK_GRAVITY_NORTH = C.GDK_GRAVITY_NORTH
+ GDK_GRAVITY_NORTH_EAST = C.GDK_GRAVITY_NORTH_EAST
+ GDK_GRAVITY_WEST = C.GDK_GRAVITY_WEST
+ GDK_GRAVITY_CENTER = C.GDK_GRAVITY_CENTER
+ GDK_GRAVITY_EAST = C.GDK_GRAVITY_EAST
+ GDK_GRAVITY_SOUTH_WEST = C.GDK_GRAVITY_SOUTH_WEST
+ GDK_GRAVITY_SOUTH = C.GDK_GRAVITY_SOUTH
+ GDK_GRAVITY_SOUTH_EAST = C.GDK_GRAVITY_SOUTH_EAST
+ GDK_GRAVITY_STATIC = C.GDK_GRAVITY_STATIC
+)
+
+/*
+ * GdkPixbuf
+ */
+
+// Pixbuf is a representation of GDK's GdkPixbuf.
+type Pixbuf struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GdkPixbuf.
+func (v *Pixbuf) native() *C.GdkPixbuf {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkPixbuf(p)
+}
+
+// Native returns a pointer to the underlying GdkPixbuf.
+func (v *Pixbuf) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *Pixbuf) NativePrivate() *C.GdkPixbuf {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkPixbuf(p)
+}
+
+func marshalPixbuf(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &Pixbuf{obj}, nil
+}
+
+// GetColorspace is a wrapper around gdk_pixbuf_get_colorspace().
+func (v *Pixbuf) GetColorspace() Colorspace {
+ c := C.gdk_pixbuf_get_colorspace(v.native())
+ return Colorspace(c)
+}
+
+// GetNChannels is a wrapper around gdk_pixbuf_get_n_channels().
+func (v *Pixbuf) GetNChannels() int {
+ c := C.gdk_pixbuf_get_n_channels(v.native())
+ return int(c)
+}
+
+// GetHasAlpha is a wrapper around gdk_pixbuf_get_has_alpha().
+func (v *Pixbuf) GetHasAlpha() bool {
+ c := C.gdk_pixbuf_get_has_alpha(v.native())
+ return gobool(c)
+}
+
+// GetBitsPerSample is a wrapper around gdk_pixbuf_get_bits_per_sample().
+func (v *Pixbuf) GetBitsPerSample() int {
+ c := C.gdk_pixbuf_get_bits_per_sample(v.native())
+ return int(c)
+}
+
+// GetPixels is a wrapper around gdk_pixbuf_get_pixels_with_length().
+// A Go slice is used to represent the underlying Pixbuf data array, one
+// byte per channel.
+func (v *Pixbuf) GetPixels() (channels []byte) {
+ var length C.guint
+ c := C.gdk_pixbuf_get_pixels_with_length(v.native(), &length)
+ sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&channels))
+ sliceHeader.Data = uintptr(unsafe.Pointer(c))
+ sliceHeader.Len = int(length)
+ sliceHeader.Cap = int(length)
+
+ // To make sure the slice doesn't outlive the Pixbuf, add a reference
+ v.Ref()
+ runtime.SetFinalizer(&channels, func(_ *[]byte) {
+ v.Unref()
+ })
+ return
+}
+
+// GetWidth is a wrapper around gdk_pixbuf_get_width().
+func (v *Pixbuf) GetWidth() int {
+ c := C.gdk_pixbuf_get_width(v.native())
+ return int(c)
+}
+
+// GetHeight is a wrapper around gdk_pixbuf_get_height().
+func (v *Pixbuf) GetHeight() int {
+ c := C.gdk_pixbuf_get_height(v.native())
+ return int(c)
+}
+
+// GetRowstride is a wrapper around gdk_pixbuf_get_rowstride().
+func (v *Pixbuf) GetRowstride() int {
+ c := C.gdk_pixbuf_get_rowstride(v.native())
+ return int(c)
+}
+
+// GetByteLength is a wrapper around gdk_pixbuf_get_byte_length().
+func (v *Pixbuf) GetByteLength() int {
+ c := C.gdk_pixbuf_get_byte_length(v.native())
+ return int(c)
+}
+
+// GetOption is a wrapper around gdk_pixbuf_get_option(). ok is true if
+// the key has an associated value.
+func (v *Pixbuf) GetOption(key string) (value string, ok bool) {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gdk_pixbuf_get_option(v.native(), (*C.gchar)(cstr))
+ if c == nil {
+ return "", false
+ }
+ return C.GoString((*C.char)(c)), true
+}
+
+// PixbufNew is a wrapper around gdk_pixbuf_new().
+func PixbufNew(colorspace Colorspace, hasAlpha bool, bitsPerSample, width, height int) (*Pixbuf, error) {
+ c := C.gdk_pixbuf_new(C.GdkColorspace(colorspace), gbool(hasAlpha),
+ C.int(bitsPerSample), C.int(width), C.int(height))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// PixbufCopy is a wrapper around gdk_pixbuf_copy().
+func PixbufCopy(v *Pixbuf) (*Pixbuf, error) {
+ c := C.gdk_pixbuf_copy(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// PixbufNewFromFile is a wrapper around gdk_pixbuf_new_from_file().
+func PixbufNewFromFile(filename string) (*Pixbuf, error) {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+
+ var err *C.GError
+ c := C.gdk_pixbuf_new_from_file((*C.char)(cstr), &err)
+ if c == nil {
+ defer C.g_error_free(err)
+ return nil, errors.New(C.GoString((*C.char)(err.message)))
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// PixbufNewFromFileAtSize is a wrapper around gdk_pixbuf_new_from_file_at_size().
+func PixbufNewFromFileAtSize(filename string, width, height int) (*Pixbuf, error) {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+
+ var err *C.GError = nil
+ c := C.gdk_pixbuf_new_from_file_at_size(cstr, C.int(width), C.int(height), &err)
+ if err != nil {
+ defer C.g_error_free(err)
+ return nil, errors.New(C.GoString((*C.char)(err.message)))
+ }
+
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// PixbufNewFromFileAtScale is a wrapper around gdk_pixbuf_new_from_file_at_scale().
+func PixbufNewFromFileAtScale(filename string, width, height int, preserveAspectRatio bool) (*Pixbuf, error) {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+
+ var err *C.GError = nil
+ c := C.gdk_pixbuf_new_from_file_at_scale(cstr, C.int(width), C.int(height),
+ gbool(preserveAspectRatio), &err)
+ if err != nil {
+ defer C.g_error_free(err)
+ return nil, errors.New(C.GoString((*C.char)(err.message)))
+ }
+
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// ScaleSimple is a wrapper around gdk_pixbuf_scale_simple().
+func (v *Pixbuf) ScaleSimple(destWidth, destHeight int, interpType InterpType) (*Pixbuf, error) {
+ c := C.gdk_pixbuf_scale_simple(v.native(), C.int(destWidth),
+ C.int(destHeight), C.GdkInterpType(interpType))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// RotateSimple is a wrapper around gdk_pixbuf_rotate_simple().
+func (v *Pixbuf) RotateSimple(angle PixbufRotation) (*Pixbuf, error) {
+ c := C.gdk_pixbuf_rotate_simple(v.native(), C.GdkPixbufRotation(angle))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// ApplyEmbeddedOrientation is a wrapper around gdk_pixbuf_apply_embedded_orientation().
+func (v *Pixbuf) ApplyEmbeddedOrientation() (*Pixbuf, error) {
+ c := C.gdk_pixbuf_apply_embedded_orientation(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// Flip is a wrapper around gdk_pixbuf_flip().
+func (v *Pixbuf) Flip(horizontal bool) (*Pixbuf, error) {
+ c := C.gdk_pixbuf_flip(v.native(), gbool(horizontal))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// SaveJPEG is a wrapper around gdk_pixbuf_save().
+// Quality is a number between 0...100
+func (v *Pixbuf) SaveJPEG(path string, quality int) error {
+ cpath := C.CString(path)
+ cquality := C.CString(strconv.Itoa(quality))
+ defer C.free(unsafe.Pointer(cpath))
+ defer C.free(unsafe.Pointer(cquality))
+
+ var err *C.GError
+ c := C._gdk_pixbuf_save_jpeg(v.native(), cpath, &err, cquality)
+ if !gobool(c) {
+ defer C.g_error_free(err)
+ return errors.New(C.GoString((*C.char)(err.message)))
+ }
+
+ return nil
+}
+
+// SavePNG is a wrapper around gdk_pixbuf_save().
+// Compression is a number between 0...9
+func (v *Pixbuf) SavePNG(path string, compression int) error {
+ cpath := C.CString(path)
+ ccompression := C.CString(strconv.Itoa(compression))
+ defer C.free(unsafe.Pointer(cpath))
+ defer C.free(unsafe.Pointer(ccompression))
+
+ var err *C.GError
+ c := C._gdk_pixbuf_save_png(v.native(), cpath, &err, ccompression)
+ if !gobool(c) {
+ defer C.g_error_free(err)
+ return errors.New(C.GoString((*C.char)(err.message)))
+ }
+ return nil
+}
+
+// PixbufGetFileInfo is a wrapper around gdk_pixbuf_get_file_info().
+// TODO: need to wrap the returned format to GdkPixbufFormat.
+func PixbufGetFileInfo(filename string) (format interface{}, width, height int) {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+ var cw, ch C.gint
+ format = C.gdk_pixbuf_get_file_info((*C.gchar)(cstr), &cw, &ch)
+ // TODO: need to wrap the returned format to GdkPixbufFormat.
+ return format, int(cw), int(ch)
+}
+
+/*
+ * GdkPixbufLoader
+ */
+
+// PixbufLoader is a representation of GDK's GdkPixbufLoader.
+// Users of PixbufLoader are expected to call Close() when they are finished.
+type PixbufLoader struct {
+ *glib.Object
+}
+
+// native() returns a pointer to the underlying GdkPixbufLoader.
+func (v *PixbufLoader) native() *C.GdkPixbufLoader {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkPixbufLoader(p)
+}
+
+// PixbufLoaderNew() is a wrapper around gdk_pixbuf_loader_new().
+func PixbufLoaderNew() (*PixbufLoader, error) {
+ c := C.gdk_pixbuf_loader_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &PixbufLoader{obj}
+ obj.Ref()
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+// PixbufLoaderNewWithType() is a wrapper around gdk_pixbuf_loader_new_with_type().
+func PixbufLoaderNewWithType(t string) (*PixbufLoader, error) {
+ var err *C.GError
+
+ cstr := C.CString(t)
+ defer C.free(unsafe.Pointer(cstr))
+
+ c := C.gdk_pixbuf_loader_new_with_type((*C.char)(cstr), &err)
+ if err != nil {
+ defer C.g_error_free(err)
+ return nil, errors.New(C.GoString((*C.char)(err.message)))
+ }
+
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &PixbufLoader{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// Write() is a wrapper around gdk_pixbuf_loader_write(). The
+// function signature differs from the C equivalent to satisify the
+// io.Writer interface.
+func (v *PixbufLoader) Write(data []byte) (int, error) {
+ // n is set to 0 on error, and set to len(data) otherwise.
+ // This is a tiny hacky to satisfy io.Writer and io.WriteCloser,
+ // which would allow access to all io and ioutil goodies,
+ // and play along nice with go environment.
+
+ if len(data) == 0 {
+ return 0, nil
+ }
+
+ var err *C.GError
+ c := C.gdk_pixbuf_loader_write(v.native(),
+ (*C.guchar)(unsafe.Pointer(&data[0])), C.gsize(len(data)),
+ &err)
+
+ if !gobool(c) {
+ defer C.g_error_free(err)
+ return 0, errors.New(C.GoString((*C.char)(err.message)))
+ }
+
+ return len(data), nil
+}
+
+func (v *PixbufLoader) WriteAndReturnPixbuf(data []byte) (*Pixbuf, error) {
+
+ if len(data) == 0 {
+ return nil, errors.New("no data")
+ }
+
+ var err *C.GError
+ c := C.gdk_pixbuf_loader_write(v.native(), (*C.guchar)(unsafe.Pointer(&data[0])), C.gsize(len(data)), &err)
+
+ if !gobool(c) {
+ defer C.g_error_free(err)
+ return nil, errors.New(C.GoString((*C.char)(err.message)))
+ }
+
+ v.Close()
+
+ c2 := C.gdk_pixbuf_loader_get_pixbuf(v.native())
+ if c2 == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c2))}
+ p := &Pixbuf{obj}
+ //obj.Ref() // Don't call Ref here, gdk_pixbuf_loader_get_pixbuf already did that for us.
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+
+ return p, nil
+}
+
+// Close is a wrapper around gdk_pixbuf_loader_close(). An error is
+// returned instead of a bool like the native C function to support the
+// io.Closer interface.
+func (v *PixbufLoader) Close() error {
+ var err *C.GError
+
+ if ok := gobool(C.gdk_pixbuf_loader_close(v.native(), &err)); !ok {
+ defer C.g_error_free(err)
+ return errors.New(C.GoString((*C.char)(err.message)))
+ }
+ return nil
+}
+
+// SetSize is a wrapper around gdk_pixbuf_loader_set_size().
+func (v *PixbufLoader) SetSize(width, height int) {
+ C.gdk_pixbuf_loader_set_size(v.native(), C.int(width), C.int(height))
+}
+
+// GetPixbuf is a wrapper around gdk_pixbuf_loader_get_pixbuf().
+func (v *PixbufLoader) GetPixbuf() (*Pixbuf, error) {
+ c := C.gdk_pixbuf_loader_get_pixbuf(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ p := &Pixbuf{obj}
+ //obj.Ref() // Don't call Ref here, gdk_pixbuf_loader_get_pixbuf already did that for us.
+ runtime.SetFinalizer(p, func(_ interface{}) { obj.Unref() })
+ return p, nil
+}
+
+type RGBA struct {
+ rgba *C.GdkRGBA
+}
+
+func marshalRGBA(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return WrapRGBA(unsafe.Pointer(c)), nil
+}
+
+func WrapRGBA(p unsafe.Pointer) *RGBA {
+ return wrapRGBA((*C.GdkRGBA)(p))
+}
+
+func wrapRGBA(obj *C.GdkRGBA) *RGBA {
+ return &RGBA{obj}
+}
+
+func NewRGBA(values ...float64) *RGBA {
+ cval := C.GdkRGBA{}
+ c := &RGBA{&cval}
+ if len(values) > 0 {
+ c.rgba.red = C.gdouble(values[0])
+ }
+ if len(values) > 1 {
+ c.rgba.green = C.gdouble(values[1])
+ }
+ if len(values) > 2 {
+ c.rgba.blue = C.gdouble(values[2])
+ }
+ if len(values) > 3 {
+ c.rgba.alpha = C.gdouble(values[3])
+ }
+ return c
+}
+
+func (c *RGBA) Floats() []float64 {
+ return []float64{float64(c.rgba.red), float64(c.rgba.green), float64(c.rgba.blue), float64(c.rgba.alpha)}
+}
+
+// SetColors sets all colors values in the RGBA.
+func (c *RGBA) SetColors(r, g, b, a float64) {
+ c.rgba.red = C.gdouble(r)
+ c.rgba.green = C.gdouble(g)
+ c.rgba.blue = C.gdouble(b)
+ c.rgba.alpha = C.gdouble(a)
+}
+
+func (v *RGBA) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.rgba))
+}
+
+// Parse is a representation of gdk_rgba_parse().
+func (v *RGBA) Parse(spec string) bool {
+ cstr := (*C.gchar)(C.CString(spec))
+ defer C.free(unsafe.Pointer(cstr))
+
+ return gobool(C.gdk_rgba_parse(v.rgba, cstr))
+}
+
+// String is a representation of gdk_rgba_to_string().
+func (v *RGBA) String() string {
+ return C.GoString((*C.char)(C.gdk_rgba_to_string(v.rgba)))
+}
+
+// GdkRGBA * gdk_rgba_copy ()
+// void gdk_rgba_free ()
+// gboolean gdk_rgba_equal ()
+// guint gdk_rgba_hash ()
+
+// PixbufGetType is a wrapper around gdk_pixbuf_get_type().
+func PixbufGetType() glib.Type {
+ return glib.Type(C.gdk_pixbuf_get_type())
+}
+
+/*
+ * GdkRectangle
+ */
+
+// Rectangle is a representation of GDK's GdkRectangle type.
+type Rectangle struct {
+ GdkRectangle C.GdkRectangle
+}
+
+func WrapRectangle(p uintptr) *Rectangle {
+ return wrapRectangle((*C.GdkRectangle)(unsafe.Pointer(p)))
+}
+
+func wrapRectangle(obj *C.GdkRectangle) *Rectangle {
+ if obj == nil {
+ return nil
+ }
+ return &Rectangle{*obj}
+}
+
+// Native() returns a pointer to the underlying GdkRectangle.
+func (r *Rectangle) native() *C.GdkRectangle {
+ return &r.GdkRectangle
+}
+
+// GetX returns x field of the underlying GdkRectangle.
+func (r *Rectangle) GetX() int {
+ return int(r.native().x)
+}
+
+// GetY returns y field of the underlying GdkRectangle.
+func (r *Rectangle) GetY() int {
+ return int(r.native().y)
+}
+
+// GetWidth returns width field of the underlying GdkRectangle.
+func (r *Rectangle) GetWidth() int {
+ return int(r.native().width)
+}
+
+// GetHeight returns height field of the underlying GdkRectangle.
+func (r *Rectangle) GetHeight() int {
+ return int(r.native().height)
+}
+
+/*
+ * GdkVisual
+ */
+
+// Visual is a representation of GDK's GdkVisual.
+type Visual struct {
+ *glib.Object
+}
+
+func (v *Visual) native() *C.GdkVisual {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkVisual(p)
+}
+
+func (v *Visual) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalVisual(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &Visual{obj}, nil
+}
+
+/*
+ * GdkWindow
+ */
+
+// Window is a representation of GDK's GdkWindow.
+type Window struct {
+ *glib.Object
+}
+
+// SetCursor is a wrapper around gdk_window_set_cursor().
+func (v *Window) SetCursor(cursor *Cursor) {
+ C.gdk_window_set_cursor(v.native(), cursor.native())
+}
+
+// native returns a pointer to the underlying GdkWindow.
+func (v *Window) native() *C.GdkWindow {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkWindow(p)
+}
+
+// Native returns a pointer to the underlying GdkWindow.
+func (v *Window) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalWindow(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &Window{obj}, nil
+}
+
+func toWindow(s *C.GdkWindow) (*Window, error) {
+ if s == nil {
+ return nil, nilPtrErr
+ }
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(s))}
+ return &Window{obj}, nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/gdk.go.h b/vendor/github.com/gotk3/gotk3/gdk/gdk.go.h
new file mode 100644
index 0000000..940dac7
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/gdk.go.h
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdlib.h>
+
+// Type Casting
+static GdkAtom
+toGdkAtom(void *p)
+{
+ return ((GdkAtom)p);
+}
+
+static GdkDevice *
+toGdkDevice(void *p)
+{
+ return (GDK_DEVICE(p));
+}
+
+static GdkCursor *
+toGdkCursor(void *p)
+{
+ return (GDK_CURSOR(p));
+}
+
+static GdkDeviceManager *
+toGdkDeviceManager(void *p)
+{
+ return (GDK_DEVICE_MANAGER(p));
+}
+
+static GdkDisplay *
+toGdkDisplay(void *p)
+{
+ return (GDK_DISPLAY(p));
+}
+
+static GdkDragContext *
+toGdkDragContext(void *p)
+{
+ return (GDK_DRAG_CONTEXT(p));
+}
+
+static GdkPixbuf *
+toGdkPixbuf(void *p)
+{
+ return (GDK_PIXBUF(p));
+}
+
+static gboolean
+_gdk_pixbuf_save_png(GdkPixbuf *pixbuf,
+const char *filename, GError ** err, const char *compression)
+{
+ return gdk_pixbuf_save(pixbuf, filename, "png", err, "compression", compression, NULL);
+}
+
+static gboolean
+_gdk_pixbuf_save_jpeg(GdkPixbuf *pixbuf,
+const char *filename, GError ** err, const char *quality)
+{
+ return gdk_pixbuf_save(pixbuf, filename, "jpeg", err, "quality", quality, NULL);
+}
+
+static GdkPixbufLoader *
+toGdkPixbufLoader(void *p)
+{
+ return (GDK_PIXBUF_LOADER(p));
+}
+
+static GdkScreen *
+toGdkScreen(void *p)
+{
+ return (GDK_SCREEN(p));
+}
+
+static GdkVisual *
+toGdkVisual(void *p)
+{
+ return (GDK_VISUAL(p));
+}
+
+static GdkWindow *
+toGdkWindow(void *p)
+{
+ return (GDK_WINDOW(p));
+}
+
+static inline gchar** next_gcharptr(gchar** s) { return (s+1); }
diff --git a/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_16.go b/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_16.go
new file mode 100644
index 0000000..b2dd330
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_16.go
@@ -0,0 +1,12 @@
+//+build gtk_3_6 gtk_3_8 gtk_3_10 gtk_3_12 gtk_3_14
+
+package gdk
+
+// #include <gdk/gdk.h>
+import "C"
+
+// SupportsComposite() is a wrapper around gdk_display_supports_composite().
+func (v *Display) SupportsComposite() bool {
+ c := C.gdk_display_supports_composite(v.native())
+ return gobool(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_20.go b/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_20.go
new file mode 100644
index 0000000..66f444a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_20.go
@@ -0,0 +1,79 @@
+//+build gtk_3_6 gtk_3_8 gtk_3_10 gtk_3_12 gtk_3_14 gtk_3_16 gtk_3_18
+
+package gdk
+
+// #include <gdk/gdk.h>
+import "C"
+import (
+ "runtime"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+// Grab() is a wrapper around gdk_device_grab().
+func (v *Device) Grab(w *Window, ownership GrabOwnership, owner_events bool, event_mask EventMask, cursor *Cursor, time uint32) GrabStatus {
+ ret := C.gdk_device_grab(
+ v.native(),
+ w.native(),
+ C.GdkGrabOwnership(ownership),
+ gbool(owner_events),
+ C.GdkEventMask(event_mask),
+ cursor.native(),
+ C.guint32(time),
+ )
+ return GrabStatus(ret)
+}
+
+// GetClientPointer() is a wrapper around gdk_device_manager_get_client_pointer().
+func (v *DeviceManager) GetClientPointer() (*Device, error) {
+ c := C.gdk_device_manager_get_client_pointer(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Device{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// ListDevices() is a wrapper around gdk_device_manager_list_devices().
+func (v *DeviceManager) ListDevices(tp DeviceType) *glib.List {
+ clist := C.gdk_device_manager_list_devices(v.native(), C.GdkDeviceType(tp))
+ if clist == nil {
+ return nil
+ }
+
+ //TODO: WrapList should set the finalizer
+ glist := glib.WrapList(uintptr(unsafe.Pointer(clist)))
+ glist.DataWrapper(func(ptr unsafe.Pointer) interface{} {
+ return &Device{&glib.Object{glib.ToGObject(ptr)}}
+ })
+ runtime.SetFinalizer(glist, func(glist *glib.List) {
+ glist.Free()
+ })
+ return glist
+}
+
+// Ungrab() is a wrapper around gdk_device_ungrab().
+func (v *Device) Ungrab(time uint32) {
+ C.gdk_device_ungrab(v.native(), C.guint32(time))
+}
+
+// GetDeviceManager() is a wrapper around gdk_display_get_device_manager().
+func (v *Display) GetDeviceManager() (*DeviceManager, error) {
+ c := C.gdk_display_get_device_manager(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &DeviceManager{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// GetScreen() is a wrapper around gdk_display_get_screen().
+func (v *Display) GetScreen(screenNum int) (*Screen, error) {
+ c := C.gdk_display_get_screen(v.native(), C.gint(screenNum))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Screen{glib.Take(unsafe.Pointer(c))}, nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_22.go b/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_22.go
new file mode 100644
index 0000000..ce2b4e3
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_22.go
@@ -0,0 +1,83 @@
+//+build gtk_3_6 gtk_3_8 gtk_3_10 gtk_3_12 gtk_3_14 gtk_3_16 gtk_3_18 gtk_3_20
+
+package gdk
+
+// #include <gdk/gdk.h>
+import "C"
+
+// GetActiveWindow is a wrapper around gdk_screen_get_active_window().
+func (v *Screen) GetActiveWindow() (*Window, error) {
+ return toWindow(C.gdk_screen_get_active_window(v.native()))
+}
+
+// GetHeight is a wrapper around gdk_screen_get_height().
+func (v *Screen) GetHeight() int {
+ c := C.gdk_screen_get_height(v.native())
+ return int(c)
+}
+
+// GetHeightMM is a wrapper around gdk_screen_get_height_mm().
+func (v *Screen) GetHeightMM() int {
+ return int(C.gdk_screen_get_height_mm(v.native()))
+}
+
+// GetMonitorAtPoint is a wrapper around gdk_screen_get_monitor_at_point().
+func (v *Screen) GetMonitorAtPoint(x, y int) int {
+ return int(C.gdk_screen_get_monitor_at_point(v.native(), C.gint(x), C.gint(y)))
+}
+
+// GetMonitorAtWindow is a wrapper around gdk_screen_get_monitor_at_window().
+func (v *Screen) GetMonitorAtWindow(w *Window) int {
+ return int(C.gdk_screen_get_monitor_at_window(v.native(), w.native()))
+}
+
+// GetMonitorHeightMM is a wrapper around gdk_screen_get_monitor_height_mm().
+func (v *Screen) GetMonitorHeightMM(m int) int {
+ return int(C.gdk_screen_get_monitor_height_mm(v.native(), C.gint(m)))
+}
+
+// GetMonitorPlugName is a wrapper around gdk_screen_get_monitor_plug_name().
+func (v *Screen) GetMonitorPlugName(m int) (string, error) {
+ return toString(C.gdk_screen_get_monitor_plug_name(v.native(), C.gint(m)))
+}
+
+// GetMonitorScaleFactor is a wrapper around gdk_screen_get_monitor_scale_factor().
+func (v *Screen) GetMonitorScaleFactor(m int) int {
+ return int(C.gdk_screen_get_monitor_scale_factor(v.native(), C.gint(m)))
+}
+
+// GetMonitorWidthMM is a wrapper around gdk_screen_get_monitor_width_mm().
+func (v *Screen) GetMonitorWidthMM(m int) int {
+ return int(C.gdk_screen_get_monitor_width_mm(v.native(), C.gint(m)))
+}
+
+// GetNMonitors is a wrapper around gdk_screen_get_n_monitors().
+func (v *Screen) GetNMonitors() int {
+ return int(C.gdk_screen_get_n_monitors(v.native()))
+}
+
+// GetNumber is a wrapper around gdk_screen_get_number().
+func (v *Screen) GetNumber() int {
+ return int(C.gdk_screen_get_number(v.native()))
+}
+
+// GetPrimaryMonitor is a wrapper around gdk_screen_get_primary_monitor().
+func (v *Screen) GetPrimaryMonitor() int {
+ return int(C.gdk_screen_get_primary_monitor(v.native()))
+}
+
+// GetWidth is a wrapper around gdk_screen_get_width().
+func (v *Screen) GetWidth() int {
+ c := C.gdk_screen_get_width(v.native())
+ return int(c)
+}
+
+// GetWidthMM is a wrapper around gdk_screen_get_width_mm().
+func (v *Screen) GetWidthMM() int {
+ return int(C.gdk_screen_get_width_mm(v.native()))
+}
+
+// MakeDisplayName is a wrapper around gdk_screen_make_display_name().
+func (v *Screen) MakeDisplayName() (string, error) {
+ return toString(C.gdk_screen_make_display_name(v.native()))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_8.go b/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_8.go
new file mode 100644
index 0000000..441afaf
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/gdk_deprecated_since_3_8.go
@@ -0,0 +1,33 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrappers for symbols deprecated beginning with GTK 3.10,
+// and should only be included in a build targeted intended to target GTK
+// 3.8 or earlier. To target an earlier build build, use the build tag
+// gtk_MAJOR_MINOR. For example, to target GTK 3.8, run
+// 'go build -tags gtk_3_8'.
+// +build gtk_3_6 gtk_3_8
+
+package gdk
+
+// #include <gdk/gdk.h>
+import "C"
+
+// GetNScreens is a wrapper around gdk_display_get_n_screens().
+func (v *Display) GetNScreens() int {
+ c := C.gdk_display_get_n_screens(v.native())
+ return int(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/gdk_pixbuf_format.go b/vendor/github.com/gotk3/gotk3/gdk/gdk_pixbuf_format.go
new file mode 100644
index 0000000..3bcb9b5
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/gdk_pixbuf_format.go
@@ -0,0 +1,89 @@
+package gdk
+
+// #include <gdk/gdk.h>
+// #include "gdk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+type PixbufFormat struct {
+ format *C.GdkPixbufFormat
+}
+
+// native returns a pointer to the underlying GdkPixbuf.
+func (v *PixbufFormat) native() *C.GdkPixbufFormat {
+ if v == nil {
+ return nil
+ }
+
+ return v.format
+}
+
+// Native returns a pointer to the underlying GdkPixbuf.
+func (v *PixbufFormat) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (f *PixbufFormat) GetName() (string, error) {
+ c := C.gdk_pixbuf_format_get_name(f.native())
+ return C.GoString((*C.char)(c)), nil
+}
+
+func (f *PixbufFormat) GetDescription() (string, error) {
+ c := C.gdk_pixbuf_format_get_description(f.native())
+ return C.GoString((*C.char)(c)), nil
+}
+
+func (f *PixbufFormat) GetLicense() (string, error) {
+ c := C.gdk_pixbuf_format_get_license(f.native())
+ return C.GoString((*C.char)(c)), nil
+}
+
+// GetMimeTypes is a wrapper around gdk_pixbuf_format_get_mime_types().
+func (f *PixbufFormat) GetMimeTypes() []string {
+ var types []string
+ c := C.gdk_pixbuf_format_get_mime_types(f.native())
+ if c == nil {
+ return nil
+ }
+ for *c != nil {
+ types = append(types, C.GoString((*C.char)(*c)))
+ c = C.next_gcharptr(c)
+ }
+ return types
+}
+
+// GetExtensions is a wrapper around gdk_pixbuf_format_get_extensions().
+func (f *PixbufFormat) GetExtensions() []string {
+ var extensions []string
+ c := C.gdk_pixbuf_format_get_extensions(f.native())
+ if c == nil {
+ return nil
+ }
+ for *c != nil {
+ extensions = append(extensions, C.GoString((*C.char)(*c)))
+ c = C.next_gcharptr(c)
+ }
+ return extensions
+}
+
+func PixbufGetFormats() []*PixbufFormat {
+ l := (*C.struct__GSList)(C.gdk_pixbuf_get_formats())
+ formats := glib.WrapSList(uintptr(unsafe.Pointer(l)))
+ if formats == nil {
+ return nil // no error. A nil list is considered to be empty.
+ }
+
+ // "The structures themselves are owned by GdkPixbuf". Free the list only.
+ defer formats.Free()
+
+ ret := make([]*PixbufFormat, 0, formats.Length())
+ formats.Foreach(func(ptr unsafe.Pointer) {
+ ret = append(ret, &PixbufFormat{(*C.GdkPixbufFormat)(ptr)})
+ })
+
+ return ret
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/gdk_since_3_22.go b/vendor/github.com/gotk3/gotk3/gdk/gdk_since_3_22.go
new file mode 100644
index 0000000..871eda0
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/gdk_since_3_22.go
@@ -0,0 +1,95 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12,!gtk_3_14,!gtk_3_16,!gtk_3_18,!gtk_3_20
+// Supports building with gtk 3.22+
+
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+package gdk
+
+// #include <gdk/gdk.h>
+// #include "gdk_since_3_22.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GdkDisplay
+ */
+
+// GetNMonitors is a wrapper around gdk_display_get_n_monitors().
+func (v *Display) GetNMonitors() int {
+ c := C.gdk_display_get_n_monitors(v.native())
+ return int(c)
+}
+
+// GetPrimaryMonitor is a wrapper around gdk_display_get_primary_monitor().
+func (v *Display) GetPrimaryMonitor() (*Monitor, error) {
+ c := C.gdk_display_get_primary_monitor(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Monitor{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+/*
+ * GdkMonitor
+ */
+
+// Monitor is a representation of GDK's GdkMonitor.
+type Monitor struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GdkMonitor.
+func (v *Monitor) native() *C.GdkMonitor {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkMonitor(p)
+}
+
+// Native returns a pointer to the underlying GdkMonitor.
+func (v *Monitor) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalMonitor(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &Monitor{obj}, nil
+}
+
+func toMonitor(s *C.GdkMonitor) (*Monitor, error) {
+ if s == nil {
+ return nil, nilPtrErr
+ }
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(s))}
+ return &Monitor{obj}, nil
+}
+
+// GetGeometry is a wrapper around gdk_monitor_get_geometry().
+func (v *Monitor) GetGeometry() *Rectangle {
+ var rect C.GdkRectangle
+
+ C.gdk_monitor_get_geometry(v.native(), &rect)
+
+ return WrapRectangle(uintptr(unsafe.Pointer(&rect)))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/gdk_since_3_22.go.h b/vendor/github.com/gotk3/gotk3/gdk/gdk_since_3_22.go.h
new file mode 100644
index 0000000..478c1a1
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/gdk_since_3_22.go.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+//#include <stdlib.h>
+
+// Type Casting
+static GdkMonitor *
+toGdkMonitor(void *p)
+{
+ return (GDK_MONITOR(p));
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/keys.go b/vendor/github.com/gotk3/gotk3/gdk/keys.go
new file mode 100644
index 0000000..bd4536e
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/keys.go
@@ -0,0 +1,2278 @@
+package gdk
+
+// #include <gdk/gdk.h>
+// #include "gdk.go.h"
+import "C"
+
+const (
+ KEY_VoidSymbol = uint(C.GDK_KEY_VoidSymbol)
+ KEY_BackSpace = uint(C.GDK_KEY_BackSpace)
+ KEY_Tab = uint(C.GDK_KEY_Tab)
+ KEY_Linefeed = uint(C.GDK_KEY_Linefeed)
+ KEY_Clear = uint(C.GDK_KEY_Clear)
+ KEY_Return = uint(C.GDK_KEY_Return)
+ KEY_Pause = uint(C.GDK_KEY_Pause)
+ KEY_Scroll_Lock = uint(C.GDK_KEY_Scroll_Lock)
+ KEY_Sys_Req = uint(C.GDK_KEY_Sys_Req)
+ KEY_Escape = uint(C.GDK_KEY_Escape)
+ KEY_Delete = uint(C.GDK_KEY_Delete)
+ KEY_Multi_key = uint(C.GDK_KEY_Multi_key)
+ KEY_Codeinput = uint(C.GDK_KEY_Codeinput)
+ KEY_SingleCandidate = uint(C.GDK_KEY_SingleCandidate)
+ KEY_MultipleCandidate = uint(C.GDK_KEY_MultipleCandidate)
+ KEY_PreviousCandidate = uint(C.GDK_KEY_PreviousCandidate)
+ KEY_Kanji = uint(C.GDK_KEY_Kanji)
+ KEY_Muhenkan = uint(C.GDK_KEY_Muhenkan)
+ KEY_Henkan_Mode = uint(C.GDK_KEY_Henkan_Mode)
+ KEY_Henkan = uint(C.GDK_KEY_Henkan)
+ KEY_Romaji = uint(C.GDK_KEY_Romaji)
+ KEY_Hiragana = uint(C.GDK_KEY_Hiragana)
+ KEY_Katakana = uint(C.GDK_KEY_Katakana)
+ KEY_Hiragana_Katakana = uint(C.GDK_KEY_Hiragana_Katakana)
+ KEY_Zenkaku = uint(C.GDK_KEY_Zenkaku)
+ KEY_Hankaku = uint(C.GDK_KEY_Hankaku)
+ KEY_Zenkaku_Hankaku = uint(C.GDK_KEY_Zenkaku_Hankaku)
+ KEY_Touroku = uint(C.GDK_KEY_Touroku)
+ KEY_Massyo = uint(C.GDK_KEY_Massyo)
+ KEY_Kana_Lock = uint(C.GDK_KEY_Kana_Lock)
+ KEY_Kana_Shift = uint(C.GDK_KEY_Kana_Shift)
+ KEY_Eisu_Shift = uint(C.GDK_KEY_Eisu_Shift)
+ KEY_Eisu_toggle = uint(C.GDK_KEY_Eisu_toggle)
+ KEY_Kanji_Bangou = uint(C.GDK_KEY_Kanji_Bangou)
+ KEY_Zen_Koho = uint(C.GDK_KEY_Zen_Koho)
+ KEY_Mae_Koho = uint(C.GDK_KEY_Mae_Koho)
+ KEY_Home = uint(C.GDK_KEY_Home)
+ KEY_Left = uint(C.GDK_KEY_Left)
+ KEY_Up = uint(C.GDK_KEY_Up)
+ KEY_Right = uint(C.GDK_KEY_Right)
+ KEY_Down = uint(C.GDK_KEY_Down)
+ KEY_Prior = uint(C.GDK_KEY_Prior)
+ KEY_Page_Up = uint(C.GDK_KEY_Page_Up)
+ KEY_Next = uint(C.GDK_KEY_Next)
+ KEY_Page_Down = uint(C.GDK_KEY_Page_Down)
+ KEY_End = uint(C.GDK_KEY_End)
+ KEY_Begin = uint(C.GDK_KEY_Begin)
+ KEY_Select = uint(C.GDK_KEY_Select)
+ KEY_Print = uint(C.GDK_KEY_Print)
+ KEY_Execute = uint(C.GDK_KEY_Execute)
+ KEY_Insert = uint(C.GDK_KEY_Insert)
+ KEY_Undo = uint(C.GDK_KEY_Undo)
+ KEY_Redo = uint(C.GDK_KEY_Redo)
+ KEY_Menu = uint(C.GDK_KEY_Menu)
+ KEY_Find = uint(C.GDK_KEY_Find)
+ KEY_Cancel = uint(C.GDK_KEY_Cancel)
+ KEY_Help = uint(C.GDK_KEY_Help)
+ KEY_Break = uint(C.GDK_KEY_Break)
+ KEY_Mode_switch = uint(C.GDK_KEY_Mode_switch)
+ KEY_script_switch = uint(C.GDK_KEY_script_switch)
+ KEY_Num_Lock = uint(C.GDK_KEY_Num_Lock)
+ KEY_KP_Space = uint(C.GDK_KEY_KP_Space)
+ KEY_KP_Tab = uint(C.GDK_KEY_KP_Tab)
+ KEY_KP_Enter = uint(C.GDK_KEY_KP_Enter)
+ KEY_KP_F1 = uint(C.GDK_KEY_KP_F1)
+ KEY_KP_F2 = uint(C.GDK_KEY_KP_F2)
+ KEY_KP_F3 = uint(C.GDK_KEY_KP_F3)
+ KEY_KP_F4 = uint(C.GDK_KEY_KP_F4)
+ KEY_KP_Home = uint(C.GDK_KEY_KP_Home)
+ KEY_KP_Left = uint(C.GDK_KEY_KP_Left)
+ KEY_KP_Up = uint(C.GDK_KEY_KP_Up)
+ KEY_KP_Right = uint(C.GDK_KEY_KP_Right)
+ KEY_KP_Down = uint(C.GDK_KEY_KP_Down)
+ KEY_KP_Prior = uint(C.GDK_KEY_KP_Prior)
+ KEY_KP_Page_Up = uint(C.GDK_KEY_KP_Page_Up)
+ KEY_KP_Next = uint(C.GDK_KEY_KP_Next)
+ KEY_KP_Page_Down = uint(C.GDK_KEY_KP_Page_Down)
+ KEY_KP_End = uint(C.GDK_KEY_KP_End)
+ KEY_KP_Begin = uint(C.GDK_KEY_KP_Begin)
+ KEY_KP_Insert = uint(C.GDK_KEY_KP_Insert)
+ KEY_KP_Delete = uint(C.GDK_KEY_KP_Delete)
+ KEY_KP_Equal = uint(C.GDK_KEY_KP_Equal)
+ KEY_KP_Multiply = uint(C.GDK_KEY_KP_Multiply)
+ KEY_KP_Add = uint(C.GDK_KEY_KP_Add)
+ KEY_KP_Separator = uint(C.GDK_KEY_KP_Separator)
+ KEY_KP_Subtract = uint(C.GDK_KEY_KP_Subtract)
+ KEY_KP_Decimal = uint(C.GDK_KEY_KP_Decimal)
+ KEY_KP_Divide = uint(C.GDK_KEY_KP_Divide)
+ KEY_KP_0 = uint(C.GDK_KEY_KP_0)
+ KEY_KP_1 = uint(C.GDK_KEY_KP_1)
+ KEY_KP_2 = uint(C.GDK_KEY_KP_2)
+ KEY_KP_3 = uint(C.GDK_KEY_KP_3)
+ KEY_KP_4 = uint(C.GDK_KEY_KP_4)
+ KEY_KP_5 = uint(C.GDK_KEY_KP_5)
+ KEY_KP_6 = uint(C.GDK_KEY_KP_6)
+ KEY_KP_7 = uint(C.GDK_KEY_KP_7)
+ KEY_KP_8 = uint(C.GDK_KEY_KP_8)
+ KEY_KP_9 = uint(C.GDK_KEY_KP_9)
+ KEY_F1 = uint(C.GDK_KEY_F1)
+ KEY_F2 = uint(C.GDK_KEY_F2)
+ KEY_F3 = uint(C.GDK_KEY_F3)
+ KEY_F4 = uint(C.GDK_KEY_F4)
+ KEY_F5 = uint(C.GDK_KEY_F5)
+ KEY_F6 = uint(C.GDK_KEY_F6)
+ KEY_F7 = uint(C.GDK_KEY_F7)
+ KEY_F8 = uint(C.GDK_KEY_F8)
+ KEY_F9 = uint(C.GDK_KEY_F9)
+ KEY_F10 = uint(C.GDK_KEY_F10)
+ KEY_F11 = uint(C.GDK_KEY_F11)
+ KEY_L1 = uint(C.GDK_KEY_L1)
+ KEY_F12 = uint(C.GDK_KEY_F12)
+ KEY_L2 = uint(C.GDK_KEY_L2)
+ KEY_F13 = uint(C.GDK_KEY_F13)
+ KEY_L3 = uint(C.GDK_KEY_L3)
+ KEY_F14 = uint(C.GDK_KEY_F14)
+ KEY_L4 = uint(C.GDK_KEY_L4)
+ KEY_F15 = uint(C.GDK_KEY_F15)
+ KEY_L5 = uint(C.GDK_KEY_L5)
+ KEY_F16 = uint(C.GDK_KEY_F16)
+ KEY_L6 = uint(C.GDK_KEY_L6)
+ KEY_F17 = uint(C.GDK_KEY_F17)
+ KEY_L7 = uint(C.GDK_KEY_L7)
+ KEY_F18 = uint(C.GDK_KEY_F18)
+ KEY_L8 = uint(C.GDK_KEY_L8)
+ KEY_F19 = uint(C.GDK_KEY_F19)
+ KEY_L9 = uint(C.GDK_KEY_L9)
+ KEY_F20 = uint(C.GDK_KEY_F20)
+ KEY_L10 = uint(C.GDK_KEY_L10)
+ KEY_F21 = uint(C.GDK_KEY_F21)
+ KEY_R1 = uint(C.GDK_KEY_R1)
+ KEY_F22 = uint(C.GDK_KEY_F22)
+ KEY_R2 = uint(C.GDK_KEY_R2)
+ KEY_F23 = uint(C.GDK_KEY_F23)
+ KEY_R3 = uint(C.GDK_KEY_R3)
+ KEY_F24 = uint(C.GDK_KEY_F24)
+ KEY_R4 = uint(C.GDK_KEY_R4)
+ KEY_F25 = uint(C.GDK_KEY_F25)
+ KEY_R5 = uint(C.GDK_KEY_R5)
+ KEY_F26 = uint(C.GDK_KEY_F26)
+ KEY_R6 = uint(C.GDK_KEY_R6)
+ KEY_F27 = uint(C.GDK_KEY_F27)
+ KEY_R7 = uint(C.GDK_KEY_R7)
+ KEY_F28 = uint(C.GDK_KEY_F28)
+ KEY_R8 = uint(C.GDK_KEY_R8)
+ KEY_F29 = uint(C.GDK_KEY_F29)
+ KEY_R9 = uint(C.GDK_KEY_R9)
+ KEY_F30 = uint(C.GDK_KEY_F30)
+ KEY_R10 = uint(C.GDK_KEY_R10)
+ KEY_F31 = uint(C.GDK_KEY_F31)
+ KEY_R11 = uint(C.GDK_KEY_R11)
+ KEY_F32 = uint(C.GDK_KEY_F32)
+ KEY_R12 = uint(C.GDK_KEY_R12)
+ KEY_F33 = uint(C.GDK_KEY_F33)
+ KEY_R13 = uint(C.GDK_KEY_R13)
+ KEY_F34 = uint(C.GDK_KEY_F34)
+ KEY_R14 = uint(C.GDK_KEY_R14)
+ KEY_F35 = uint(C.GDK_KEY_F35)
+ KEY_R15 = uint(C.GDK_KEY_R15)
+ KEY_Shift_L = uint(C.GDK_KEY_Shift_L)
+ KEY_Shift_R = uint(C.GDK_KEY_Shift_R)
+ KEY_Control_L = uint(C.GDK_KEY_Control_L)
+ KEY_Control_R = uint(C.GDK_KEY_Control_R)
+ KEY_Caps_Lock = uint(C.GDK_KEY_Caps_Lock)
+ KEY_Shift_Lock = uint(C.GDK_KEY_Shift_Lock)
+ KEY_Meta_L = uint(C.GDK_KEY_Meta_L)
+ KEY_Meta_R = uint(C.GDK_KEY_Meta_R)
+ KEY_Alt_L = uint(C.GDK_KEY_Alt_L)
+ KEY_Alt_R = uint(C.GDK_KEY_Alt_R)
+ KEY_Super_L = uint(C.GDK_KEY_Super_L)
+ KEY_Super_R = uint(C.GDK_KEY_Super_R)
+ KEY_Hyper_L = uint(C.GDK_KEY_Hyper_L)
+ KEY_Hyper_R = uint(C.GDK_KEY_Hyper_R)
+ KEY_ISO_Lock = uint(C.GDK_KEY_ISO_Lock)
+ KEY_ISO_Level2_Latch = uint(C.GDK_KEY_ISO_Level2_Latch)
+ KEY_ISO_Level3_Shift = uint(C.GDK_KEY_ISO_Level3_Shift)
+ KEY_ISO_Level3_Latch = uint(C.GDK_KEY_ISO_Level3_Latch)
+ KEY_ISO_Level3_Lock = uint(C.GDK_KEY_ISO_Level3_Lock)
+ KEY_ISO_Level5_Shift = uint(C.GDK_KEY_ISO_Level5_Shift)
+ KEY_ISO_Level5_Latch = uint(C.GDK_KEY_ISO_Level5_Latch)
+ KEY_ISO_Level5_Lock = uint(C.GDK_KEY_ISO_Level5_Lock)
+ KEY_ISO_Group_Shift = uint(C.GDK_KEY_ISO_Group_Shift)
+ KEY_ISO_Group_Latch = uint(C.GDK_KEY_ISO_Group_Latch)
+ KEY_ISO_Group_Lock = uint(C.GDK_KEY_ISO_Group_Lock)
+ KEY_ISO_Next_Group = uint(C.GDK_KEY_ISO_Next_Group)
+ KEY_ISO_Next_Group_Lock = uint(C.GDK_KEY_ISO_Next_Group_Lock)
+ KEY_ISO_Prev_Group = uint(C.GDK_KEY_ISO_Prev_Group)
+ KEY_ISO_Prev_Group_Lock = uint(C.GDK_KEY_ISO_Prev_Group_Lock)
+ KEY_ISO_First_Group = uint(C.GDK_KEY_ISO_First_Group)
+ KEY_ISO_First_Group_Lock = uint(C.GDK_KEY_ISO_First_Group_Lock)
+ KEY_ISO_Last_Group = uint(C.GDK_KEY_ISO_Last_Group)
+ KEY_ISO_Last_Group_Lock = uint(C.GDK_KEY_ISO_Last_Group_Lock)
+ KEY_ISO_Left_Tab = uint(C.GDK_KEY_ISO_Left_Tab)
+ KEY_ISO_Move_Line_Up = uint(C.GDK_KEY_ISO_Move_Line_Up)
+ KEY_ISO_Move_Line_Down = uint(C.GDK_KEY_ISO_Move_Line_Down)
+ KEY_ISO_Partial_Line_Up = uint(C.GDK_KEY_ISO_Partial_Line_Up)
+ KEY_ISO_Partial_Line_Down = uint(C.GDK_KEY_ISO_Partial_Line_Down)
+ KEY_ISO_Partial_Space_Left = uint(C.GDK_KEY_ISO_Partial_Space_Left)
+ KEY_ISO_Partial_Space_Right = uint(C.GDK_KEY_ISO_Partial_Space_Right)
+ KEY_ISO_Set_Margin_Left = uint(C.GDK_KEY_ISO_Set_Margin_Left)
+ KEY_ISO_Set_Margin_Right = uint(C.GDK_KEY_ISO_Set_Margin_Right)
+ KEY_ISO_Release_Margin_Left = uint(C.GDK_KEY_ISO_Release_Margin_Left)
+ KEY_ISO_Release_Margin_Right = uint(C.GDK_KEY_ISO_Release_Margin_Right)
+ KEY_ISO_Release_Both_Margins = uint(C.GDK_KEY_ISO_Release_Both_Margins)
+ KEY_ISO_Fast_Cursor_Left = uint(C.GDK_KEY_ISO_Fast_Cursor_Left)
+ KEY_ISO_Fast_Cursor_Right = uint(C.GDK_KEY_ISO_Fast_Cursor_Right)
+ KEY_ISO_Fast_Cursor_Up = uint(C.GDK_KEY_ISO_Fast_Cursor_Up)
+ KEY_ISO_Fast_Cursor_Down = uint(C.GDK_KEY_ISO_Fast_Cursor_Down)
+ KEY_ISO_Continuous_Underline = uint(C.GDK_KEY_ISO_Continuous_Underline)
+ KEY_ISO_Discontinuous_Underline = uint(C.GDK_KEY_ISO_Discontinuous_Underline)
+ KEY_ISO_Emphasize = uint(C.GDK_KEY_ISO_Emphasize)
+ KEY_ISO_Center_Object = uint(C.GDK_KEY_ISO_Center_Object)
+ KEY_ISO_Enter = uint(C.GDK_KEY_ISO_Enter)
+ KEY_dead_grave = uint(C.GDK_KEY_dead_grave)
+ KEY_dead_acute = uint(C.GDK_KEY_dead_acute)
+ KEY_dead_circumflex = uint(C.GDK_KEY_dead_circumflex)
+ KEY_dead_tilde = uint(C.GDK_KEY_dead_tilde)
+ KEY_dead_perispomeni = uint(C.GDK_KEY_dead_perispomeni)
+ KEY_dead_macron = uint(C.GDK_KEY_dead_macron)
+ KEY_dead_breve = uint(C.GDK_KEY_dead_breve)
+ KEY_dead_abovedot = uint(C.GDK_KEY_dead_abovedot)
+ KEY_dead_diaeresis = uint(C.GDK_KEY_dead_diaeresis)
+ KEY_dead_abovering = uint(C.GDK_KEY_dead_abovering)
+ KEY_dead_doubleacute = uint(C.GDK_KEY_dead_doubleacute)
+ KEY_dead_caron = uint(C.GDK_KEY_dead_caron)
+ KEY_dead_cedilla = uint(C.GDK_KEY_dead_cedilla)
+ KEY_dead_ogonek = uint(C.GDK_KEY_dead_ogonek)
+ KEY_dead_iota = uint(C.GDK_KEY_dead_iota)
+ KEY_dead_voiced_sound = uint(C.GDK_KEY_dead_voiced_sound)
+ KEY_dead_semivoiced_sound = uint(C.GDK_KEY_dead_semivoiced_sound)
+ KEY_dead_belowdot = uint(C.GDK_KEY_dead_belowdot)
+ KEY_dead_hook = uint(C.GDK_KEY_dead_hook)
+ KEY_dead_horn = uint(C.GDK_KEY_dead_horn)
+ KEY_dead_stroke = uint(C.GDK_KEY_dead_stroke)
+ KEY_dead_abovecomma = uint(C.GDK_KEY_dead_abovecomma)
+ KEY_dead_psili = uint(C.GDK_KEY_dead_psili)
+ KEY_dead_abovereversedcomma = uint(C.GDK_KEY_dead_abovereversedcomma)
+ KEY_dead_dasia = uint(C.GDK_KEY_dead_dasia)
+ KEY_dead_doublegrave = uint(C.GDK_KEY_dead_doublegrave)
+ KEY_dead_belowring = uint(C.GDK_KEY_dead_belowring)
+ KEY_dead_belowmacron = uint(C.GDK_KEY_dead_belowmacron)
+ KEY_dead_belowcircumflex = uint(C.GDK_KEY_dead_belowcircumflex)
+ KEY_dead_belowtilde = uint(C.GDK_KEY_dead_belowtilde)
+ KEY_dead_belowbreve = uint(C.GDK_KEY_dead_belowbreve)
+ KEY_dead_belowdiaeresis = uint(C.GDK_KEY_dead_belowdiaeresis)
+ KEY_dead_invertedbreve = uint(C.GDK_KEY_dead_invertedbreve)
+ KEY_dead_belowcomma = uint(C.GDK_KEY_dead_belowcomma)
+ KEY_dead_currency = uint(C.GDK_KEY_dead_currency)
+ KEY_dead_a = uint(C.GDK_KEY_dead_a)
+ KEY_dead_A = uint(C.GDK_KEY_dead_A)
+ KEY_dead_e = uint(C.GDK_KEY_dead_e)
+ KEY_dead_E = uint(C.GDK_KEY_dead_E)
+ KEY_dead_i = uint(C.GDK_KEY_dead_i)
+ KEY_dead_I = uint(C.GDK_KEY_dead_I)
+ KEY_dead_o = uint(C.GDK_KEY_dead_o)
+ KEY_dead_O = uint(C.GDK_KEY_dead_O)
+ KEY_dead_u = uint(C.GDK_KEY_dead_u)
+ KEY_dead_U = uint(C.GDK_KEY_dead_U)
+ KEY_dead_small_schwa = uint(C.GDK_KEY_dead_small_schwa)
+ KEY_dead_capital_schwa = uint(C.GDK_KEY_dead_capital_schwa)
+ KEY_dead_greek = uint(C.GDK_KEY_dead_greek)
+ KEY_First_Virtual_Screen = uint(C.GDK_KEY_First_Virtual_Screen)
+ KEY_Prev_Virtual_Screen = uint(C.GDK_KEY_Prev_Virtual_Screen)
+ KEY_Next_Virtual_Screen = uint(C.GDK_KEY_Next_Virtual_Screen)
+ KEY_Last_Virtual_Screen = uint(C.GDK_KEY_Last_Virtual_Screen)
+ KEY_Terminate_Server = uint(C.GDK_KEY_Terminate_Server)
+ KEY_AccessX_Enable = uint(C.GDK_KEY_AccessX_Enable)
+ KEY_AccessX_Feedback_Enable = uint(C.GDK_KEY_AccessX_Feedback_Enable)
+ KEY_RepeatKeys_Enable = uint(C.GDK_KEY_RepeatKeys_Enable)
+ KEY_SlowKeys_Enable = uint(C.GDK_KEY_SlowKeys_Enable)
+ KEY_BounceKeys_Enable = uint(C.GDK_KEY_BounceKeys_Enable)
+ KEY_StickyKeys_Enable = uint(C.GDK_KEY_StickyKeys_Enable)
+ KEY_MouseKeys_Enable = uint(C.GDK_KEY_MouseKeys_Enable)
+ KEY_MouseKeys_Accel_Enable = uint(C.GDK_KEY_MouseKeys_Accel_Enable)
+ KEY_Overlay1_Enable = uint(C.GDK_KEY_Overlay1_Enable)
+ KEY_Overlay2_Enable = uint(C.GDK_KEY_Overlay2_Enable)
+ KEY_AudibleBell_Enable = uint(C.GDK_KEY_AudibleBell_Enable)
+ KEY_Pointer_Left = uint(C.GDK_KEY_Pointer_Left)
+ KEY_Pointer_Right = uint(C.GDK_KEY_Pointer_Right)
+ KEY_Pointer_Up = uint(C.GDK_KEY_Pointer_Up)
+ KEY_Pointer_Down = uint(C.GDK_KEY_Pointer_Down)
+ KEY_Pointer_UpLeft = uint(C.GDK_KEY_Pointer_UpLeft)
+ KEY_Pointer_UpRight = uint(C.GDK_KEY_Pointer_UpRight)
+ KEY_Pointer_DownLeft = uint(C.GDK_KEY_Pointer_DownLeft)
+ KEY_Pointer_DownRight = uint(C.GDK_KEY_Pointer_DownRight)
+ KEY_Pointer_Button_Dflt = uint(C.GDK_KEY_Pointer_Button_Dflt)
+ KEY_Pointer_Button1 = uint(C.GDK_KEY_Pointer_Button1)
+ KEY_Pointer_Button2 = uint(C.GDK_KEY_Pointer_Button2)
+ KEY_Pointer_Button3 = uint(C.GDK_KEY_Pointer_Button3)
+ KEY_Pointer_Button4 = uint(C.GDK_KEY_Pointer_Button4)
+ KEY_Pointer_Button5 = uint(C.GDK_KEY_Pointer_Button5)
+ KEY_Pointer_DblClick_Dflt = uint(C.GDK_KEY_Pointer_DblClick_Dflt)
+ KEY_Pointer_DblClick1 = uint(C.GDK_KEY_Pointer_DblClick1)
+ KEY_Pointer_DblClick2 = uint(C.GDK_KEY_Pointer_DblClick2)
+ KEY_Pointer_DblClick3 = uint(C.GDK_KEY_Pointer_DblClick3)
+ KEY_Pointer_DblClick4 = uint(C.GDK_KEY_Pointer_DblClick4)
+ KEY_Pointer_DblClick5 = uint(C.GDK_KEY_Pointer_DblClick5)
+ KEY_Pointer_Drag_Dflt = uint(C.GDK_KEY_Pointer_Drag_Dflt)
+ KEY_Pointer_Drag1 = uint(C.GDK_KEY_Pointer_Drag1)
+ KEY_Pointer_Drag2 = uint(C.GDK_KEY_Pointer_Drag2)
+ KEY_Pointer_Drag3 = uint(C.GDK_KEY_Pointer_Drag3)
+ KEY_Pointer_Drag4 = uint(C.GDK_KEY_Pointer_Drag4)
+ KEY_Pointer_Drag5 = uint(C.GDK_KEY_Pointer_Drag5)
+ KEY_Pointer_EnableKeys = uint(C.GDK_KEY_Pointer_EnableKeys)
+ KEY_Pointer_Accelerate = uint(C.GDK_KEY_Pointer_Accelerate)
+ KEY_Pointer_DfltBtnNext = uint(C.GDK_KEY_Pointer_DfltBtnNext)
+ KEY_Pointer_DfltBtnPrev = uint(C.GDK_KEY_Pointer_DfltBtnPrev)
+ KEY_ch = uint(C.GDK_KEY_ch)
+ KEY_Ch = uint(C.GDK_KEY_Ch)
+ KEY_CH = uint(C.GDK_KEY_CH)
+ KEY_c_h = uint(C.GDK_KEY_c_h)
+ KEY_C_h = uint(C.GDK_KEY_C_h)
+ KEY_C_H = uint(C.GDK_KEY_C_H)
+ KEY_3270_Duplicate = uint(C.GDK_KEY_3270_Duplicate)
+ KEY_3270_FieldMark = uint(C.GDK_KEY_3270_FieldMark)
+ KEY_3270_Right2 = uint(C.GDK_KEY_3270_Right2)
+ KEY_3270_Left2 = uint(C.GDK_KEY_3270_Left2)
+ KEY_3270_BackTab = uint(C.GDK_KEY_3270_BackTab)
+ KEY_3270_EraseEOF = uint(C.GDK_KEY_3270_EraseEOF)
+ KEY_3270_EraseInput = uint(C.GDK_KEY_3270_EraseInput)
+ KEY_3270_Reset = uint(C.GDK_KEY_3270_Reset)
+ KEY_3270_Quit = uint(C.GDK_KEY_3270_Quit)
+ KEY_3270_PA1 = uint(C.GDK_KEY_3270_PA1)
+ KEY_3270_PA2 = uint(C.GDK_KEY_3270_PA2)
+ KEY_3270_PA3 = uint(C.GDK_KEY_3270_PA3)
+ KEY_3270_Test = uint(C.GDK_KEY_3270_Test)
+ KEY_3270_Attn = uint(C.GDK_KEY_3270_Attn)
+ KEY_3270_CursorBlink = uint(C.GDK_KEY_3270_CursorBlink)
+ KEY_3270_AltCursor = uint(C.GDK_KEY_3270_AltCursor)
+ KEY_3270_KeyClick = uint(C.GDK_KEY_3270_KeyClick)
+ KEY_3270_Jump = uint(C.GDK_KEY_3270_Jump)
+ KEY_3270_Ident = uint(C.GDK_KEY_3270_Ident)
+ KEY_3270_Rule = uint(C.GDK_KEY_3270_Rule)
+ KEY_3270_Copy = uint(C.GDK_KEY_3270_Copy)
+ KEY_3270_Play = uint(C.GDK_KEY_3270_Play)
+ KEY_3270_Setup = uint(C.GDK_KEY_3270_Setup)
+ KEY_3270_Record = uint(C.GDK_KEY_3270_Record)
+ KEY_3270_ChangeScreen = uint(C.GDK_KEY_3270_ChangeScreen)
+ KEY_3270_DeleteWord = uint(C.GDK_KEY_3270_DeleteWord)
+ KEY_3270_ExSelect = uint(C.GDK_KEY_3270_ExSelect)
+ KEY_3270_CursorSelect = uint(C.GDK_KEY_3270_CursorSelect)
+ KEY_3270_PrintScreen = uint(C.GDK_KEY_3270_PrintScreen)
+ KEY_3270_Enter = uint(C.GDK_KEY_3270_Enter)
+ KEY_space = uint(C.GDK_KEY_space)
+ KEY_exclam = uint(C.GDK_KEY_exclam)
+ KEY_quotedbl = uint(C.GDK_KEY_quotedbl)
+ KEY_numbersign = uint(C.GDK_KEY_numbersign)
+ KEY_dollar = uint(C.GDK_KEY_dollar)
+ KEY_percent = uint(C.GDK_KEY_percent)
+ KEY_ampersand = uint(C.GDK_KEY_ampersand)
+ KEY_apostrophe = uint(C.GDK_KEY_apostrophe)
+ KEY_quoteright = uint(C.GDK_KEY_quoteright)
+ KEY_parenleft = uint(C.GDK_KEY_parenleft)
+ KEY_parenright = uint(C.GDK_KEY_parenright)
+ KEY_asterisk = uint(C.GDK_KEY_asterisk)
+ KEY_plus = uint(C.GDK_KEY_plus)
+ KEY_comma = uint(C.GDK_KEY_comma)
+ KEY_minus = uint(C.GDK_KEY_minus)
+ KEY_period = uint(C.GDK_KEY_period)
+ KEY_slash = uint(C.GDK_KEY_slash)
+ KEY_0 = uint(C.GDK_KEY_0)
+ KEY_1 = uint(C.GDK_KEY_1)
+ KEY_2 = uint(C.GDK_KEY_2)
+ KEY_3 = uint(C.GDK_KEY_3)
+ KEY_4 = uint(C.GDK_KEY_4)
+ KEY_5 = uint(C.GDK_KEY_5)
+ KEY_6 = uint(C.GDK_KEY_6)
+ KEY_7 = uint(C.GDK_KEY_7)
+ KEY_8 = uint(C.GDK_KEY_8)
+ KEY_9 = uint(C.GDK_KEY_9)
+ KEY_colon = uint(C.GDK_KEY_colon)
+ KEY_semicolon = uint(C.GDK_KEY_semicolon)
+ KEY_less = uint(C.GDK_KEY_less)
+ KEY_equal = uint(C.GDK_KEY_equal)
+ KEY_greater = uint(C.GDK_KEY_greater)
+ KEY_question = uint(C.GDK_KEY_question)
+ KEY_at = uint(C.GDK_KEY_at)
+ KEY_A = uint(C.GDK_KEY_A)
+ KEY_B = uint(C.GDK_KEY_B)
+ KEY_C = uint(C.GDK_KEY_C)
+ KEY_D = uint(C.GDK_KEY_D)
+ KEY_E = uint(C.GDK_KEY_E)
+ KEY_F = uint(C.GDK_KEY_F)
+ KEY_G = uint(C.GDK_KEY_G)
+ KEY_H = uint(C.GDK_KEY_H)
+ KEY_I = uint(C.GDK_KEY_I)
+ KEY_J = uint(C.GDK_KEY_J)
+ KEY_K = uint(C.GDK_KEY_K)
+ KEY_L = uint(C.GDK_KEY_L)
+ KEY_M = uint(C.GDK_KEY_M)
+ KEY_N = uint(C.GDK_KEY_N)
+ KEY_O = uint(C.GDK_KEY_O)
+ KEY_P = uint(C.GDK_KEY_P)
+ KEY_Q = uint(C.GDK_KEY_Q)
+ KEY_R = uint(C.GDK_KEY_R)
+ KEY_S = uint(C.GDK_KEY_S)
+ KEY_T = uint(C.GDK_KEY_T)
+ KEY_U = uint(C.GDK_KEY_U)
+ KEY_V = uint(C.GDK_KEY_V)
+ KEY_W = uint(C.GDK_KEY_W)
+ KEY_X = uint(C.GDK_KEY_X)
+ KEY_Y = uint(C.GDK_KEY_Y)
+ KEY_Z = uint(C.GDK_KEY_Z)
+ KEY_bracketleft = uint(C.GDK_KEY_bracketleft)
+ KEY_backslash = uint(C.GDK_KEY_backslash)
+ KEY_bracketright = uint(C.GDK_KEY_bracketright)
+ KEY_asciicircum = uint(C.GDK_KEY_asciicircum)
+ KEY_underscore = uint(C.GDK_KEY_underscore)
+ KEY_grave = uint(C.GDK_KEY_grave)
+ KEY_quoteleft = uint(C.GDK_KEY_quoteleft)
+ KEY_a = uint(C.GDK_KEY_a)
+ KEY_b = uint(C.GDK_KEY_b)
+ KEY_c = uint(C.GDK_KEY_c)
+ KEY_d = uint(C.GDK_KEY_d)
+ KEY_e = uint(C.GDK_KEY_e)
+ KEY_f = uint(C.GDK_KEY_f)
+ KEY_g = uint(C.GDK_KEY_g)
+ KEY_h = uint(C.GDK_KEY_h)
+ KEY_i = uint(C.GDK_KEY_i)
+ KEY_j = uint(C.GDK_KEY_j)
+ KEY_k = uint(C.GDK_KEY_k)
+ KEY_l = uint(C.GDK_KEY_l)
+ KEY_m = uint(C.GDK_KEY_m)
+ KEY_n = uint(C.GDK_KEY_n)
+ KEY_o = uint(C.GDK_KEY_o)
+ KEY_p = uint(C.GDK_KEY_p)
+ KEY_q = uint(C.GDK_KEY_q)
+ KEY_r = uint(C.GDK_KEY_r)
+ KEY_s = uint(C.GDK_KEY_s)
+ KEY_t = uint(C.GDK_KEY_t)
+ KEY_u = uint(C.GDK_KEY_u)
+ KEY_v = uint(C.GDK_KEY_v)
+ KEY_w = uint(C.GDK_KEY_w)
+ KEY_x = uint(C.GDK_KEY_x)
+ KEY_y = uint(C.GDK_KEY_y)
+ KEY_z = uint(C.GDK_KEY_z)
+ KEY_braceleft = uint(C.GDK_KEY_braceleft)
+ KEY_bar = uint(C.GDK_KEY_bar)
+ KEY_braceright = uint(C.GDK_KEY_braceright)
+ KEY_asciitilde = uint(C.GDK_KEY_asciitilde)
+ KEY_nobreakspace = uint(C.GDK_KEY_nobreakspace)
+ KEY_exclamdown = uint(C.GDK_KEY_exclamdown)
+ KEY_cent = uint(C.GDK_KEY_cent)
+ KEY_sterling = uint(C.GDK_KEY_sterling)
+ KEY_currency = uint(C.GDK_KEY_currency)
+ KEY_yen = uint(C.GDK_KEY_yen)
+ KEY_brokenbar = uint(C.GDK_KEY_brokenbar)
+ KEY_section = uint(C.GDK_KEY_section)
+ KEY_diaeresis = uint(C.GDK_KEY_diaeresis)
+ KEY_copyright = uint(C.GDK_KEY_copyright)
+ KEY_ordfeminine = uint(C.GDK_KEY_ordfeminine)
+ KEY_guillemotleft = uint(C.GDK_KEY_guillemotleft)
+ KEY_notsign = uint(C.GDK_KEY_notsign)
+ KEY_hyphen = uint(C.GDK_KEY_hyphen)
+ KEY_registered = uint(C.GDK_KEY_registered)
+ KEY_macron = uint(C.GDK_KEY_macron)
+ KEY_degree = uint(C.GDK_KEY_degree)
+ KEY_plusminus = uint(C.GDK_KEY_plusminus)
+ KEY_twosuperior = uint(C.GDK_KEY_twosuperior)
+ KEY_threesuperior = uint(C.GDK_KEY_threesuperior)
+ KEY_acute = uint(C.GDK_KEY_acute)
+ KEY_mu = uint(C.GDK_KEY_mu)
+ KEY_paragraph = uint(C.GDK_KEY_paragraph)
+ KEY_periodcentered = uint(C.GDK_KEY_periodcentered)
+ KEY_cedilla = uint(C.GDK_KEY_cedilla)
+ KEY_onesuperior = uint(C.GDK_KEY_onesuperior)
+ KEY_masculine = uint(C.GDK_KEY_masculine)
+ KEY_guillemotright = uint(C.GDK_KEY_guillemotright)
+ KEY_onequarter = uint(C.GDK_KEY_onequarter)
+ KEY_onehalf = uint(C.GDK_KEY_onehalf)
+ KEY_threequarters = uint(C.GDK_KEY_threequarters)
+ KEY_questiondown = uint(C.GDK_KEY_questiondown)
+ KEY_Agrave = uint(C.GDK_KEY_Agrave)
+ KEY_Aacute = uint(C.GDK_KEY_Aacute)
+ KEY_Acircumflex = uint(C.GDK_KEY_Acircumflex)
+ KEY_Atilde = uint(C.GDK_KEY_Atilde)
+ KEY_Adiaeresis = uint(C.GDK_KEY_Adiaeresis)
+ KEY_Aring = uint(C.GDK_KEY_Aring)
+ KEY_AE = uint(C.GDK_KEY_AE)
+ KEY_Ccedilla = uint(C.GDK_KEY_Ccedilla)
+ KEY_Egrave = uint(C.GDK_KEY_Egrave)
+ KEY_Eacute = uint(C.GDK_KEY_Eacute)
+ KEY_Ecircumflex = uint(C.GDK_KEY_Ecircumflex)
+ KEY_Ediaeresis = uint(C.GDK_KEY_Ediaeresis)
+ KEY_Igrave = uint(C.GDK_KEY_Igrave)
+ KEY_Iacute = uint(C.GDK_KEY_Iacute)
+ KEY_Icircumflex = uint(C.GDK_KEY_Icircumflex)
+ KEY_Idiaeresis = uint(C.GDK_KEY_Idiaeresis)
+ KEY_ETH = uint(C.GDK_KEY_ETH)
+ KEY_Eth = uint(C.GDK_KEY_Eth)
+ KEY_Ntilde = uint(C.GDK_KEY_Ntilde)
+ KEY_Ograve = uint(C.GDK_KEY_Ograve)
+ KEY_Oacute = uint(C.GDK_KEY_Oacute)
+ KEY_Ocircumflex = uint(C.GDK_KEY_Ocircumflex)
+ KEY_Otilde = uint(C.GDK_KEY_Otilde)
+ KEY_Odiaeresis = uint(C.GDK_KEY_Odiaeresis)
+ KEY_multiply = uint(C.GDK_KEY_multiply)
+ KEY_Oslash = uint(C.GDK_KEY_Oslash)
+ KEY_Ooblique = uint(C.GDK_KEY_Ooblique)
+ KEY_Ugrave = uint(C.GDK_KEY_Ugrave)
+ KEY_Uacute = uint(C.GDK_KEY_Uacute)
+ KEY_Ucircumflex = uint(C.GDK_KEY_Ucircumflex)
+ KEY_Udiaeresis = uint(C.GDK_KEY_Udiaeresis)
+ KEY_Yacute = uint(C.GDK_KEY_Yacute)
+ KEY_THORN = uint(C.GDK_KEY_THORN)
+ KEY_Thorn = uint(C.GDK_KEY_Thorn)
+ KEY_ssharp = uint(C.GDK_KEY_ssharp)
+ KEY_agrave = uint(C.GDK_KEY_agrave)
+ KEY_aacute = uint(C.GDK_KEY_aacute)
+ KEY_acircumflex = uint(C.GDK_KEY_acircumflex)
+ KEY_atilde = uint(C.GDK_KEY_atilde)
+ KEY_adiaeresis = uint(C.GDK_KEY_adiaeresis)
+ KEY_aring = uint(C.GDK_KEY_aring)
+ KEY_ae = uint(C.GDK_KEY_ae)
+ KEY_ccedilla = uint(C.GDK_KEY_ccedilla)
+ KEY_egrave = uint(C.GDK_KEY_egrave)
+ KEY_eacute = uint(C.GDK_KEY_eacute)
+ KEY_ecircumflex = uint(C.GDK_KEY_ecircumflex)
+ KEY_ediaeresis = uint(C.GDK_KEY_ediaeresis)
+ KEY_igrave = uint(C.GDK_KEY_igrave)
+ KEY_iacute = uint(C.GDK_KEY_iacute)
+ KEY_icircumflex = uint(C.GDK_KEY_icircumflex)
+ KEY_idiaeresis = uint(C.GDK_KEY_idiaeresis)
+ KEY_eth = uint(C.GDK_KEY_eth)
+ KEY_ntilde = uint(C.GDK_KEY_ntilde)
+ KEY_ograve = uint(C.GDK_KEY_ograve)
+ KEY_oacute = uint(C.GDK_KEY_oacute)
+ KEY_ocircumflex = uint(C.GDK_KEY_ocircumflex)
+ KEY_otilde = uint(C.GDK_KEY_otilde)
+ KEY_odiaeresis = uint(C.GDK_KEY_odiaeresis)
+ KEY_division = uint(C.GDK_KEY_division)
+ KEY_oslash = uint(C.GDK_KEY_oslash)
+ KEY_ooblique = uint(C.GDK_KEY_ooblique)
+ KEY_ugrave = uint(C.GDK_KEY_ugrave)
+ KEY_uacute = uint(C.GDK_KEY_uacute)
+ KEY_ucircumflex = uint(C.GDK_KEY_ucircumflex)
+ KEY_udiaeresis = uint(C.GDK_KEY_udiaeresis)
+ KEY_yacute = uint(C.GDK_KEY_yacute)
+ KEY_thorn = uint(C.GDK_KEY_thorn)
+ KEY_ydiaeresis = uint(C.GDK_KEY_ydiaeresis)
+ KEY_Aogonek = uint(C.GDK_KEY_Aogonek)
+ KEY_breve = uint(C.GDK_KEY_breve)
+ KEY_Lstroke = uint(C.GDK_KEY_Lstroke)
+ KEY_Lcaron = uint(C.GDK_KEY_Lcaron)
+ KEY_Sacute = uint(C.GDK_KEY_Sacute)
+ KEY_Scaron = uint(C.GDK_KEY_Scaron)
+ KEY_Scedilla = uint(C.GDK_KEY_Scedilla)
+ KEY_Tcaron = uint(C.GDK_KEY_Tcaron)
+ KEY_Zacute = uint(C.GDK_KEY_Zacute)
+ KEY_Zcaron = uint(C.GDK_KEY_Zcaron)
+ KEY_Zabovedot = uint(C.GDK_KEY_Zabovedot)
+ KEY_aogonek = uint(C.GDK_KEY_aogonek)
+ KEY_ogonek = uint(C.GDK_KEY_ogonek)
+ KEY_lstroke = uint(C.GDK_KEY_lstroke)
+ KEY_lcaron = uint(C.GDK_KEY_lcaron)
+ KEY_sacute = uint(C.GDK_KEY_sacute)
+ KEY_caron = uint(C.GDK_KEY_caron)
+ KEY_scaron = uint(C.GDK_KEY_scaron)
+ KEY_scedilla = uint(C.GDK_KEY_scedilla)
+ KEY_tcaron = uint(C.GDK_KEY_tcaron)
+ KEY_zacute = uint(C.GDK_KEY_zacute)
+ KEY_doubleacute = uint(C.GDK_KEY_doubleacute)
+ KEY_zcaron = uint(C.GDK_KEY_zcaron)
+ KEY_zabovedot = uint(C.GDK_KEY_zabovedot)
+ KEY_Racute = uint(C.GDK_KEY_Racute)
+ KEY_Abreve = uint(C.GDK_KEY_Abreve)
+ KEY_Lacute = uint(C.GDK_KEY_Lacute)
+ KEY_Cacute = uint(C.GDK_KEY_Cacute)
+ KEY_Ccaron = uint(C.GDK_KEY_Ccaron)
+ KEY_Eogonek = uint(C.GDK_KEY_Eogonek)
+ KEY_Ecaron = uint(C.GDK_KEY_Ecaron)
+ KEY_Dcaron = uint(C.GDK_KEY_Dcaron)
+ KEY_Dstroke = uint(C.GDK_KEY_Dstroke)
+ KEY_Nacute = uint(C.GDK_KEY_Nacute)
+ KEY_Ncaron = uint(C.GDK_KEY_Ncaron)
+ KEY_Odoubleacute = uint(C.GDK_KEY_Odoubleacute)
+ KEY_Rcaron = uint(C.GDK_KEY_Rcaron)
+ KEY_Uring = uint(C.GDK_KEY_Uring)
+ KEY_Udoubleacute = uint(C.GDK_KEY_Udoubleacute)
+ KEY_Tcedilla = uint(C.GDK_KEY_Tcedilla)
+ KEY_racute = uint(C.GDK_KEY_racute)
+ KEY_abreve = uint(C.GDK_KEY_abreve)
+ KEY_lacute = uint(C.GDK_KEY_lacute)
+ KEY_cacute = uint(C.GDK_KEY_cacute)
+ KEY_ccaron = uint(C.GDK_KEY_ccaron)
+ KEY_eogonek = uint(C.GDK_KEY_eogonek)
+ KEY_ecaron = uint(C.GDK_KEY_ecaron)
+ KEY_dcaron = uint(C.GDK_KEY_dcaron)
+ KEY_dstroke = uint(C.GDK_KEY_dstroke)
+ KEY_nacute = uint(C.GDK_KEY_nacute)
+ KEY_ncaron = uint(C.GDK_KEY_ncaron)
+ KEY_odoubleacute = uint(C.GDK_KEY_odoubleacute)
+ KEY_rcaron = uint(C.GDK_KEY_rcaron)
+ KEY_uring = uint(C.GDK_KEY_uring)
+ KEY_udoubleacute = uint(C.GDK_KEY_udoubleacute)
+ KEY_tcedilla = uint(C.GDK_KEY_tcedilla)
+ KEY_abovedot = uint(C.GDK_KEY_abovedot)
+ KEY_Hstroke = uint(C.GDK_KEY_Hstroke)
+ KEY_Hcircumflex = uint(C.GDK_KEY_Hcircumflex)
+ KEY_Iabovedot = uint(C.GDK_KEY_Iabovedot)
+ KEY_Gbreve = uint(C.GDK_KEY_Gbreve)
+ KEY_Jcircumflex = uint(C.GDK_KEY_Jcircumflex)
+ KEY_hstroke = uint(C.GDK_KEY_hstroke)
+ KEY_hcircumflex = uint(C.GDK_KEY_hcircumflex)
+ KEY_idotless = uint(C.GDK_KEY_idotless)
+ KEY_gbreve = uint(C.GDK_KEY_gbreve)
+ KEY_jcircumflex = uint(C.GDK_KEY_jcircumflex)
+ KEY_Cabovedot = uint(C.GDK_KEY_Cabovedot)
+ KEY_Ccircumflex = uint(C.GDK_KEY_Ccircumflex)
+ KEY_Gabovedot = uint(C.GDK_KEY_Gabovedot)
+ KEY_Gcircumflex = uint(C.GDK_KEY_Gcircumflex)
+ KEY_Ubreve = uint(C.GDK_KEY_Ubreve)
+ KEY_Scircumflex = uint(C.GDK_KEY_Scircumflex)
+ KEY_cabovedot = uint(C.GDK_KEY_cabovedot)
+ KEY_ccircumflex = uint(C.GDK_KEY_ccircumflex)
+ KEY_gabovedot = uint(C.GDK_KEY_gabovedot)
+ KEY_gcircumflex = uint(C.GDK_KEY_gcircumflex)
+ KEY_ubreve = uint(C.GDK_KEY_ubreve)
+ KEY_scircumflex = uint(C.GDK_KEY_scircumflex)
+ KEY_kra = uint(C.GDK_KEY_kra)
+ KEY_kappa = uint(C.GDK_KEY_kappa)
+ KEY_Rcedilla = uint(C.GDK_KEY_Rcedilla)
+ KEY_Itilde = uint(C.GDK_KEY_Itilde)
+ KEY_Lcedilla = uint(C.GDK_KEY_Lcedilla)
+ KEY_Emacron = uint(C.GDK_KEY_Emacron)
+ KEY_Gcedilla = uint(C.GDK_KEY_Gcedilla)
+ KEY_Tslash = uint(C.GDK_KEY_Tslash)
+ KEY_rcedilla = uint(C.GDK_KEY_rcedilla)
+ KEY_itilde = uint(C.GDK_KEY_itilde)
+ KEY_lcedilla = uint(C.GDK_KEY_lcedilla)
+ KEY_emacron = uint(C.GDK_KEY_emacron)
+ KEY_gcedilla = uint(C.GDK_KEY_gcedilla)
+ KEY_tslash = uint(C.GDK_KEY_tslash)
+ KEY_ENG = uint(C.GDK_KEY_ENG)
+ KEY_eng = uint(C.GDK_KEY_eng)
+ KEY_Amacron = uint(C.GDK_KEY_Amacron)
+ KEY_Iogonek = uint(C.GDK_KEY_Iogonek)
+ KEY_Eabovedot = uint(C.GDK_KEY_Eabovedot)
+ KEY_Imacron = uint(C.GDK_KEY_Imacron)
+ KEY_Ncedilla = uint(C.GDK_KEY_Ncedilla)
+ KEY_Omacron = uint(C.GDK_KEY_Omacron)
+ KEY_Kcedilla = uint(C.GDK_KEY_Kcedilla)
+ KEY_Uogonek = uint(C.GDK_KEY_Uogonek)
+ KEY_Utilde = uint(C.GDK_KEY_Utilde)
+ KEY_Umacron = uint(C.GDK_KEY_Umacron)
+ KEY_amacron = uint(C.GDK_KEY_amacron)
+ KEY_iogonek = uint(C.GDK_KEY_iogonek)
+ KEY_eabovedot = uint(C.GDK_KEY_eabovedot)
+ KEY_imacron = uint(C.GDK_KEY_imacron)
+ KEY_ncedilla = uint(C.GDK_KEY_ncedilla)
+ KEY_omacron = uint(C.GDK_KEY_omacron)
+ KEY_kcedilla = uint(C.GDK_KEY_kcedilla)
+ KEY_uogonek = uint(C.GDK_KEY_uogonek)
+ KEY_utilde = uint(C.GDK_KEY_utilde)
+ KEY_umacron = uint(C.GDK_KEY_umacron)
+ KEY_Wcircumflex = uint(C.GDK_KEY_Wcircumflex)
+ KEY_wcircumflex = uint(C.GDK_KEY_wcircumflex)
+ KEY_Ycircumflex = uint(C.GDK_KEY_Ycircumflex)
+ KEY_ycircumflex = uint(C.GDK_KEY_ycircumflex)
+ KEY_Babovedot = uint(C.GDK_KEY_Babovedot)
+ KEY_babovedot = uint(C.GDK_KEY_babovedot)
+ KEY_Dabovedot = uint(C.GDK_KEY_Dabovedot)
+ KEY_dabovedot = uint(C.GDK_KEY_dabovedot)
+ KEY_Fabovedot = uint(C.GDK_KEY_Fabovedot)
+ KEY_fabovedot = uint(C.GDK_KEY_fabovedot)
+ KEY_Mabovedot = uint(C.GDK_KEY_Mabovedot)
+ KEY_mabovedot = uint(C.GDK_KEY_mabovedot)
+ KEY_Pabovedot = uint(C.GDK_KEY_Pabovedot)
+ KEY_pabovedot = uint(C.GDK_KEY_pabovedot)
+ KEY_Sabovedot = uint(C.GDK_KEY_Sabovedot)
+ KEY_sabovedot = uint(C.GDK_KEY_sabovedot)
+ KEY_Tabovedot = uint(C.GDK_KEY_Tabovedot)
+ KEY_tabovedot = uint(C.GDK_KEY_tabovedot)
+ KEY_Wgrave = uint(C.GDK_KEY_Wgrave)
+ KEY_wgrave = uint(C.GDK_KEY_wgrave)
+ KEY_Wacute = uint(C.GDK_KEY_Wacute)
+ KEY_wacute = uint(C.GDK_KEY_wacute)
+ KEY_Wdiaeresis = uint(C.GDK_KEY_Wdiaeresis)
+ KEY_wdiaeresis = uint(C.GDK_KEY_wdiaeresis)
+ KEY_Ygrave = uint(C.GDK_KEY_Ygrave)
+ KEY_ygrave = uint(C.GDK_KEY_ygrave)
+ KEY_OE = uint(C.GDK_KEY_OE)
+ KEY_oe = uint(C.GDK_KEY_oe)
+ KEY_Ydiaeresis = uint(C.GDK_KEY_Ydiaeresis)
+ KEY_overline = uint(C.GDK_KEY_overline)
+ KEY_kana_fullstop = uint(C.GDK_KEY_kana_fullstop)
+ KEY_kana_openingbracket = uint(C.GDK_KEY_kana_openingbracket)
+ KEY_kana_closingbracket = uint(C.GDK_KEY_kana_closingbracket)
+ KEY_kana_comma = uint(C.GDK_KEY_kana_comma)
+ KEY_kana_conjunctive = uint(C.GDK_KEY_kana_conjunctive)
+ KEY_kana_middledot = uint(C.GDK_KEY_kana_middledot)
+ KEY_kana_WO = uint(C.GDK_KEY_kana_WO)
+ KEY_kana_a = uint(C.GDK_KEY_kana_a)
+ KEY_kana_i = uint(C.GDK_KEY_kana_i)
+ KEY_kana_u = uint(C.GDK_KEY_kana_u)
+ KEY_kana_e = uint(C.GDK_KEY_kana_e)
+ KEY_kana_o = uint(C.GDK_KEY_kana_o)
+ KEY_kana_ya = uint(C.GDK_KEY_kana_ya)
+ KEY_kana_yu = uint(C.GDK_KEY_kana_yu)
+ KEY_kana_yo = uint(C.GDK_KEY_kana_yo)
+ KEY_kana_tsu = uint(C.GDK_KEY_kana_tsu)
+ KEY_kana_tu = uint(C.GDK_KEY_kana_tu)
+ KEY_prolongedsound = uint(C.GDK_KEY_prolongedsound)
+ KEY_kana_A = uint(C.GDK_KEY_kana_A)
+ KEY_kana_I = uint(C.GDK_KEY_kana_I)
+ KEY_kana_U = uint(C.GDK_KEY_kana_U)
+ KEY_kana_E = uint(C.GDK_KEY_kana_E)
+ KEY_kana_O = uint(C.GDK_KEY_kana_O)
+ KEY_kana_KA = uint(C.GDK_KEY_kana_KA)
+ KEY_kana_KI = uint(C.GDK_KEY_kana_KI)
+ KEY_kana_KU = uint(C.GDK_KEY_kana_KU)
+ KEY_kana_KE = uint(C.GDK_KEY_kana_KE)
+ KEY_kana_KO = uint(C.GDK_KEY_kana_KO)
+ KEY_kana_SA = uint(C.GDK_KEY_kana_SA)
+ KEY_kana_SHI = uint(C.GDK_KEY_kana_SHI)
+ KEY_kana_SU = uint(C.GDK_KEY_kana_SU)
+ KEY_kana_SE = uint(C.GDK_KEY_kana_SE)
+ KEY_kana_SO = uint(C.GDK_KEY_kana_SO)
+ KEY_kana_TA = uint(C.GDK_KEY_kana_TA)
+ KEY_kana_CHI = uint(C.GDK_KEY_kana_CHI)
+ KEY_kana_TI = uint(C.GDK_KEY_kana_TI)
+ KEY_kana_TSU = uint(C.GDK_KEY_kana_TSU)
+ KEY_kana_TU = uint(C.GDK_KEY_kana_TU)
+ KEY_kana_TE = uint(C.GDK_KEY_kana_TE)
+ KEY_kana_TO = uint(C.GDK_KEY_kana_TO)
+ KEY_kana_NA = uint(C.GDK_KEY_kana_NA)
+ KEY_kana_NI = uint(C.GDK_KEY_kana_NI)
+ KEY_kana_NU = uint(C.GDK_KEY_kana_NU)
+ KEY_kana_NE = uint(C.GDK_KEY_kana_NE)
+ KEY_kana_NO = uint(C.GDK_KEY_kana_NO)
+ KEY_kana_HA = uint(C.GDK_KEY_kana_HA)
+ KEY_kana_HI = uint(C.GDK_KEY_kana_HI)
+ KEY_kana_FU = uint(C.GDK_KEY_kana_FU)
+ KEY_kana_HU = uint(C.GDK_KEY_kana_HU)
+ KEY_kana_HE = uint(C.GDK_KEY_kana_HE)
+ KEY_kana_HO = uint(C.GDK_KEY_kana_HO)
+ KEY_kana_MA = uint(C.GDK_KEY_kana_MA)
+ KEY_kana_MI = uint(C.GDK_KEY_kana_MI)
+ KEY_kana_MU = uint(C.GDK_KEY_kana_MU)
+ KEY_kana_ME = uint(C.GDK_KEY_kana_ME)
+ KEY_kana_MO = uint(C.GDK_KEY_kana_MO)
+ KEY_kana_YA = uint(C.GDK_KEY_kana_YA)
+ KEY_kana_YU = uint(C.GDK_KEY_kana_YU)
+ KEY_kana_YO = uint(C.GDK_KEY_kana_YO)
+ KEY_kana_RA = uint(C.GDK_KEY_kana_RA)
+ KEY_kana_RI = uint(C.GDK_KEY_kana_RI)
+ KEY_kana_RU = uint(C.GDK_KEY_kana_RU)
+ KEY_kana_RE = uint(C.GDK_KEY_kana_RE)
+ KEY_kana_RO = uint(C.GDK_KEY_kana_RO)
+ KEY_kana_WA = uint(C.GDK_KEY_kana_WA)
+ KEY_kana_N = uint(C.GDK_KEY_kana_N)
+ KEY_voicedsound = uint(C.GDK_KEY_voicedsound)
+ KEY_semivoicedsound = uint(C.GDK_KEY_semivoicedsound)
+ KEY_kana_switch = uint(C.GDK_KEY_kana_switch)
+ KEY_Farsi_0 = uint(C.GDK_KEY_Farsi_0)
+ KEY_Farsi_1 = uint(C.GDK_KEY_Farsi_1)
+ KEY_Farsi_2 = uint(C.GDK_KEY_Farsi_2)
+ KEY_Farsi_3 = uint(C.GDK_KEY_Farsi_3)
+ KEY_Farsi_4 = uint(C.GDK_KEY_Farsi_4)
+ KEY_Farsi_5 = uint(C.GDK_KEY_Farsi_5)
+ KEY_Farsi_6 = uint(C.GDK_KEY_Farsi_6)
+ KEY_Farsi_7 = uint(C.GDK_KEY_Farsi_7)
+ KEY_Farsi_8 = uint(C.GDK_KEY_Farsi_8)
+ KEY_Farsi_9 = uint(C.GDK_KEY_Farsi_9)
+ KEY_Arabic_percent = uint(C.GDK_KEY_Arabic_percent)
+ KEY_Arabic_superscript_alef = uint(C.GDK_KEY_Arabic_superscript_alef)
+ KEY_Arabic_tteh = uint(C.GDK_KEY_Arabic_tteh)
+ KEY_Arabic_peh = uint(C.GDK_KEY_Arabic_peh)
+ KEY_Arabic_tcheh = uint(C.GDK_KEY_Arabic_tcheh)
+ KEY_Arabic_ddal = uint(C.GDK_KEY_Arabic_ddal)
+ KEY_Arabic_rreh = uint(C.GDK_KEY_Arabic_rreh)
+ KEY_Arabic_comma = uint(C.GDK_KEY_Arabic_comma)
+ KEY_Arabic_fullstop = uint(C.GDK_KEY_Arabic_fullstop)
+ KEY_Arabic_0 = uint(C.GDK_KEY_Arabic_0)
+ KEY_Arabic_1 = uint(C.GDK_KEY_Arabic_1)
+ KEY_Arabic_2 = uint(C.GDK_KEY_Arabic_2)
+ KEY_Arabic_3 = uint(C.GDK_KEY_Arabic_3)
+ KEY_Arabic_4 = uint(C.GDK_KEY_Arabic_4)
+ KEY_Arabic_5 = uint(C.GDK_KEY_Arabic_5)
+ KEY_Arabic_6 = uint(C.GDK_KEY_Arabic_6)
+ KEY_Arabic_7 = uint(C.GDK_KEY_Arabic_7)
+ KEY_Arabic_8 = uint(C.GDK_KEY_Arabic_8)
+ KEY_Arabic_9 = uint(C.GDK_KEY_Arabic_9)
+ KEY_Arabic_semicolon = uint(C.GDK_KEY_Arabic_semicolon)
+ KEY_Arabic_question_mark = uint(C.GDK_KEY_Arabic_question_mark)
+ KEY_Arabic_hamza = uint(C.GDK_KEY_Arabic_hamza)
+ KEY_Arabic_maddaonalef = uint(C.GDK_KEY_Arabic_maddaonalef)
+ KEY_Arabic_hamzaonalef = uint(C.GDK_KEY_Arabic_hamzaonalef)
+ KEY_Arabic_hamzaonwaw = uint(C.GDK_KEY_Arabic_hamzaonwaw)
+ KEY_Arabic_hamzaunderalef = uint(C.GDK_KEY_Arabic_hamzaunderalef)
+ KEY_Arabic_hamzaonyeh = uint(C.GDK_KEY_Arabic_hamzaonyeh)
+ KEY_Arabic_alef = uint(C.GDK_KEY_Arabic_alef)
+ KEY_Arabic_beh = uint(C.GDK_KEY_Arabic_beh)
+ KEY_Arabic_tehmarbuta = uint(C.GDK_KEY_Arabic_tehmarbuta)
+ KEY_Arabic_teh = uint(C.GDK_KEY_Arabic_teh)
+ KEY_Arabic_theh = uint(C.GDK_KEY_Arabic_theh)
+ KEY_Arabic_jeem = uint(C.GDK_KEY_Arabic_jeem)
+ KEY_Arabic_hah = uint(C.GDK_KEY_Arabic_hah)
+ KEY_Arabic_khah = uint(C.GDK_KEY_Arabic_khah)
+ KEY_Arabic_dal = uint(C.GDK_KEY_Arabic_dal)
+ KEY_Arabic_thal = uint(C.GDK_KEY_Arabic_thal)
+ KEY_Arabic_ra = uint(C.GDK_KEY_Arabic_ra)
+ KEY_Arabic_zain = uint(C.GDK_KEY_Arabic_zain)
+ KEY_Arabic_seen = uint(C.GDK_KEY_Arabic_seen)
+ KEY_Arabic_sheen = uint(C.GDK_KEY_Arabic_sheen)
+ KEY_Arabic_sad = uint(C.GDK_KEY_Arabic_sad)
+ KEY_Arabic_dad = uint(C.GDK_KEY_Arabic_dad)
+ KEY_Arabic_tah = uint(C.GDK_KEY_Arabic_tah)
+ KEY_Arabic_zah = uint(C.GDK_KEY_Arabic_zah)
+ KEY_Arabic_ain = uint(C.GDK_KEY_Arabic_ain)
+ KEY_Arabic_ghain = uint(C.GDK_KEY_Arabic_ghain)
+ KEY_Arabic_tatweel = uint(C.GDK_KEY_Arabic_tatweel)
+ KEY_Arabic_feh = uint(C.GDK_KEY_Arabic_feh)
+ KEY_Arabic_qaf = uint(C.GDK_KEY_Arabic_qaf)
+ KEY_Arabic_kaf = uint(C.GDK_KEY_Arabic_kaf)
+ KEY_Arabic_lam = uint(C.GDK_KEY_Arabic_lam)
+ KEY_Arabic_meem = uint(C.GDK_KEY_Arabic_meem)
+ KEY_Arabic_noon = uint(C.GDK_KEY_Arabic_noon)
+ KEY_Arabic_ha = uint(C.GDK_KEY_Arabic_ha)
+ KEY_Arabic_heh = uint(C.GDK_KEY_Arabic_heh)
+ KEY_Arabic_waw = uint(C.GDK_KEY_Arabic_waw)
+ KEY_Arabic_alefmaksura = uint(C.GDK_KEY_Arabic_alefmaksura)
+ KEY_Arabic_yeh = uint(C.GDK_KEY_Arabic_yeh)
+ KEY_Arabic_fathatan = uint(C.GDK_KEY_Arabic_fathatan)
+ KEY_Arabic_dammatan = uint(C.GDK_KEY_Arabic_dammatan)
+ KEY_Arabic_kasratan = uint(C.GDK_KEY_Arabic_kasratan)
+ KEY_Arabic_fatha = uint(C.GDK_KEY_Arabic_fatha)
+ KEY_Arabic_damma = uint(C.GDK_KEY_Arabic_damma)
+ KEY_Arabic_kasra = uint(C.GDK_KEY_Arabic_kasra)
+ KEY_Arabic_shadda = uint(C.GDK_KEY_Arabic_shadda)
+ KEY_Arabic_sukun = uint(C.GDK_KEY_Arabic_sukun)
+ KEY_Arabic_madda_above = uint(C.GDK_KEY_Arabic_madda_above)
+ KEY_Arabic_hamza_above = uint(C.GDK_KEY_Arabic_hamza_above)
+ KEY_Arabic_hamza_below = uint(C.GDK_KEY_Arabic_hamza_below)
+ KEY_Arabic_jeh = uint(C.GDK_KEY_Arabic_jeh)
+ KEY_Arabic_veh = uint(C.GDK_KEY_Arabic_veh)
+ KEY_Arabic_keheh = uint(C.GDK_KEY_Arabic_keheh)
+ KEY_Arabic_gaf = uint(C.GDK_KEY_Arabic_gaf)
+ KEY_Arabic_noon_ghunna = uint(C.GDK_KEY_Arabic_noon_ghunna)
+ KEY_Arabic_heh_doachashmee = uint(C.GDK_KEY_Arabic_heh_doachashmee)
+ KEY_Farsi_yeh = uint(C.GDK_KEY_Farsi_yeh)
+ KEY_Arabic_farsi_yeh = uint(C.GDK_KEY_Arabic_farsi_yeh)
+ KEY_Arabic_yeh_baree = uint(C.GDK_KEY_Arabic_yeh_baree)
+ KEY_Arabic_heh_goal = uint(C.GDK_KEY_Arabic_heh_goal)
+ KEY_Arabic_switch = uint(C.GDK_KEY_Arabic_switch)
+ KEY_Cyrillic_GHE_bar = uint(C.GDK_KEY_Cyrillic_GHE_bar)
+ KEY_Cyrillic_ghe_bar = uint(C.GDK_KEY_Cyrillic_ghe_bar)
+ KEY_Cyrillic_ZHE_descender = uint(C.GDK_KEY_Cyrillic_ZHE_descender)
+ KEY_Cyrillic_zhe_descender = uint(C.GDK_KEY_Cyrillic_zhe_descender)
+ KEY_Cyrillic_KA_descender = uint(C.GDK_KEY_Cyrillic_KA_descender)
+ KEY_Cyrillic_ka_descender = uint(C.GDK_KEY_Cyrillic_ka_descender)
+ KEY_Cyrillic_KA_vertstroke = uint(C.GDK_KEY_Cyrillic_KA_vertstroke)
+ KEY_Cyrillic_ka_vertstroke = uint(C.GDK_KEY_Cyrillic_ka_vertstroke)
+ KEY_Cyrillic_EN_descender = uint(C.GDK_KEY_Cyrillic_EN_descender)
+ KEY_Cyrillic_en_descender = uint(C.GDK_KEY_Cyrillic_en_descender)
+ KEY_Cyrillic_U_straight = uint(C.GDK_KEY_Cyrillic_U_straight)
+ KEY_Cyrillic_u_straight = uint(C.GDK_KEY_Cyrillic_u_straight)
+ KEY_Cyrillic_U_straight_bar = uint(C.GDK_KEY_Cyrillic_U_straight_bar)
+ KEY_Cyrillic_u_straight_bar = uint(C.GDK_KEY_Cyrillic_u_straight_bar)
+ KEY_Cyrillic_HA_descender = uint(C.GDK_KEY_Cyrillic_HA_descender)
+ KEY_Cyrillic_ha_descender = uint(C.GDK_KEY_Cyrillic_ha_descender)
+ KEY_Cyrillic_CHE_descender = uint(C.GDK_KEY_Cyrillic_CHE_descender)
+ KEY_Cyrillic_che_descender = uint(C.GDK_KEY_Cyrillic_che_descender)
+ KEY_Cyrillic_CHE_vertstroke = uint(C.GDK_KEY_Cyrillic_CHE_vertstroke)
+ KEY_Cyrillic_che_vertstroke = uint(C.GDK_KEY_Cyrillic_che_vertstroke)
+ KEY_Cyrillic_SHHA = uint(C.GDK_KEY_Cyrillic_SHHA)
+ KEY_Cyrillic_shha = uint(C.GDK_KEY_Cyrillic_shha)
+ KEY_Cyrillic_SCHWA = uint(C.GDK_KEY_Cyrillic_SCHWA)
+ KEY_Cyrillic_schwa = uint(C.GDK_KEY_Cyrillic_schwa)
+ KEY_Cyrillic_I_macron = uint(C.GDK_KEY_Cyrillic_I_macron)
+ KEY_Cyrillic_i_macron = uint(C.GDK_KEY_Cyrillic_i_macron)
+ KEY_Cyrillic_O_bar = uint(C.GDK_KEY_Cyrillic_O_bar)
+ KEY_Cyrillic_o_bar = uint(C.GDK_KEY_Cyrillic_o_bar)
+ KEY_Cyrillic_U_macron = uint(C.GDK_KEY_Cyrillic_U_macron)
+ KEY_Cyrillic_u_macron = uint(C.GDK_KEY_Cyrillic_u_macron)
+ KEY_Serbian_dje = uint(C.GDK_KEY_Serbian_dje)
+ KEY_Macedonia_gje = uint(C.GDK_KEY_Macedonia_gje)
+ KEY_Cyrillic_io = uint(C.GDK_KEY_Cyrillic_io)
+ KEY_Ukrainian_ie = uint(C.GDK_KEY_Ukrainian_ie)
+ KEY_Ukranian_je = uint(C.GDK_KEY_Ukranian_je)
+ KEY_Macedonia_dse = uint(C.GDK_KEY_Macedonia_dse)
+ KEY_Ukrainian_i = uint(C.GDK_KEY_Ukrainian_i)
+ KEY_Ukranian_i = uint(C.GDK_KEY_Ukranian_i)
+ KEY_Ukrainian_yi = uint(C.GDK_KEY_Ukrainian_yi)
+ KEY_Ukranian_yi = uint(C.GDK_KEY_Ukranian_yi)
+ KEY_Cyrillic_je = uint(C.GDK_KEY_Cyrillic_je)
+ KEY_Serbian_je = uint(C.GDK_KEY_Serbian_je)
+ KEY_Cyrillic_lje = uint(C.GDK_KEY_Cyrillic_lje)
+ KEY_Serbian_lje = uint(C.GDK_KEY_Serbian_lje)
+ KEY_Cyrillic_nje = uint(C.GDK_KEY_Cyrillic_nje)
+ KEY_Serbian_nje = uint(C.GDK_KEY_Serbian_nje)
+ KEY_Serbian_tshe = uint(C.GDK_KEY_Serbian_tshe)
+ KEY_Macedonia_kje = uint(C.GDK_KEY_Macedonia_kje)
+ KEY_Ukrainian_ghe_with_upturn = uint(C.GDK_KEY_Ukrainian_ghe_with_upturn)
+ KEY_Byelorussian_shortu = uint(C.GDK_KEY_Byelorussian_shortu)
+ KEY_Cyrillic_dzhe = uint(C.GDK_KEY_Cyrillic_dzhe)
+ KEY_Serbian_dze = uint(C.GDK_KEY_Serbian_dze)
+ KEY_numerosign = uint(C.GDK_KEY_numerosign)
+ KEY_Serbian_DJE = uint(C.GDK_KEY_Serbian_DJE)
+ KEY_Macedonia_GJE = uint(C.GDK_KEY_Macedonia_GJE)
+ KEY_Cyrillic_IO = uint(C.GDK_KEY_Cyrillic_IO)
+ KEY_Ukrainian_IE = uint(C.GDK_KEY_Ukrainian_IE)
+ KEY_Ukranian_JE = uint(C.GDK_KEY_Ukranian_JE)
+ KEY_Macedonia_DSE = uint(C.GDK_KEY_Macedonia_DSE)
+ KEY_Ukrainian_I = uint(C.GDK_KEY_Ukrainian_I)
+ KEY_Ukranian_I = uint(C.GDK_KEY_Ukranian_I)
+ KEY_Ukrainian_YI = uint(C.GDK_KEY_Ukrainian_YI)
+ KEY_Ukranian_YI = uint(C.GDK_KEY_Ukranian_YI)
+ KEY_Cyrillic_JE = uint(C.GDK_KEY_Cyrillic_JE)
+ KEY_Serbian_JE = uint(C.GDK_KEY_Serbian_JE)
+ KEY_Cyrillic_LJE = uint(C.GDK_KEY_Cyrillic_LJE)
+ KEY_Serbian_LJE = uint(C.GDK_KEY_Serbian_LJE)
+ KEY_Cyrillic_NJE = uint(C.GDK_KEY_Cyrillic_NJE)
+ KEY_Serbian_NJE = uint(C.GDK_KEY_Serbian_NJE)
+ KEY_Serbian_TSHE = uint(C.GDK_KEY_Serbian_TSHE)
+ KEY_Macedonia_KJE = uint(C.GDK_KEY_Macedonia_KJE)
+ KEY_Ukrainian_GHE_WITH_UPTURN = uint(C.GDK_KEY_Ukrainian_GHE_WITH_UPTURN)
+ KEY_Byelorussian_SHORTU = uint(C.GDK_KEY_Byelorussian_SHORTU)
+ KEY_Cyrillic_DZHE = uint(C.GDK_KEY_Cyrillic_DZHE)
+ KEY_Serbian_DZE = uint(C.GDK_KEY_Serbian_DZE)
+ KEY_Cyrillic_yu = uint(C.GDK_KEY_Cyrillic_yu)
+ KEY_Cyrillic_a = uint(C.GDK_KEY_Cyrillic_a)
+ KEY_Cyrillic_be = uint(C.GDK_KEY_Cyrillic_be)
+ KEY_Cyrillic_tse = uint(C.GDK_KEY_Cyrillic_tse)
+ KEY_Cyrillic_de = uint(C.GDK_KEY_Cyrillic_de)
+ KEY_Cyrillic_ie = uint(C.GDK_KEY_Cyrillic_ie)
+ KEY_Cyrillic_ef = uint(C.GDK_KEY_Cyrillic_ef)
+ KEY_Cyrillic_ghe = uint(C.GDK_KEY_Cyrillic_ghe)
+ KEY_Cyrillic_ha = uint(C.GDK_KEY_Cyrillic_ha)
+ KEY_Cyrillic_i = uint(C.GDK_KEY_Cyrillic_i)
+ KEY_Cyrillic_shorti = uint(C.GDK_KEY_Cyrillic_shorti)
+ KEY_Cyrillic_ka = uint(C.GDK_KEY_Cyrillic_ka)
+ KEY_Cyrillic_el = uint(C.GDK_KEY_Cyrillic_el)
+ KEY_Cyrillic_em = uint(C.GDK_KEY_Cyrillic_em)
+ KEY_Cyrillic_en = uint(C.GDK_KEY_Cyrillic_en)
+ KEY_Cyrillic_o = uint(C.GDK_KEY_Cyrillic_o)
+ KEY_Cyrillic_pe = uint(C.GDK_KEY_Cyrillic_pe)
+ KEY_Cyrillic_ya = uint(C.GDK_KEY_Cyrillic_ya)
+ KEY_Cyrillic_er = uint(C.GDK_KEY_Cyrillic_er)
+ KEY_Cyrillic_es = uint(C.GDK_KEY_Cyrillic_es)
+ KEY_Cyrillic_te = uint(C.GDK_KEY_Cyrillic_te)
+ KEY_Cyrillic_u = uint(C.GDK_KEY_Cyrillic_u)
+ KEY_Cyrillic_zhe = uint(C.GDK_KEY_Cyrillic_zhe)
+ KEY_Cyrillic_ve = uint(C.GDK_KEY_Cyrillic_ve)
+ KEY_Cyrillic_softsign = uint(C.GDK_KEY_Cyrillic_softsign)
+ KEY_Cyrillic_yeru = uint(C.GDK_KEY_Cyrillic_yeru)
+ KEY_Cyrillic_ze = uint(C.GDK_KEY_Cyrillic_ze)
+ KEY_Cyrillic_sha = uint(C.GDK_KEY_Cyrillic_sha)
+ KEY_Cyrillic_e = uint(C.GDK_KEY_Cyrillic_e)
+ KEY_Cyrillic_shcha = uint(C.GDK_KEY_Cyrillic_shcha)
+ KEY_Cyrillic_che = uint(C.GDK_KEY_Cyrillic_che)
+ KEY_Cyrillic_hardsign = uint(C.GDK_KEY_Cyrillic_hardsign)
+ KEY_Cyrillic_YU = uint(C.GDK_KEY_Cyrillic_YU)
+ KEY_Cyrillic_A = uint(C.GDK_KEY_Cyrillic_A)
+ KEY_Cyrillic_BE = uint(C.GDK_KEY_Cyrillic_BE)
+ KEY_Cyrillic_TSE = uint(C.GDK_KEY_Cyrillic_TSE)
+ KEY_Cyrillic_DE = uint(C.GDK_KEY_Cyrillic_DE)
+ KEY_Cyrillic_IE = uint(C.GDK_KEY_Cyrillic_IE)
+ KEY_Cyrillic_EF = uint(C.GDK_KEY_Cyrillic_EF)
+ KEY_Cyrillic_GHE = uint(C.GDK_KEY_Cyrillic_GHE)
+ KEY_Cyrillic_HA = uint(C.GDK_KEY_Cyrillic_HA)
+ KEY_Cyrillic_I = uint(C.GDK_KEY_Cyrillic_I)
+ KEY_Cyrillic_SHORTI = uint(C.GDK_KEY_Cyrillic_SHORTI)
+ KEY_Cyrillic_KA = uint(C.GDK_KEY_Cyrillic_KA)
+ KEY_Cyrillic_EL = uint(C.GDK_KEY_Cyrillic_EL)
+ KEY_Cyrillic_EM = uint(C.GDK_KEY_Cyrillic_EM)
+ KEY_Cyrillic_EN = uint(C.GDK_KEY_Cyrillic_EN)
+ KEY_Cyrillic_O = uint(C.GDK_KEY_Cyrillic_O)
+ KEY_Cyrillic_PE = uint(C.GDK_KEY_Cyrillic_PE)
+ KEY_Cyrillic_YA = uint(C.GDK_KEY_Cyrillic_YA)
+ KEY_Cyrillic_ER = uint(C.GDK_KEY_Cyrillic_ER)
+ KEY_Cyrillic_ES = uint(C.GDK_KEY_Cyrillic_ES)
+ KEY_Cyrillic_TE = uint(C.GDK_KEY_Cyrillic_TE)
+ KEY_Cyrillic_U = uint(C.GDK_KEY_Cyrillic_U)
+ KEY_Cyrillic_ZHE = uint(C.GDK_KEY_Cyrillic_ZHE)
+ KEY_Cyrillic_VE = uint(C.GDK_KEY_Cyrillic_VE)
+ KEY_Cyrillic_SOFTSIGN = uint(C.GDK_KEY_Cyrillic_SOFTSIGN)
+ KEY_Cyrillic_YERU = uint(C.GDK_KEY_Cyrillic_YERU)
+ KEY_Cyrillic_ZE = uint(C.GDK_KEY_Cyrillic_ZE)
+ KEY_Cyrillic_SHA = uint(C.GDK_KEY_Cyrillic_SHA)
+ KEY_Cyrillic_E = uint(C.GDK_KEY_Cyrillic_E)
+ KEY_Cyrillic_SHCHA = uint(C.GDK_KEY_Cyrillic_SHCHA)
+ KEY_Cyrillic_CHE = uint(C.GDK_KEY_Cyrillic_CHE)
+ KEY_Cyrillic_HARDSIGN = uint(C.GDK_KEY_Cyrillic_HARDSIGN)
+ KEY_Greek_ALPHAaccent = uint(C.GDK_KEY_Greek_ALPHAaccent)
+ KEY_Greek_EPSILONaccent = uint(C.GDK_KEY_Greek_EPSILONaccent)
+ KEY_Greek_ETAaccent = uint(C.GDK_KEY_Greek_ETAaccent)
+ KEY_Greek_IOTAaccent = uint(C.GDK_KEY_Greek_IOTAaccent)
+ KEY_Greek_IOTAdieresis = uint(C.GDK_KEY_Greek_IOTAdieresis)
+ KEY_Greek_IOTAdiaeresis = uint(C.GDK_KEY_Greek_IOTAdiaeresis)
+ KEY_Greek_OMICRONaccent = uint(C.GDK_KEY_Greek_OMICRONaccent)
+ KEY_Greek_UPSILONaccent = uint(C.GDK_KEY_Greek_UPSILONaccent)
+ KEY_Greek_UPSILONdieresis = uint(C.GDK_KEY_Greek_UPSILONdieresis)
+ KEY_Greek_OMEGAaccent = uint(C.GDK_KEY_Greek_OMEGAaccent)
+ KEY_Greek_accentdieresis = uint(C.GDK_KEY_Greek_accentdieresis)
+ KEY_Greek_horizbar = uint(C.GDK_KEY_Greek_horizbar)
+ KEY_Greek_alphaaccent = uint(C.GDK_KEY_Greek_alphaaccent)
+ KEY_Greek_epsilonaccent = uint(C.GDK_KEY_Greek_epsilonaccent)
+ KEY_Greek_etaaccent = uint(C.GDK_KEY_Greek_etaaccent)
+ KEY_Greek_iotaaccent = uint(C.GDK_KEY_Greek_iotaaccent)
+ KEY_Greek_iotadieresis = uint(C.GDK_KEY_Greek_iotadieresis)
+ KEY_Greek_iotaaccentdieresis = uint(C.GDK_KEY_Greek_iotaaccentdieresis)
+ KEY_Greek_omicronaccent = uint(C.GDK_KEY_Greek_omicronaccent)
+ KEY_Greek_upsilonaccent = uint(C.GDK_KEY_Greek_upsilonaccent)
+ KEY_Greek_upsilondieresis = uint(C.GDK_KEY_Greek_upsilondieresis)
+ KEY_Greek_upsilonaccentdieresis = uint(C.GDK_KEY_Greek_upsilonaccentdieresis)
+ KEY_Greek_omegaaccent = uint(C.GDK_KEY_Greek_omegaaccent)
+ KEY_Greek_ALPHA = uint(C.GDK_KEY_Greek_ALPHA)
+ KEY_Greek_BETA = uint(C.GDK_KEY_Greek_BETA)
+ KEY_Greek_GAMMA = uint(C.GDK_KEY_Greek_GAMMA)
+ KEY_Greek_DELTA = uint(C.GDK_KEY_Greek_DELTA)
+ KEY_Greek_EPSILON = uint(C.GDK_KEY_Greek_EPSILON)
+ KEY_Greek_ZETA = uint(C.GDK_KEY_Greek_ZETA)
+ KEY_Greek_ETA = uint(C.GDK_KEY_Greek_ETA)
+ KEY_Greek_THETA = uint(C.GDK_KEY_Greek_THETA)
+ KEY_Greek_IOTA = uint(C.GDK_KEY_Greek_IOTA)
+ KEY_Greek_KAPPA = uint(C.GDK_KEY_Greek_KAPPA)
+ KEY_Greek_LAMDA = uint(C.GDK_KEY_Greek_LAMDA)
+ KEY_Greek_LAMBDA = uint(C.GDK_KEY_Greek_LAMBDA)
+ KEY_Greek_MU = uint(C.GDK_KEY_Greek_MU)
+ KEY_Greek_NU = uint(C.GDK_KEY_Greek_NU)
+ KEY_Greek_XI = uint(C.GDK_KEY_Greek_XI)
+ KEY_Greek_OMICRON = uint(C.GDK_KEY_Greek_OMICRON)
+ KEY_Greek_PI = uint(C.GDK_KEY_Greek_PI)
+ KEY_Greek_RHO = uint(C.GDK_KEY_Greek_RHO)
+ KEY_Greek_SIGMA = uint(C.GDK_KEY_Greek_SIGMA)
+ KEY_Greek_TAU = uint(C.GDK_KEY_Greek_TAU)
+ KEY_Greek_UPSILON = uint(C.GDK_KEY_Greek_UPSILON)
+ KEY_Greek_PHI = uint(C.GDK_KEY_Greek_PHI)
+ KEY_Greek_CHI = uint(C.GDK_KEY_Greek_CHI)
+ KEY_Greek_PSI = uint(C.GDK_KEY_Greek_PSI)
+ KEY_Greek_OMEGA = uint(C.GDK_KEY_Greek_OMEGA)
+ KEY_Greek_alpha = uint(C.GDK_KEY_Greek_alpha)
+ KEY_Greek_beta = uint(C.GDK_KEY_Greek_beta)
+ KEY_Greek_gamma = uint(C.GDK_KEY_Greek_gamma)
+ KEY_Greek_delta = uint(C.GDK_KEY_Greek_delta)
+ KEY_Greek_epsilon = uint(C.GDK_KEY_Greek_epsilon)
+ KEY_Greek_zeta = uint(C.GDK_KEY_Greek_zeta)
+ KEY_Greek_eta = uint(C.GDK_KEY_Greek_eta)
+ KEY_Greek_theta = uint(C.GDK_KEY_Greek_theta)
+ KEY_Greek_iota = uint(C.GDK_KEY_Greek_iota)
+ KEY_Greek_kappa = uint(C.GDK_KEY_Greek_kappa)
+ KEY_Greek_lamda = uint(C.GDK_KEY_Greek_lamda)
+ KEY_Greek_lambda = uint(C.GDK_KEY_Greek_lambda)
+ KEY_Greek_mu = uint(C.GDK_KEY_Greek_mu)
+ KEY_Greek_nu = uint(C.GDK_KEY_Greek_nu)
+ KEY_Greek_xi = uint(C.GDK_KEY_Greek_xi)
+ KEY_Greek_omicron = uint(C.GDK_KEY_Greek_omicron)
+ KEY_Greek_pi = uint(C.GDK_KEY_Greek_pi)
+ KEY_Greek_rho = uint(C.GDK_KEY_Greek_rho)
+ KEY_Greek_sigma = uint(C.GDK_KEY_Greek_sigma)
+ KEY_Greek_finalsmallsigma = uint(C.GDK_KEY_Greek_finalsmallsigma)
+ KEY_Greek_tau = uint(C.GDK_KEY_Greek_tau)
+ KEY_Greek_upsilon = uint(C.GDK_KEY_Greek_upsilon)
+ KEY_Greek_phi = uint(C.GDK_KEY_Greek_phi)
+ KEY_Greek_chi = uint(C.GDK_KEY_Greek_chi)
+ KEY_Greek_psi = uint(C.GDK_KEY_Greek_psi)
+ KEY_Greek_omega = uint(C.GDK_KEY_Greek_omega)
+ KEY_Greek_switch = uint(C.GDK_KEY_Greek_switch)
+ KEY_leftradical = uint(C.GDK_KEY_leftradical)
+ KEY_topleftradical = uint(C.GDK_KEY_topleftradical)
+ KEY_horizconnector = uint(C.GDK_KEY_horizconnector)
+ KEY_topintegral = uint(C.GDK_KEY_topintegral)
+ KEY_botintegral = uint(C.GDK_KEY_botintegral)
+ KEY_vertconnector = uint(C.GDK_KEY_vertconnector)
+ KEY_topleftsqbracket = uint(C.GDK_KEY_topleftsqbracket)
+ KEY_botleftsqbracket = uint(C.GDK_KEY_botleftsqbracket)
+ KEY_toprightsqbracket = uint(C.GDK_KEY_toprightsqbracket)
+ KEY_botrightsqbracket = uint(C.GDK_KEY_botrightsqbracket)
+ KEY_topleftparens = uint(C.GDK_KEY_topleftparens)
+ KEY_botleftparens = uint(C.GDK_KEY_botleftparens)
+ KEY_toprightparens = uint(C.GDK_KEY_toprightparens)
+ KEY_botrightparens = uint(C.GDK_KEY_botrightparens)
+ KEY_leftmiddlecurlybrace = uint(C.GDK_KEY_leftmiddlecurlybrace)
+ KEY_rightmiddlecurlybrace = uint(C.GDK_KEY_rightmiddlecurlybrace)
+ KEY_topleftsummation = uint(C.GDK_KEY_topleftsummation)
+ KEY_botleftsummation = uint(C.GDK_KEY_botleftsummation)
+ KEY_topvertsummationconnector = uint(C.GDK_KEY_topvertsummationconnector)
+ KEY_botvertsummationconnector = uint(C.GDK_KEY_botvertsummationconnector)
+ KEY_toprightsummation = uint(C.GDK_KEY_toprightsummation)
+ KEY_botrightsummation = uint(C.GDK_KEY_botrightsummation)
+ KEY_rightmiddlesummation = uint(C.GDK_KEY_rightmiddlesummation)
+ KEY_lessthanequal = uint(C.GDK_KEY_lessthanequal)
+ KEY_notequal = uint(C.GDK_KEY_notequal)
+ KEY_greaterthanequal = uint(C.GDK_KEY_greaterthanequal)
+ KEY_integral = uint(C.GDK_KEY_integral)
+ KEY_therefore = uint(C.GDK_KEY_therefore)
+ KEY_variation = uint(C.GDK_KEY_variation)
+ KEY_infinity = uint(C.GDK_KEY_infinity)
+ KEY_nabla = uint(C.GDK_KEY_nabla)
+ KEY_approximate = uint(C.GDK_KEY_approximate)
+ KEY_similarequal = uint(C.GDK_KEY_similarequal)
+ KEY_ifonlyif = uint(C.GDK_KEY_ifonlyif)
+ KEY_implies = uint(C.GDK_KEY_implies)
+ KEY_identical = uint(C.GDK_KEY_identical)
+ KEY_radical = uint(C.GDK_KEY_radical)
+ KEY_includedin = uint(C.GDK_KEY_includedin)
+ KEY_includes = uint(C.GDK_KEY_includes)
+ KEY_intersection = uint(C.GDK_KEY_intersection)
+ KEY_union = uint(C.GDK_KEY_union)
+ KEY_logicaland = uint(C.GDK_KEY_logicaland)
+ KEY_logicalor = uint(C.GDK_KEY_logicalor)
+ KEY_partialderivative = uint(C.GDK_KEY_partialderivative)
+ KEY_function = uint(C.GDK_KEY_function)
+ KEY_leftarrow = uint(C.GDK_KEY_leftarrow)
+ KEY_uparrow = uint(C.GDK_KEY_uparrow)
+ KEY_rightarrow = uint(C.GDK_KEY_rightarrow)
+ KEY_downarrow = uint(C.GDK_KEY_downarrow)
+ KEY_blank = uint(C.GDK_KEY_blank)
+ KEY_soliddiamond = uint(C.GDK_KEY_soliddiamond)
+ KEY_checkerboard = uint(C.GDK_KEY_checkerboard)
+ KEY_ht = uint(C.GDK_KEY_ht)
+ KEY_ff = uint(C.GDK_KEY_ff)
+ KEY_cr = uint(C.GDK_KEY_cr)
+ KEY_lf = uint(C.GDK_KEY_lf)
+ KEY_nl = uint(C.GDK_KEY_nl)
+ KEY_vt = uint(C.GDK_KEY_vt)
+ KEY_lowrightcorner = uint(C.GDK_KEY_lowrightcorner)
+ KEY_uprightcorner = uint(C.GDK_KEY_uprightcorner)
+ KEY_upleftcorner = uint(C.GDK_KEY_upleftcorner)
+ KEY_lowleftcorner = uint(C.GDK_KEY_lowleftcorner)
+ KEY_crossinglines = uint(C.GDK_KEY_crossinglines)
+ KEY_horizlinescan1 = uint(C.GDK_KEY_horizlinescan1)
+ KEY_horizlinescan3 = uint(C.GDK_KEY_horizlinescan3)
+ KEY_horizlinescan5 = uint(C.GDK_KEY_horizlinescan5)
+ KEY_horizlinescan7 = uint(C.GDK_KEY_horizlinescan7)
+ KEY_horizlinescan9 = uint(C.GDK_KEY_horizlinescan9)
+ KEY_leftt = uint(C.GDK_KEY_leftt)
+ KEY_rightt = uint(C.GDK_KEY_rightt)
+ KEY_bott = uint(C.GDK_KEY_bott)
+ KEY_topt = uint(C.GDK_KEY_topt)
+ KEY_vertbar = uint(C.GDK_KEY_vertbar)
+ KEY_emspace = uint(C.GDK_KEY_emspace)
+ KEY_enspace = uint(C.GDK_KEY_enspace)
+ KEY_em3space = uint(C.GDK_KEY_em3space)
+ KEY_em4space = uint(C.GDK_KEY_em4space)
+ KEY_digitspace = uint(C.GDK_KEY_digitspace)
+ KEY_punctspace = uint(C.GDK_KEY_punctspace)
+ KEY_thinspace = uint(C.GDK_KEY_thinspace)
+ KEY_hairspace = uint(C.GDK_KEY_hairspace)
+ KEY_emdash = uint(C.GDK_KEY_emdash)
+ KEY_endash = uint(C.GDK_KEY_endash)
+ KEY_signifblank = uint(C.GDK_KEY_signifblank)
+ KEY_ellipsis = uint(C.GDK_KEY_ellipsis)
+ KEY_doubbaselinedot = uint(C.GDK_KEY_doubbaselinedot)
+ KEY_onethird = uint(C.GDK_KEY_onethird)
+ KEY_twothirds = uint(C.GDK_KEY_twothirds)
+ KEY_onefifth = uint(C.GDK_KEY_onefifth)
+ KEY_twofifths = uint(C.GDK_KEY_twofifths)
+ KEY_threefifths = uint(C.GDK_KEY_threefifths)
+ KEY_fourfifths = uint(C.GDK_KEY_fourfifths)
+ KEY_onesixth = uint(C.GDK_KEY_onesixth)
+ KEY_fivesixths = uint(C.GDK_KEY_fivesixths)
+ KEY_careof = uint(C.GDK_KEY_careof)
+ KEY_figdash = uint(C.GDK_KEY_figdash)
+ KEY_leftanglebracket = uint(C.GDK_KEY_leftanglebracket)
+ KEY_decimalpoint = uint(C.GDK_KEY_decimalpoint)
+ KEY_rightanglebracket = uint(C.GDK_KEY_rightanglebracket)
+ KEY_marker = uint(C.GDK_KEY_marker)
+ KEY_oneeighth = uint(C.GDK_KEY_oneeighth)
+ KEY_threeeighths = uint(C.GDK_KEY_threeeighths)
+ KEY_fiveeighths = uint(C.GDK_KEY_fiveeighths)
+ KEY_seveneighths = uint(C.GDK_KEY_seveneighths)
+ KEY_trademark = uint(C.GDK_KEY_trademark)
+ KEY_signaturemark = uint(C.GDK_KEY_signaturemark)
+ KEY_trademarkincircle = uint(C.GDK_KEY_trademarkincircle)
+ KEY_leftopentriangle = uint(C.GDK_KEY_leftopentriangle)
+ KEY_rightopentriangle = uint(C.GDK_KEY_rightopentriangle)
+ KEY_emopencircle = uint(C.GDK_KEY_emopencircle)
+ KEY_emopenrectangle = uint(C.GDK_KEY_emopenrectangle)
+ KEY_leftsinglequotemark = uint(C.GDK_KEY_leftsinglequotemark)
+ KEY_rightsinglequotemark = uint(C.GDK_KEY_rightsinglequotemark)
+ KEY_leftdoublequotemark = uint(C.GDK_KEY_leftdoublequotemark)
+ KEY_rightdoublequotemark = uint(C.GDK_KEY_rightdoublequotemark)
+ KEY_prescription = uint(C.GDK_KEY_prescription)
+ KEY_permille = uint(C.GDK_KEY_permille)
+ KEY_minutes = uint(C.GDK_KEY_minutes)
+ KEY_seconds = uint(C.GDK_KEY_seconds)
+ KEY_latincross = uint(C.GDK_KEY_latincross)
+ KEY_hexagram = uint(C.GDK_KEY_hexagram)
+ KEY_filledrectbullet = uint(C.GDK_KEY_filledrectbullet)
+ KEY_filledlefttribullet = uint(C.GDK_KEY_filledlefttribullet)
+ KEY_filledrighttribullet = uint(C.GDK_KEY_filledrighttribullet)
+ KEY_emfilledcircle = uint(C.GDK_KEY_emfilledcircle)
+ KEY_emfilledrect = uint(C.GDK_KEY_emfilledrect)
+ KEY_enopencircbullet = uint(C.GDK_KEY_enopencircbullet)
+ KEY_enopensquarebullet = uint(C.GDK_KEY_enopensquarebullet)
+ KEY_openrectbullet = uint(C.GDK_KEY_openrectbullet)
+ KEY_opentribulletup = uint(C.GDK_KEY_opentribulletup)
+ KEY_opentribulletdown = uint(C.GDK_KEY_opentribulletdown)
+ KEY_openstar = uint(C.GDK_KEY_openstar)
+ KEY_enfilledcircbullet = uint(C.GDK_KEY_enfilledcircbullet)
+ KEY_enfilledsqbullet = uint(C.GDK_KEY_enfilledsqbullet)
+ KEY_filledtribulletup = uint(C.GDK_KEY_filledtribulletup)
+ KEY_filledtribulletdown = uint(C.GDK_KEY_filledtribulletdown)
+ KEY_leftpointer = uint(C.GDK_KEY_leftpointer)
+ KEY_rightpointer = uint(C.GDK_KEY_rightpointer)
+ KEY_club = uint(C.GDK_KEY_club)
+ KEY_diamond = uint(C.GDK_KEY_diamond)
+ KEY_heart = uint(C.GDK_KEY_heart)
+ KEY_maltesecross = uint(C.GDK_KEY_maltesecross)
+ KEY_dagger = uint(C.GDK_KEY_dagger)
+ KEY_doubledagger = uint(C.GDK_KEY_doubledagger)
+ KEY_checkmark = uint(C.GDK_KEY_checkmark)
+ KEY_ballotcross = uint(C.GDK_KEY_ballotcross)
+ KEY_musicalsharp = uint(C.GDK_KEY_musicalsharp)
+ KEY_musicalflat = uint(C.GDK_KEY_musicalflat)
+ KEY_malesymbol = uint(C.GDK_KEY_malesymbol)
+ KEY_femalesymbol = uint(C.GDK_KEY_femalesymbol)
+ KEY_telephone = uint(C.GDK_KEY_telephone)
+ KEY_telephonerecorder = uint(C.GDK_KEY_telephonerecorder)
+ KEY_phonographcopyright = uint(C.GDK_KEY_phonographcopyright)
+ KEY_caret = uint(C.GDK_KEY_caret)
+ KEY_singlelowquotemark = uint(C.GDK_KEY_singlelowquotemark)
+ KEY_doublelowquotemark = uint(C.GDK_KEY_doublelowquotemark)
+ KEY_cursor = uint(C.GDK_KEY_cursor)
+ KEY_leftcaret = uint(C.GDK_KEY_leftcaret)
+ KEY_rightcaret = uint(C.GDK_KEY_rightcaret)
+ KEY_downcaret = uint(C.GDK_KEY_downcaret)
+ KEY_upcaret = uint(C.GDK_KEY_upcaret)
+ KEY_overbar = uint(C.GDK_KEY_overbar)
+ KEY_downtack = uint(C.GDK_KEY_downtack)
+ KEY_upshoe = uint(C.GDK_KEY_upshoe)
+ KEY_downstile = uint(C.GDK_KEY_downstile)
+ KEY_underbar = uint(C.GDK_KEY_underbar)
+ KEY_jot = uint(C.GDK_KEY_jot)
+ KEY_quad = uint(C.GDK_KEY_quad)
+ KEY_uptack = uint(C.GDK_KEY_uptack)
+ KEY_circle = uint(C.GDK_KEY_circle)
+ KEY_upstile = uint(C.GDK_KEY_upstile)
+ KEY_downshoe = uint(C.GDK_KEY_downshoe)
+ KEY_rightshoe = uint(C.GDK_KEY_rightshoe)
+ KEY_leftshoe = uint(C.GDK_KEY_leftshoe)
+ KEY_lefttack = uint(C.GDK_KEY_lefttack)
+ KEY_righttack = uint(C.GDK_KEY_righttack)
+ KEY_hebrew_doublelowline = uint(C.GDK_KEY_hebrew_doublelowline)
+ KEY_hebrew_aleph = uint(C.GDK_KEY_hebrew_aleph)
+ KEY_hebrew_bet = uint(C.GDK_KEY_hebrew_bet)
+ KEY_hebrew_beth = uint(C.GDK_KEY_hebrew_beth)
+ KEY_hebrew_gimel = uint(C.GDK_KEY_hebrew_gimel)
+ KEY_hebrew_gimmel = uint(C.GDK_KEY_hebrew_gimmel)
+ KEY_hebrew_dalet = uint(C.GDK_KEY_hebrew_dalet)
+ KEY_hebrew_daleth = uint(C.GDK_KEY_hebrew_daleth)
+ KEY_hebrew_he = uint(C.GDK_KEY_hebrew_he)
+ KEY_hebrew_waw = uint(C.GDK_KEY_hebrew_waw)
+ KEY_hebrew_zain = uint(C.GDK_KEY_hebrew_zain)
+ KEY_hebrew_zayin = uint(C.GDK_KEY_hebrew_zayin)
+ KEY_hebrew_chet = uint(C.GDK_KEY_hebrew_chet)
+ KEY_hebrew_het = uint(C.GDK_KEY_hebrew_het)
+ KEY_hebrew_tet = uint(C.GDK_KEY_hebrew_tet)
+ KEY_hebrew_teth = uint(C.GDK_KEY_hebrew_teth)
+ KEY_hebrew_yod = uint(C.GDK_KEY_hebrew_yod)
+ KEY_hebrew_finalkaph = uint(C.GDK_KEY_hebrew_finalkaph)
+ KEY_hebrew_kaph = uint(C.GDK_KEY_hebrew_kaph)
+ KEY_hebrew_lamed = uint(C.GDK_KEY_hebrew_lamed)
+ KEY_hebrew_finalmem = uint(C.GDK_KEY_hebrew_finalmem)
+ KEY_hebrew_mem = uint(C.GDK_KEY_hebrew_mem)
+ KEY_hebrew_finalnun = uint(C.GDK_KEY_hebrew_finalnun)
+ KEY_hebrew_nun = uint(C.GDK_KEY_hebrew_nun)
+ KEY_hebrew_samech = uint(C.GDK_KEY_hebrew_samech)
+ KEY_hebrew_samekh = uint(C.GDK_KEY_hebrew_samekh)
+ KEY_hebrew_ayin = uint(C.GDK_KEY_hebrew_ayin)
+ KEY_hebrew_finalpe = uint(C.GDK_KEY_hebrew_finalpe)
+ KEY_hebrew_pe = uint(C.GDK_KEY_hebrew_pe)
+ KEY_hebrew_finalzade = uint(C.GDK_KEY_hebrew_finalzade)
+ KEY_hebrew_finalzadi = uint(C.GDK_KEY_hebrew_finalzadi)
+ KEY_hebrew_zade = uint(C.GDK_KEY_hebrew_zade)
+ KEY_hebrew_zadi = uint(C.GDK_KEY_hebrew_zadi)
+ KEY_hebrew_qoph = uint(C.GDK_KEY_hebrew_qoph)
+ KEY_hebrew_kuf = uint(C.GDK_KEY_hebrew_kuf)
+ KEY_hebrew_resh = uint(C.GDK_KEY_hebrew_resh)
+ KEY_hebrew_shin = uint(C.GDK_KEY_hebrew_shin)
+ KEY_hebrew_taw = uint(C.GDK_KEY_hebrew_taw)
+ KEY_hebrew_taf = uint(C.GDK_KEY_hebrew_taf)
+ KEY_Hebrew_switch = uint(C.GDK_KEY_Hebrew_switch)
+ KEY_Thai_kokai = uint(C.GDK_KEY_Thai_kokai)
+ KEY_Thai_khokhai = uint(C.GDK_KEY_Thai_khokhai)
+ KEY_Thai_khokhuat = uint(C.GDK_KEY_Thai_khokhuat)
+ KEY_Thai_khokhwai = uint(C.GDK_KEY_Thai_khokhwai)
+ KEY_Thai_khokhon = uint(C.GDK_KEY_Thai_khokhon)
+ KEY_Thai_khorakhang = uint(C.GDK_KEY_Thai_khorakhang)
+ KEY_Thai_ngongu = uint(C.GDK_KEY_Thai_ngongu)
+ KEY_Thai_chochan = uint(C.GDK_KEY_Thai_chochan)
+ KEY_Thai_choching = uint(C.GDK_KEY_Thai_choching)
+ KEY_Thai_chochang = uint(C.GDK_KEY_Thai_chochang)
+ KEY_Thai_soso = uint(C.GDK_KEY_Thai_soso)
+ KEY_Thai_chochoe = uint(C.GDK_KEY_Thai_chochoe)
+ KEY_Thai_yoying = uint(C.GDK_KEY_Thai_yoying)
+ KEY_Thai_dochada = uint(C.GDK_KEY_Thai_dochada)
+ KEY_Thai_topatak = uint(C.GDK_KEY_Thai_topatak)
+ KEY_Thai_thothan = uint(C.GDK_KEY_Thai_thothan)
+ KEY_Thai_thonangmontho = uint(C.GDK_KEY_Thai_thonangmontho)
+ KEY_Thai_thophuthao = uint(C.GDK_KEY_Thai_thophuthao)
+ KEY_Thai_nonen = uint(C.GDK_KEY_Thai_nonen)
+ KEY_Thai_dodek = uint(C.GDK_KEY_Thai_dodek)
+ KEY_Thai_totao = uint(C.GDK_KEY_Thai_totao)
+ KEY_Thai_thothung = uint(C.GDK_KEY_Thai_thothung)
+ KEY_Thai_thothahan = uint(C.GDK_KEY_Thai_thothahan)
+ KEY_Thai_thothong = uint(C.GDK_KEY_Thai_thothong)
+ KEY_Thai_nonu = uint(C.GDK_KEY_Thai_nonu)
+ KEY_Thai_bobaimai = uint(C.GDK_KEY_Thai_bobaimai)
+ KEY_Thai_popla = uint(C.GDK_KEY_Thai_popla)
+ KEY_Thai_phophung = uint(C.GDK_KEY_Thai_phophung)
+ KEY_Thai_fofa = uint(C.GDK_KEY_Thai_fofa)
+ KEY_Thai_phophan = uint(C.GDK_KEY_Thai_phophan)
+ KEY_Thai_fofan = uint(C.GDK_KEY_Thai_fofan)
+ KEY_Thai_phosamphao = uint(C.GDK_KEY_Thai_phosamphao)
+ KEY_Thai_moma = uint(C.GDK_KEY_Thai_moma)
+ KEY_Thai_yoyak = uint(C.GDK_KEY_Thai_yoyak)
+ KEY_Thai_rorua = uint(C.GDK_KEY_Thai_rorua)
+ KEY_Thai_ru = uint(C.GDK_KEY_Thai_ru)
+ KEY_Thai_loling = uint(C.GDK_KEY_Thai_loling)
+ KEY_Thai_lu = uint(C.GDK_KEY_Thai_lu)
+ KEY_Thai_wowaen = uint(C.GDK_KEY_Thai_wowaen)
+ KEY_Thai_sosala = uint(C.GDK_KEY_Thai_sosala)
+ KEY_Thai_sorusi = uint(C.GDK_KEY_Thai_sorusi)
+ KEY_Thai_sosua = uint(C.GDK_KEY_Thai_sosua)
+ KEY_Thai_hohip = uint(C.GDK_KEY_Thai_hohip)
+ KEY_Thai_lochula = uint(C.GDK_KEY_Thai_lochula)
+ KEY_Thai_oang = uint(C.GDK_KEY_Thai_oang)
+ KEY_Thai_honokhuk = uint(C.GDK_KEY_Thai_honokhuk)
+ KEY_Thai_paiyannoi = uint(C.GDK_KEY_Thai_paiyannoi)
+ KEY_Thai_saraa = uint(C.GDK_KEY_Thai_saraa)
+ KEY_Thai_maihanakat = uint(C.GDK_KEY_Thai_maihanakat)
+ KEY_Thai_saraaa = uint(C.GDK_KEY_Thai_saraaa)
+ KEY_Thai_saraam = uint(C.GDK_KEY_Thai_saraam)
+ KEY_Thai_sarai = uint(C.GDK_KEY_Thai_sarai)
+ KEY_Thai_saraii = uint(C.GDK_KEY_Thai_saraii)
+ KEY_Thai_saraue = uint(C.GDK_KEY_Thai_saraue)
+ KEY_Thai_sarauee = uint(C.GDK_KEY_Thai_sarauee)
+ KEY_Thai_sarau = uint(C.GDK_KEY_Thai_sarau)
+ KEY_Thai_sarauu = uint(C.GDK_KEY_Thai_sarauu)
+ KEY_Thai_phinthu = uint(C.GDK_KEY_Thai_phinthu)
+ KEY_Thai_maihanakat_maitho = uint(C.GDK_KEY_Thai_maihanakat_maitho)
+ KEY_Thai_baht = uint(C.GDK_KEY_Thai_baht)
+ KEY_Thai_sarae = uint(C.GDK_KEY_Thai_sarae)
+ KEY_Thai_saraae = uint(C.GDK_KEY_Thai_saraae)
+ KEY_Thai_sarao = uint(C.GDK_KEY_Thai_sarao)
+ KEY_Thai_saraaimaimuan = uint(C.GDK_KEY_Thai_saraaimaimuan)
+ KEY_Thai_saraaimaimalai = uint(C.GDK_KEY_Thai_saraaimaimalai)
+ KEY_Thai_lakkhangyao = uint(C.GDK_KEY_Thai_lakkhangyao)
+ KEY_Thai_maiyamok = uint(C.GDK_KEY_Thai_maiyamok)
+ KEY_Thai_maitaikhu = uint(C.GDK_KEY_Thai_maitaikhu)
+ KEY_Thai_maiek = uint(C.GDK_KEY_Thai_maiek)
+ KEY_Thai_maitho = uint(C.GDK_KEY_Thai_maitho)
+ KEY_Thai_maitri = uint(C.GDK_KEY_Thai_maitri)
+ KEY_Thai_maichattawa = uint(C.GDK_KEY_Thai_maichattawa)
+ KEY_Thai_thanthakhat = uint(C.GDK_KEY_Thai_thanthakhat)
+ KEY_Thai_nikhahit = uint(C.GDK_KEY_Thai_nikhahit)
+ KEY_Thai_leksun = uint(C.GDK_KEY_Thai_leksun)
+ KEY_Thai_leknung = uint(C.GDK_KEY_Thai_leknung)
+ KEY_Thai_leksong = uint(C.GDK_KEY_Thai_leksong)
+ KEY_Thai_leksam = uint(C.GDK_KEY_Thai_leksam)
+ KEY_Thai_leksi = uint(C.GDK_KEY_Thai_leksi)
+ KEY_Thai_lekha = uint(C.GDK_KEY_Thai_lekha)
+ KEY_Thai_lekhok = uint(C.GDK_KEY_Thai_lekhok)
+ KEY_Thai_lekchet = uint(C.GDK_KEY_Thai_lekchet)
+ KEY_Thai_lekpaet = uint(C.GDK_KEY_Thai_lekpaet)
+ KEY_Thai_lekkao = uint(C.GDK_KEY_Thai_lekkao)
+ KEY_Hangul = uint(C.GDK_KEY_Hangul)
+ KEY_Hangul_Start = uint(C.GDK_KEY_Hangul_Start)
+ KEY_Hangul_End = uint(C.GDK_KEY_Hangul_End)
+ KEY_Hangul_Hanja = uint(C.GDK_KEY_Hangul_Hanja)
+ KEY_Hangul_Jamo = uint(C.GDK_KEY_Hangul_Jamo)
+ KEY_Hangul_Romaja = uint(C.GDK_KEY_Hangul_Romaja)
+ KEY_Hangul_Codeinput = uint(C.GDK_KEY_Hangul_Codeinput)
+ KEY_Hangul_Jeonja = uint(C.GDK_KEY_Hangul_Jeonja)
+ KEY_Hangul_Banja = uint(C.GDK_KEY_Hangul_Banja)
+ KEY_Hangul_PreHanja = uint(C.GDK_KEY_Hangul_PreHanja)
+ KEY_Hangul_PostHanja = uint(C.GDK_KEY_Hangul_PostHanja)
+ KEY_Hangul_SingleCandidate = uint(C.GDK_KEY_Hangul_SingleCandidate)
+ KEY_Hangul_MultipleCandidate = uint(C.GDK_KEY_Hangul_MultipleCandidate)
+ KEY_Hangul_PreviousCandidate = uint(C.GDK_KEY_Hangul_PreviousCandidate)
+ KEY_Hangul_Special = uint(C.GDK_KEY_Hangul_Special)
+ KEY_Hangul_switch = uint(C.GDK_KEY_Hangul_switch)
+ KEY_Hangul_Kiyeog = uint(C.GDK_KEY_Hangul_Kiyeog)
+ KEY_Hangul_SsangKiyeog = uint(C.GDK_KEY_Hangul_SsangKiyeog)
+ KEY_Hangul_KiyeogSios = uint(C.GDK_KEY_Hangul_KiyeogSios)
+ KEY_Hangul_Nieun = uint(C.GDK_KEY_Hangul_Nieun)
+ KEY_Hangul_NieunJieuj = uint(C.GDK_KEY_Hangul_NieunJieuj)
+ KEY_Hangul_NieunHieuh = uint(C.GDK_KEY_Hangul_NieunHieuh)
+ KEY_Hangul_Dikeud = uint(C.GDK_KEY_Hangul_Dikeud)
+ KEY_Hangul_SsangDikeud = uint(C.GDK_KEY_Hangul_SsangDikeud)
+ KEY_Hangul_Rieul = uint(C.GDK_KEY_Hangul_Rieul)
+ KEY_Hangul_RieulKiyeog = uint(C.GDK_KEY_Hangul_RieulKiyeog)
+ KEY_Hangul_RieulMieum = uint(C.GDK_KEY_Hangul_RieulMieum)
+ KEY_Hangul_RieulPieub = uint(C.GDK_KEY_Hangul_RieulPieub)
+ KEY_Hangul_RieulSios = uint(C.GDK_KEY_Hangul_RieulSios)
+ KEY_Hangul_RieulTieut = uint(C.GDK_KEY_Hangul_RieulTieut)
+ KEY_Hangul_RieulPhieuf = uint(C.GDK_KEY_Hangul_RieulPhieuf)
+ KEY_Hangul_RieulHieuh = uint(C.GDK_KEY_Hangul_RieulHieuh)
+ KEY_Hangul_Mieum = uint(C.GDK_KEY_Hangul_Mieum)
+ KEY_Hangul_Pieub = uint(C.GDK_KEY_Hangul_Pieub)
+ KEY_Hangul_SsangPieub = uint(C.GDK_KEY_Hangul_SsangPieub)
+ KEY_Hangul_PieubSios = uint(C.GDK_KEY_Hangul_PieubSios)
+ KEY_Hangul_Sios = uint(C.GDK_KEY_Hangul_Sios)
+ KEY_Hangul_SsangSios = uint(C.GDK_KEY_Hangul_SsangSios)
+ KEY_Hangul_Ieung = uint(C.GDK_KEY_Hangul_Ieung)
+ KEY_Hangul_Jieuj = uint(C.GDK_KEY_Hangul_Jieuj)
+ KEY_Hangul_SsangJieuj = uint(C.GDK_KEY_Hangul_SsangJieuj)
+ KEY_Hangul_Cieuc = uint(C.GDK_KEY_Hangul_Cieuc)
+ KEY_Hangul_Khieuq = uint(C.GDK_KEY_Hangul_Khieuq)
+ KEY_Hangul_Tieut = uint(C.GDK_KEY_Hangul_Tieut)
+ KEY_Hangul_Phieuf = uint(C.GDK_KEY_Hangul_Phieuf)
+ KEY_Hangul_Hieuh = uint(C.GDK_KEY_Hangul_Hieuh)
+ KEY_Hangul_A = uint(C.GDK_KEY_Hangul_A)
+ KEY_Hangul_AE = uint(C.GDK_KEY_Hangul_AE)
+ KEY_Hangul_YA = uint(C.GDK_KEY_Hangul_YA)
+ KEY_Hangul_YAE = uint(C.GDK_KEY_Hangul_YAE)
+ KEY_Hangul_EO = uint(C.GDK_KEY_Hangul_EO)
+ KEY_Hangul_E = uint(C.GDK_KEY_Hangul_E)
+ KEY_Hangul_YEO = uint(C.GDK_KEY_Hangul_YEO)
+ KEY_Hangul_YE = uint(C.GDK_KEY_Hangul_YE)
+ KEY_Hangul_O = uint(C.GDK_KEY_Hangul_O)
+ KEY_Hangul_WA = uint(C.GDK_KEY_Hangul_WA)
+ KEY_Hangul_WAE = uint(C.GDK_KEY_Hangul_WAE)
+ KEY_Hangul_OE = uint(C.GDK_KEY_Hangul_OE)
+ KEY_Hangul_YO = uint(C.GDK_KEY_Hangul_YO)
+ KEY_Hangul_U = uint(C.GDK_KEY_Hangul_U)
+ KEY_Hangul_WEO = uint(C.GDK_KEY_Hangul_WEO)
+ KEY_Hangul_WE = uint(C.GDK_KEY_Hangul_WE)
+ KEY_Hangul_WI = uint(C.GDK_KEY_Hangul_WI)
+ KEY_Hangul_YU = uint(C.GDK_KEY_Hangul_YU)
+ KEY_Hangul_EU = uint(C.GDK_KEY_Hangul_EU)
+ KEY_Hangul_YI = uint(C.GDK_KEY_Hangul_YI)
+ KEY_Hangul_I = uint(C.GDK_KEY_Hangul_I)
+ KEY_Hangul_J_Kiyeog = uint(C.GDK_KEY_Hangul_J_Kiyeog)
+ KEY_Hangul_J_SsangKiyeog = uint(C.GDK_KEY_Hangul_J_SsangKiyeog)
+ KEY_Hangul_J_KiyeogSios = uint(C.GDK_KEY_Hangul_J_KiyeogSios)
+ KEY_Hangul_J_Nieun = uint(C.GDK_KEY_Hangul_J_Nieun)
+ KEY_Hangul_J_NieunJieuj = uint(C.GDK_KEY_Hangul_J_NieunJieuj)
+ KEY_Hangul_J_NieunHieuh = uint(C.GDK_KEY_Hangul_J_NieunHieuh)
+ KEY_Hangul_J_Dikeud = uint(C.GDK_KEY_Hangul_J_Dikeud)
+ KEY_Hangul_J_Rieul = uint(C.GDK_KEY_Hangul_J_Rieul)
+ KEY_Hangul_J_RieulKiyeog = uint(C.GDK_KEY_Hangul_J_RieulKiyeog)
+ KEY_Hangul_J_RieulMieum = uint(C.GDK_KEY_Hangul_J_RieulMieum)
+ KEY_Hangul_J_RieulPieub = uint(C.GDK_KEY_Hangul_J_RieulPieub)
+ KEY_Hangul_J_RieulSios = uint(C.GDK_KEY_Hangul_J_RieulSios)
+ KEY_Hangul_J_RieulTieut = uint(C.GDK_KEY_Hangul_J_RieulTieut)
+ KEY_Hangul_J_RieulPhieuf = uint(C.GDK_KEY_Hangul_J_RieulPhieuf)
+ KEY_Hangul_J_RieulHieuh = uint(C.GDK_KEY_Hangul_J_RieulHieuh)
+ KEY_Hangul_J_Mieum = uint(C.GDK_KEY_Hangul_J_Mieum)
+ KEY_Hangul_J_Pieub = uint(C.GDK_KEY_Hangul_J_Pieub)
+ KEY_Hangul_J_PieubSios = uint(C.GDK_KEY_Hangul_J_PieubSios)
+ KEY_Hangul_J_Sios = uint(C.GDK_KEY_Hangul_J_Sios)
+ KEY_Hangul_J_SsangSios = uint(C.GDK_KEY_Hangul_J_SsangSios)
+ KEY_Hangul_J_Ieung = uint(C.GDK_KEY_Hangul_J_Ieung)
+ KEY_Hangul_J_Jieuj = uint(C.GDK_KEY_Hangul_J_Jieuj)
+ KEY_Hangul_J_Cieuc = uint(C.GDK_KEY_Hangul_J_Cieuc)
+ KEY_Hangul_J_Khieuq = uint(C.GDK_KEY_Hangul_J_Khieuq)
+ KEY_Hangul_J_Tieut = uint(C.GDK_KEY_Hangul_J_Tieut)
+ KEY_Hangul_J_Phieuf = uint(C.GDK_KEY_Hangul_J_Phieuf)
+ KEY_Hangul_J_Hieuh = uint(C.GDK_KEY_Hangul_J_Hieuh)
+ KEY_Hangul_RieulYeorinHieuh = uint(C.GDK_KEY_Hangul_RieulYeorinHieuh)
+ KEY_Hangul_SunkyeongeumMieum = uint(C.GDK_KEY_Hangul_SunkyeongeumMieum)
+ KEY_Hangul_SunkyeongeumPieub = uint(C.GDK_KEY_Hangul_SunkyeongeumPieub)
+ KEY_Hangul_PanSios = uint(C.GDK_KEY_Hangul_PanSios)
+ KEY_Hangul_KkogjiDalrinIeung = uint(C.GDK_KEY_Hangul_KkogjiDalrinIeung)
+ KEY_Hangul_SunkyeongeumPhieuf = uint(C.GDK_KEY_Hangul_SunkyeongeumPhieuf)
+ KEY_Hangul_YeorinHieuh = uint(C.GDK_KEY_Hangul_YeorinHieuh)
+ KEY_Hangul_AraeA = uint(C.GDK_KEY_Hangul_AraeA)
+ KEY_Hangul_AraeAE = uint(C.GDK_KEY_Hangul_AraeAE)
+ KEY_Hangul_J_PanSios = uint(C.GDK_KEY_Hangul_J_PanSios)
+ KEY_Hangul_J_KkogjiDalrinIeung = uint(C.GDK_KEY_Hangul_J_KkogjiDalrinIeung)
+ KEY_Hangul_J_YeorinHieuh = uint(C.GDK_KEY_Hangul_J_YeorinHieuh)
+ KEY_Korean_Won = uint(C.GDK_KEY_Korean_Won)
+ KEY_Armenian_ligature_ew = uint(C.GDK_KEY_Armenian_ligature_ew)
+ KEY_Armenian_full_stop = uint(C.GDK_KEY_Armenian_full_stop)
+ KEY_Armenian_verjaket = uint(C.GDK_KEY_Armenian_verjaket)
+ KEY_Armenian_separation_mark = uint(C.GDK_KEY_Armenian_separation_mark)
+ KEY_Armenian_but = uint(C.GDK_KEY_Armenian_but)
+ KEY_Armenian_hyphen = uint(C.GDK_KEY_Armenian_hyphen)
+ KEY_Armenian_yentamna = uint(C.GDK_KEY_Armenian_yentamna)
+ KEY_Armenian_exclam = uint(C.GDK_KEY_Armenian_exclam)
+ KEY_Armenian_amanak = uint(C.GDK_KEY_Armenian_amanak)
+ KEY_Armenian_accent = uint(C.GDK_KEY_Armenian_accent)
+ KEY_Armenian_shesht = uint(C.GDK_KEY_Armenian_shesht)
+ KEY_Armenian_question = uint(C.GDK_KEY_Armenian_question)
+ KEY_Armenian_paruyk = uint(C.GDK_KEY_Armenian_paruyk)
+ KEY_Armenian_AYB = uint(C.GDK_KEY_Armenian_AYB)
+ KEY_Armenian_ayb = uint(C.GDK_KEY_Armenian_ayb)
+ KEY_Armenian_BEN = uint(C.GDK_KEY_Armenian_BEN)
+ KEY_Armenian_ben = uint(C.GDK_KEY_Armenian_ben)
+ KEY_Armenian_GIM = uint(C.GDK_KEY_Armenian_GIM)
+ KEY_Armenian_gim = uint(C.GDK_KEY_Armenian_gim)
+ KEY_Armenian_DA = uint(C.GDK_KEY_Armenian_DA)
+ KEY_Armenian_da = uint(C.GDK_KEY_Armenian_da)
+ KEY_Armenian_YECH = uint(C.GDK_KEY_Armenian_YECH)
+ KEY_Armenian_yech = uint(C.GDK_KEY_Armenian_yech)
+ KEY_Armenian_ZA = uint(C.GDK_KEY_Armenian_ZA)
+ KEY_Armenian_za = uint(C.GDK_KEY_Armenian_za)
+ KEY_Armenian_E = uint(C.GDK_KEY_Armenian_E)
+ KEY_Armenian_e = uint(C.GDK_KEY_Armenian_e)
+ KEY_Armenian_AT = uint(C.GDK_KEY_Armenian_AT)
+ KEY_Armenian_at = uint(C.GDK_KEY_Armenian_at)
+ KEY_Armenian_TO = uint(C.GDK_KEY_Armenian_TO)
+ KEY_Armenian_to = uint(C.GDK_KEY_Armenian_to)
+ KEY_Armenian_ZHE = uint(C.GDK_KEY_Armenian_ZHE)
+ KEY_Armenian_zhe = uint(C.GDK_KEY_Armenian_zhe)
+ KEY_Armenian_INI = uint(C.GDK_KEY_Armenian_INI)
+ KEY_Armenian_ini = uint(C.GDK_KEY_Armenian_ini)
+ KEY_Armenian_LYUN = uint(C.GDK_KEY_Armenian_LYUN)
+ KEY_Armenian_lyun = uint(C.GDK_KEY_Armenian_lyun)
+ KEY_Armenian_KHE = uint(C.GDK_KEY_Armenian_KHE)
+ KEY_Armenian_khe = uint(C.GDK_KEY_Armenian_khe)
+ KEY_Armenian_TSA = uint(C.GDK_KEY_Armenian_TSA)
+ KEY_Armenian_tsa = uint(C.GDK_KEY_Armenian_tsa)
+ KEY_Armenian_KEN = uint(C.GDK_KEY_Armenian_KEN)
+ KEY_Armenian_ken = uint(C.GDK_KEY_Armenian_ken)
+ KEY_Armenian_HO = uint(C.GDK_KEY_Armenian_HO)
+ KEY_Armenian_ho = uint(C.GDK_KEY_Armenian_ho)
+ KEY_Armenian_DZA = uint(C.GDK_KEY_Armenian_DZA)
+ KEY_Armenian_dza = uint(C.GDK_KEY_Armenian_dza)
+ KEY_Armenian_GHAT = uint(C.GDK_KEY_Armenian_GHAT)
+ KEY_Armenian_ghat = uint(C.GDK_KEY_Armenian_ghat)
+ KEY_Armenian_TCHE = uint(C.GDK_KEY_Armenian_TCHE)
+ KEY_Armenian_tche = uint(C.GDK_KEY_Armenian_tche)
+ KEY_Armenian_MEN = uint(C.GDK_KEY_Armenian_MEN)
+ KEY_Armenian_men = uint(C.GDK_KEY_Armenian_men)
+ KEY_Armenian_HI = uint(C.GDK_KEY_Armenian_HI)
+ KEY_Armenian_hi = uint(C.GDK_KEY_Armenian_hi)
+ KEY_Armenian_NU = uint(C.GDK_KEY_Armenian_NU)
+ KEY_Armenian_nu = uint(C.GDK_KEY_Armenian_nu)
+ KEY_Armenian_SHA = uint(C.GDK_KEY_Armenian_SHA)
+ KEY_Armenian_sha = uint(C.GDK_KEY_Armenian_sha)
+ KEY_Armenian_VO = uint(C.GDK_KEY_Armenian_VO)
+ KEY_Armenian_vo = uint(C.GDK_KEY_Armenian_vo)
+ KEY_Armenian_CHA = uint(C.GDK_KEY_Armenian_CHA)
+ KEY_Armenian_cha = uint(C.GDK_KEY_Armenian_cha)
+ KEY_Armenian_PE = uint(C.GDK_KEY_Armenian_PE)
+ KEY_Armenian_pe = uint(C.GDK_KEY_Armenian_pe)
+ KEY_Armenian_JE = uint(C.GDK_KEY_Armenian_JE)
+ KEY_Armenian_je = uint(C.GDK_KEY_Armenian_je)
+ KEY_Armenian_RA = uint(C.GDK_KEY_Armenian_RA)
+ KEY_Armenian_ra = uint(C.GDK_KEY_Armenian_ra)
+ KEY_Armenian_SE = uint(C.GDK_KEY_Armenian_SE)
+ KEY_Armenian_se = uint(C.GDK_KEY_Armenian_se)
+ KEY_Armenian_VEV = uint(C.GDK_KEY_Armenian_VEV)
+ KEY_Armenian_vev = uint(C.GDK_KEY_Armenian_vev)
+ KEY_Armenian_TYUN = uint(C.GDK_KEY_Armenian_TYUN)
+ KEY_Armenian_tyun = uint(C.GDK_KEY_Armenian_tyun)
+ KEY_Armenian_RE = uint(C.GDK_KEY_Armenian_RE)
+ KEY_Armenian_re = uint(C.GDK_KEY_Armenian_re)
+ KEY_Armenian_TSO = uint(C.GDK_KEY_Armenian_TSO)
+ KEY_Armenian_tso = uint(C.GDK_KEY_Armenian_tso)
+ KEY_Armenian_VYUN = uint(C.GDK_KEY_Armenian_VYUN)
+ KEY_Armenian_vyun = uint(C.GDK_KEY_Armenian_vyun)
+ KEY_Armenian_PYUR = uint(C.GDK_KEY_Armenian_PYUR)
+ KEY_Armenian_pyur = uint(C.GDK_KEY_Armenian_pyur)
+ KEY_Armenian_KE = uint(C.GDK_KEY_Armenian_KE)
+ KEY_Armenian_ke = uint(C.GDK_KEY_Armenian_ke)
+ KEY_Armenian_O = uint(C.GDK_KEY_Armenian_O)
+ KEY_Armenian_o = uint(C.GDK_KEY_Armenian_o)
+ KEY_Armenian_FE = uint(C.GDK_KEY_Armenian_FE)
+ KEY_Armenian_fe = uint(C.GDK_KEY_Armenian_fe)
+ KEY_Armenian_apostrophe = uint(C.GDK_KEY_Armenian_apostrophe)
+ KEY_Georgian_an = uint(C.GDK_KEY_Georgian_an)
+ KEY_Georgian_ban = uint(C.GDK_KEY_Georgian_ban)
+ KEY_Georgian_gan = uint(C.GDK_KEY_Georgian_gan)
+ KEY_Georgian_don = uint(C.GDK_KEY_Georgian_don)
+ KEY_Georgian_en = uint(C.GDK_KEY_Georgian_en)
+ KEY_Georgian_vin = uint(C.GDK_KEY_Georgian_vin)
+ KEY_Georgian_zen = uint(C.GDK_KEY_Georgian_zen)
+ KEY_Georgian_tan = uint(C.GDK_KEY_Georgian_tan)
+ KEY_Georgian_in = uint(C.GDK_KEY_Georgian_in)
+ KEY_Georgian_kan = uint(C.GDK_KEY_Georgian_kan)
+ KEY_Georgian_las = uint(C.GDK_KEY_Georgian_las)
+ KEY_Georgian_man = uint(C.GDK_KEY_Georgian_man)
+ KEY_Georgian_nar = uint(C.GDK_KEY_Georgian_nar)
+ KEY_Georgian_on = uint(C.GDK_KEY_Georgian_on)
+ KEY_Georgian_par = uint(C.GDK_KEY_Georgian_par)
+ KEY_Georgian_zhar = uint(C.GDK_KEY_Georgian_zhar)
+ KEY_Georgian_rae = uint(C.GDK_KEY_Georgian_rae)
+ KEY_Georgian_san = uint(C.GDK_KEY_Georgian_san)
+ KEY_Georgian_tar = uint(C.GDK_KEY_Georgian_tar)
+ KEY_Georgian_un = uint(C.GDK_KEY_Georgian_un)
+ KEY_Georgian_phar = uint(C.GDK_KEY_Georgian_phar)
+ KEY_Georgian_khar = uint(C.GDK_KEY_Georgian_khar)
+ KEY_Georgian_ghan = uint(C.GDK_KEY_Georgian_ghan)
+ KEY_Georgian_qar = uint(C.GDK_KEY_Georgian_qar)
+ KEY_Georgian_shin = uint(C.GDK_KEY_Georgian_shin)
+ KEY_Georgian_chin = uint(C.GDK_KEY_Georgian_chin)
+ KEY_Georgian_can = uint(C.GDK_KEY_Georgian_can)
+ KEY_Georgian_jil = uint(C.GDK_KEY_Georgian_jil)
+ KEY_Georgian_cil = uint(C.GDK_KEY_Georgian_cil)
+ KEY_Georgian_char = uint(C.GDK_KEY_Georgian_char)
+ KEY_Georgian_xan = uint(C.GDK_KEY_Georgian_xan)
+ KEY_Georgian_jhan = uint(C.GDK_KEY_Georgian_jhan)
+ KEY_Georgian_hae = uint(C.GDK_KEY_Georgian_hae)
+ KEY_Georgian_he = uint(C.GDK_KEY_Georgian_he)
+ KEY_Georgian_hie = uint(C.GDK_KEY_Georgian_hie)
+ KEY_Georgian_we = uint(C.GDK_KEY_Georgian_we)
+ KEY_Georgian_har = uint(C.GDK_KEY_Georgian_har)
+ KEY_Georgian_hoe = uint(C.GDK_KEY_Georgian_hoe)
+ KEY_Georgian_fi = uint(C.GDK_KEY_Georgian_fi)
+ KEY_Xabovedot = uint(C.GDK_KEY_Xabovedot)
+ KEY_Ibreve = uint(C.GDK_KEY_Ibreve)
+ KEY_Zstroke = uint(C.GDK_KEY_Zstroke)
+ KEY_Gcaron = uint(C.GDK_KEY_Gcaron)
+ KEY_Ocaron = uint(C.GDK_KEY_Ocaron)
+ KEY_Obarred = uint(C.GDK_KEY_Obarred)
+ KEY_xabovedot = uint(C.GDK_KEY_xabovedot)
+ KEY_ibreve = uint(C.GDK_KEY_ibreve)
+ KEY_zstroke = uint(C.GDK_KEY_zstroke)
+ KEY_gcaron = uint(C.GDK_KEY_gcaron)
+ KEY_ocaron = uint(C.GDK_KEY_ocaron)
+ KEY_obarred = uint(C.GDK_KEY_obarred)
+ KEY_SCHWA = uint(C.GDK_KEY_SCHWA)
+ KEY_schwa = uint(C.GDK_KEY_schwa)
+ KEY_EZH = uint(C.GDK_KEY_EZH)
+ KEY_ezh = uint(C.GDK_KEY_ezh)
+ KEY_Lbelowdot = uint(C.GDK_KEY_Lbelowdot)
+ KEY_lbelowdot = uint(C.GDK_KEY_lbelowdot)
+ KEY_Abelowdot = uint(C.GDK_KEY_Abelowdot)
+ KEY_abelowdot = uint(C.GDK_KEY_abelowdot)
+ KEY_Ahook = uint(C.GDK_KEY_Ahook)
+ KEY_ahook = uint(C.GDK_KEY_ahook)
+ KEY_Acircumflexacute = uint(C.GDK_KEY_Acircumflexacute)
+ KEY_acircumflexacute = uint(C.GDK_KEY_acircumflexacute)
+ KEY_Acircumflexgrave = uint(C.GDK_KEY_Acircumflexgrave)
+ KEY_acircumflexgrave = uint(C.GDK_KEY_acircumflexgrave)
+ KEY_Acircumflexhook = uint(C.GDK_KEY_Acircumflexhook)
+ KEY_acircumflexhook = uint(C.GDK_KEY_acircumflexhook)
+ KEY_Acircumflextilde = uint(C.GDK_KEY_Acircumflextilde)
+ KEY_acircumflextilde = uint(C.GDK_KEY_acircumflextilde)
+ KEY_Acircumflexbelowdot = uint(C.GDK_KEY_Acircumflexbelowdot)
+ KEY_acircumflexbelowdot = uint(C.GDK_KEY_acircumflexbelowdot)
+ KEY_Abreveacute = uint(C.GDK_KEY_Abreveacute)
+ KEY_abreveacute = uint(C.GDK_KEY_abreveacute)
+ KEY_Abrevegrave = uint(C.GDK_KEY_Abrevegrave)
+ KEY_abrevegrave = uint(C.GDK_KEY_abrevegrave)
+ KEY_Abrevehook = uint(C.GDK_KEY_Abrevehook)
+ KEY_abrevehook = uint(C.GDK_KEY_abrevehook)
+ KEY_Abrevetilde = uint(C.GDK_KEY_Abrevetilde)
+ KEY_abrevetilde = uint(C.GDK_KEY_abrevetilde)
+ KEY_Abrevebelowdot = uint(C.GDK_KEY_Abrevebelowdot)
+ KEY_abrevebelowdot = uint(C.GDK_KEY_abrevebelowdot)
+ KEY_Ebelowdot = uint(C.GDK_KEY_Ebelowdot)
+ KEY_ebelowdot = uint(C.GDK_KEY_ebelowdot)
+ KEY_Ehook = uint(C.GDK_KEY_Ehook)
+ KEY_ehook = uint(C.GDK_KEY_ehook)
+ KEY_Etilde = uint(C.GDK_KEY_Etilde)
+ KEY_etilde = uint(C.GDK_KEY_etilde)
+ KEY_Ecircumflexacute = uint(C.GDK_KEY_Ecircumflexacute)
+ KEY_ecircumflexacute = uint(C.GDK_KEY_ecircumflexacute)
+ KEY_Ecircumflexgrave = uint(C.GDK_KEY_Ecircumflexgrave)
+ KEY_ecircumflexgrave = uint(C.GDK_KEY_ecircumflexgrave)
+ KEY_Ecircumflexhook = uint(C.GDK_KEY_Ecircumflexhook)
+ KEY_ecircumflexhook = uint(C.GDK_KEY_ecircumflexhook)
+ KEY_Ecircumflextilde = uint(C.GDK_KEY_Ecircumflextilde)
+ KEY_ecircumflextilde = uint(C.GDK_KEY_ecircumflextilde)
+ KEY_Ecircumflexbelowdot = uint(C.GDK_KEY_Ecircumflexbelowdot)
+ KEY_ecircumflexbelowdot = uint(C.GDK_KEY_ecircumflexbelowdot)
+ KEY_Ihook = uint(C.GDK_KEY_Ihook)
+ KEY_ihook = uint(C.GDK_KEY_ihook)
+ KEY_Ibelowdot = uint(C.GDK_KEY_Ibelowdot)
+ KEY_ibelowdot = uint(C.GDK_KEY_ibelowdot)
+ KEY_Obelowdot = uint(C.GDK_KEY_Obelowdot)
+ KEY_obelowdot = uint(C.GDK_KEY_obelowdot)
+ KEY_Ohook = uint(C.GDK_KEY_Ohook)
+ KEY_ohook = uint(C.GDK_KEY_ohook)
+ KEY_Ocircumflexacute = uint(C.GDK_KEY_Ocircumflexacute)
+ KEY_ocircumflexacute = uint(C.GDK_KEY_ocircumflexacute)
+ KEY_Ocircumflexgrave = uint(C.GDK_KEY_Ocircumflexgrave)
+ KEY_ocircumflexgrave = uint(C.GDK_KEY_ocircumflexgrave)
+ KEY_Ocircumflexhook = uint(C.GDK_KEY_Ocircumflexhook)
+ KEY_ocircumflexhook = uint(C.GDK_KEY_ocircumflexhook)
+ KEY_Ocircumflextilde = uint(C.GDK_KEY_Ocircumflextilde)
+ KEY_ocircumflextilde = uint(C.GDK_KEY_ocircumflextilde)
+ KEY_Ocircumflexbelowdot = uint(C.GDK_KEY_Ocircumflexbelowdot)
+ KEY_ocircumflexbelowdot = uint(C.GDK_KEY_ocircumflexbelowdot)
+ KEY_Ohornacute = uint(C.GDK_KEY_Ohornacute)
+ KEY_ohornacute = uint(C.GDK_KEY_ohornacute)
+ KEY_Ohorngrave = uint(C.GDK_KEY_Ohorngrave)
+ KEY_ohorngrave = uint(C.GDK_KEY_ohorngrave)
+ KEY_Ohornhook = uint(C.GDK_KEY_Ohornhook)
+ KEY_ohornhook = uint(C.GDK_KEY_ohornhook)
+ KEY_Ohorntilde = uint(C.GDK_KEY_Ohorntilde)
+ KEY_ohorntilde = uint(C.GDK_KEY_ohorntilde)
+ KEY_Ohornbelowdot = uint(C.GDK_KEY_Ohornbelowdot)
+ KEY_ohornbelowdot = uint(C.GDK_KEY_ohornbelowdot)
+ KEY_Ubelowdot = uint(C.GDK_KEY_Ubelowdot)
+ KEY_ubelowdot = uint(C.GDK_KEY_ubelowdot)
+ KEY_Uhook = uint(C.GDK_KEY_Uhook)
+ KEY_uhook = uint(C.GDK_KEY_uhook)
+ KEY_Uhornacute = uint(C.GDK_KEY_Uhornacute)
+ KEY_uhornacute = uint(C.GDK_KEY_uhornacute)
+ KEY_Uhorngrave = uint(C.GDK_KEY_Uhorngrave)
+ KEY_uhorngrave = uint(C.GDK_KEY_uhorngrave)
+ KEY_Uhornhook = uint(C.GDK_KEY_Uhornhook)
+ KEY_uhornhook = uint(C.GDK_KEY_uhornhook)
+ KEY_Uhorntilde = uint(C.GDK_KEY_Uhorntilde)
+ KEY_uhorntilde = uint(C.GDK_KEY_uhorntilde)
+ KEY_Uhornbelowdot = uint(C.GDK_KEY_Uhornbelowdot)
+ KEY_uhornbelowdot = uint(C.GDK_KEY_uhornbelowdot)
+ KEY_Ybelowdot = uint(C.GDK_KEY_Ybelowdot)
+ KEY_ybelowdot = uint(C.GDK_KEY_ybelowdot)
+ KEY_Yhook = uint(C.GDK_KEY_Yhook)
+ KEY_yhook = uint(C.GDK_KEY_yhook)
+ KEY_Ytilde = uint(C.GDK_KEY_Ytilde)
+ KEY_ytilde = uint(C.GDK_KEY_ytilde)
+ KEY_Ohorn = uint(C.GDK_KEY_Ohorn)
+ KEY_ohorn = uint(C.GDK_KEY_ohorn)
+ KEY_Uhorn = uint(C.GDK_KEY_Uhorn)
+ KEY_uhorn = uint(C.GDK_KEY_uhorn)
+ KEY_EcuSign = uint(C.GDK_KEY_EcuSign)
+ KEY_ColonSign = uint(C.GDK_KEY_ColonSign)
+ KEY_CruzeiroSign = uint(C.GDK_KEY_CruzeiroSign)
+ KEY_FFrancSign = uint(C.GDK_KEY_FFrancSign)
+ KEY_LiraSign = uint(C.GDK_KEY_LiraSign)
+ KEY_MillSign = uint(C.GDK_KEY_MillSign)
+ KEY_NairaSign = uint(C.GDK_KEY_NairaSign)
+ KEY_PesetaSign = uint(C.GDK_KEY_PesetaSign)
+ KEY_RupeeSign = uint(C.GDK_KEY_RupeeSign)
+ KEY_WonSign = uint(C.GDK_KEY_WonSign)
+ KEY_NewSheqelSign = uint(C.GDK_KEY_NewSheqelSign)
+ KEY_DongSign = uint(C.GDK_KEY_DongSign)
+ KEY_EuroSign = uint(C.GDK_KEY_EuroSign)
+ KEY_zerosuperior = uint(C.GDK_KEY_zerosuperior)
+ KEY_foursuperior = uint(C.GDK_KEY_foursuperior)
+ KEY_fivesuperior = uint(C.GDK_KEY_fivesuperior)
+ KEY_sixsuperior = uint(C.GDK_KEY_sixsuperior)
+ KEY_sevensuperior = uint(C.GDK_KEY_sevensuperior)
+ KEY_eightsuperior = uint(C.GDK_KEY_eightsuperior)
+ KEY_ninesuperior = uint(C.GDK_KEY_ninesuperior)
+ KEY_zerosubscript = uint(C.GDK_KEY_zerosubscript)
+ KEY_onesubscript = uint(C.GDK_KEY_onesubscript)
+ KEY_twosubscript = uint(C.GDK_KEY_twosubscript)
+ KEY_threesubscript = uint(C.GDK_KEY_threesubscript)
+ KEY_foursubscript = uint(C.GDK_KEY_foursubscript)
+ KEY_fivesubscript = uint(C.GDK_KEY_fivesubscript)
+ KEY_sixsubscript = uint(C.GDK_KEY_sixsubscript)
+ KEY_sevensubscript = uint(C.GDK_KEY_sevensubscript)
+ KEY_eightsubscript = uint(C.GDK_KEY_eightsubscript)
+ KEY_ninesubscript = uint(C.GDK_KEY_ninesubscript)
+ KEY_partdifferential = uint(C.GDK_KEY_partdifferential)
+ KEY_emptyset = uint(C.GDK_KEY_emptyset)
+ KEY_elementof = uint(C.GDK_KEY_elementof)
+ KEY_notelementof = uint(C.GDK_KEY_notelementof)
+ KEY_containsas = uint(C.GDK_KEY_containsas)
+ KEY_squareroot = uint(C.GDK_KEY_squareroot)
+ KEY_cuberoot = uint(C.GDK_KEY_cuberoot)
+ KEY_fourthroot = uint(C.GDK_KEY_fourthroot)
+ KEY_dintegral = uint(C.GDK_KEY_dintegral)
+ KEY_tintegral = uint(C.GDK_KEY_tintegral)
+ KEY_because = uint(C.GDK_KEY_because)
+ KEY_approxeq = uint(C.GDK_KEY_approxeq)
+ KEY_notapproxeq = uint(C.GDK_KEY_notapproxeq)
+ KEY_notidentical = uint(C.GDK_KEY_notidentical)
+ KEY_stricteq = uint(C.GDK_KEY_stricteq)
+ KEY_braille_dot_1 = uint(C.GDK_KEY_braille_dot_1)
+ KEY_braille_dot_2 = uint(C.GDK_KEY_braille_dot_2)
+ KEY_braille_dot_3 = uint(C.GDK_KEY_braille_dot_3)
+ KEY_braille_dot_4 = uint(C.GDK_KEY_braille_dot_4)
+ KEY_braille_dot_5 = uint(C.GDK_KEY_braille_dot_5)
+ KEY_braille_dot_6 = uint(C.GDK_KEY_braille_dot_6)
+ KEY_braille_dot_7 = uint(C.GDK_KEY_braille_dot_7)
+ KEY_braille_dot_8 = uint(C.GDK_KEY_braille_dot_8)
+ KEY_braille_dot_9 = uint(C.GDK_KEY_braille_dot_9)
+ KEY_braille_dot_10 = uint(C.GDK_KEY_braille_dot_10)
+ KEY_braille_blank = uint(C.GDK_KEY_braille_blank)
+ KEY_braille_dots_1 = uint(C.GDK_KEY_braille_dots_1)
+ KEY_braille_dots_2 = uint(C.GDK_KEY_braille_dots_2)
+ KEY_braille_dots_12 = uint(C.GDK_KEY_braille_dots_12)
+ KEY_braille_dots_3 = uint(C.GDK_KEY_braille_dots_3)
+ KEY_braille_dots_13 = uint(C.GDK_KEY_braille_dots_13)
+ KEY_braille_dots_23 = uint(C.GDK_KEY_braille_dots_23)
+ KEY_braille_dots_123 = uint(C.GDK_KEY_braille_dots_123)
+ KEY_braille_dots_4 = uint(C.GDK_KEY_braille_dots_4)
+ KEY_braille_dots_14 = uint(C.GDK_KEY_braille_dots_14)
+ KEY_braille_dots_24 = uint(C.GDK_KEY_braille_dots_24)
+ KEY_braille_dots_124 = uint(C.GDK_KEY_braille_dots_124)
+ KEY_braille_dots_34 = uint(C.GDK_KEY_braille_dots_34)
+ KEY_braille_dots_134 = uint(C.GDK_KEY_braille_dots_134)
+ KEY_braille_dots_234 = uint(C.GDK_KEY_braille_dots_234)
+ KEY_braille_dots_1234 = uint(C.GDK_KEY_braille_dots_1234)
+ KEY_braille_dots_5 = uint(C.GDK_KEY_braille_dots_5)
+ KEY_braille_dots_15 = uint(C.GDK_KEY_braille_dots_15)
+ KEY_braille_dots_25 = uint(C.GDK_KEY_braille_dots_25)
+ KEY_braille_dots_125 = uint(C.GDK_KEY_braille_dots_125)
+ KEY_braille_dots_35 = uint(C.GDK_KEY_braille_dots_35)
+ KEY_braille_dots_135 = uint(C.GDK_KEY_braille_dots_135)
+ KEY_braille_dots_235 = uint(C.GDK_KEY_braille_dots_235)
+ KEY_braille_dots_1235 = uint(C.GDK_KEY_braille_dots_1235)
+ KEY_braille_dots_45 = uint(C.GDK_KEY_braille_dots_45)
+ KEY_braille_dots_145 = uint(C.GDK_KEY_braille_dots_145)
+ KEY_braille_dots_245 = uint(C.GDK_KEY_braille_dots_245)
+ KEY_braille_dots_1245 = uint(C.GDK_KEY_braille_dots_1245)
+ KEY_braille_dots_345 = uint(C.GDK_KEY_braille_dots_345)
+ KEY_braille_dots_1345 = uint(C.GDK_KEY_braille_dots_1345)
+ KEY_braille_dots_2345 = uint(C.GDK_KEY_braille_dots_2345)
+ KEY_braille_dots_12345 = uint(C.GDK_KEY_braille_dots_12345)
+ KEY_braille_dots_6 = uint(C.GDK_KEY_braille_dots_6)
+ KEY_braille_dots_16 = uint(C.GDK_KEY_braille_dots_16)
+ KEY_braille_dots_26 = uint(C.GDK_KEY_braille_dots_26)
+ KEY_braille_dots_126 = uint(C.GDK_KEY_braille_dots_126)
+ KEY_braille_dots_36 = uint(C.GDK_KEY_braille_dots_36)
+ KEY_braille_dots_136 = uint(C.GDK_KEY_braille_dots_136)
+ KEY_braille_dots_236 = uint(C.GDK_KEY_braille_dots_236)
+ KEY_braille_dots_1236 = uint(C.GDK_KEY_braille_dots_1236)
+ KEY_braille_dots_46 = uint(C.GDK_KEY_braille_dots_46)
+ KEY_braille_dots_146 = uint(C.GDK_KEY_braille_dots_146)
+ KEY_braille_dots_246 = uint(C.GDK_KEY_braille_dots_246)
+ KEY_braille_dots_1246 = uint(C.GDK_KEY_braille_dots_1246)
+ KEY_braille_dots_346 = uint(C.GDK_KEY_braille_dots_346)
+ KEY_braille_dots_1346 = uint(C.GDK_KEY_braille_dots_1346)
+ KEY_braille_dots_2346 = uint(C.GDK_KEY_braille_dots_2346)
+ KEY_braille_dots_12346 = uint(C.GDK_KEY_braille_dots_12346)
+ KEY_braille_dots_56 = uint(C.GDK_KEY_braille_dots_56)
+ KEY_braille_dots_156 = uint(C.GDK_KEY_braille_dots_156)
+ KEY_braille_dots_256 = uint(C.GDK_KEY_braille_dots_256)
+ KEY_braille_dots_1256 = uint(C.GDK_KEY_braille_dots_1256)
+ KEY_braille_dots_356 = uint(C.GDK_KEY_braille_dots_356)
+ KEY_braille_dots_1356 = uint(C.GDK_KEY_braille_dots_1356)
+ KEY_braille_dots_2356 = uint(C.GDK_KEY_braille_dots_2356)
+ KEY_braille_dots_12356 = uint(C.GDK_KEY_braille_dots_12356)
+ KEY_braille_dots_456 = uint(C.GDK_KEY_braille_dots_456)
+ KEY_braille_dots_1456 = uint(C.GDK_KEY_braille_dots_1456)
+ KEY_braille_dots_2456 = uint(C.GDK_KEY_braille_dots_2456)
+ KEY_braille_dots_12456 = uint(C.GDK_KEY_braille_dots_12456)
+ KEY_braille_dots_3456 = uint(C.GDK_KEY_braille_dots_3456)
+ KEY_braille_dots_13456 = uint(C.GDK_KEY_braille_dots_13456)
+ KEY_braille_dots_23456 = uint(C.GDK_KEY_braille_dots_23456)
+ KEY_braille_dots_123456 = uint(C.GDK_KEY_braille_dots_123456)
+ KEY_braille_dots_7 = uint(C.GDK_KEY_braille_dots_7)
+ KEY_braille_dots_17 = uint(C.GDK_KEY_braille_dots_17)
+ KEY_braille_dots_27 = uint(C.GDK_KEY_braille_dots_27)
+ KEY_braille_dots_127 = uint(C.GDK_KEY_braille_dots_127)
+ KEY_braille_dots_37 = uint(C.GDK_KEY_braille_dots_37)
+ KEY_braille_dots_137 = uint(C.GDK_KEY_braille_dots_137)
+ KEY_braille_dots_237 = uint(C.GDK_KEY_braille_dots_237)
+ KEY_braille_dots_1237 = uint(C.GDK_KEY_braille_dots_1237)
+ KEY_braille_dots_47 = uint(C.GDK_KEY_braille_dots_47)
+ KEY_braille_dots_147 = uint(C.GDK_KEY_braille_dots_147)
+ KEY_braille_dots_247 = uint(C.GDK_KEY_braille_dots_247)
+ KEY_braille_dots_1247 = uint(C.GDK_KEY_braille_dots_1247)
+ KEY_braille_dots_347 = uint(C.GDK_KEY_braille_dots_347)
+ KEY_braille_dots_1347 = uint(C.GDK_KEY_braille_dots_1347)
+ KEY_braille_dots_2347 = uint(C.GDK_KEY_braille_dots_2347)
+ KEY_braille_dots_12347 = uint(C.GDK_KEY_braille_dots_12347)
+ KEY_braille_dots_57 = uint(C.GDK_KEY_braille_dots_57)
+ KEY_braille_dots_157 = uint(C.GDK_KEY_braille_dots_157)
+ KEY_braille_dots_257 = uint(C.GDK_KEY_braille_dots_257)
+ KEY_braille_dots_1257 = uint(C.GDK_KEY_braille_dots_1257)
+ KEY_braille_dots_357 = uint(C.GDK_KEY_braille_dots_357)
+ KEY_braille_dots_1357 = uint(C.GDK_KEY_braille_dots_1357)
+ KEY_braille_dots_2357 = uint(C.GDK_KEY_braille_dots_2357)
+ KEY_braille_dots_12357 = uint(C.GDK_KEY_braille_dots_12357)
+ KEY_braille_dots_457 = uint(C.GDK_KEY_braille_dots_457)
+ KEY_braille_dots_1457 = uint(C.GDK_KEY_braille_dots_1457)
+ KEY_braille_dots_2457 = uint(C.GDK_KEY_braille_dots_2457)
+ KEY_braille_dots_12457 = uint(C.GDK_KEY_braille_dots_12457)
+ KEY_braille_dots_3457 = uint(C.GDK_KEY_braille_dots_3457)
+ KEY_braille_dots_13457 = uint(C.GDK_KEY_braille_dots_13457)
+ KEY_braille_dots_23457 = uint(C.GDK_KEY_braille_dots_23457)
+ KEY_braille_dots_123457 = uint(C.GDK_KEY_braille_dots_123457)
+ KEY_braille_dots_67 = uint(C.GDK_KEY_braille_dots_67)
+ KEY_braille_dots_167 = uint(C.GDK_KEY_braille_dots_167)
+ KEY_braille_dots_267 = uint(C.GDK_KEY_braille_dots_267)
+ KEY_braille_dots_1267 = uint(C.GDK_KEY_braille_dots_1267)
+ KEY_braille_dots_367 = uint(C.GDK_KEY_braille_dots_367)
+ KEY_braille_dots_1367 = uint(C.GDK_KEY_braille_dots_1367)
+ KEY_braille_dots_2367 = uint(C.GDK_KEY_braille_dots_2367)
+ KEY_braille_dots_12367 = uint(C.GDK_KEY_braille_dots_12367)
+ KEY_braille_dots_467 = uint(C.GDK_KEY_braille_dots_467)
+ KEY_braille_dots_1467 = uint(C.GDK_KEY_braille_dots_1467)
+ KEY_braille_dots_2467 = uint(C.GDK_KEY_braille_dots_2467)
+ KEY_braille_dots_12467 = uint(C.GDK_KEY_braille_dots_12467)
+ KEY_braille_dots_3467 = uint(C.GDK_KEY_braille_dots_3467)
+ KEY_braille_dots_13467 = uint(C.GDK_KEY_braille_dots_13467)
+ KEY_braille_dots_23467 = uint(C.GDK_KEY_braille_dots_23467)
+ KEY_braille_dots_123467 = uint(C.GDK_KEY_braille_dots_123467)
+ KEY_braille_dots_567 = uint(C.GDK_KEY_braille_dots_567)
+ KEY_braille_dots_1567 = uint(C.GDK_KEY_braille_dots_1567)
+ KEY_braille_dots_2567 = uint(C.GDK_KEY_braille_dots_2567)
+ KEY_braille_dots_12567 = uint(C.GDK_KEY_braille_dots_12567)
+ KEY_braille_dots_3567 = uint(C.GDK_KEY_braille_dots_3567)
+ KEY_braille_dots_13567 = uint(C.GDK_KEY_braille_dots_13567)
+ KEY_braille_dots_23567 = uint(C.GDK_KEY_braille_dots_23567)
+ KEY_braille_dots_123567 = uint(C.GDK_KEY_braille_dots_123567)
+ KEY_braille_dots_4567 = uint(C.GDK_KEY_braille_dots_4567)
+ KEY_braille_dots_14567 = uint(C.GDK_KEY_braille_dots_14567)
+ KEY_braille_dots_24567 = uint(C.GDK_KEY_braille_dots_24567)
+ KEY_braille_dots_124567 = uint(C.GDK_KEY_braille_dots_124567)
+ KEY_braille_dots_34567 = uint(C.GDK_KEY_braille_dots_34567)
+ KEY_braille_dots_134567 = uint(C.GDK_KEY_braille_dots_134567)
+ KEY_braille_dots_234567 = uint(C.GDK_KEY_braille_dots_234567)
+ KEY_braille_dots_1234567 = uint(C.GDK_KEY_braille_dots_1234567)
+ KEY_braille_dots_8 = uint(C.GDK_KEY_braille_dots_8)
+ KEY_braille_dots_18 = uint(C.GDK_KEY_braille_dots_18)
+ KEY_braille_dots_28 = uint(C.GDK_KEY_braille_dots_28)
+ KEY_braille_dots_128 = uint(C.GDK_KEY_braille_dots_128)
+ KEY_braille_dots_38 = uint(C.GDK_KEY_braille_dots_38)
+ KEY_braille_dots_138 = uint(C.GDK_KEY_braille_dots_138)
+ KEY_braille_dots_238 = uint(C.GDK_KEY_braille_dots_238)
+ KEY_braille_dots_1238 = uint(C.GDK_KEY_braille_dots_1238)
+ KEY_braille_dots_48 = uint(C.GDK_KEY_braille_dots_48)
+ KEY_braille_dots_148 = uint(C.GDK_KEY_braille_dots_148)
+ KEY_braille_dots_248 = uint(C.GDK_KEY_braille_dots_248)
+ KEY_braille_dots_1248 = uint(C.GDK_KEY_braille_dots_1248)
+ KEY_braille_dots_348 = uint(C.GDK_KEY_braille_dots_348)
+ KEY_braille_dots_1348 = uint(C.GDK_KEY_braille_dots_1348)
+ KEY_braille_dots_2348 = uint(C.GDK_KEY_braille_dots_2348)
+ KEY_braille_dots_12348 = uint(C.GDK_KEY_braille_dots_12348)
+ KEY_braille_dots_58 = uint(C.GDK_KEY_braille_dots_58)
+ KEY_braille_dots_158 = uint(C.GDK_KEY_braille_dots_158)
+ KEY_braille_dots_258 = uint(C.GDK_KEY_braille_dots_258)
+ KEY_braille_dots_1258 = uint(C.GDK_KEY_braille_dots_1258)
+ KEY_braille_dots_358 = uint(C.GDK_KEY_braille_dots_358)
+ KEY_braille_dots_1358 = uint(C.GDK_KEY_braille_dots_1358)
+ KEY_braille_dots_2358 = uint(C.GDK_KEY_braille_dots_2358)
+ KEY_braille_dots_12358 = uint(C.GDK_KEY_braille_dots_12358)
+ KEY_braille_dots_458 = uint(C.GDK_KEY_braille_dots_458)
+ KEY_braille_dots_1458 = uint(C.GDK_KEY_braille_dots_1458)
+ KEY_braille_dots_2458 = uint(C.GDK_KEY_braille_dots_2458)
+ KEY_braille_dots_12458 = uint(C.GDK_KEY_braille_dots_12458)
+ KEY_braille_dots_3458 = uint(C.GDK_KEY_braille_dots_3458)
+ KEY_braille_dots_13458 = uint(C.GDK_KEY_braille_dots_13458)
+ KEY_braille_dots_23458 = uint(C.GDK_KEY_braille_dots_23458)
+ KEY_braille_dots_123458 = uint(C.GDK_KEY_braille_dots_123458)
+ KEY_braille_dots_68 = uint(C.GDK_KEY_braille_dots_68)
+ KEY_braille_dots_168 = uint(C.GDK_KEY_braille_dots_168)
+ KEY_braille_dots_268 = uint(C.GDK_KEY_braille_dots_268)
+ KEY_braille_dots_1268 = uint(C.GDK_KEY_braille_dots_1268)
+ KEY_braille_dots_368 = uint(C.GDK_KEY_braille_dots_368)
+ KEY_braille_dots_1368 = uint(C.GDK_KEY_braille_dots_1368)
+ KEY_braille_dots_2368 = uint(C.GDK_KEY_braille_dots_2368)
+ KEY_braille_dots_12368 = uint(C.GDK_KEY_braille_dots_12368)
+ KEY_braille_dots_468 = uint(C.GDK_KEY_braille_dots_468)
+ KEY_braille_dots_1468 = uint(C.GDK_KEY_braille_dots_1468)
+ KEY_braille_dots_2468 = uint(C.GDK_KEY_braille_dots_2468)
+ KEY_braille_dots_12468 = uint(C.GDK_KEY_braille_dots_12468)
+ KEY_braille_dots_3468 = uint(C.GDK_KEY_braille_dots_3468)
+ KEY_braille_dots_13468 = uint(C.GDK_KEY_braille_dots_13468)
+ KEY_braille_dots_23468 = uint(C.GDK_KEY_braille_dots_23468)
+ KEY_braille_dots_123468 = uint(C.GDK_KEY_braille_dots_123468)
+ KEY_braille_dots_568 = uint(C.GDK_KEY_braille_dots_568)
+ KEY_braille_dots_1568 = uint(C.GDK_KEY_braille_dots_1568)
+ KEY_braille_dots_2568 = uint(C.GDK_KEY_braille_dots_2568)
+ KEY_braille_dots_12568 = uint(C.GDK_KEY_braille_dots_12568)
+ KEY_braille_dots_3568 = uint(C.GDK_KEY_braille_dots_3568)
+ KEY_braille_dots_13568 = uint(C.GDK_KEY_braille_dots_13568)
+ KEY_braille_dots_23568 = uint(C.GDK_KEY_braille_dots_23568)
+ KEY_braille_dots_123568 = uint(C.GDK_KEY_braille_dots_123568)
+ KEY_braille_dots_4568 = uint(C.GDK_KEY_braille_dots_4568)
+ KEY_braille_dots_14568 = uint(C.GDK_KEY_braille_dots_14568)
+ KEY_braille_dots_24568 = uint(C.GDK_KEY_braille_dots_24568)
+ KEY_braille_dots_124568 = uint(C.GDK_KEY_braille_dots_124568)
+ KEY_braille_dots_34568 = uint(C.GDK_KEY_braille_dots_34568)
+ KEY_braille_dots_134568 = uint(C.GDK_KEY_braille_dots_134568)
+ KEY_braille_dots_234568 = uint(C.GDK_KEY_braille_dots_234568)
+ KEY_braille_dots_1234568 = uint(C.GDK_KEY_braille_dots_1234568)
+ KEY_braille_dots_78 = uint(C.GDK_KEY_braille_dots_78)
+ KEY_braille_dots_178 = uint(C.GDK_KEY_braille_dots_178)
+ KEY_braille_dots_278 = uint(C.GDK_KEY_braille_dots_278)
+ KEY_braille_dots_1278 = uint(C.GDK_KEY_braille_dots_1278)
+ KEY_braille_dots_378 = uint(C.GDK_KEY_braille_dots_378)
+ KEY_braille_dots_1378 = uint(C.GDK_KEY_braille_dots_1378)
+ KEY_braille_dots_2378 = uint(C.GDK_KEY_braille_dots_2378)
+ KEY_braille_dots_12378 = uint(C.GDK_KEY_braille_dots_12378)
+ KEY_braille_dots_478 = uint(C.GDK_KEY_braille_dots_478)
+ KEY_braille_dots_1478 = uint(C.GDK_KEY_braille_dots_1478)
+ KEY_braille_dots_2478 = uint(C.GDK_KEY_braille_dots_2478)
+ KEY_braille_dots_12478 = uint(C.GDK_KEY_braille_dots_12478)
+ KEY_braille_dots_3478 = uint(C.GDK_KEY_braille_dots_3478)
+ KEY_braille_dots_13478 = uint(C.GDK_KEY_braille_dots_13478)
+ KEY_braille_dots_23478 = uint(C.GDK_KEY_braille_dots_23478)
+ KEY_braille_dots_123478 = uint(C.GDK_KEY_braille_dots_123478)
+ KEY_braille_dots_578 = uint(C.GDK_KEY_braille_dots_578)
+ KEY_braille_dots_1578 = uint(C.GDK_KEY_braille_dots_1578)
+ KEY_braille_dots_2578 = uint(C.GDK_KEY_braille_dots_2578)
+ KEY_braille_dots_12578 = uint(C.GDK_KEY_braille_dots_12578)
+ KEY_braille_dots_3578 = uint(C.GDK_KEY_braille_dots_3578)
+ KEY_braille_dots_13578 = uint(C.GDK_KEY_braille_dots_13578)
+ KEY_braille_dots_23578 = uint(C.GDK_KEY_braille_dots_23578)
+ KEY_braille_dots_123578 = uint(C.GDK_KEY_braille_dots_123578)
+ KEY_braille_dots_4578 = uint(C.GDK_KEY_braille_dots_4578)
+ KEY_braille_dots_14578 = uint(C.GDK_KEY_braille_dots_14578)
+ KEY_braille_dots_24578 = uint(C.GDK_KEY_braille_dots_24578)
+ KEY_braille_dots_124578 = uint(C.GDK_KEY_braille_dots_124578)
+ KEY_braille_dots_34578 = uint(C.GDK_KEY_braille_dots_34578)
+ KEY_braille_dots_134578 = uint(C.GDK_KEY_braille_dots_134578)
+ KEY_braille_dots_234578 = uint(C.GDK_KEY_braille_dots_234578)
+ KEY_braille_dots_1234578 = uint(C.GDK_KEY_braille_dots_1234578)
+ KEY_braille_dots_678 = uint(C.GDK_KEY_braille_dots_678)
+ KEY_braille_dots_1678 = uint(C.GDK_KEY_braille_dots_1678)
+ KEY_braille_dots_2678 = uint(C.GDK_KEY_braille_dots_2678)
+ KEY_braille_dots_12678 = uint(C.GDK_KEY_braille_dots_12678)
+ KEY_braille_dots_3678 = uint(C.GDK_KEY_braille_dots_3678)
+ KEY_braille_dots_13678 = uint(C.GDK_KEY_braille_dots_13678)
+ KEY_braille_dots_23678 = uint(C.GDK_KEY_braille_dots_23678)
+ KEY_braille_dots_123678 = uint(C.GDK_KEY_braille_dots_123678)
+ KEY_braille_dots_4678 = uint(C.GDK_KEY_braille_dots_4678)
+ KEY_braille_dots_14678 = uint(C.GDK_KEY_braille_dots_14678)
+ KEY_braille_dots_24678 = uint(C.GDK_KEY_braille_dots_24678)
+ KEY_braille_dots_124678 = uint(C.GDK_KEY_braille_dots_124678)
+ KEY_braille_dots_34678 = uint(C.GDK_KEY_braille_dots_34678)
+ KEY_braille_dots_134678 = uint(C.GDK_KEY_braille_dots_134678)
+ KEY_braille_dots_234678 = uint(C.GDK_KEY_braille_dots_234678)
+ KEY_braille_dots_1234678 = uint(C.GDK_KEY_braille_dots_1234678)
+ KEY_braille_dots_5678 = uint(C.GDK_KEY_braille_dots_5678)
+ KEY_braille_dots_15678 = uint(C.GDK_KEY_braille_dots_15678)
+ KEY_braille_dots_25678 = uint(C.GDK_KEY_braille_dots_25678)
+ KEY_braille_dots_125678 = uint(C.GDK_KEY_braille_dots_125678)
+ KEY_braille_dots_35678 = uint(C.GDK_KEY_braille_dots_35678)
+ KEY_braille_dots_135678 = uint(C.GDK_KEY_braille_dots_135678)
+ KEY_braille_dots_235678 = uint(C.GDK_KEY_braille_dots_235678)
+ KEY_braille_dots_1235678 = uint(C.GDK_KEY_braille_dots_1235678)
+ KEY_braille_dots_45678 = uint(C.GDK_KEY_braille_dots_45678)
+ KEY_braille_dots_145678 = uint(C.GDK_KEY_braille_dots_145678)
+ KEY_braille_dots_245678 = uint(C.GDK_KEY_braille_dots_245678)
+ KEY_braille_dots_1245678 = uint(C.GDK_KEY_braille_dots_1245678)
+ KEY_braille_dots_345678 = uint(C.GDK_KEY_braille_dots_345678)
+ KEY_braille_dots_1345678 = uint(C.GDK_KEY_braille_dots_1345678)
+ KEY_braille_dots_2345678 = uint(C.GDK_KEY_braille_dots_2345678)
+ KEY_braille_dots_12345678 = uint(C.GDK_KEY_braille_dots_12345678)
+ KEY_Sinh_ng = uint(C.GDK_KEY_Sinh_ng)
+ KEY_Sinh_h2 = uint(C.GDK_KEY_Sinh_h2)
+ KEY_Sinh_a = uint(C.GDK_KEY_Sinh_a)
+ KEY_Sinh_aa = uint(C.GDK_KEY_Sinh_aa)
+ KEY_Sinh_ae = uint(C.GDK_KEY_Sinh_ae)
+ KEY_Sinh_aee = uint(C.GDK_KEY_Sinh_aee)
+ KEY_Sinh_i = uint(C.GDK_KEY_Sinh_i)
+ KEY_Sinh_ii = uint(C.GDK_KEY_Sinh_ii)
+ KEY_Sinh_u = uint(C.GDK_KEY_Sinh_u)
+ KEY_Sinh_uu = uint(C.GDK_KEY_Sinh_uu)
+ KEY_Sinh_ri = uint(C.GDK_KEY_Sinh_ri)
+ KEY_Sinh_rii = uint(C.GDK_KEY_Sinh_rii)
+ KEY_Sinh_lu = uint(C.GDK_KEY_Sinh_lu)
+ KEY_Sinh_luu = uint(C.GDK_KEY_Sinh_luu)
+ KEY_Sinh_e = uint(C.GDK_KEY_Sinh_e)
+ KEY_Sinh_ee = uint(C.GDK_KEY_Sinh_ee)
+ KEY_Sinh_ai = uint(C.GDK_KEY_Sinh_ai)
+ KEY_Sinh_o = uint(C.GDK_KEY_Sinh_o)
+ KEY_Sinh_oo = uint(C.GDK_KEY_Sinh_oo)
+ KEY_Sinh_au = uint(C.GDK_KEY_Sinh_au)
+ KEY_Sinh_ka = uint(C.GDK_KEY_Sinh_ka)
+ KEY_Sinh_kha = uint(C.GDK_KEY_Sinh_kha)
+ KEY_Sinh_ga = uint(C.GDK_KEY_Sinh_ga)
+ KEY_Sinh_gha = uint(C.GDK_KEY_Sinh_gha)
+ KEY_Sinh_ng2 = uint(C.GDK_KEY_Sinh_ng2)
+ KEY_Sinh_nga = uint(C.GDK_KEY_Sinh_nga)
+ KEY_Sinh_ca = uint(C.GDK_KEY_Sinh_ca)
+ KEY_Sinh_cha = uint(C.GDK_KEY_Sinh_cha)
+ KEY_Sinh_ja = uint(C.GDK_KEY_Sinh_ja)
+ KEY_Sinh_jha = uint(C.GDK_KEY_Sinh_jha)
+ KEY_Sinh_nya = uint(C.GDK_KEY_Sinh_nya)
+ KEY_Sinh_jnya = uint(C.GDK_KEY_Sinh_jnya)
+ KEY_Sinh_nja = uint(C.GDK_KEY_Sinh_nja)
+ KEY_Sinh_tta = uint(C.GDK_KEY_Sinh_tta)
+ KEY_Sinh_ttha = uint(C.GDK_KEY_Sinh_ttha)
+ KEY_Sinh_dda = uint(C.GDK_KEY_Sinh_dda)
+ KEY_Sinh_ddha = uint(C.GDK_KEY_Sinh_ddha)
+ KEY_Sinh_nna = uint(C.GDK_KEY_Sinh_nna)
+ KEY_Sinh_ndda = uint(C.GDK_KEY_Sinh_ndda)
+ KEY_Sinh_tha = uint(C.GDK_KEY_Sinh_tha)
+ KEY_Sinh_thha = uint(C.GDK_KEY_Sinh_thha)
+ KEY_Sinh_dha = uint(C.GDK_KEY_Sinh_dha)
+ KEY_Sinh_dhha = uint(C.GDK_KEY_Sinh_dhha)
+ KEY_Sinh_na = uint(C.GDK_KEY_Sinh_na)
+ KEY_Sinh_ndha = uint(C.GDK_KEY_Sinh_ndha)
+ KEY_Sinh_pa = uint(C.GDK_KEY_Sinh_pa)
+ KEY_Sinh_pha = uint(C.GDK_KEY_Sinh_pha)
+ KEY_Sinh_ba = uint(C.GDK_KEY_Sinh_ba)
+ KEY_Sinh_bha = uint(C.GDK_KEY_Sinh_bha)
+ KEY_Sinh_ma = uint(C.GDK_KEY_Sinh_ma)
+ KEY_Sinh_mba = uint(C.GDK_KEY_Sinh_mba)
+ KEY_Sinh_ya = uint(C.GDK_KEY_Sinh_ya)
+ KEY_Sinh_ra = uint(C.GDK_KEY_Sinh_ra)
+ KEY_Sinh_la = uint(C.GDK_KEY_Sinh_la)
+ KEY_Sinh_va = uint(C.GDK_KEY_Sinh_va)
+ KEY_Sinh_sha = uint(C.GDK_KEY_Sinh_sha)
+ KEY_Sinh_ssha = uint(C.GDK_KEY_Sinh_ssha)
+ KEY_Sinh_sa = uint(C.GDK_KEY_Sinh_sa)
+ KEY_Sinh_ha = uint(C.GDK_KEY_Sinh_ha)
+ KEY_Sinh_lla = uint(C.GDK_KEY_Sinh_lla)
+ KEY_Sinh_fa = uint(C.GDK_KEY_Sinh_fa)
+ KEY_Sinh_al = uint(C.GDK_KEY_Sinh_al)
+ KEY_Sinh_aa2 = uint(C.GDK_KEY_Sinh_aa2)
+ KEY_Sinh_ae2 = uint(C.GDK_KEY_Sinh_ae2)
+ KEY_Sinh_aee2 = uint(C.GDK_KEY_Sinh_aee2)
+ KEY_Sinh_i2 = uint(C.GDK_KEY_Sinh_i2)
+ KEY_Sinh_ii2 = uint(C.GDK_KEY_Sinh_ii2)
+ KEY_Sinh_u2 = uint(C.GDK_KEY_Sinh_u2)
+ KEY_Sinh_uu2 = uint(C.GDK_KEY_Sinh_uu2)
+ KEY_Sinh_ru2 = uint(C.GDK_KEY_Sinh_ru2)
+ KEY_Sinh_e2 = uint(C.GDK_KEY_Sinh_e2)
+ KEY_Sinh_ee2 = uint(C.GDK_KEY_Sinh_ee2)
+ KEY_Sinh_ai2 = uint(C.GDK_KEY_Sinh_ai2)
+ KEY_Sinh_o2 = uint(C.GDK_KEY_Sinh_o2)
+ KEY_Sinh_oo2 = uint(C.GDK_KEY_Sinh_oo2)
+ KEY_Sinh_au2 = uint(C.GDK_KEY_Sinh_au2)
+ KEY_Sinh_lu2 = uint(C.GDK_KEY_Sinh_lu2)
+ KEY_Sinh_ruu2 = uint(C.GDK_KEY_Sinh_ruu2)
+ KEY_Sinh_luu2 = uint(C.GDK_KEY_Sinh_luu2)
+ KEY_Sinh_kunddaliya = uint(C.GDK_KEY_Sinh_kunddaliya)
+ KEY_ModeLock = uint(C.GDK_KEY_ModeLock)
+ KEY_MonBrightnessUp = uint(C.GDK_KEY_MonBrightnessUp)
+ KEY_MonBrightnessDown = uint(C.GDK_KEY_MonBrightnessDown)
+ KEY_KbdLightOnOff = uint(C.GDK_KEY_KbdLightOnOff)
+ KEY_KbdBrightnessUp = uint(C.GDK_KEY_KbdBrightnessUp)
+ KEY_KbdBrightnessDown = uint(C.GDK_KEY_KbdBrightnessDown)
+ KEY_Standby = uint(C.GDK_KEY_Standby)
+ KEY_AudioLowerVolume = uint(C.GDK_KEY_AudioLowerVolume)
+ KEY_AudioMute = uint(C.GDK_KEY_AudioMute)
+ KEY_AudioRaiseVolume = uint(C.GDK_KEY_AudioRaiseVolume)
+ KEY_AudioPlay = uint(C.GDK_KEY_AudioPlay)
+ KEY_AudioStop = uint(C.GDK_KEY_AudioStop)
+ KEY_AudioPrev = uint(C.GDK_KEY_AudioPrev)
+ KEY_AudioNext = uint(C.GDK_KEY_AudioNext)
+ KEY_HomePage = uint(C.GDK_KEY_HomePage)
+ KEY_Mail = uint(C.GDK_KEY_Mail)
+ KEY_Start = uint(C.GDK_KEY_Start)
+ KEY_Search = uint(C.GDK_KEY_Search)
+ KEY_AudioRecord = uint(C.GDK_KEY_AudioRecord)
+ KEY_Calculator = uint(C.GDK_KEY_Calculator)
+ KEY_Memo = uint(C.GDK_KEY_Memo)
+ KEY_ToDoList = uint(C.GDK_KEY_ToDoList)
+ KEY_Calendar = uint(C.GDK_KEY_Calendar)
+ KEY_PowerDown = uint(C.GDK_KEY_PowerDown)
+ KEY_ContrastAdjust = uint(C.GDK_KEY_ContrastAdjust)
+ KEY_RockerUp = uint(C.GDK_KEY_RockerUp)
+ KEY_RockerDown = uint(C.GDK_KEY_RockerDown)
+ KEY_RockerEnter = uint(C.GDK_KEY_RockerEnter)
+ KEY_Back = uint(C.GDK_KEY_Back)
+ KEY_Forward = uint(C.GDK_KEY_Forward)
+ KEY_Stop = uint(C.GDK_KEY_Stop)
+ KEY_Refresh = uint(C.GDK_KEY_Refresh)
+ KEY_PowerOff = uint(C.GDK_KEY_PowerOff)
+ KEY_WakeUp = uint(C.GDK_KEY_WakeUp)
+ KEY_Eject = uint(C.GDK_KEY_Eject)
+ KEY_ScreenSaver = uint(C.GDK_KEY_ScreenSaver)
+ KEY_WWW = uint(C.GDK_KEY_WWW)
+ KEY_Sleep = uint(C.GDK_KEY_Sleep)
+ KEY_Favorites = uint(C.GDK_KEY_Favorites)
+ KEY_AudioPause = uint(C.GDK_KEY_AudioPause)
+ KEY_AudioMedia = uint(C.GDK_KEY_AudioMedia)
+ KEY_MyComputer = uint(C.GDK_KEY_MyComputer)
+ KEY_VendorHome = uint(C.GDK_KEY_VendorHome)
+ KEY_LightBulb = uint(C.GDK_KEY_LightBulb)
+ KEY_Shop = uint(C.GDK_KEY_Shop)
+ KEY_History = uint(C.GDK_KEY_History)
+ KEY_OpenURL = uint(C.GDK_KEY_OpenURL)
+ KEY_AddFavorite = uint(C.GDK_KEY_AddFavorite)
+ KEY_HotLinks = uint(C.GDK_KEY_HotLinks)
+ KEY_BrightnessAdjust = uint(C.GDK_KEY_BrightnessAdjust)
+ KEY_Finance = uint(C.GDK_KEY_Finance)
+ KEY_Community = uint(C.GDK_KEY_Community)
+ KEY_AudioRewind = uint(C.GDK_KEY_AudioRewind)
+ KEY_BackForward = uint(C.GDK_KEY_BackForward)
+ KEY_Launch0 = uint(C.GDK_KEY_Launch0)
+ KEY_Launch1 = uint(C.GDK_KEY_Launch1)
+ KEY_Launch2 = uint(C.GDK_KEY_Launch2)
+ KEY_Launch3 = uint(C.GDK_KEY_Launch3)
+ KEY_Launch4 = uint(C.GDK_KEY_Launch4)
+ KEY_Launch5 = uint(C.GDK_KEY_Launch5)
+ KEY_Launch6 = uint(C.GDK_KEY_Launch6)
+ KEY_Launch7 = uint(C.GDK_KEY_Launch7)
+ KEY_Launch8 = uint(C.GDK_KEY_Launch8)
+ KEY_Launch9 = uint(C.GDK_KEY_Launch9)
+ KEY_LaunchA = uint(C.GDK_KEY_LaunchA)
+ KEY_LaunchB = uint(C.GDK_KEY_LaunchB)
+ KEY_LaunchC = uint(C.GDK_KEY_LaunchC)
+ KEY_LaunchD = uint(C.GDK_KEY_LaunchD)
+ KEY_LaunchE = uint(C.GDK_KEY_LaunchE)
+ KEY_LaunchF = uint(C.GDK_KEY_LaunchF)
+ KEY_ApplicationLeft = uint(C.GDK_KEY_ApplicationLeft)
+ KEY_ApplicationRight = uint(C.GDK_KEY_ApplicationRight)
+ KEY_Book = uint(C.GDK_KEY_Book)
+ KEY_CD = uint(C.GDK_KEY_CD)
+ KEY_WindowClear = uint(C.GDK_KEY_WindowClear)
+ KEY_Close = uint(C.GDK_KEY_Close)
+ KEY_Copy = uint(C.GDK_KEY_Copy)
+ KEY_Cut = uint(C.GDK_KEY_Cut)
+ KEY_Display = uint(C.GDK_KEY_Display)
+ KEY_DOS = uint(C.GDK_KEY_DOS)
+ KEY_Documents = uint(C.GDK_KEY_Documents)
+ KEY_Excel = uint(C.GDK_KEY_Excel)
+ KEY_Explorer = uint(C.GDK_KEY_Explorer)
+ KEY_Game = uint(C.GDK_KEY_Game)
+ KEY_Go = uint(C.GDK_KEY_Go)
+ KEY_iTouch = uint(C.GDK_KEY_iTouch)
+ KEY_LogOff = uint(C.GDK_KEY_LogOff)
+ KEY_Market = uint(C.GDK_KEY_Market)
+ KEY_Meeting = uint(C.GDK_KEY_Meeting)
+ KEY_MenuKB = uint(C.GDK_KEY_MenuKB)
+ KEY_MenuPB = uint(C.GDK_KEY_MenuPB)
+ KEY_MySites = uint(C.GDK_KEY_MySites)
+ KEY_New = uint(C.GDK_KEY_New)
+ KEY_News = uint(C.GDK_KEY_News)
+ KEY_OfficeHome = uint(C.GDK_KEY_OfficeHome)
+ KEY_Open = uint(C.GDK_KEY_Open)
+ KEY_Option = uint(C.GDK_KEY_Option)
+ KEY_Paste = uint(C.GDK_KEY_Paste)
+ KEY_Phone = uint(C.GDK_KEY_Phone)
+ KEY_Reply = uint(C.GDK_KEY_Reply)
+ KEY_Reload = uint(C.GDK_KEY_Reload)
+ KEY_RotateWindows = uint(C.GDK_KEY_RotateWindows)
+ KEY_RotationPB = uint(C.GDK_KEY_RotationPB)
+ KEY_RotationKB = uint(C.GDK_KEY_RotationKB)
+ KEY_Save = uint(C.GDK_KEY_Save)
+ KEY_ScrollUp = uint(C.GDK_KEY_ScrollUp)
+ KEY_ScrollDown = uint(C.GDK_KEY_ScrollDown)
+ KEY_ScrollClick = uint(C.GDK_KEY_ScrollClick)
+ KEY_Send = uint(C.GDK_KEY_Send)
+ KEY_Spell = uint(C.GDK_KEY_Spell)
+ KEY_SplitScreen = uint(C.GDK_KEY_SplitScreen)
+ KEY_Support = uint(C.GDK_KEY_Support)
+ KEY_TaskPane = uint(C.GDK_KEY_TaskPane)
+ KEY_Terminal = uint(C.GDK_KEY_Terminal)
+ KEY_Tools = uint(C.GDK_KEY_Tools)
+ KEY_Travel = uint(C.GDK_KEY_Travel)
+ KEY_UserPB = uint(C.GDK_KEY_UserPB)
+ KEY_User1KB = uint(C.GDK_KEY_User1KB)
+ KEY_User2KB = uint(C.GDK_KEY_User2KB)
+ KEY_Video = uint(C.GDK_KEY_Video)
+ KEY_WheelButton = uint(C.GDK_KEY_WheelButton)
+ KEY_Word = uint(C.GDK_KEY_Word)
+ KEY_Xfer = uint(C.GDK_KEY_Xfer)
+ KEY_ZoomIn = uint(C.GDK_KEY_ZoomIn)
+ KEY_ZoomOut = uint(C.GDK_KEY_ZoomOut)
+ KEY_Away = uint(C.GDK_KEY_Away)
+ KEY_Messenger = uint(C.GDK_KEY_Messenger)
+ KEY_WebCam = uint(C.GDK_KEY_WebCam)
+ KEY_MailForward = uint(C.GDK_KEY_MailForward)
+ KEY_Pictures = uint(C.GDK_KEY_Pictures)
+ KEY_Music = uint(C.GDK_KEY_Music)
+ KEY_Battery = uint(C.GDK_KEY_Battery)
+ KEY_Bluetooth = uint(C.GDK_KEY_Bluetooth)
+ KEY_WLAN = uint(C.GDK_KEY_WLAN)
+ KEY_UWB = uint(C.GDK_KEY_UWB)
+ KEY_AudioForward = uint(C.GDK_KEY_AudioForward)
+ KEY_AudioRepeat = uint(C.GDK_KEY_AudioRepeat)
+ KEY_AudioRandomPlay = uint(C.GDK_KEY_AudioRandomPlay)
+ KEY_Subtitle = uint(C.GDK_KEY_Subtitle)
+ KEY_AudioCycleTrack = uint(C.GDK_KEY_AudioCycleTrack)
+ KEY_CycleAngle = uint(C.GDK_KEY_CycleAngle)
+ KEY_FrameBack = uint(C.GDK_KEY_FrameBack)
+ KEY_FrameForward = uint(C.GDK_KEY_FrameForward)
+ KEY_Time = uint(C.GDK_KEY_Time)
+ KEY_SelectButton = uint(C.GDK_KEY_SelectButton)
+ KEY_View = uint(C.GDK_KEY_View)
+ KEY_TopMenu = uint(C.GDK_KEY_TopMenu)
+ KEY_Red = uint(C.GDK_KEY_Red)
+ KEY_Green = uint(C.GDK_KEY_Green)
+ KEY_Yellow = uint(C.GDK_KEY_Yellow)
+ KEY_Blue = uint(C.GDK_KEY_Blue)
+ KEY_Suspend = uint(C.GDK_KEY_Suspend)
+ KEY_Hibernate = uint(C.GDK_KEY_Hibernate)
+ KEY_TouchpadToggle = uint(C.GDK_KEY_TouchpadToggle)
+ KEY_TouchpadOn = uint(C.GDK_KEY_TouchpadOn)
+ KEY_TouchpadOff = uint(C.GDK_KEY_TouchpadOff)
+ KEY_AudioMicMute = uint(C.GDK_KEY_AudioMicMute)
+ KEY_Switch_VT_1 = uint(C.GDK_KEY_Switch_VT_1)
+ KEY_Switch_VT_2 = uint(C.GDK_KEY_Switch_VT_2)
+ KEY_Switch_VT_3 = uint(C.GDK_KEY_Switch_VT_3)
+ KEY_Switch_VT_4 = uint(C.GDK_KEY_Switch_VT_4)
+ KEY_Switch_VT_5 = uint(C.GDK_KEY_Switch_VT_5)
+ KEY_Switch_VT_6 = uint(C.GDK_KEY_Switch_VT_6)
+ KEY_Switch_VT_7 = uint(C.GDK_KEY_Switch_VT_7)
+ KEY_Switch_VT_8 = uint(C.GDK_KEY_Switch_VT_8)
+ KEY_Switch_VT_9 = uint(C.GDK_KEY_Switch_VT_9)
+ KEY_Switch_VT_10 = uint(C.GDK_KEY_Switch_VT_10)
+ KEY_Switch_VT_11 = uint(C.GDK_KEY_Switch_VT_11)
+ KEY_Switch_VT_12 = uint(C.GDK_KEY_Switch_VT_12)
+ KEY_Ungrab = uint(C.GDK_KEY_Ungrab)
+ KEY_ClearGrab = uint(C.GDK_KEY_ClearGrab)
+ KEY_Next_VMode = uint(C.GDK_KEY_Next_VMode)
+ KEY_Prev_VMode = uint(C.GDK_KEY_Prev_VMode)
+ KEY_LogWindowTree = uint(C.GDK_KEY_LogWindowTree)
+ KEY_LogGrabInfo = uint(C.GDK_KEY_LogGrabInfo)
+)
diff --git a/vendor/github.com/gotk3/gotk3/gdk/screen.go b/vendor/github.com/gotk3/gotk3/gdk/screen.go
new file mode 100644
index 0000000..da18c13
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/screen.go
@@ -0,0 +1,113 @@
+package gdk
+
+// #include <gdk/gdk.h>
+// #include "gdk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GdkScreen
+ */
+
+// Screen is a representation of GDK's GdkScreen.
+type Screen struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GdkScreen.
+func (v *Screen) native() *C.GdkScreen {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGdkScreen(p)
+}
+
+// Native returns a pointer to the underlying GdkScreen.
+func (v *Screen) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalScreen(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(c))}
+ return &Screen{obj}, nil
+}
+
+func toScreen(s *C.GdkScreen) (*Screen, error) {
+ if s == nil {
+ return nil, nilPtrErr
+ }
+ obj := &glib.Object{glib.ToGObject(unsafe.Pointer(s))}
+ return &Screen{obj}, nil
+}
+
+// GetRGBAVisual is a wrapper around gdk_screen_get_rgba_visual().
+func (v *Screen) GetRGBAVisual() (*Visual, error) {
+ c := C.gdk_screen_get_rgba_visual(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Visual{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// GetSystemVisual is a wrapper around gdk_screen_get_system_visual().
+func (v *Screen) GetSystemVisual() (*Visual, error) {
+ c := C.gdk_screen_get_system_visual(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return &Visual{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+// ScreenGetDefault is a wrapper around gdk_screen_get_default().
+func ScreenGetDefault() (*Screen, error) {
+ return toScreen(C.gdk_screen_get_default())
+}
+
+// IsComposited is a wrapper around gdk_screen_is_composited().
+func (v *Screen) IsComposited() bool {
+ return gobool(C.gdk_screen_is_composited(v.native()))
+}
+
+// GetRootWindow is a wrapper around gdk_screen_get_root_window().
+func (v *Screen) GetRootWindow() (*Window, error) {
+ return toWindow(C.gdk_screen_get_root_window(v.native()))
+}
+
+// GetDisplay is a wrapper around gdk_screen_get_display().
+func (v *Screen) GetDisplay() (*Display, error) {
+ return toDisplay(C.gdk_screen_get_display(v.native()))
+}
+
+func toString(c *C.gchar) (string, error) {
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return C.GoString((*C.char)(c)), nil
+}
+
+// GetResolution is a wrapper around gdk_screen_get_resolution().
+func (v *Screen) GetResolution() float64 {
+ return float64(C.gdk_screen_get_resolution(v.native()))
+}
+
+// SetResolution is a wrapper around gdk_screen_set_resolution().
+func (v *Screen) SetResolution(r float64) {
+ C.gdk_screen_set_resolution(v.native(), C.gdouble(r))
+}
+
+// void gdk_screen_set_font_options ()
+// gboolean gdk_screen_get_setting ()
+// const cairo_font_options_t * gdk_screen_get_font_options ()
+// GList * gdk_screen_get_window_stack ()
+// GList * gdk_screen_list_visuals ()
+// GList * gdk_screen_get_toplevel_windows ()
+// void gdk_screen_get_monitor_geometry ()
+// void gdk_screen_get_monitor_workarea ()
diff --git a/vendor/github.com/gotk3/gotk3/gdk/screen_no_x11.go b/vendor/github.com/gotk3/gotk3/gdk/screen_no_x11.go
new file mode 100644
index 0000000..9551598
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/screen_no_x11.go
@@ -0,0 +1,25 @@
+// +build !linux no_x11
+
+package gdk
+
+func WorkspaceControlSupported() bool {
+ return false
+}
+
+// GetScreenNumber is a wrapper around gdk_x11_screen_get_screen_number().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Screen) GetScreenNumber() int {
+ return -1
+}
+
+// GetNumberOfDesktops is a wrapper around gdk_x11_screen_get_number_of_desktops().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Screen) GetNumberOfDesktops() uint32 {
+ return 0
+}
+
+// GetCurrentDesktop is a wrapper around gdk_x11_screen_get_current_desktop().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Screen) GetCurrentDesktop() uint32 {
+ return 0
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/screen_x11.go b/vendor/github.com/gotk3/gotk3/gdk/screen_x11.go
new file mode 100644
index 0000000..ba17d1a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/screen_x11.go
@@ -0,0 +1,30 @@
+// +build linux
+// +build !no_x11
+
+package gdk
+
+// #include <gdk/gdk.h>
+// #include <gdk/gdkx.h>
+import "C"
+
+func WorkspaceControlSupported() bool {
+ return true
+}
+
+// GetScreenNumber is a wrapper around gdk_x11_screen_get_screen_number().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Screen) GetScreenNumber() int {
+ return int(C.gdk_x11_screen_get_screen_number(v.native()))
+}
+
+// GetNumberOfDesktops is a wrapper around gdk_x11_screen_get_number_of_desktops().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Screen) GetNumberOfDesktops() uint32 {
+ return uint32(C.gdk_x11_screen_get_number_of_desktops(v.native()))
+}
+
+// GetCurrentDesktop is a wrapper around gdk_x11_screen_get_current_desktop().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Screen) GetCurrentDesktop() uint32 {
+ return uint32(C.gdk_x11_screen_get_current_desktop(v.native()))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/window_no_x11.go b/vendor/github.com/gotk3/gotk3/gdk/window_no_x11.go
new file mode 100644
index 0000000..72c5665
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/window_no_x11.go
@@ -0,0 +1,17 @@
+// +build !linux no_x11
+
+package gdk
+
+func (v *Window) MoveToCurrentDesktop() {
+}
+
+// GetDesktop is a wrapper around gdk_x11_window_get_desktop().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Window) GetDesktop() uint32 {
+ return 0
+}
+
+// MoveToDesktop is a wrapper around gdk_x11_window_move_to_desktop().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Window) MoveToDesktop(d uint32) {
+}
diff --git a/vendor/github.com/gotk3/gotk3/gdk/window_x11.go b/vendor/github.com/gotk3/gotk3/gdk/window_x11.go
new file mode 100644
index 0000000..5161c8c
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gdk/window_x11.go
@@ -0,0 +1,26 @@
+// +build linux
+// +build !no_x11
+
+package gdk
+
+// #include <gdk/gdk.h>
+// #include <gdk/gdkx.h>
+import "C"
+
+// MoveToCurrentDesktop is a wrapper around gdk_x11_window_move_to_current_desktop().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Window) MoveToCurrentDesktop() {
+ C.gdk_x11_window_move_to_current_desktop(v.native())
+}
+
+// GetDesktop is a wrapper around gdk_x11_window_get_desktop().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Window) GetDesktop() uint32 {
+ return uint32(C.gdk_x11_window_get_desktop(v.native()))
+}
+
+// MoveToDesktop is a wrapper around gdk_x11_window_move_to_desktop().
+// It only works on GDK versions compiled with X11 support - its return value can't be used if WorkspaceControlSupported returns false
+func (v *Window) MoveToDesktop(d uint32) {
+ C.gdk_x11_window_move_to_desktop(v.native(), C.guint32(d))
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/application.go b/vendor/github.com/gotk3/gotk3/glib/application.go
new file mode 100644
index 0000000..81ad34e
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/application.go
@@ -0,0 +1,219 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// Application is a representation of GApplication.
+type Application struct {
+ *Object
+
+ // Interfaces
+ IActionMap
+ IActionGroup
+}
+
+// native() returns a pointer to the underlying GApplication.
+func (v *Application) native() *C.GApplication {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGApplication(unsafe.Pointer(v.GObject))
+}
+
+func (v *Application) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalApplication(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapApplication(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapApplication(obj *Object) *Application {
+ am := wrapActionMap(obj)
+ ag := wrapActionGroup(obj)
+ return &Application{obj, am, ag}
+}
+
+// ApplicationIDIsValid is a wrapper around g_application_id_is_valid().
+func ApplicationIDIsValid(id string) bool {
+ cstr1 := (*C.gchar)(C.CString(id))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return gobool(C.g_application_id_is_valid(cstr1))
+}
+
+// ApplicationNew is a wrapper around g_application_new().
+func ApplicationNew(appID string, flags ApplicationFlags) *Application {
+ cstr1 := (*C.gchar)(C.CString(appID))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ c := C.g_application_new(cstr1, C.GApplicationFlags(flags))
+ if c == nil {
+ return nil
+ }
+ return wrapApplication(wrapObject(unsafe.Pointer(c)))
+}
+
+// GetApplicationID is a wrapper around g_application_get_application_id().
+func (v *Application) GetApplicationID() string {
+ c := C.g_application_get_application_id(v.native())
+
+ return C.GoString((*C.char)(c))
+}
+
+// SetApplicationID is a wrapper around g_application_set_application_id().
+func (v *Application) SetApplicationID(id string) {
+ cstr1 := (*C.gchar)(C.CString(id))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_application_set_application_id(v.native(), cstr1)
+}
+
+// GetInactivityTimeout is a wrapper around g_application_get_inactivity_timeout().
+func (v *Application) GetInactivityTimeout() uint {
+ return uint(C.g_application_get_inactivity_timeout(v.native()))
+}
+
+// SetInactivityTimeout is a wrapper around g_application_set_inactivity_timeout().
+func (v *Application) SetInactivityTimeout(timeout uint) {
+ C.g_application_set_inactivity_timeout(v.native(), C.guint(timeout))
+}
+
+// GetFlags is a wrapper around g_application_get_flags().
+func (v *Application) GetFlags() ApplicationFlags {
+ return ApplicationFlags(C.g_application_get_flags(v.native()))
+}
+
+// SetFlags is a wrapper around g_application_set_flags().
+func (v *Application) SetFlags(flags ApplicationFlags) {
+ C.g_application_set_flags(v.native(), C.GApplicationFlags(flags))
+}
+
+// Only available in GLib 2.42+
+// // GetResourceBasePath is a wrapper around g_application_get_resource_base_path().
+// func (v *Application) GetResourceBasePath() string {
+// c := C.g_application_get_resource_base_path(v.native())
+
+// return C.GoString((*C.char)(c))
+// }
+
+// Only available in GLib 2.42+
+// // SetResourceBasePath is a wrapper around g_application_set_resource_base_path().
+// func (v *Application) SetResourceBasePath(bp string) {
+// cstr1 := (*C.gchar)(C.CString(bp))
+// defer C.free(unsafe.Pointer(cstr1))
+
+// C.g_application_set_resource_base_path(v.native(), cstr1)
+// }
+
+// GetDbusObjectPath is a wrapper around g_application_get_dbus_object_path().
+func (v *Application) GetDbusObjectPath() string {
+ c := C.g_application_get_dbus_object_path(v.native())
+
+ return C.GoString((*C.char)(c))
+}
+
+// GetIsRegistered is a wrapper around g_application_get_is_registered().
+func (v *Application) GetIsRegistered() bool {
+ return gobool(C.g_application_get_is_registered(v.native()))
+}
+
+// GetIsRemote is a wrapper around g_application_get_is_remote().
+func (v *Application) GetIsRemote() bool {
+ return gobool(C.g_application_get_is_remote(v.native()))
+}
+
+// Hold is a wrapper around g_application_hold().
+func (v *Application) Hold() {
+ C.g_application_hold(v.native())
+}
+
+// Release is a wrapper around g_application_release().
+func (v *Application) Release() {
+ C.g_application_release(v.native())
+}
+
+// Quit is a wrapper around g_application_quit().
+func (v *Application) Quit() {
+ C.g_application_quit(v.native())
+}
+
+// Activate is a wrapper around g_application_activate().
+func (v *Application) Activate() {
+ C.g_application_activate(v.native())
+}
+
+// SendNotification is a wrapper around g_application_send_notification().
+func (v *Application) SendNotification(id string, notification *Notification) {
+ cstr1 := (*C.gchar)(C.CString(id))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_application_send_notification(v.native(), cstr1, notification.native())
+}
+
+// WithdrawNotification is a wrapper around g_application_withdraw_notification().
+func (v *Application) WithdrawNotification(id string) {
+ cstr1 := (*C.gchar)(C.CString(id))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_application_withdraw_notification(v.native(), cstr1)
+}
+
+// SetDefault is a wrapper around g_application_set_default().
+func (v *Application) SetDefault() {
+ C.g_application_set_default(v.native())
+}
+
+// ApplicationGetDefault is a wrapper around g_application_get_default().
+func ApplicationGetDefault() *Application {
+ c := C.g_application_get_default()
+ if c == nil {
+ return nil
+ }
+ return wrapApplication(wrapObject(unsafe.Pointer(c)))
+}
+
+// MarkBusy is a wrapper around g_application_mark_busy().
+func (v *Application) MarkBusy() {
+ C.g_application_mark_busy(v.native())
+}
+
+// UnmarkBusy is a wrapper around g_application_unmark_busy().
+func (v *Application) UnmarkBusy() {
+ C.g_application_unmark_busy(v.native())
+}
+
+// Run is a wrapper around g_application_run().
+func (v *Application) Run(args []string) int {
+ cargs := C.make_strings(C.int(len(args)))
+ defer C.destroy_strings(cargs)
+
+ for i, arg := range args {
+ cstr := C.CString(arg)
+ defer C.free(unsafe.Pointer(cstr))
+ C.set_string(cargs, C.int(i), (*C.char)(cstr))
+ }
+
+ return int(C.g_application_run(v.native(), C.int(len(args)), cargs))
+}
+
+// Only available in GLib 2.44+
+// // GetIsBusy is a wrapper around g_application_get_is_busy().
+// func (v *Application) GetIsBusy() bool {
+// return gobool(C.g_application_get_is_busy(v.native()))
+// }
+
+// void g_application_bind_busy_property ()
+// void g_application_unbind_busy_property ()
+// gboolean g_application_register () // requires GCancellable
+// void g_application_set_action_group () // Deprecated since 2.32
+// GDBusConnection * g_application_get_dbus_connection () // No support for GDBusConnection
+// void g_application_open () // Needs GFile
+// void g_application_add_main_option_entries () //Needs GOptionEntry
+// void g_application_add_main_option () //Needs GOptionFlags and GOptionArg
+// void g_application_add_option_group () // Needs GOptionGroup
diff --git a/vendor/github.com/gotk3/gotk3/glib/connect.go b/vendor/github.com/gotk3/gotk3/glib/connect.go
new file mode 100644
index 0000000..9cd9a0e
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/connect.go
@@ -0,0 +1,116 @@
+package glib
+
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import (
+ "errors"
+ "reflect"
+ "unsafe"
+)
+
+/*
+ * Events
+ */
+
+type SignalHandle uint
+
+func (v *Object) connectClosure(after bool, detailedSignal string, f interface{}, userData ...interface{}) (SignalHandle, error) {
+ if len(userData) > 1 {
+ return 0, errors.New("userData len must be 0 or 1")
+ }
+
+ cstr := C.CString(detailedSignal)
+ defer C.free(unsafe.Pointer(cstr))
+
+ closure, err := ClosureNew(f, userData...)
+ if err != nil {
+ return 0, err
+ }
+
+ C._g_closure_add_finalize_notifier(closure)
+
+ c := C.g_signal_connect_closure(C.gpointer(v.native()),
+ (*C.gchar)(cstr), closure, gbool(after))
+ handle := SignalHandle(c)
+
+ // Map the signal handle to the closure.
+ signals[handle] = closure
+
+ return handle, nil
+}
+
+// Connect is a wrapper around g_signal_connect_closure(). f must be
+// a function with a signaure matching the callback signature for
+// detailedSignal. userData must either 0 or 1 elements which can
+// be optionally passed to f. If f takes less arguments than it is
+// passed from the GLib runtime, the extra arguments are ignored.
+//
+// Arguments for f must be a matching Go equivalent type for the
+// C callback, or an interface type which the value may be packed in.
+// If the type is not suitable, a runtime panic will occur when the
+// signal is emitted.
+func (v *Object) Connect(detailedSignal string, f interface{}, userData ...interface{}) (SignalHandle, error) {
+ return v.connectClosure(false, detailedSignal, f, userData...)
+}
+
+// ConnectAfter is a wrapper around g_signal_connect_closure(). f must be
+// a function with a signaure matching the callback signature for
+// detailedSignal. userData must either 0 or 1 elements which can
+// be optionally passed to f. If f takes less arguments than it is
+// passed from the GLib runtime, the extra arguments are ignored.
+//
+// Arguments for f must be a matching Go equivalent type for the
+// C callback, or an interface type which the value may be packed in.
+// If the type is not suitable, a runtime panic will occur when the
+// signal is emitted.
+//
+// The difference between Connect and ConnectAfter is that the latter
+// will be invoked after the default handler, not before.
+func (v *Object) ConnectAfter(detailedSignal string, f interface{}, userData ...interface{}) (SignalHandle, error) {
+ return v.connectClosure(true, detailedSignal, f, userData...)
+}
+
+// ClosureNew creates a new GClosure and adds its callback function
+// to the internally-maintained map. It's exported for visibility to other
+// gotk3 packages and shouldn't be used in application code.
+func ClosureNew(f interface{}, marshalData ...interface{}) (*C.GClosure, error) {
+ // Create a reflect.Value from f. This is called when the
+ // returned GClosure runs.
+ rf := reflect.ValueOf(f)
+
+ // Create closure context which points to the reflected func.
+ cc := closureContext{rf: rf}
+
+ // Closures can only be created from funcs.
+ if rf.Type().Kind() != reflect.Func {
+ return nil, errors.New("value is not a func")
+ }
+
+ if len(marshalData) > 0 {
+ cc.userData = reflect.ValueOf(marshalData[0])
+ }
+
+ c := C._g_closure_new()
+
+ // Associate the GClosure with rf. rf will be looked up in this
+ // map by the closure when the closure runs.
+ closures.Lock()
+ closures.m[c] = cc
+ closures.Unlock()
+
+ return c, nil
+}
+
+// removeClosure removes a closure from the internal closures map. This is
+// needed to prevent a leak where Go code can access the closure context
+// (along with rf and userdata) even after an object has been destroyed and
+// the GClosure is invalidated and will never run.
+//
+//export removeClosure
+func removeClosure(_ C.gpointer, closure *C.GClosure) {
+ closures.Lock()
+ delete(closures.m, closure)
+ closures.Unlock()
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gaction.go b/vendor/github.com/gotk3/gotk3/glib/gaction.go
new file mode 100644
index 0000000..94bc32e
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gaction.go
@@ -0,0 +1,215 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// Action is a representation of glib's GAction GInterface.
+type Action struct {
+ *Object
+}
+
+// IAction is an interface type implemented by all structs
+// embedding an Action. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C function taking a
+// GAction.
+type IAction interface {
+ toGAction() *C.GAction
+ toAction() *Action
+}
+
+func (v *Action) toGAction() *C.GAction {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func (v *Action) toAction() *Action {
+ return v
+}
+
+// gboolean g_action_parse_detailed_name (const gchar *detailed_name, gchar **action_name, GVariant **target_value, GError **error);
+// gchar * g_action_print_detailed_name (const gchar *action_name, GVariant *target_value);
+
+// native() returns a pointer to the underlying GAction.
+func (v *Action) native() *C.GAction {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGAction(unsafe.Pointer(v.GObject))
+}
+
+func (v *Action) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalAction(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapAction(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapAction(obj *Object) *Action {
+ return &Action{obj}
+}
+
+// ActionNameIsValid is a wrapper around g_action_name_is_valid
+func ActionNameIsValid(actionName string) bool {
+ cstr := (*C.gchar)(C.CString(actionName))
+ return gobool(C.g_action_name_is_valid(cstr))
+}
+
+// GetName is a wrapper around g_action_get_name
+func (v *Action) GetName() string {
+ return C.GoString((*C.char)(C.g_action_get_name(v.native())))
+}
+
+// GetEnabled is a wrapper around g_action_get_enabled
+func (v *Action) GetEnabled() bool {
+ return gobool(C.g_action_get_enabled(v.native()))
+}
+
+// GetState is a wrapper around g_action_get_state
+func (v *Action) GetState() *Variant {
+ c := C.g_action_get_state(v.native())
+ if c == nil {
+ return nil
+ }
+ return newVariant((*C.GVariant)(c))
+}
+
+// GetStateHint is a wrapper around g_action_get_state_hint
+func (v *Action) GetStateHint() *Variant {
+ c := C.g_action_get_state_hint(v.native())
+ if c == nil {
+ return nil
+ }
+ return newVariant((*C.GVariant)(c))
+}
+
+// GetParameterType is a wrapper around g_action_get_parameter_type
+func (v *Action) GetParameterType() *VariantType {
+ c := C.g_action_get_parameter_type(v.native())
+ if c == nil {
+ return nil
+ }
+ return newVariantType((*C.GVariantType)(c))
+}
+
+// GetStateType is a wrapper around g_action_get_state_type
+func (v *Action) GetStateType() *VariantType {
+ c := C.g_action_get_state_type(v.native())
+ if c == nil {
+ return nil
+ }
+ return newVariantType((*C.GVariantType)(c))
+}
+
+// ChangeState is a wrapper around g_action_change_state
+func (v *Action) ChangeState(value *Variant) {
+ C.g_action_change_state(v.native(), value.native())
+}
+
+// Activate is a wrapper around g_action_activate
+func (v *Action) Activate(parameter *Variant) {
+ C.g_action_activate(v.native(), parameter.native())
+}
+
+// SimpleAction is a representation of GSimpleAction
+type SimpleAction struct {
+ Action
+}
+
+func (v *SimpleAction) native() *C.GSimpleAction {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGSimpleAction(unsafe.Pointer(v.GObject))
+}
+
+func (v *SimpleAction) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalSimpleAction(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapSimpleAction(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapSimpleAction(obj *Object) *SimpleAction {
+ return &SimpleAction{Action{obj}}
+}
+
+// SimpleActionNew is a wrapper around g_simple_action_new
+func SimpleActionNew(name string, parameterType *VariantType) *SimpleAction {
+ c := C.g_simple_action_new((*C.gchar)(C.CString(name)), parameterType.native())
+ if c == nil {
+ return nil
+ }
+ return wrapSimpleAction(wrapObject(unsafe.Pointer(c)))
+}
+
+// SimpleActionNewStateful is a wrapper around g_simple_action_new_stateful
+func SimpleActionNewStateful(name string, parameterType *VariantType, state *Variant) *SimpleAction {
+ c := C.g_simple_action_new_stateful((*C.gchar)(C.CString(name)), parameterType.native(), state.native())
+ if c == nil {
+ return nil
+ }
+ return wrapSimpleAction(wrapObject(unsafe.Pointer(c)))
+}
+
+// SetEnabled is a wrapper around g_simple_action_set_enabled
+func (v *SimpleAction) SetEnabled(enabled bool) {
+ C.g_simple_action_set_enabled(v.native(), gbool(enabled))
+}
+
+// SetState is a wrapper around g_simple_action_set_state
+// This should only be called by the implementor of the action.
+// Users of the action should not attempt to directly modify the 'state' property.
+// Instead, they should call ChangeState [g_action_change_state()] to request the change.
+func (v *SimpleAction) SetState(value *Variant) {
+ C.g_simple_action_set_state(v.native(), value.native())
+}
+
+// SetStateHint is a wrapper around g_simple_action_set_state_hint
+// GLib 2.44 only (currently no build tags, so commented out)
+/*func (v *SimpleAction) SetStateHint(stateHint *Variant) {
+ C.g_simple_action_set_state_hint(v.native(), stateHint.native())
+}*/
+
+// PropertyAction is a representation of GPropertyAction
+type PropertyAction struct {
+ Action
+}
+
+func (v *PropertyAction) native() *C.GPropertyAction {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGPropertyAction(unsafe.Pointer(v.GObject))
+}
+
+func (v *PropertyAction) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalPropertyAction(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapPropertyAction(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapPropertyAction(obj *Object) *PropertyAction {
+ return &PropertyAction{Action{obj}}
+}
+
+// PropertyActionNew is a wrapper around g_property_action_new
+func PropertyActionNew(name string, object *Object, propertyName string) *PropertyAction {
+ c := C.g_property_action_new((*C.gchar)(C.CString(name)), C.gpointer(unsafe.Pointer(object.native())), (*C.gchar)(C.CString(propertyName)))
+ if c == nil {
+ return nil
+ }
+ return wrapPropertyAction(wrapObject(unsafe.Pointer(c)))
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gactiongroup.go b/vendor/github.com/gotk3/gotk3/glib/gactiongroup.go
new file mode 100644
index 0000000..4c1c654
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gactiongroup.go
@@ -0,0 +1,113 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// IActionGroup is an interface representation of ActionGroup,
+// used to avoid duplication when embedding the type in a wrapper of another GObject-based type.
+type IActionGroup interface {
+ Native() uintptr
+
+ HasAction(actionName string) bool
+ GetActionEnabled(actionName string) bool
+ GetActionParameterType(actionName string) *VariantType
+ GetActionStateType(actionName string) *VariantType
+ GetActionState(actionName string) *Variant
+ GetActionStateHint(actionName string) *Variant
+ ChangeActionState(actionName string, value *Variant)
+ Activate(actionName string, parameter *Variant)
+}
+
+// ActionGroup is a representation of glib's GActionGroup GInterface
+type ActionGroup struct {
+ *Object
+}
+
+// g_action_group_list_actions()
+// g_action_group_query_action()
+// should only called from implementations:
+// g_action_group_action_added
+// g_action_group_action_removed
+// g_action_group_action_enabled_changed
+// g_action_group_action_state_changed
+
+// native() returns a pointer to the underlying GActionGroup.
+func (v *ActionGroup) native() *C.GActionGroup {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGActionGroup(unsafe.Pointer(v.GObject))
+}
+
+func (v *ActionGroup) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalActionGroup(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapActionGroup(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapActionGroup(obj *Object) *ActionGroup {
+ return &ActionGroup{obj}
+}
+
+// HasAction is a wrapper around g_action_group_has_action().
+func (v *ActionGroup) HasAction(actionName string) bool {
+ return gobool(C.g_action_group_has_action(v.native(), (*C.gchar)(C.CString(actionName))))
+}
+
+// GetActionEnabled is a wrapper around g_action_group_get_action_enabled().
+func (v *ActionGroup) GetActionEnabled(actionName string) bool {
+ return gobool(C.g_action_group_get_action_enabled(v.native(), (*C.gchar)(C.CString(actionName))))
+}
+
+// GetActionParameterType is a wrapper around g_action_group_get_action_parameter_type().
+func (v *ActionGroup) GetActionParameterType(actionName string) *VariantType {
+ c := C.g_action_group_get_action_parameter_type(v.native(), (*C.gchar)(C.CString(actionName)))
+ if c == nil {
+ return nil
+ }
+ return newVariantType((*C.GVariantType)(c))
+}
+
+// GetActionStateType is a wrapper around g_action_group_get_action_state_type().
+func (v *ActionGroup) GetActionStateType(actionName string) *VariantType {
+ c := C.g_action_group_get_action_state_type(v.native(), (*C.gchar)(C.CString(actionName)))
+ if c == nil {
+ return nil
+ }
+ return newVariantType((*C.GVariantType)(c))
+}
+
+// GetActionState is a wrapper around g_action_group_get_action_state().
+func (v *ActionGroup) GetActionState(actionName string) *Variant {
+ c := C.g_action_group_get_action_state(v.native(), (*C.gchar)(C.CString(actionName)))
+ if c == nil {
+ return nil
+ }
+ return newVariant((*C.GVariant)(c))
+}
+
+// GetActionStateHint is a wrapper around g_action_group_get_action_state_hint().
+func (v *ActionGroup) GetActionStateHint(actionName string) *Variant {
+ c := C.g_action_group_get_action_state_hint(v.native(), (*C.gchar)(C.CString(actionName)))
+ if c == nil {
+ return nil
+ }
+ return newVariant((*C.GVariant)(c))
+}
+
+// ChangeActionState is a wrapper around g_action_group_change_action_state
+func (v *ActionGroup) ChangeActionState(actionName string, value *Variant) {
+ C.g_action_group_change_action_state(v.native(), (*C.gchar)(C.CString(actionName)), value.native())
+}
+
+// Activate is a wrapper around g_action_group_activate_action
+func (v *ActionGroup) Activate(actionName string, parameter *Variant) {
+ C.g_action_group_activate_action(v.native(), (*C.gchar)(C.CString(actionName)), parameter.native())
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gactionmap.go b/vendor/github.com/gotk3/gotk3/glib/gactionmap.go
new file mode 100644
index 0000000..f5b8998
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gactionmap.go
@@ -0,0 +1,66 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// IActionMap is an interface representation of ActionMap,
+// used to avoid duplication when embedding the type in a wrapper of another GObject-based type.
+type IActionMap interface {
+ Native() uintptr
+
+ LookupAction(actionName string) *Action
+ AddAction(action IAction)
+ RemoveAction(actionName string)
+}
+
+// ActionMap is a representation of glib's GActionMap GInterface
+type ActionMap struct {
+ *Object
+}
+
+// void g_action_map_add_action_entries (GActionMap *action_map, const GActionEntry *entries, gint n_entries, gpointer user_data);
+// struct GActionEntry
+
+// native() returns a pointer to the underlying GActionMap.
+func (v *ActionMap) native() *C.GActionMap {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGActionMap(unsafe.Pointer(v.GObject))
+}
+
+func (v *ActionMap) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalActionMap(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapActionMap(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapActionMap(obj *Object) *ActionMap {
+ return &ActionMap{obj}
+}
+
+// LookupAction is a wrapper around g_action_map_lookup_action
+func (v *ActionMap) LookupAction(actionName string) *Action {
+ c := C.g_action_map_lookup_action(v.native(), (*C.gchar)(C.CString(actionName)))
+ if c == nil {
+ return nil
+ }
+ return wrapAction(wrapObject(unsafe.Pointer(c)))
+}
+
+// AddAction is a wrapper around g_action_map_add_action
+func (v *ActionMap) AddAction(action IAction) {
+ C.g_action_map_add_action(v.native(), action.toGAction())
+}
+
+// RemoveAction is a wrapper around g_action_map_remove_action
+func (v *ActionMap) RemoveAction(actionName string) {
+ C.g_action_map_remove_action(v.native(), (*C.gchar)(C.CString(actionName)))
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gbinding.go b/vendor/github.com/gotk3/gotk3/glib/gbinding.go
new file mode 100644
index 0000000..133ce12
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gbinding.go
@@ -0,0 +1,98 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+type BindingFlags int
+
+const (
+ BINDING_DEFAULT BindingFlags = C.G_BINDING_DEFAULT
+ BINDING_BIDIRECTIONAL BindingFlags = C.G_BINDING_BIDIRECTIONAL
+ BINDING_SYNC_CREATE = C.G_BINDING_SYNC_CREATE
+ BINDING_INVERT_BOOLEAN = C.G_BINDING_INVERT_BOOLEAN
+)
+
+type Binding struct {
+ *Object
+}
+
+func (v *Binding) native() *C.GBinding {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGBinding(unsafe.Pointer(v.GObject))
+}
+
+func marshalBinding(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return &Binding{wrapObject(unsafe.Pointer(c))}, nil
+}
+
+// Creates a binding between source property on source and target property on
+// target . Whenever the source property is changed the target_property is
+// updated using the same value.
+func BindProperty(source *Object, sourceProperty string,
+ target *Object, targetProperty string,
+ flags BindingFlags) *Binding {
+ srcStr := (*C.gchar)(C.CString(sourceProperty))
+ defer C.free(unsafe.Pointer(srcStr))
+ tgtStr := (*C.gchar)(C.CString(targetProperty))
+ defer C.free(unsafe.Pointer(tgtStr))
+ obj := C.g_object_bind_property(
+ C.gpointer(source.GObject), srcStr,
+ C.gpointer(target.GObject), tgtStr,
+ C.GBindingFlags(flags),
+ )
+ if obj == nil {
+ return nil
+ }
+ return &Binding{wrapObject(unsafe.Pointer(obj))}
+}
+
+// Explicitly releases the binding between the source and the target property
+// expressed by Binding
+func (v *Binding) Unbind() {
+ C.g_binding_unbind(v.native())
+}
+
+// Retrieves the GObject instance used as the source of the binding
+func (v *Binding) GetSource() *Object {
+ obj := C.g_binding_get_source(v.native())
+ if obj == nil {
+ return nil
+ }
+ return wrapObject(unsafe.Pointer(obj))
+}
+
+// Retrieves the name of the property of “source” used as the source of
+// the binding.
+func (v *Binding) GetSourceProperty() string {
+ s := C.g_binding_get_source_property(v.native())
+ return C.GoString((*C.char)(s))
+}
+
+// Retrieves the GObject instance used as the target of the binding.
+func (v *Binding) GetTarget() *Object {
+ obj := C.g_binding_get_target(v.native())
+ if obj == nil {
+ return nil
+ }
+ return wrapObject(unsafe.Pointer(obj))
+}
+
+// Retrieves the name of the property of “target” used as the target of
+// the binding.
+func (v *Binding) GetTargetProperty() string {
+ s := C.g_binding_get_target_property(v.native())
+ return C.GoString((*C.char)(s))
+}
+
+// Retrieves the flags passed when constructing the GBinding.
+func (v *Binding) GetFlags() BindingFlags {
+ flags := C.g_binding_get_flags(v.native())
+ return BindingFlags(flags)
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/glib.go b/vendor/github.com/gotk3/gotk3/glib/glib.go
new file mode 100644
index 0000000..523a711
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/glib.go
@@ -0,0 +1,1371 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// Package glib provides Go bindings for GLib 2. Supports version 2.36
+// and later.
+package glib
+
+// #cgo pkg-config: gio-2.0 glib-2.0 gobject-2.0
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "reflect"
+ "runtime"
+ "sync"
+ "unsafe"
+)
+
+/*
+ * Type conversions
+ */
+
+func gbool(b bool) C.gboolean {
+ if b {
+ return C.gboolean(1)
+ }
+ return C.gboolean(0)
+}
+func gobool(b C.gboolean) bool {
+ if b != 0 {
+ return true
+ }
+ return false
+}
+
+/*
+ * Unexported vars
+ */
+
+type closureContext struct {
+ rf reflect.Value
+ userData reflect.Value
+}
+
+var (
+ errNilPtr = errors.New("cgo returned unexpected nil pointer")
+
+ closures = struct {
+ sync.RWMutex
+ m map[*C.GClosure]closureContext
+ }{
+ m: make(map[*C.GClosure]closureContext),
+ }
+
+ signals = make(map[SignalHandle]*C.GClosure)
+)
+
+/*
+ * Constants
+ */
+
+// Type is a representation of GLib's GType.
+type Type uint
+
+const (
+ TYPE_INVALID Type = C.G_TYPE_INVALID
+ TYPE_NONE Type = C.G_TYPE_NONE
+ TYPE_INTERFACE Type = C.G_TYPE_INTERFACE
+ TYPE_CHAR Type = C.G_TYPE_CHAR
+ TYPE_UCHAR Type = C.G_TYPE_UCHAR
+ TYPE_BOOLEAN Type = C.G_TYPE_BOOLEAN
+ TYPE_INT Type = C.G_TYPE_INT
+ TYPE_UINT Type = C.G_TYPE_UINT
+ TYPE_LONG Type = C.G_TYPE_LONG
+ TYPE_ULONG Type = C.G_TYPE_ULONG
+ TYPE_INT64 Type = C.G_TYPE_INT64
+ TYPE_UINT64 Type = C.G_TYPE_UINT64
+ TYPE_ENUM Type = C.G_TYPE_ENUM
+ TYPE_FLAGS Type = C.G_TYPE_FLAGS
+ TYPE_FLOAT Type = C.G_TYPE_FLOAT
+ TYPE_DOUBLE Type = C.G_TYPE_DOUBLE
+ TYPE_STRING Type = C.G_TYPE_STRING
+ TYPE_POINTER Type = C.G_TYPE_POINTER
+ TYPE_BOXED Type = C.G_TYPE_BOXED
+ TYPE_PARAM Type = C.G_TYPE_PARAM
+ TYPE_OBJECT Type = C.G_TYPE_OBJECT
+ TYPE_VARIANT Type = C.G_TYPE_VARIANT
+)
+
+// Name is a wrapper around g_type_name().
+func (t Type) Name() string {
+ return C.GoString((*C.char)(C.g_type_name(C.GType(t))))
+}
+
+// Depth is a wrapper around g_type_depth().
+func (t Type) Depth() uint {
+ return uint(C.g_type_depth(C.GType(t)))
+}
+
+// Parent is a wrapper around g_type_parent().
+func (t Type) Parent() Type {
+ return Type(C.g_type_parent(C.GType(t)))
+}
+
+// UserDirectory is a representation of GLib's GUserDirectory.
+type UserDirectory int
+
+const (
+ USER_DIRECTORY_DESKTOP UserDirectory = C.G_USER_DIRECTORY_DESKTOP
+ USER_DIRECTORY_DOCUMENTS UserDirectory = C.G_USER_DIRECTORY_DOCUMENTS
+ USER_DIRECTORY_DOWNLOAD UserDirectory = C.G_USER_DIRECTORY_DOWNLOAD
+ USER_DIRECTORY_MUSIC UserDirectory = C.G_USER_DIRECTORY_MUSIC
+ USER_DIRECTORY_PICTURES UserDirectory = C.G_USER_DIRECTORY_PICTURES
+ USER_DIRECTORY_PUBLIC_SHARE UserDirectory = C.G_USER_DIRECTORY_PUBLIC_SHARE
+ USER_DIRECTORY_TEMPLATES UserDirectory = C.G_USER_DIRECTORY_TEMPLATES
+ USER_DIRECTORY_VIDEOS UserDirectory = C.G_USER_DIRECTORY_VIDEOS
+)
+
+const USER_N_DIRECTORIES int = C.G_USER_N_DIRECTORIES
+
+/*
+ * GApplicationFlags
+ */
+
+type ApplicationFlags int
+
+const (
+ APPLICATION_FLAGS_NONE ApplicationFlags = C.G_APPLICATION_FLAGS_NONE
+ APPLICATION_IS_SERVICE ApplicationFlags = C.G_APPLICATION_IS_SERVICE
+ APPLICATION_HANDLES_OPEN ApplicationFlags = C.G_APPLICATION_HANDLES_OPEN
+ APPLICATION_HANDLES_COMMAND_LINE ApplicationFlags = C.G_APPLICATION_HANDLES_COMMAND_LINE
+ APPLICATION_SEND_ENVIRONMENT ApplicationFlags = C.G_APPLICATION_SEND_ENVIRONMENT
+ APPLICATION_NON_UNIQUE ApplicationFlags = C.G_APPLICATION_NON_UNIQUE
+)
+
+// goMarshal is called by the GLib runtime when a closure needs to be invoked.
+// The closure will be invoked with as many arguments as it can take, from 0 to
+// the full amount provided by the call. If the closure asks for more parameters
+// than there are to give, a warning is printed to stderr and the closure is
+// not run.
+//
+//export goMarshal
+func goMarshal(closure *C.GClosure, retValue *C.GValue,
+ nParams C.guint, params *C.GValue,
+ invocationHint C.gpointer, marshalData *C.GValue) {
+
+ // Get the context associated with this callback closure.
+ closures.RLock()
+ cc := closures.m[closure]
+ closures.RUnlock()
+
+ // Get number of parameters passed in. If user data was saved with the
+ // closure context, increment the total number of parameters.
+ nGLibParams := int(nParams)
+ nTotalParams := nGLibParams
+ if cc.userData.IsValid() {
+ nTotalParams++
+ }
+
+ // Get number of parameters from the callback closure. If this exceeds
+ // the total number of marshaled parameters, a warning will be printed
+ // to stderr, and the callback will not be run.
+ nCbParams := cc.rf.Type().NumIn()
+ if nCbParams > nTotalParams {
+ fmt.Fprintf(os.Stderr,
+ "too many closure args: have %d, max allowed %d\n",
+ nCbParams, nTotalParams)
+ return
+ }
+
+ // Create a slice of reflect.Values as arguments to call the function.
+ gValues := gValueSlice(params, nCbParams)
+ args := make([]reflect.Value, 0, nCbParams)
+
+ // Fill beginning of args, up to the minimum of the total number of callback
+ // parameters and parameters from the glib runtime.
+ for i := 0; i < nCbParams && i < nGLibParams; i++ {
+ v := &Value{&gValues[i]}
+ val, err := v.GoValue()
+ if err != nil {
+ fmt.Fprintf(os.Stderr,
+ "no suitable Go value for arg %d: %v\n", i, err)
+ return
+ }
+ rv := reflect.ValueOf(val)
+ args = append(args, rv.Convert(cc.rf.Type().In(i)))
+ }
+
+ // If non-nil user data was passed in and not all args have been set,
+ // get and set the reflect.Value directly from the GValue.
+ if cc.userData.IsValid() && len(args) < cap(args) {
+ args = append(args, cc.userData.Convert(cc.rf.Type().In(nCbParams-1)))
+ }
+
+ // Call closure with args. If the callback returns one or more
+ // values, save the GValue equivalent of the first.
+ rv := cc.rf.Call(args)
+ if retValue != nil && len(rv) > 0 {
+ if g, err := GValue(rv[0].Interface()); err != nil {
+ fmt.Fprintf(os.Stderr,
+ "cannot save callback return value: %v", err)
+ } else {
+ *retValue = *g.native()
+ }
+ }
+}
+
+// gValueSlice converts a C array of GValues to a Go slice.
+func gValueSlice(values *C.GValue, nValues int) (slice []C.GValue) {
+ header := (*reflect.SliceHeader)((unsafe.Pointer(&slice)))
+ header.Cap = nValues
+ header.Len = nValues
+ header.Data = uintptr(unsafe.Pointer(values))
+ return
+}
+
+/*
+ * Main event loop
+ */
+
+type SourceHandle uint
+
+// IdleAdd adds an idle source to the default main event loop
+// context. After running once, the source func will be removed
+// from the main event loop, unless f returns a single bool true.
+//
+// This function will cause a panic when f eventually runs if the
+// types of args do not match those of f.
+func IdleAdd(f interface{}, args ...interface{}) (SourceHandle, error) {
+ // f must be a func with no parameters.
+ rf := reflect.ValueOf(f)
+ if rf.Type().Kind() != reflect.Func {
+ return 0, errors.New("f is not a function")
+ }
+
+ // Create an idle source func to be added to the main loop context.
+ idleSrc := C.g_idle_source_new()
+ if idleSrc == nil {
+ return 0, errNilPtr
+ }
+ return sourceAttach(idleSrc, rf, args...)
+}
+
+// TimeoutAdd adds an timeout source to the default main event loop
+// context. After running once, the source func will be removed
+// from the main event loop, unless f returns a single bool true.
+//
+// This function will cause a panic when f eventually runs if the
+// types of args do not match those of f.
+// timeout is in milliseconds
+func TimeoutAdd(timeout uint, f interface{}, args ...interface{}) (SourceHandle, error) {
+ // f must be a func with no parameters.
+ rf := reflect.ValueOf(f)
+ if rf.Type().Kind() != reflect.Func {
+ return 0, errors.New("f is not a function")
+ }
+
+ // Create a timeout source func to be added to the main loop context.
+ timeoutSrc := C.g_timeout_source_new(C.guint(timeout))
+ if timeoutSrc == nil {
+ return 0, errNilPtr
+ }
+
+ return sourceAttach(timeoutSrc, rf, args...)
+}
+
+// sourceAttach attaches a source to the default main loop context.
+func sourceAttach(src *C.struct__GSource, rf reflect.Value, args ...interface{}) (SourceHandle, error) {
+ if src == nil {
+ return 0, errNilPtr
+ }
+
+ // rf must be a func with no parameters.
+ if rf.Type().Kind() != reflect.Func {
+ C.g_source_destroy(src)
+ return 0, errors.New("rf is not a function")
+ }
+
+ // Create a new GClosure from f that invalidates itself when
+ // f returns false. The error is ignored here, as this will
+ // always be a function.
+ var closure *C.GClosure
+ closure, _ = ClosureNew(rf.Interface(), args...)
+
+ // Remove closure context when closure is finalized.
+ C._g_closure_add_finalize_notifier(closure)
+
+ // Set closure to run as a callback when the idle source runs.
+ C.g_source_set_closure(src, closure)
+
+ // Attach the idle source func to the default main event loop
+ // context.
+ cid := C.g_source_attach(src, nil)
+ return SourceHandle(cid), nil
+}
+
+/*
+ * Miscellaneous Utility Functions
+ */
+
+// GetHomeDir is a wrapper around g_get_home_dir().
+func GetHomeDir() string {
+ c := C.g_get_home_dir()
+ return C.GoString((*C.char)(c))
+}
+
+// GetUserCacheDir is a wrapper around g_get_user_cache_dir().
+func GetUserCacheDir() string {
+ c := C.g_get_user_cache_dir()
+ return C.GoString((*C.char)(c))
+}
+
+// GetUserDataDir is a wrapper around g_get_user_data_dir().
+func GetUserDataDir() string {
+ c := C.g_get_user_data_dir()
+ return C.GoString((*C.char)(c))
+}
+
+// GetUserConfigDir is a wrapper around g_get_user_config_dir().
+func GetUserConfigDir() string {
+ c := C.g_get_user_config_dir()
+ return C.GoString((*C.char)(c))
+}
+
+// GetUserRuntimeDir is a wrapper around g_get_user_runtime_dir().
+func GetUserRuntimeDir() string {
+ c := C.g_get_user_runtime_dir()
+ return C.GoString((*C.char)(c))
+}
+
+// GetUserSpecialDir is a wrapper around g_get_user_special_dir(). A
+// non-nil error is returned in the case that g_get_user_special_dir()
+// returns NULL to differentiate between NULL and an empty string.
+func GetUserSpecialDir(directory UserDirectory) (string, error) {
+ c := C.g_get_user_special_dir(C.GUserDirectory(directory))
+ if c == nil {
+ return "", errNilPtr
+ }
+ return C.GoString((*C.char)(c)), nil
+}
+
+/*
+ * GObject
+ */
+
+// IObject is an interface type implemented by Object and all types which embed
+// an Object. It is meant to be used as a type for function arguments which
+// require GObjects or any subclasses thereof.
+type IObject interface {
+ toGObject() *C.GObject
+ toObject() *Object
+}
+
+// Object is a representation of GLib's GObject.
+type Object struct {
+ GObject *C.GObject
+}
+
+func (v *Object) toGObject() *C.GObject {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func (v *Object) toObject() *Object {
+ return v
+}
+
+// newObject creates a new Object from a GObject pointer.
+func newObject(p *C.GObject) *Object {
+ return &Object{GObject: p}
+}
+
+// native returns a pointer to the underlying GObject.
+func (v *Object) native() *C.GObject {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGObject(p)
+}
+
+// Take wraps a unsafe.Pointer as a glib.Object, taking ownership of it.
+// This function is exported for visibility in other gotk3 packages and
+// is not meant to be used by applications.
+func Take(ptr unsafe.Pointer) *Object {
+ obj := newObject(ToGObject(ptr))
+
+ if obj.IsFloating() {
+ obj.RefSink()
+ } else {
+ obj.Ref()
+ }
+
+ runtime.SetFinalizer(obj, (*Object).Unref)
+ return obj
+}
+
+// Native returns a pointer to the underlying GObject.
+func (v *Object) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+// IsA is a wrapper around g_type_is_a().
+func (v *Object) IsA(typ Type) bool {
+ return gobool(C.g_type_is_a(C.GType(v.TypeFromInstance()), C.GType(typ)))
+}
+
+// TypeFromInstance is a wrapper around g_type_from_instance().
+func (v *Object) TypeFromInstance() Type {
+ c := C._g_type_from_instance(C.gpointer(unsafe.Pointer(v.native())))
+ return Type(c)
+}
+
+// ToGObject type converts an unsafe.Pointer as a native C GObject.
+// This function is exported for visibility in other gotk3 packages and
+// is not meant to be used by applications.
+func ToGObject(p unsafe.Pointer) *C.GObject {
+ return C.toGObject(p)
+}
+
+// Ref is a wrapper around g_object_ref().
+func (v *Object) Ref() {
+ C.g_object_ref(C.gpointer(v.GObject))
+}
+
+// Unref is a wrapper around g_object_unref().
+func (v *Object) Unref() {
+ C.g_object_unref(C.gpointer(v.GObject))
+}
+
+// RefSink is a wrapper around g_object_ref_sink().
+func (v *Object) RefSink() {
+ C.g_object_ref_sink(C.gpointer(v.GObject))
+}
+
+// IsFloating is a wrapper around g_object_is_floating().
+func (v *Object) IsFloating() bool {
+ c := C.g_object_is_floating(C.gpointer(v.GObject))
+ return gobool(c)
+}
+
+// ForceFloating is a wrapper around g_object_force_floating().
+func (v *Object) ForceFloating() {
+ C.g_object_force_floating(v.GObject)
+}
+
+// StopEmission is a wrapper around g_signal_stop_emission_by_name().
+func (v *Object) StopEmission(s string) {
+ cstr := C.CString(s)
+ defer C.free(unsafe.Pointer(cstr))
+ C.g_signal_stop_emission_by_name((C.gpointer)(v.GObject),
+ (*C.gchar)(cstr))
+}
+
+// Set is a wrapper around g_object_set(). However, unlike
+// g_object_set(), this function only sets one name value pair. Make
+// multiple calls to this function to set multiple properties.
+func (v *Object) Set(name string, value interface{}) error {
+ return v.SetProperty(name, value)
+ /*
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+
+ if _, ok := value.(Object); ok {
+ value = value.(Object).GObject
+ }
+
+ // Can't call g_object_set() as it uses a variable arg list, use a
+ // wrapper instead
+ var p unsafe.Pointer
+ switch v := value.(type) {
+ case bool:
+ c := gbool(v)
+ p = unsafe.Pointer(&c)
+
+ case int8:
+ c := C.gint8(v)
+ p = unsafe.Pointer(&c)
+
+ case int16:
+ c := C.gint16(v)
+ p = unsafe.Pointer(&c)
+
+ case int32:
+ c := C.gint32(v)
+ p = unsafe.Pointer(&c)
+
+ case int64:
+ c := C.gint64(v)
+ p = unsafe.Pointer(&c)
+
+ case int:
+ c := C.gint(v)
+ p = unsafe.Pointer(&c)
+
+ case uint8:
+ c := C.guchar(v)
+ p = unsafe.Pointer(&c)
+
+ case uint16:
+ c := C.guint16(v)
+ p = unsafe.Pointer(&c)
+
+ case uint32:
+ c := C.guint32(v)
+ p = unsafe.Pointer(&c)
+
+ case uint64:
+ c := C.guint64(v)
+ p = unsafe.Pointer(&c)
+
+ case uint:
+ c := C.guint(v)
+ p = unsafe.Pointer(&c)
+
+ case uintptr:
+ p = unsafe.Pointer(C.gpointer(v))
+
+ case float32:
+ c := C.gfloat(v)
+ p = unsafe.Pointer(&c)
+
+ case float64:
+ c := C.gdouble(v)
+ p = unsafe.Pointer(&c)
+
+ case string:
+ cstr := C.CString(v)
+ defer C.g_free(C.gpointer(unsafe.Pointer(cstr)))
+ p = unsafe.Pointer(&cstr)
+
+ default:
+ if pv, ok := value.(unsafe.Pointer); ok {
+ p = pv
+ } else {
+ val := reflect.ValueOf(value)
+ switch val.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16,
+ reflect.Int32, reflect.Int64:
+ c := C.int(val.Int())
+ p = unsafe.Pointer(&c)
+
+ case reflect.Uintptr, reflect.Ptr, reflect.UnsafePointer:
+ p = unsafe.Pointer(C.gpointer(val.Pointer()))
+ }
+ }
+ }
+ if p == nil {
+ return errors.New("Unable to perform type conversion")
+ }
+ C._g_object_set_one(C.gpointer(v.GObject), (*C.gchar)(cstr), p)
+ return nil*/
+}
+
+// GetPropertyType returns the Type of a property of the underlying GObject.
+// If the property is missing it will return TYPE_INVALID and an error.
+func (v *Object) GetPropertyType(name string) (Type, error) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+
+ paramSpec := C.g_object_class_find_property(C._g_object_get_class(v.native()), (*C.gchar)(cstr))
+ if paramSpec == nil {
+ return TYPE_INVALID, errors.New("couldn't find Property")
+ }
+ return Type(paramSpec.value_type), nil
+}
+
+// GetProperty is a wrapper around g_object_get_property().
+func (v *Object) GetProperty(name string) (interface{}, error) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+
+ t, err := v.GetPropertyType(name)
+ if err != nil {
+ return nil, err
+ }
+
+ p, err := ValueInit(t)
+ if err != nil {
+ return nil, errors.New("unable to allocate value")
+ }
+ C.g_object_get_property(v.GObject, (*C.gchar)(cstr), p.native())
+ return p.GoValue()
+}
+
+// SetProperty is a wrapper around g_object_set_property().
+func (v *Object) SetProperty(name string, value interface{}) error {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+
+ if _, ok := value.(Object); ok {
+ value = value.(Object).GObject
+ }
+
+ p, err := GValue(value)
+ if err != nil {
+ return errors.New("Unable to perform type conversion")
+ }
+ C.g_object_set_property(v.GObject, (*C.gchar)(cstr), p.native())
+ return nil
+}
+
+// pointerVal attempts to return an unsafe.Pointer for value.
+// Not all types are understood, in which case a nil Pointer
+// is returned.
+/*func pointerVal(value interface{}) unsafe.Pointer {
+ var p unsafe.Pointer
+ switch v := value.(type) {
+ case bool:
+ c := gbool(v)
+ p = unsafe.Pointer(&c)
+
+ case int8:
+ c := C.gint8(v)
+ p = unsafe.Pointer(&c)
+
+ case int16:
+ c := C.gint16(v)
+ p = unsafe.Pointer(&c)
+
+ case int32:
+ c := C.gint32(v)
+ p = unsafe.Pointer(&c)
+
+ case int64:
+ c := C.gint64(v)
+ p = unsafe.Pointer(&c)
+
+ case int:
+ c := C.gint(v)
+ p = unsafe.Pointer(&c)
+
+ case uint8:
+ c := C.guchar(v)
+ p = unsafe.Pointer(&c)
+
+ case uint16:
+ c := C.guint16(v)
+ p = unsafe.Pointer(&c)
+
+ case uint32:
+ c := C.guint32(v)
+ p = unsafe.Pointer(&c)
+
+ case uint64:
+ c := C.guint64(v)
+ p = unsafe.Pointer(&c)
+
+ case uint:
+ c := C.guint(v)
+ p = unsafe.Pointer(&c)
+
+ case uintptr:
+ p = unsafe.Pointer(C.gpointer(v))
+
+ case float32:
+ c := C.gfloat(v)
+ p = unsafe.Pointer(&c)
+
+ case float64:
+ c := C.gdouble(v)
+ p = unsafe.Pointer(&c)
+
+ case string:
+ cstr := C.CString(v)
+ defer C.free(unsafe.Pointer(cstr))
+ p = unsafe.Pointer(cstr)
+
+ default:
+ if pv, ok := value.(unsafe.Pointer); ok {
+ p = pv
+ } else {
+ val := reflect.ValueOf(value)
+ switch val.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16,
+ reflect.Int32, reflect.Int64:
+ c := C.int(val.Int())
+ p = unsafe.Pointer(&c)
+
+ case reflect.Uintptr, reflect.Ptr, reflect.UnsafePointer:
+ p = unsafe.Pointer(C.gpointer(val.Pointer()))
+ }
+ }
+ }
+
+ return p
+}*/
+
+/*
+ * GObject Signals
+ */
+
+// Emit is a wrapper around g_signal_emitv() and emits the signal
+// specified by the string s to an Object. Arguments to callback
+// functions connected to this signal must be specified in args. Emit()
+// returns an interface{} which must be type asserted as the Go
+// equivalent type to the return value for native C callback.
+//
+// Note that this code is unsafe in that the types of values in args are
+// not checked against whether they are suitable for the callback.
+func (v *Object) Emit(s string, args ...interface{}) (interface{}, error) {
+ cstr := C.CString(s)
+ defer C.free(unsafe.Pointer(cstr))
+
+ // Create array of this instance and arguments
+ valv := C.alloc_gvalue_list(C.int(len(args)) + 1)
+ defer C.free(unsafe.Pointer(valv))
+
+ // Add args and valv
+ val, err := GValue(v)
+ if err != nil {
+ return nil, errors.New("Error converting Object to GValue: " + err.Error())
+ }
+ C.val_list_insert(valv, C.int(0), val.native())
+ for i := range args {
+ val, err := GValue(args[i])
+ if err != nil {
+ return nil, fmt.Errorf("Error converting arg %d to GValue: %s", i, err.Error())
+ }
+ C.val_list_insert(valv, C.int(i+1), val.native())
+ }
+
+ t := v.TypeFromInstance()
+ // TODO: use just the signal name
+ id := C.g_signal_lookup((*C.gchar)(cstr), C.GType(t))
+
+ ret, err := ValueAlloc()
+ if err != nil {
+ return nil, errors.New("Error creating Value for return value")
+ }
+ C.g_signal_emitv(valv, id, C.GQuark(0), ret.native())
+
+ return ret.GoValue()
+}
+
+// HandlerBlock is a wrapper around g_signal_handler_block().
+func (v *Object) HandlerBlock(handle SignalHandle) {
+ C.g_signal_handler_block(C.gpointer(v.GObject), C.gulong(handle))
+}
+
+// HandlerUnblock is a wrapper around g_signal_handler_unblock().
+func (v *Object) HandlerUnblock(handle SignalHandle) {
+ C.g_signal_handler_unblock(C.gpointer(v.GObject), C.gulong(handle))
+}
+
+// HandlerDisconnect is a wrapper around g_signal_handler_disconnect().
+func (v *Object) HandlerDisconnect(handle SignalHandle) {
+ C.g_signal_handler_disconnect(C.gpointer(v.GObject), C.gulong(handle))
+ C.g_closure_invalidate(signals[handle])
+ delete(closures.m, signals[handle])
+ delete(signals, handle)
+}
+
+// Wrapper function for new objects with reference management.
+func wrapObject(ptr unsafe.Pointer) *Object {
+ obj := &Object{ToGObject(ptr)}
+
+ if obj.IsFloating() {
+ obj.RefSink()
+ } else {
+ obj.Ref()
+ }
+
+ runtime.SetFinalizer(obj, (*Object).Unref)
+ return obj
+}
+
+/*
+ * GInitiallyUnowned
+ */
+
+// InitiallyUnowned is a representation of GLib's GInitiallyUnowned.
+type InitiallyUnowned struct {
+ // This must be a pointer so copies of the ref-sinked object
+ // do not outlive the original object, causing an unref
+ // finalizer to prematurely run.
+ *Object
+}
+
+// Native returns a pointer to the underlying GObject. This is implemented
+// here rather than calling Native on the embedded Object to prevent a nil
+// pointer dereference.
+func (v *InitiallyUnowned) Native() uintptr {
+ if v == nil || v.Object == nil {
+ return uintptr(unsafe.Pointer(nil))
+ }
+ return v.Object.Native()
+}
+
+/*
+ * GValue
+ */
+
+// Value is a representation of GLib's GValue.
+//
+// Don't allocate Values on the stack or heap manually as they may not
+// be properly unset when going out of scope. Instead, use ValueAlloc(),
+// which will set the runtime finalizer to unset the Value after it has
+// left scope.
+type Value struct {
+ GValue *C.GValue
+}
+
+// native returns a pointer to the underlying GValue.
+func (v *Value) native() *C.GValue {
+ return v.GValue
+}
+
+// Native returns a pointer to the underlying GValue.
+func (v *Value) Native() unsafe.Pointer {
+ return unsafe.Pointer(v.native())
+}
+
+// ValueAlloc allocates a Value and sets a runtime finalizer to call
+// g_value_unset() on the underlying GValue after leaving scope.
+// ValueAlloc() returns a non-nil error if the allocation failed.
+func ValueAlloc() (*Value, error) {
+ c := C._g_value_alloc()
+ if c == nil {
+ return nil, errNilPtr
+ }
+
+ v := &Value{c}
+
+ //An allocated GValue is not guaranteed to hold a value that can be unset
+ //We need to double check before unsetting, to prevent:
+ //`g_value_unset: assertion 'G_IS_VALUE (value)' failed`
+ runtime.SetFinalizer(v, func(f *Value) {
+ if t, _, err := f.Type(); err != nil || t == TYPE_INVALID || t == TYPE_NONE {
+ C.g_free(C.gpointer(f.native()))
+ return
+ }
+
+ f.unset()
+ })
+
+ return v, nil
+}
+
+// ValueInit is a wrapper around g_value_init() and allocates and
+// initializes a new Value with the Type t. A runtime finalizer is set
+// to call g_value_unset() on the underlying GValue after leaving scope.
+// ValueInit() returns a non-nil error if the allocation failed.
+func ValueInit(t Type) (*Value, error) {
+ c := C._g_value_init(C.GType(t))
+ if c == nil {
+ return nil, errNilPtr
+ }
+
+ v := &Value{c}
+
+ runtime.SetFinalizer(v, (*Value).unset)
+ return v, nil
+}
+
+// ValueFromNative returns a type-asserted pointer to the Value.
+func ValueFromNative(l unsafe.Pointer) *Value {
+ //TODO why it does not add finalizer to the value?
+ return &Value{(*C.GValue)(l)}
+}
+
+func (v *Value) unset() {
+ C.g_value_unset(v.native())
+}
+
+// Type is a wrapper around the G_VALUE_HOLDS_GTYPE() macro and
+// the g_value_get_gtype() function. GetType() returns TYPE_INVALID if v
+// does not hold a Type, or otherwise returns the Type of v.
+func (v *Value) Type() (actual Type, fundamental Type, err error) {
+ if !gobool(C._g_is_value(v.native())) {
+ return actual, fundamental, errors.New("invalid GValue")
+ }
+ cActual := C._g_value_type(v.native())
+ cFundamental := C._g_value_fundamental(cActual)
+ return Type(cActual), Type(cFundamental), nil
+}
+
+// GValue converts a Go type to a comparable GValue. GValue()
+// returns a non-nil error if the conversion was unsuccessful.
+func GValue(v interface{}) (gvalue *Value, err error) {
+ if v == nil {
+ val, err := ValueInit(TYPE_POINTER)
+ if err != nil {
+ return nil, err
+ }
+ val.SetPointer(uintptr(unsafe.Pointer(nil)))
+ return val, nil
+ }
+
+ switch e := v.(type) {
+ case bool:
+ val, err := ValueInit(TYPE_BOOLEAN)
+ if err != nil {
+ return nil, err
+ }
+ val.SetBool(e)
+ return val, nil
+
+ case int8:
+ val, err := ValueInit(TYPE_CHAR)
+ if err != nil {
+ return nil, err
+ }
+ val.SetSChar(e)
+ return val, nil
+
+ case int64:
+ val, err := ValueInit(TYPE_INT64)
+ if err != nil {
+ return nil, err
+ }
+ val.SetInt64(e)
+ return val, nil
+
+ case int:
+ val, err := ValueInit(TYPE_INT)
+ if err != nil {
+ return nil, err
+ }
+ val.SetInt(e)
+ return val, nil
+
+ case uint8:
+ val, err := ValueInit(TYPE_UCHAR)
+ if err != nil {
+ return nil, err
+ }
+ val.SetUChar(e)
+ return val, nil
+
+ case uint64:
+ val, err := ValueInit(TYPE_UINT64)
+ if err != nil {
+ return nil, err
+ }
+ val.SetUInt64(e)
+ return val, nil
+
+ case uint:
+ val, err := ValueInit(TYPE_UINT)
+ if err != nil {
+ return nil, err
+ }
+ val.SetUInt(e)
+ return val, nil
+
+ case float32:
+ val, err := ValueInit(TYPE_FLOAT)
+ if err != nil {
+ return nil, err
+ }
+ val.SetFloat(e)
+ return val, nil
+
+ case float64:
+ val, err := ValueInit(TYPE_DOUBLE)
+ if err != nil {
+ return nil, err
+ }
+ val.SetDouble(e)
+ return val, nil
+
+ case string:
+ val, err := ValueInit(TYPE_STRING)
+ if err != nil {
+ return nil, err
+ }
+ val.SetString(e)
+ return val, nil
+
+ case *Object:
+ val, err := ValueInit(TYPE_OBJECT)
+ if err != nil {
+ return nil, err
+ }
+ val.SetInstance(uintptr(unsafe.Pointer(e.GObject)))
+ return val, nil
+
+ default:
+ /* Try this since above doesn't catch constants under other types */
+ rval := reflect.ValueOf(v)
+ switch rval.Kind() {
+ case reflect.Int8:
+ val, err := ValueInit(TYPE_CHAR)
+ if err != nil {
+ return nil, err
+ }
+ val.SetSChar(int8(rval.Int()))
+ return val, nil
+
+ case reflect.Int16:
+ return nil, errors.New("Type not implemented")
+
+ case reflect.Int32:
+ return nil, errors.New("Type not implemented")
+
+ case reflect.Int64:
+ val, err := ValueInit(TYPE_INT64)
+ if err != nil {
+ return nil, err
+ }
+ val.SetInt64(rval.Int())
+ return val, nil
+
+ case reflect.Int:
+ val, err := ValueInit(TYPE_INT)
+ if err != nil {
+ return nil, err
+ }
+ val.SetInt(int(rval.Int()))
+ return val, nil
+
+ case reflect.Uintptr, reflect.Ptr:
+ val, err := ValueInit(TYPE_POINTER)
+ if err != nil {
+ return nil, err
+ }
+ val.SetPointer(rval.Pointer())
+ return val, nil
+ }
+ }
+
+ return nil, errors.New("Type not implemented")
+}
+
+// GValueMarshaler is a marshal function to convert a GValue into an
+// appropriate Go type. The uintptr parameter is a *C.GValue.
+type GValueMarshaler func(uintptr) (interface{}, error)
+
+// TypeMarshaler represents an actual type and it's associated marshaler.
+type TypeMarshaler struct {
+ T Type
+ F GValueMarshaler
+}
+
+// RegisterGValueMarshalers adds marshalers for several types to the
+// internal marshalers map. Once registered, calling GoValue on any
+// Value witha registered type will return the data returned by the
+// marshaler.
+func RegisterGValueMarshalers(tm []TypeMarshaler) {
+ gValueMarshalers.register(tm)
+}
+
+type marshalMap map[Type]GValueMarshaler
+
+// gValueMarshalers is a map of Glib types to functions to marshal a
+// GValue to a native Go type.
+var gValueMarshalers = marshalMap{
+ TYPE_INVALID: marshalInvalid,
+ TYPE_NONE: marshalNone,
+ TYPE_INTERFACE: marshalInterface,
+ TYPE_CHAR: marshalChar,
+ TYPE_UCHAR: marshalUchar,
+ TYPE_BOOLEAN: marshalBoolean,
+ TYPE_INT: marshalInt,
+ TYPE_LONG: marshalLong,
+ TYPE_ENUM: marshalEnum,
+ TYPE_INT64: marshalInt64,
+ TYPE_UINT: marshalUint,
+ TYPE_ULONG: marshalUlong,
+ TYPE_FLAGS: marshalFlags,
+ TYPE_UINT64: marshalUint64,
+ TYPE_FLOAT: marshalFloat,
+ TYPE_DOUBLE: marshalDouble,
+ TYPE_STRING: marshalString,
+ TYPE_POINTER: marshalPointer,
+ TYPE_BOXED: marshalBoxed,
+ TYPE_OBJECT: marshalObject,
+ TYPE_VARIANT: marshalVariant,
+}
+
+func (m marshalMap) register(tm []TypeMarshaler) {
+ for i := range tm {
+ m[tm[i].T] = tm[i].F
+ }
+}
+
+func (m marshalMap) lookup(v *Value) (GValueMarshaler, error) {
+ actual, fundamental, err := v.Type()
+ if err != nil {
+ return nil, err
+ }
+
+ if f, ok := m[actual]; ok {
+ return f, nil
+ }
+ if f, ok := m[fundamental]; ok {
+ return f, nil
+ }
+ return nil, errors.New("missing marshaler for type")
+}
+
+func marshalInvalid(uintptr) (interface{}, error) {
+ return nil, errors.New("invalid type")
+}
+
+func marshalNone(uintptr) (interface{}, error) {
+ return nil, nil
+}
+
+func marshalInterface(uintptr) (interface{}, error) {
+ return nil, errors.New("interface conversion not yet implemented")
+}
+
+func marshalChar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_schar((*C.GValue)(unsafe.Pointer(p)))
+ return int8(c), nil
+}
+
+func marshalUchar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_uchar((*C.GValue)(unsafe.Pointer(p)))
+ return uint8(c), nil
+}
+
+func marshalBoolean(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boolean((*C.GValue)(unsafe.Pointer(p)))
+ return gobool(c), nil
+}
+
+func marshalInt(p uintptr) (interface{}, error) {
+ c := C.g_value_get_int((*C.GValue)(unsafe.Pointer(p)))
+ return int(c), nil
+}
+
+func marshalLong(p uintptr) (interface{}, error) {
+ c := C.g_value_get_long((*C.GValue)(unsafe.Pointer(p)))
+ return int(c), nil
+}
+
+func marshalEnum(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return int(c), nil
+}
+
+func marshalInt64(p uintptr) (interface{}, error) {
+ c := C.g_value_get_int64((*C.GValue)(unsafe.Pointer(p)))
+ return int64(c), nil
+}
+
+func marshalUint(p uintptr) (interface{}, error) {
+ c := C.g_value_get_uint((*C.GValue)(unsafe.Pointer(p)))
+ return uint(c), nil
+}
+
+func marshalUlong(p uintptr) (interface{}, error) {
+ c := C.g_value_get_ulong((*C.GValue)(unsafe.Pointer(p)))
+ return uint(c), nil
+}
+
+func marshalFlags(p uintptr) (interface{}, error) {
+ c := C.g_value_get_flags((*C.GValue)(unsafe.Pointer(p)))
+ return uint(c), nil
+}
+
+func marshalUint64(p uintptr) (interface{}, error) {
+ c := C.g_value_get_uint64((*C.GValue)(unsafe.Pointer(p)))
+ return uint64(c), nil
+}
+
+func marshalFloat(p uintptr) (interface{}, error) {
+ c := C.g_value_get_float((*C.GValue)(unsafe.Pointer(p)))
+ return float32(c), nil
+}
+
+func marshalDouble(p uintptr) (interface{}, error) {
+ c := C.g_value_get_double((*C.GValue)(unsafe.Pointer(p)))
+ return float64(c), nil
+}
+
+func marshalString(p uintptr) (interface{}, error) {
+ c := C.g_value_get_string((*C.GValue)(unsafe.Pointer(p)))
+ return C.GoString((*C.char)(c)), nil
+}
+
+func marshalBoxed(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return uintptr(unsafe.Pointer(c)), nil
+}
+
+func marshalPointer(p uintptr) (interface{}, error) {
+ c := C.g_value_get_pointer((*C.GValue)(unsafe.Pointer(p)))
+ return unsafe.Pointer(c), nil
+}
+
+func marshalObject(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return newObject((*C.GObject)(c)), nil
+}
+
+func marshalVariant(p uintptr) (interface{}, error) {
+ return nil, errors.New("variant conversion not yet implemented")
+}
+
+// GoValue converts a Value to comparable Go type. GoValue()
+// returns a non-nil error if the conversion was unsuccessful. The
+// returned interface{} must be type asserted as the actual Go
+// representation of the Value.
+//
+// This function is a wrapper around the many g_value_get_*()
+// functions, depending on the type of the Value.
+func (v *Value) GoValue() (interface{}, error) {
+ f, err := gValueMarshalers.lookup(v)
+ if err != nil {
+ return nil, err
+ }
+
+ //No need to add finalizer because it is already done by ValueAlloc and ValueInit
+ rv, err := f(uintptr(unsafe.Pointer(v.native())))
+ return rv, err
+}
+
+// SetBool is a wrapper around g_value_set_boolean().
+func (v *Value) SetBool(val bool) {
+ C.g_value_set_boolean(v.native(), gbool(val))
+}
+
+// SetSChar is a wrapper around g_value_set_schar().
+func (v *Value) SetSChar(val int8) {
+ C.g_value_set_schar(v.native(), C.gint8(val))
+}
+
+// SetInt64 is a wrapper around g_value_set_int64().
+func (v *Value) SetInt64(val int64) {
+ C.g_value_set_int64(v.native(), C.gint64(val))
+}
+
+// SetInt is a wrapper around g_value_set_int().
+func (v *Value) SetInt(val int) {
+ C.g_value_set_int(v.native(), C.gint(val))
+}
+
+// SetUChar is a wrapper around g_value_set_uchar().
+func (v *Value) SetUChar(val uint8) {
+ C.g_value_set_uchar(v.native(), C.guchar(val))
+}
+
+// SetUInt64 is a wrapper around g_value_set_uint64().
+func (v *Value) SetUInt64(val uint64) {
+ C.g_value_set_uint64(v.native(), C.guint64(val))
+}
+
+// SetUInt is a wrapper around g_value_set_uint().
+func (v *Value) SetUInt(val uint) {
+ C.g_value_set_uint(v.native(), C.guint(val))
+}
+
+// SetFloat is a wrapper around g_value_set_float().
+func (v *Value) SetFloat(val float32) {
+ C.g_value_set_float(v.native(), C.gfloat(val))
+}
+
+// SetDouble is a wrapper around g_value_set_double().
+func (v *Value) SetDouble(val float64) {
+ C.g_value_set_double(v.native(), C.gdouble(val))
+}
+
+// SetString is a wrapper around g_value_set_string().
+func (v *Value) SetString(val string) {
+ cstr := C.CString(val)
+ defer C.free(unsafe.Pointer(cstr))
+ C.g_value_set_string(v.native(), (*C.gchar)(cstr))
+}
+
+// SetInstance is a wrapper around g_value_set_instance().
+func (v *Value) SetInstance(instance uintptr) {
+ C.g_value_set_instance(v.native(), C.gpointer(instance))
+}
+
+// SetPointer is a wrapper around g_value_set_pointer().
+func (v *Value) SetPointer(p uintptr) {
+ C.g_value_set_pointer(v.native(), C.gpointer(p))
+}
+
+// GetPointer is a wrapper around g_value_get_pointer().
+func (v *Value) GetPointer() unsafe.Pointer {
+ return unsafe.Pointer(C.g_value_get_pointer(v.native()))
+}
+
+// GetString is a wrapper around g_value_get_string(). GetString()
+// returns a non-nil error if g_value_get_string() returned a NULL
+// pointer to distinguish between returning a NULL pointer and returning
+// an empty string.
+func (v *Value) GetString() (string, error) {
+ c := C.g_value_get_string(v.native())
+ if c == nil {
+ return "", errNilPtr
+ }
+ return C.GoString((*C.char)(c)), nil
+}
+
+type Signal struct {
+ name string
+ signalId C.guint
+}
+
+func SignalNew(s string) (*Signal, error) {
+ cstr := C.CString(s)
+ defer C.free(unsafe.Pointer(cstr))
+
+ signalId := C._g_signal_new((*C.gchar)(cstr))
+
+ if signalId == 0 {
+ return nil, fmt.Errorf("invalid signal name: %s", s)
+ }
+
+ return &Signal{
+ name: s,
+ signalId: signalId,
+ }, nil
+}
+
+func (s *Signal) String() string {
+ return s.name
+}
+
+type Quark uint32
+
+// GetApplicationName is a wrapper around g_get_application_name().
+func GetApplicationName() string {
+ c := C.g_get_application_name()
+
+ return C.GoString((*C.char)(c))
+}
+
+// SetApplicationName is a wrapper around g_set_application_name().
+func SetApplicationName(name string) {
+ cstr := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.g_set_application_name(cstr)
+}
+
+// InitI18n initializes the i18n subsystem.
+func InitI18n(domain string, dir string) {
+ domainStr := C.CString(domain)
+ defer C.free(unsafe.Pointer(domainStr))
+
+ dirStr := C.CString(dir)
+ defer C.free(unsafe.Pointer(dirStr))
+
+ C.init_i18n(domainStr, dirStr)
+}
+
+// Local localizes a string using gettext
+func Local(input string) string {
+ cstr := C.CString(input)
+ defer C.free(unsafe.Pointer(cstr))
+
+ return C.GoString(C.localize(cstr))
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/glib.go.h b/vendor/github.com/gotk3/gotk3/glib/glib.go.h
new file mode 100644
index 0000000..55a324b
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/glib.go.h
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __GLIB_GO_H__
+#define __GLIB_GO_H__
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gio/gio.h>
+#define G_SETTINGS_ENABLE_BACKEND
+#include <gio/gsettingsbackend.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gi18n.h>
+#include <locale.h>
+
+/* GObject Type Casting */
+static GObject *
+toGObject(void *p)
+{
+ return (G_OBJECT(p));
+}
+
+static GAction *
+toGAction(void *p)
+{
+ return (G_ACTION(p));
+}
+
+static GActionGroup *
+toGActionGroup(void *p)
+{
+ return (G_ACTION_GROUP(p));
+}
+
+static GActionMap *
+toGActionMap(void *p)
+{
+ return (G_ACTION_MAP(p));
+}
+
+static GSimpleAction *
+toGSimpleAction(void *p)
+{
+ return (G_SIMPLE_ACTION(p));
+}
+
+static GSimpleActionGroup *
+toGSimpleActionGroup(void *p)
+{
+ return (G_SIMPLE_ACTION_GROUP(p));
+}
+
+static GPropertyAction *
+toGPropertyAction(void *p)
+{
+ return (G_PROPERTY_ACTION(p));
+}
+
+static GMenuModel *
+toGMenuModel(void *p)
+{
+ return (G_MENU_MODEL(p));
+}
+
+static GMenu *
+toGMenu(void *p)
+{
+ return (G_MENU(p));
+}
+
+static GMenuItem *
+toGMenuItem(void *p)
+{
+ return (G_MENU_ITEM(p));
+}
+
+static GNotification *
+toGNotification(void *p)
+{
+ return (G_NOTIFICATION(p));
+}
+
+static GApplication *
+toGApplication(void *p)
+{
+ return (G_APPLICATION(p));
+}
+
+static GSettings *
+toGSettings(void *p)
+{
+ return (G_SETTINGS(p));
+}
+
+static GSettingsBackend *
+toGSettingsBackend(void *p)
+{
+ return (G_SETTINGS_BACKEND(p));
+}
+
+static GBinding*
+toGBinding(void *p)
+{
+ return (G_BINDING(p));
+}
+
+static GType
+_g_type_from_instance(gpointer instance)
+{
+ return (G_TYPE_FROM_INSTANCE(instance));
+}
+
+/* Wrapper to avoid variable arg list */
+static void
+_g_object_set_one(gpointer object, const gchar *property_name, void *val)
+{
+ g_object_set(object, property_name, *(gpointer **)val, NULL);
+}
+
+static GValue *
+alloc_gvalue_list(int n)
+{
+ GValue *valv;
+
+ valv = g_new0(GValue, n);
+ return (valv);
+}
+
+static void
+val_list_insert(GValue *valv, int i, GValue *val)
+{
+ valv[i] = *val;
+}
+
+/*
+ * GValue
+ */
+
+static GValue *
+_g_value_alloc()
+{
+ return (g_new0(GValue, 1));
+}
+
+static GValue *
+_g_value_init(GType g_type)
+{
+ GValue *value;
+
+ value = g_new0(GValue, 1);
+ return (g_value_init(value, g_type));
+}
+
+static gboolean
+_g_is_value(GValue *val)
+{
+ return (G_IS_VALUE(val));
+}
+
+static GType
+_g_value_type(GValue *val)
+{
+ return (G_VALUE_TYPE(val));
+}
+
+static GType
+_g_value_fundamental(GType type)
+{
+ return (G_TYPE_FUNDAMENTAL(type));
+}
+
+static GObjectClass *
+_g_object_get_class (GObject *object)
+{
+ return (G_OBJECT_GET_CLASS(object));
+}
+
+/*
+ * Closure support
+ */
+
+extern void goMarshal(GClosure *, GValue *, guint, GValue *, gpointer, GValue *);
+
+static GClosure *
+_g_closure_new()
+{
+ GClosure *closure;
+
+ closure = g_closure_new_simple(sizeof(GClosure), NULL);
+ g_closure_set_marshal(closure, (GClosureMarshal)(goMarshal));
+ return (closure);
+}
+
+extern void removeClosure(gpointer, GClosure *);
+
+static void
+_g_closure_add_finalize_notifier(GClosure *closure)
+{
+ g_closure_add_finalize_notifier(closure, NULL, removeClosure);
+}
+
+static inline guint _g_signal_new(const gchar *name) {
+ return g_signal_new(name,
+ G_TYPE_OBJECT,
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 0);
+}
+
+static void init_i18n(const char *domain, const char *dir) {
+ setlocale(LC_ALL, "");
+ bindtextdomain(domain, dir);
+ bind_textdomain_codeset(domain, "UTF-8");
+ textdomain(domain);
+}
+
+static const char* localize(const char *string) {
+ return _(string);
+}
+
+static inline char** make_strings(int count) {
+ return (char**)malloc(sizeof(char*) * count);
+}
+
+static inline void destroy_strings(char** strings) {
+ free(strings);
+}
+
+static inline char* get_string(char** strings, int n) {
+ return strings[n];
+}
+
+static inline void set_string(char** strings, int n, char* str) {
+ strings[n] = str;
+}
+
+static inline gchar** next_gcharptr(gchar** s) { return (s+1); }
+
+#endif
diff --git a/vendor/github.com/gotk3/gotk3/glib/glib_extension.go b/vendor/github.com/gotk3/gotk3/glib/glib_extension.go
new file mode 100644
index 0000000..f96286a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/glib_extension.go
@@ -0,0 +1,18 @@
+//glib_extension contains definitions and functions to interface between glib/gtk/gio and go universe
+
+package glib
+
+import (
+ "reflect"
+)
+
+// Should be implemented by any class which need special conversion like
+// gtk.Application -> gio.Application
+type IGlibConvert interface {
+ // If conversion can't be done, the function has to panic with a message that it can't convert to type
+ Convert(reflect.Type) reflect.Value
+}
+
+var (
+ IGlibConvertType reflect.Type
+)
diff --git a/vendor/github.com/gotk3/gotk3/glib/glib_test.go b/vendor/github.com/gotk3/gotk3/glib/glib_test.go
new file mode 100644
index 0000000..14344a4
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/glib_test.go
@@ -0,0 +1,58 @@
+package glib_test
+
+import (
+ "runtime"
+ "testing"
+
+ "github.com/gotk3/gotk3/glib"
+ "github.com/gotk3/gotk3/gtk"
+)
+
+func init() {
+ gtk.Init(nil)
+}
+
+// TestConnectNotifySignal ensures that property notification signals (those
+// whose name begins with "notify::") are queried by the name "notify" (with the
+// "::" and the property name omitted). This is because the signal is "notify"
+// and the characters after the "::" are not recognized by the signal system.
+//
+// See
+// https://developer.gnome.org/gobject/stable/gobject-The-Base-Object-Type.html#GObject-notify
+// for background, and
+// https://developer.gnome.org/gobject/stable/gobject-Signals.html#g-signal-new
+// for the specification of valid signal names.
+func TestConnectNotifySignal(t *testing.T) {
+ runtime.LockOSThread()
+
+ // Create any GObject that has defined properties.
+ spacing := 0
+ box, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, spacing)
+
+ // Connect to a "notify::" signal to listen on property changes.
+ box.Connect("notify::spacing", func() {
+ gtk.MainQuit()
+ })
+
+ glib.IdleAdd(func(s string) bool {
+ t.Log(s)
+ spacing++
+ box.SetSpacing(spacing)
+ return true
+ }, "IdleAdd executed")
+
+ gtk.Main()
+}
+
+/*At this moment Visionect specific*/
+func TestTimeoutAdd(t *testing.T) {
+ runtime.LockOSThread()
+
+ glib.TimeoutAdd(2500, func(s string) bool {
+ t.Log(s)
+ gtk.MainQuit()
+ return false
+ }, "TimeoutAdd executed")
+
+ gtk.Main()
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gmain_context.go b/vendor/github.com/gotk3/gotk3/glib/gmain_context.go
new file mode 100644
index 0000000..86ffd89
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gmain_context.go
@@ -0,0 +1,31 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+
+type MainContext C.GMainContext
+
+// native returns a pointer to the underlying GMainContext.
+func (v *MainContext) native() *C.GMainContext {
+ if v == nil {
+ return nil
+ }
+ return (*C.GMainContext)(v)
+}
+
+// MainContextDefault is a wrapper around g_main_context_default().
+func MainContextDefault() *MainContext {
+ c := C.g_main_context_default()
+ if c == nil {
+ return nil
+ }
+ return (*MainContext)(c)
+}
+
+// MainDepth is a wrapper around g_main_depth().
+func MainDepth() int {
+ return int(C.g_main_depth())
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gsimpleactiongroup.go b/vendor/github.com/gotk3/gotk3/glib/gsimpleactiongroup.go
new file mode 100644
index 0000000..f96936e
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gsimpleactiongroup.go
@@ -0,0 +1,58 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import (
+ "unsafe"
+)
+
+// SimpleActionGroup is a representation of glib's GSimpleActionGroup
+type SimpleActionGroup struct {
+ *Object
+
+ // Interfaces
+ IActionMap
+ IActionGroup
+}
+
+// deprecated since 2.38:
+// g_simple_action_group_lookup()
+// g_simple_action_group_insert()
+// g_simple_action_group_remove()
+// g_simple_action_group_add_entries()
+// -> See implementations in ActionMap
+
+// native() returns a pointer to the underlying GSimpleActionGroup.
+func (v *SimpleActionGroup) native() *C.GSimpleActionGroup {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGSimpleActionGroup(unsafe.Pointer(v.GObject))
+}
+
+func (v *SimpleActionGroup) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalSimpleActionGroup(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapSimpleActionGroup(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapSimpleActionGroup(obj *Object) *SimpleActionGroup {
+ am := wrapActionMap(obj)
+ ag := wrapActionGroup(obj)
+ return &SimpleActionGroup{obj, am, ag}
+}
+
+// SimpleActionGroupNew is a wrapper around g_simple_action_group_new
+func SimpleActionGroupNew() *SimpleActionGroup {
+ c := C.g_simple_action_group_new()
+ if c == nil {
+ return nil
+ }
+ return wrapSimpleActionGroup(wrapObject(unsafe.Pointer(c)))
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gsimpleactiongroup_test.go b/vendor/github.com/gotk3/gotk3/glib/gsimpleactiongroup_test.go
new file mode 100644
index 0000000..0982bc6
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gsimpleactiongroup_test.go
@@ -0,0 +1,70 @@
+package glib
+
+import (
+ "testing"
+)
+
+func TestSimpleActionGroupNew(t *testing.T) {
+ sag := SimpleActionGroupNew()
+ if sag == nil {
+ t.Error("SimpleActionGroupNew returned nil")
+ }
+
+ if sag.IActionGroup == nil {
+ t.Error("Embedded IActionGroup is nil")
+ }
+ if sag.IActionMap == nil {
+ t.Error("Embedded IActionGroup is nil")
+ }
+}
+
+func TestSimpleActionGroup_AddAction_RemoveAction_HasAction(t *testing.T) {
+ sag := SimpleActionGroupNew()
+ if sag == nil {
+ t.Error("SimpleActionGroup returned nil")
+ }
+
+ // Check before: empty
+ hasAction := sag.HasAction("nope")
+ if hasAction {
+ t.Error("Action group contained unexpected action 'nope'")
+ }
+ hasAction = sag.HasAction("yepp")
+ if hasAction {
+ t.Error("Action group contained unexpected action 'yepp'")
+ }
+
+ // Add a new action
+ act := SimpleActionNew("yepp", nil)
+ if act == nil {
+ t.Error("SimpleActionNew returned nil")
+ }
+ sag.AddAction(act)
+
+ // Check that it exists
+ hasAction = sag.HasAction("nope")
+ if hasAction {
+ t.Error("Action group contained unexpected action 'nope'")
+ }
+ hasAction = sag.HasAction("yepp")
+ if !hasAction {
+ t.Error("Action group did not contain action 'yepp' after adding it")
+ }
+
+ // Remove the action again
+ sag.RemoveAction("yepp")
+
+ // Check that it was removed
+ hasAction = sag.HasAction("nope")
+ if hasAction {
+ t.Error("Action group contained unexpected action 'nope'")
+ }
+ hasAction = sag.HasAction("yepp")
+ if hasAction {
+ t.Error("Action group contained unexpected action 'yepp'")
+ }
+
+ // NoFail check: removing a non-existing action
+ sag.RemoveAction("yepp")
+ sag.RemoveAction("nope")
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gsource.go b/vendor/github.com/gotk3/gotk3/glib/gsource.go
new file mode 100644
index 0000000..f11e711
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gsource.go
@@ -0,0 +1,26 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+
+type Source C.GSource
+
+// native returns a pointer to the underlying GSource.
+func (v *Source) native() *C.GSource {
+ if v == nil {
+ return nil
+ }
+ return (*C.GSource)(v)
+}
+
+// MainCurrentSource is a wrapper around g_main_current_source().
+func MainCurrentSource() *Source {
+ c := C.g_main_current_source()
+ if c == nil {
+ return nil
+ }
+ return (*Source)(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gvariant.go b/vendor/github.com/gotk3/gotk3/glib/gvariant.go
new file mode 100644
index 0000000..39e175d
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gvariant.go
@@ -0,0 +1,284 @@
+//GVariant : GVariant — strongly typed value datatype
+// https://developer.gnome.org/glib/2.26/glib-GVariant.html
+
+package glib
+
+// #include "gvariant.go.h"
+// #include "glib.go.h"
+import "C"
+
+import (
+ "fmt"
+ "unsafe"
+)
+
+/*
+ * GVariant
+ */
+
+// IVariant is an interface type implemented by Variant and all types which embed
+// an Variant. It is meant to be used as a type for function arguments which
+// require GVariants or any subclasses thereof.
+type IVariant interface {
+ ToGVariant() *C.GVariant
+ ToVariant() *Variant
+}
+
+// A Variant is a representation of GLib's GVariant.
+type Variant struct {
+ GVariant *C.GVariant
+}
+
+// ToGVariant exposes the underlying *C.GVariant type for this Variant,
+// necessary to implement IVariant.
+func (v *Variant) ToGVariant() *C.GVariant {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// ToVariant returns this Variant, necessary to implement IVariant.
+func (v *Variant) ToVariant() *Variant {
+ return v
+}
+
+// newVariant creates a new Variant from a GVariant pointer.
+func newVariant(p *C.GVariant) *Variant {
+ return &Variant{GVariant: p}
+}
+
+// VariantFromUnsafePointer returns a Variant from an unsafe pointer.
+// XXX: unnecessary footgun?
+//func VariantFromUnsafePointer(p unsafe.Pointer) *Variant {
+// return &Variant{C.toGVariant(p)}
+//}
+
+// native returns a pointer to the underlying GVariant.
+func (v *Variant) native() *C.GVariant {
+ if v == nil || v.GVariant == nil {
+ return nil
+ }
+ return v.GVariant
+}
+
+// Native returns a pointer to the underlying GVariant.
+func (v *Variant) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+// TypeString returns the g variant type string for this variant.
+func (v *Variant) TypeString() string {
+ // the string returned from this belongs to GVariant and must not be freed.
+ return C.GoString((*C.char)(C.g_variant_get_type_string(v.native())))
+}
+
+// IsContainer returns true if the variant is a container and false otherwise.
+func (v *Variant) IsContainer() bool {
+ return gobool(C.g_variant_is_container(v.native()))
+}
+
+// IsFloating returns true if the variant has a floating reference count.
+// XXX: this isn't useful without ref_sink/take_ref, which are themselves
+// perhaps not useful for most Go code that may use variants.
+//func (v *Variant) IsFloating() bool {
+// return gobool(C.g_variant_is_floating(v.native()))
+//}
+
+// GetBoolean returns the bool value of this variant.
+func (v *Variant) GetBoolean() bool {
+ return gobool(C.g_variant_get_boolean(v.native()))
+}
+
+// GetString returns the string value of the variant.
+func (v *Variant) GetString() string {
+ var len C.gsize
+ gc := C.g_variant_get_string(v.native(), &len)
+ defer C.g_free(C.gpointer(gc))
+ return C.GoStringN((*C.char)(gc), (C.int)(len))
+}
+
+// GetStrv returns a slice of strings from this variant. It wraps
+// g_variant_get_strv, but returns copies of the strings instead.
+func (v *Variant) GetStrv() []string {
+ gstrv := C.g_variant_get_strv(v.native(), nil)
+ // we do not own the memory for these strings, so we must not use strfreev
+ // but we must free the actual pointer we receive.
+ c := gstrv
+ defer C.g_free(C.gpointer(gstrv))
+ var strs []string
+
+ for *c != nil {
+ strs = append(strs, C.GoString((*C.char)(*c)))
+ c = C.next_gcharptr(c)
+ }
+ return strs
+}
+
+// GetInt returns the int64 value of the variant if it is an integer type, and
+// an error otherwise. It wraps variouns `g_variant_get_*` functions dealing
+// with integers of different sizes.
+func (v *Variant) GetInt() (int64, error) {
+ t := v.Type().String()
+ var i int64
+ switch t {
+ case "y":
+ i = int64(C.g_variant_get_byte(v.native()))
+ case "n":
+ i = int64(C.g_variant_get_int16(v.native()))
+ case "q":
+ i = int64(C.g_variant_get_uint16(v.native()))
+ case "i":
+ i = int64(C.g_variant_get_int32(v.native()))
+ case "u":
+ i = int64(C.g_variant_get_uint32(v.native()))
+ case "x":
+ i = int64(C.g_variant_get_int64(v.native()))
+ case "t":
+ i = int64(C.g_variant_get_uint64(v.native()))
+ default:
+ return 0, fmt.Errorf("variant type %s not an integer type", t)
+ }
+ return i, nil
+}
+
+// Type returns the VariantType for this variant.
+func (v *Variant) Type() *VariantType {
+ return newVariantType(C.g_variant_get_type(v.native()))
+}
+
+// IsType returns true if the variant's type matches t.
+func (v *Variant) IsType(t *VariantType) bool {
+ return gobool(C.g_variant_is_of_type(v.native(), t.native()))
+}
+
+// String wraps g_variant_print(). It returns a string understood
+// by g_variant_parse().
+func (v *Variant) String() string {
+ gc := C.g_variant_print(v.native(), gbool(false))
+ defer C.g_free(C.gpointer(gc))
+ return C.GoString((*C.char)(gc))
+}
+
+// AnnotatedString wraps g_variant_print(), but returns a type-annotated
+// string.
+func (v *Variant) AnnotatedString() string {
+ gc := C.g_variant_print(v.native(), gbool(true))
+ defer C.g_free(C.gpointer(gc))
+ return C.GoString((*C.char)(gc))
+}
+
+//void g_variant_unref ()
+//GVariant * g_variant_ref ()
+//GVariant * g_variant_ref_sink ()
+//GVariant * g_variant_take_ref ()
+//gint g_variant_compare ()
+//GVariantClass g_variant_classify ()
+//gboolean g_variant_check_format_string ()
+//void g_variant_get ()
+//void g_variant_get_va ()
+//GVariant * g_variant_new ()
+//GVariant * g_variant_new_va ()
+//GVariant * g_variant_new_boolean ()
+//GVariant * g_variant_new_byte ()
+//GVariant * g_variant_new_int16 ()
+//GVariant * g_variant_new_uint16 ()
+//GVariant * g_variant_new_int32 ()
+//GVariant * g_variant_new_uint32 ()
+//GVariant * g_variant_new_int64 ()
+//GVariant * g_variant_new_uint64 ()
+//GVariant * g_variant_new_handle ()
+//GVariant * g_variant_new_double ()
+//GVariant * g_variant_new_string ()
+//GVariant * g_variant_new_take_string ()
+//GVariant * g_variant_new_printf ()
+//GVariant * g_variant_new_object_path ()
+//gboolean g_variant_is_object_path ()
+//GVariant * g_variant_new_signature ()
+//gboolean g_variant_is_signature ()
+//GVariant * g_variant_new_variant ()
+//GVariant * g_variant_new_strv ()
+//GVariant * g_variant_new_objv ()
+//GVariant * g_variant_new_bytestring ()
+//GVariant * g_variant_new_bytestring_array ()
+//guchar g_variant_get_byte ()
+//gint16 g_variant_get_int16 ()
+//guint16 g_variant_get_uint16 ()
+//gint32 g_variant_get_int32 ()
+//guint32 g_variant_get_uint32 ()
+//gint64 g_variant_get_int64 ()
+//guint64 g_variant_get_uint64 ()
+//gint32 g_variant_get_handle ()
+//gdouble g_variant_get_double ()
+//const gchar * g_variant_get_string ()
+//gchar * g_variant_dup_string ()
+//GVariant * g_variant_get_variant ()
+//const gchar ** g_variant_get_strv ()
+//gchar ** g_variant_dup_strv ()
+//const gchar ** g_variant_get_objv ()
+//gchar ** g_variant_dup_objv ()
+//const gchar * g_variant_get_bytestring ()
+//gchar * g_variant_dup_bytestring ()
+//const gchar ** g_variant_get_bytestring_array ()
+//gchar ** g_variant_dup_bytestring_array ()
+//GVariant * g_variant_new_maybe ()
+//GVariant * g_variant_new_array ()
+//GVariant * g_variant_new_tuple ()
+//GVariant * g_variant_new_dict_entry ()
+//GVariant * g_variant_new_fixed_array ()
+//GVariant * g_variant_get_maybe ()
+//gsize g_variant_n_children ()
+//GVariant * g_variant_get_child_value ()
+//void g_variant_get_child ()
+//GVariant * g_variant_lookup_value ()
+//gboolean g_variant_lookup ()
+//gconstpointer g_variant_get_fixed_array ()
+//gsize g_variant_get_size ()
+//gconstpointer g_variant_get_data ()
+//GBytes * g_variant_get_data_as_bytes ()
+//void g_variant_store ()
+//GVariant * g_variant_new_from_data ()
+//GVariant * g_variant_new_from_bytes ()
+//GVariant * g_variant_byteswap ()
+//GVariant * g_variant_get_normal_form ()
+//gboolean g_variant_is_normal_form ()
+//guint g_variant_hash ()
+//gboolean g_variant_equal ()
+//gchar * g_variant_print ()
+//GString * g_variant_print_string ()
+//GVariantIter * g_variant_iter_copy ()
+//void g_variant_iter_free ()
+//gsize g_variant_iter_init ()
+//gsize g_variant_iter_n_children ()
+//GVariantIter * g_variant_iter_new ()
+//GVariant * g_variant_iter_next_value ()
+//gboolean g_variant_iter_next ()
+//gboolean g_variant_iter_loop ()
+//void g_variant_builder_unref ()
+//GVariantBuilder * g_variant_builder_ref ()
+//GVariantBuilder * g_variant_builder_new ()
+//void g_variant_builder_init ()
+//void g_variant_builder_clear ()
+//void g_variant_builder_add_value ()
+//void g_variant_builder_add ()
+//void g_variant_builder_add_parsed ()
+//GVariant * g_variant_builder_end ()
+//void g_variant_builder_open ()
+//void g_variant_builder_close ()
+//void g_variant_dict_unref ()
+//GVariantDict * g_variant_dict_ref ()
+//GVariantDict * g_variant_dict_new ()
+//void g_variant_dict_init ()
+//void g_variant_dict_clear ()
+//gboolean g_variant_dict_contains ()
+//gboolean g_variant_dict_lookup ()
+//GVariant * g_variant_dict_lookup_value ()
+//void g_variant_dict_insert ()
+//void g_variant_dict_insert_value ()
+//gboolean g_variant_dict_remove ()
+//GVariant * g_variant_dict_end ()
+//#define G_VARIANT_PARSE_ERROR
+//GVariant * g_variant_parse ()
+//GVariant * g_variant_new_parsed_va ()
+//GVariant * g_variant_new_parsed ()
+//gchar * g_variant_parse_error_print_context ()
diff --git a/vendor/github.com/gotk3/gotk3/glib/gvariant.go.h b/vendor/github.com/gotk3/gotk3/glib/gvariant.go.h
new file mode 100644
index 0000000..01d732e
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gvariant.go.h
@@ -0,0 +1,40 @@
+// Same copyright and license as the rest of the files in this project
+
+//GVariant : GVariant — strongly typed value datatype
+// https://developer.gnome.org/glib/2.26/glib-GVariant.html
+
+#ifndef __GVARIANT_GO_H__
+#define __GVARIANT_GO_H__
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <glib.h>
+
+// Type Casting
+
+static GVariant *
+toGVariant(void *p)
+{
+ return (GVariant*)p;
+}
+
+static GVariantBuilder *
+toGVariantBuilder(void *p)
+{
+ return (GVariantBuilder*)p;
+}
+
+static GVariantDict *
+toGVariantDict(void *p)
+{
+ return (GVariantDict*)p;
+}
+
+static GVariantIter *
+toGVariantIter(void *p)
+{
+ return (GVariantIter*)p;
+}
+
+#endif
diff --git a/vendor/github.com/gotk3/gotk3/glib/gvariant_test.go b/vendor/github.com/gotk3/gotk3/glib/gvariant_test.go
new file mode 100644
index 0000000..796b662
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gvariant_test.go
@@ -0,0 +1,14 @@
+// Same copyright and license as the rest of the files in this project
+
+package glib_test
+
+import (
+ "testing"
+)
+
+func Test_AcceleratorParse(t *testing.T) {
+ /*
+ testVariant := &Variant{}
+ t.Log("native: " + testVariant.Native())
+ */
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gvariantbuilder.go b/vendor/github.com/gotk3/gotk3/glib/gvariantbuilder.go
new file mode 100644
index 0000000..c18e787
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gvariantbuilder.go
@@ -0,0 +1,52 @@
+// Same copyright and license as the rest of the files in this project
+
+// GVariant : GVariant — strongly typed value datatype
+// https://developer.gnome.org/glib/2.26/glib-GVariant.html
+
+package glib
+
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+// #include "gvariant.go.h"
+import "C"
+import "unsafe"
+
+/*
+ * GVariantBuilder
+ */
+
+// VariantBuilder is a representation of GLib's VariantBuilder.
+type VariantBuilder struct {
+ GVariantBuilder *C.GVariantBuilder
+}
+
+func (v *VariantBuilder) toGVariantBuilder() *C.GVariantBuilder {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func (v *VariantBuilder) toVariantBuilder() *VariantBuilder {
+ return v
+}
+
+// newVariantBuilder creates a new VariantBuilder from a GVariantBuilder pointer.
+func newVariantBuilder(p *C.GVariantBuilder) *VariantBuilder {
+ return &VariantBuilder{GVariantBuilder: p}
+}
+
+// native returns a pointer to the underlying GVariantBuilder.
+func (v *VariantBuilder) native() *C.GVariantBuilder {
+ if v == nil || v.GVariantBuilder == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GVariantBuilder)
+ return C.toGVariantBuilder(p)
+}
+
+// Native returns a pointer to the underlying GVariantBuilder.
+func (v *VariantBuilder) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gvariantclass.go b/vendor/github.com/gotk3/gotk3/glib/gvariantclass.go
new file mode 100644
index 0000000..aea0618
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gvariantclass.go
@@ -0,0 +1,39 @@
+// Same copyright and license as the rest of the files in this project
+
+//GVariant : GVariant — strongly typed value datatype
+// https://developer.gnome.org/glib/2.26/glib-GVariant.html
+
+package glib
+
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+// #include "gvariant.go.h"
+import "C"
+
+/*
+ * GVariantClass
+ */
+
+type VariantClass int
+
+const (
+ VARIANT_CLASS_BOOLEAN VariantClass = C.G_VARIANT_CLASS_BOOLEAN //The GVariant is a boolean.
+ VARIANT_CLASS_BYTE VariantClass = C.G_VARIANT_CLASS_BYTE //The GVariant is a byte.
+ VARIANT_CLASS_INT16 VariantClass = C.G_VARIANT_CLASS_INT16 //The GVariant is a signed 16 bit integer.
+ VARIANT_CLASS_UINT16 VariantClass = C.G_VARIANT_CLASS_UINT16 //The GVariant is an unsigned 16 bit integer.
+ VARIANT_CLASS_INT32 VariantClass = C.G_VARIANT_CLASS_INT32 //The GVariant is a signed 32 bit integer.
+ VARIANT_CLASS_UINT32 VariantClass = C.G_VARIANT_CLASS_UINT32 //The GVariant is an unsigned 32 bit integer.
+ VARIANT_CLASS_INT64 VariantClass = C.G_VARIANT_CLASS_INT64 //The GVariant is a signed 64 bit integer.
+ VARIANT_CLASS_UINT64 VariantClass = C.G_VARIANT_CLASS_UINT64 //The GVariant is an unsigned 64 bit integer.
+ VARIANT_CLASS_HANDLE VariantClass = C.G_VARIANT_CLASS_HANDLE //The GVariant is a file handle index.
+ VARIANT_CLASS_DOUBLE VariantClass = C.G_VARIANT_CLASS_DOUBLE //The GVariant is a double precision floating point value.
+ VARIANT_CLASS_STRING VariantClass = C.G_VARIANT_CLASS_STRING //The GVariant is a normal string.
+ VARIANT_CLASS_OBJECT_PATH VariantClass = C.G_VARIANT_CLASS_OBJECT_PATH //The GVariant is a D-Bus object path string.
+ VARIANT_CLASS_SIGNATURE VariantClass = C.G_VARIANT_CLASS_SIGNATURE //The GVariant is a D-Bus signature string.
+ VARIANT_CLASS_VARIANT VariantClass = C.G_VARIANT_CLASS_VARIANT //The GVariant is a variant.
+ VARIANT_CLASS_MAYBE VariantClass = C.G_VARIANT_CLASS_MAYBE //The GVariant is a maybe-typed value.
+ VARIANT_CLASS_ARRAY VariantClass = C.G_VARIANT_CLASS_ARRAY //The GVariant is an array.
+ VARIANT_CLASS_TUPLE VariantClass = C.G_VARIANT_CLASS_TUPLE //The GVariant is a tuple.
+ VARIANT_CLASS_DICT_ENTRY VariantClass = C.G_VARIANT_CLASS_DICT_ENTRY //The GVariant is a dictionary entry.
+)
diff --git a/vendor/github.com/gotk3/gotk3/glib/gvariantdict.go b/vendor/github.com/gotk3/gotk3/glib/gvariantdict.go
new file mode 100644
index 0000000..e682008
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gvariantdict.go
@@ -0,0 +1,52 @@
+// Same copyright and license as the rest of the files in this project
+
+//GVariant : GVariant — strongly typed value datatype
+// https://developer.gnome.org/glib/2.26/glib-GVariant.html
+
+package glib
+
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+// #include "gvariant.go.h"
+import "C"
+import "unsafe"
+
+/*
+ * GVariantDict
+ */
+
+// VariantDict is a representation of GLib's VariantDict.
+type VariantDict struct {
+ GVariantDict *C.GVariantDict
+}
+
+func (v *VariantDict) toGVariantDict() *C.GVariantDict {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func (v *VariantDict) toVariantDict() *VariantDict {
+ return v
+}
+
+// newVariantDict creates a new VariantDict from a GVariantDict pointer.
+func newVariantDict(p *C.GVariantDict) *VariantDict {
+ return &VariantDict{GVariantDict: p}
+}
+
+// native returns a pointer to the underlying GVariantDict.
+func (v *VariantDict) native() *C.GVariantDict {
+ if v == nil || v.GVariantDict == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GVariantDict)
+ return C.toGVariantDict(p)
+}
+
+// Native returns a pointer to the underlying GVariantDict.
+func (v *VariantDict) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gvariantiter.go b/vendor/github.com/gotk3/gotk3/glib/gvariantiter.go
new file mode 100644
index 0000000..17b55ae
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gvariantiter.go
@@ -0,0 +1,52 @@
+// Same copyright and license as the rest of the files in this project
+
+//GVariant : GVariant — strongly typed value datatype
+// https://developer.gnome.org/glib/2.26/glib-GVariant.html
+
+package glib
+
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+// #include "gvariant.go.h"
+import "C"
+import "unsafe"
+
+/*
+ * GVariantIter
+ */
+
+// VariantIter is a representation of GLib's GVariantIter.
+type VariantIter struct {
+ GVariantIter *C.GVariantIter
+}
+
+func (v *VariantIter) toGVariantIter() *C.GVariantIter {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func (v *VariantIter) toVariantIter() *VariantIter {
+ return v
+}
+
+// newVariantIter creates a new VariantIter from a GVariantIter pointer.
+func newVariantIter(p *C.GVariantIter) *VariantIter {
+ return &VariantIter{GVariantIter: p}
+}
+
+// native returns a pointer to the underlying GVariantIter.
+func (v *VariantIter) native() *C.GVariantIter {
+ if v == nil || v.GVariantIter == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GVariantIter)
+ return C.toGVariantIter(p)
+}
+
+// Native returns a pointer to the underlying GVariantIter.
+func (v *VariantIter) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/gvarianttype.go b/vendor/github.com/gotk3/gotk3/glib/gvarianttype.go
new file mode 100644
index 0000000..0efe421
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gvarianttype.go
@@ -0,0 +1,60 @@
+// Same copyright and license as the rest of the files in this project
+
+//GVariant : GVariant — strongly typed value datatype
+// https://developer.gnome.org/glib/2.26/glib-GVariant.html
+
+package glib
+
+// #include <glib.h>
+// #include "gvarianttype.go.h"
+import "C"
+
+// A VariantType is a wrapper for the GVariantType, which encodes type
+// information for GVariants.
+type VariantType struct {
+ GVariantType *C.GVariantType
+}
+
+func (v *VariantType) native() *C.GVariantType {
+ if v == nil {
+ return nil
+ }
+ return v.GVariantType
+}
+
+// String returns a copy of this VariantType's type string.
+func (v *VariantType) String() string {
+ ch := C.g_variant_type_dup_string(v.native())
+ defer C.g_free(C.gpointer(ch))
+ return C.GoString((*C.char)(ch))
+}
+
+func newVariantType(v *C.GVariantType) *VariantType {
+ return &VariantType{v}
+}
+
+// Variant types for comparing between them. Cannot be const because
+// they are pointers.
+var (
+ VARIANT_TYPE_BOOLEAN = newVariantType(C._G_VARIANT_TYPE_BOOLEAN)
+ VARIANT_TYPE_BYTE = newVariantType(C._G_VARIANT_TYPE_BYTE)
+ VARIANT_TYPE_INT16 = newVariantType(C._G_VARIANT_TYPE_INT16)
+ VARIANT_TYPE_UINT16 = newVariantType(C._G_VARIANT_TYPE_UINT16)
+ VARIANT_TYPE_INT32 = newVariantType(C._G_VARIANT_TYPE_INT32)
+ VARIANT_TYPE_UINT32 = newVariantType(C._G_VARIANT_TYPE_UINT32)
+ VARIANT_TYPE_INT64 = newVariantType(C._G_VARIANT_TYPE_INT64)
+ VARIANT_TYPE_UINT64 = newVariantType(C._G_VARIANT_TYPE_UINT64)
+ VARIANT_TYPE_HANDLE = newVariantType(C._G_VARIANT_TYPE_HANDLE)
+ VARIANT_TYPE_DOUBLE = newVariantType(C._G_VARIANT_TYPE_DOUBLE)
+ VARIANT_TYPE_STRING = newVariantType(C._G_VARIANT_TYPE_STRING)
+ VARIANT_TYPE_ANY = newVariantType(C._G_VARIANT_TYPE_ANY)
+ VARIANT_TYPE_BASIC = newVariantType(C._G_VARIANT_TYPE_BASIC)
+ VARIANT_TYPE_TUPLE = newVariantType(C._G_VARIANT_TYPE_TUPLE)
+ VARIANT_TYPE_UNIT = newVariantType(C._G_VARIANT_TYPE_UNIT)
+ VARIANT_TYPE_DICTIONARY = newVariantType(C._G_VARIANT_TYPE_DICTIONARY)
+ VARIANT_TYPE_STRING_ARRAY = newVariantType(C._G_VARIANT_TYPE_STRING_ARRAY)
+ VARIANT_TYPE_OBJECT_PATH_ARRAY = newVariantType(C._G_VARIANT_TYPE_OBJECT_PATH_ARRAY)
+ VARIANT_TYPE_BYTESTRING = newVariantType(C._G_VARIANT_TYPE_BYTESTRING)
+ VARIANT_TYPE_BYTESTRING_ARRAY = newVariantType(C._G_VARIANT_TYPE_BYTESTRING_ARRAY)
+ VARIANT_TYPE_VARDICT = newVariantType(C._G_VARIANT_TYPE_VARDICT)
+)
diff --git a/vendor/github.com/gotk3/gotk3/glib/gvarianttype.go.h b/vendor/github.com/gotk3/gotk3/glib/gvarianttype.go.h
new file mode 100644
index 0000000..a2195de
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/gvarianttype.go.h
@@ -0,0 +1,37 @@
+// Same copyright and license as the rest of the files in this project
+
+//GVariant : GVariant — strongly typed value datatype
+// https://developer.gnome.org/glib/2.26/glib-GVariant.html
+
+#ifndef __GVARIANTTYPE_GO_H__
+#define __GVARIANTTYPE_GO_H__
+
+const GVariantType* _G_VARIANT_TYPE_BOOLEAN = G_VARIANT_TYPE_BOOLEAN;
+const GVariantType* _G_VARIANT_TYPE_BYTE = G_VARIANT_TYPE_BYTE;
+const GVariantType* _G_VARIANT_TYPE_INT16 = G_VARIANT_TYPE_INT16;
+const GVariantType* _G_VARIANT_TYPE_UINT16 = G_VARIANT_TYPE_UINT16;
+const GVariantType* _G_VARIANT_TYPE_INT32 = G_VARIANT_TYPE_INT32;
+const GVariantType* _G_VARIANT_TYPE_UINT32 = G_VARIANT_TYPE_UINT32;
+const GVariantType* _G_VARIANT_TYPE_INT64 = G_VARIANT_TYPE_INT64;
+const GVariantType* _G_VARIANT_TYPE_UINT64 = G_VARIANT_TYPE_UINT64;
+const GVariantType* _G_VARIANT_TYPE_HANDLE = G_VARIANT_TYPE_HANDLE;
+const GVariantType* _G_VARIANT_TYPE_DOUBLE = G_VARIANT_TYPE_DOUBLE;
+const GVariantType* _G_VARIANT_TYPE_STRING = G_VARIANT_TYPE_STRING;
+const GVariantType* _G_VARIANT_TYPE_OBJECT_PATH = G_VARIANT_TYPE_OBJECT_PATH;
+const GVariantType* _G_VARIANT_TYPE_SIGNATURE = G_VARIANT_TYPE_SIGNATURE;
+const GVariantType* _G_VARIANT_TYPE_VARIANT = G_VARIANT_TYPE_VARIANT;
+const GVariantType* _G_VARIANT_TYPE_ANY = G_VARIANT_TYPE_ANY;
+const GVariantType* _G_VARIANT_TYPE_BASIC = G_VARIANT_TYPE_BASIC;
+const GVariantType* _G_VARIANT_TYPE_MAYBE = G_VARIANT_TYPE_MAYBE;
+const GVariantType* _G_VARIANT_TYPE_ARRAY = G_VARIANT_TYPE_ARRAY;
+const GVariantType* _G_VARIANT_TYPE_TUPLE = G_VARIANT_TYPE_TUPLE;
+const GVariantType* _G_VARIANT_TYPE_UNIT = G_VARIANT_TYPE_UNIT;
+const GVariantType* _G_VARIANT_TYPE_DICT_ENTRY = G_VARIANT_TYPE_DICT_ENTRY;
+const GVariantType* _G_VARIANT_TYPE_DICTIONARY = G_VARIANT_TYPE_DICTIONARY;
+const GVariantType* _G_VARIANT_TYPE_STRING_ARRAY = G_VARIANT_TYPE_STRING_ARRAY;
+const GVariantType* _G_VARIANT_TYPE_OBJECT_PATH_ARRAY = G_VARIANT_TYPE_OBJECT_PATH_ARRAY;
+const GVariantType* _G_VARIANT_TYPE_BYTESTRING = G_VARIANT_TYPE_BYTESTRING;
+const GVariantType* _G_VARIANT_TYPE_BYTESTRING_ARRAY = G_VARIANT_TYPE_BYTESTRING_ARRAY;
+const GVariantType* _G_VARIANT_TYPE_VARDICT = G_VARIANT_TYPE_VARDICT;
+
+#endif
diff --git a/vendor/github.com/gotk3/gotk3/glib/list.go b/vendor/github.com/gotk3/gotk3/glib/list.go
new file mode 100644
index 0000000..250e426
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/list.go
@@ -0,0 +1,155 @@
+package glib
+
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+/*
+ * Linked Lists
+ */
+
+// List is a representation of Glib's GList.
+type List struct {
+ list *C.struct__GList
+ // If set, dataWrap is called every time NthDataWrapped()
+ // or DataWrapped() is called to wrap raw underlying
+ // value into appropriate type.
+ dataWrap func(unsafe.Pointer) interface{}
+}
+
+func WrapList(obj uintptr) *List {
+ return wrapList((*C.struct__GList)(unsafe.Pointer(obj)))
+}
+
+func wrapList(obj *C.struct__GList) *List {
+ if obj == nil {
+ return nil
+ }
+ return &List{list: obj}
+}
+
+func (v *List) wrapNewHead(obj *C.struct__GList) *List {
+ if obj == nil {
+ return nil
+ }
+ return &List{
+ list: obj,
+ dataWrap: v.dataWrap,
+ }
+}
+
+func (v *List) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.list))
+}
+
+func (v *List) native() *C.struct__GList {
+ if v == nil || v.list == nil {
+ return nil
+ }
+ return v.list
+}
+
+// DataWapper sets wrap functions, which is called during NthDataWrapped()
+// and DataWrapped(). It's used to cast raw C data into appropriate
+// Go structures and types every time that data is retreived.
+func (v *List) DataWrapper(fn func(unsafe.Pointer) interface{}) {
+ if v == nil {
+ return
+ }
+ v.dataWrap = fn
+}
+
+// Append is a wrapper around g_list_append().
+func (v *List) Append(data uintptr) *List {
+ glist := C.g_list_append(v.native(), C.gpointer(data))
+ return v.wrapNewHead(glist)
+}
+
+// Prepend is a wrapper around g_list_prepend().
+func (v *List) Prepend(data uintptr) *List {
+ glist := C.g_list_prepend(v.native(), C.gpointer(data))
+ return v.wrapNewHead(glist)
+}
+
+// Insert is a wrapper around g_list_insert().
+func (v *List) Insert(data uintptr, position int) *List {
+ glist := C.g_list_insert(v.native(), C.gpointer(data), C.gint(position))
+ return v.wrapNewHead(glist)
+}
+
+// Length is a wrapper around g_list_length().
+func (v *List) Length() uint {
+ return uint(C.g_list_length(v.native()))
+}
+
+// nthDataRaw is a wrapper around g_list_nth_data().
+func (v *List) nthDataRaw(n uint) unsafe.Pointer {
+ return unsafe.Pointer(C.g_list_nth_data(v.native(), C.guint(n)))
+}
+
+// Nth() is a wrapper around g_list_nth().
+func (v *List) Nth(n uint) *List {
+ list := wrapList(C.g_list_nth(v.native(), C.guint(n)))
+ list.DataWrapper(v.dataWrap)
+ return list
+}
+
+// NthDataWrapped acts the same as g_list_nth_data(), but passes
+// retrieved value before returning through wrap function, set by DataWrapper().
+// If no wrap function is set, it returns raw unsafe.Pointer.
+func (v *List) NthData(n uint) interface{} {
+ ptr := v.nthDataRaw(n)
+ if v.dataWrap != nil {
+ return v.dataWrap(ptr)
+ }
+ return ptr
+}
+
+// Free is a wrapper around g_list_free().
+func (v *List) Free() {
+ C.g_list_free(v.native())
+}
+
+// Next is a wrapper around the next struct field
+func (v *List) Next() *List {
+ return v.wrapNewHead(v.native().next)
+}
+
+// Previous is a wrapper around the prev struct field
+func (v *List) Previous() *List {
+ return v.wrapNewHead(v.native().prev)
+}
+
+// dataRaw is a wrapper around the data struct field
+func (v *List) dataRaw() unsafe.Pointer {
+ return unsafe.Pointer(v.native().data)
+}
+
+// DataWrapped acts the same as data struct field, but passes
+// retrieved value before returning through wrap function, set by DataWrapper().
+// If no wrap function is set, it returns raw unsafe.Pointer.
+func (v *List) Data() interface{} {
+ ptr := v.dataRaw()
+ if v.dataWrap != nil {
+ return v.dataWrap(ptr)
+ }
+ return ptr
+}
+
+// Foreach acts the same as g_list_foreach().
+// No user_data argument is implemented because of Go clojure capabilities.
+func (v *List) Foreach(fn func(item interface{})) {
+ for l := v; l != nil; l = l.Next() {
+ fn(l.Data())
+ }
+}
+
+// FreeFull acts the same as g_list_free_full().
+// Calling list.FreeFull(fn) is equivalent to calling list.Foreach(fn) and
+// list.Free() sequentially.
+func (v *List) FreeFull(fn func(item interface{})) {
+ v.Foreach(fn)
+ v.Free()
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/list_test.go b/vendor/github.com/gotk3/gotk3/glib/list_test.go
new file mode 100644
index 0000000..66e3693
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/list_test.go
@@ -0,0 +1,76 @@
+package glib
+
+import (
+ "fmt"
+ "testing"
+ "unsafe"
+)
+
+func TestList_Basics(t *testing.T) {
+ list := (&List{}).Append(0).Append(1).Append(2)
+ if list.Length() != 3 {
+ t.Errorf("Length of list with 3 appended elements must be 3. (Got %v).", list.Length())
+ }
+
+ list = (&List{}).Prepend(0).Prepend(1).Prepend(2)
+ if list.Length() != 3 {
+ t.Errorf("Length of list with 3 prepended elements must be 3. (Got %v).", list.Length())
+ }
+
+ list = (&List{}).Insert(0, 0).Insert(1, 0).Insert(2, 0)
+ if list.Length() != 3 {
+ t.Errorf("Length of list with 3 inserted elements must be 3. (Got %v).", list.Length())
+ }
+}
+
+func TestList_DataWrapper(t *testing.T) {
+ list := (&List{}).Append(0).Append(1).Append(2)
+ list.DataWrapper(func(ptr unsafe.Pointer) interface{} {
+ return fmt.Sprintf("Value %v", uintptr(ptr))
+ })
+
+ i := 0
+ for l := list; l != nil; l = l.Next() {
+ expect := fmt.Sprintf("Value %v", i)
+ i++
+ actual, ok := l.Data().(string)
+ if !ok {
+ t.Error("DataWrapper must have returned a string!")
+ }
+ if actual != expect {
+ t.Errorf("DataWrapper returned unexpected result. Expected '%v', got '%v'.", expect, actual)
+ }
+ }
+}
+
+func TestList_Foreach(t *testing.T) {
+ list := (&List{}).Append(0).Append(1).Append(2)
+ list.DataWrapper(func(ptr unsafe.Pointer) interface{} {
+ return int(uintptr(ptr) + 1)
+ })
+
+ sum := 0
+ list.Foreach(func(item interface{}) {
+ sum += item.(int)
+ })
+
+ if sum != 6 {
+ t.Errorf("Foreach resulted into wrong sum. Got %v, expected %v.", sum, 6)
+ }
+}
+
+func TestList_Nth(t *testing.T) {
+ list := (&List{}).Append(0).Append(1).Append(2)
+ list.DataWrapper(func(ptr unsafe.Pointer) interface{} {
+ return int(uintptr(ptr) + 1)
+ })
+
+ for i := uint(0); i < 3; i++ {
+ nth := list.Nth(i).Data().(int)
+ nthData := list.NthData(i).(int)
+
+ if nth != nthData {
+ t.Errorf("%v's element didn't match. Nth->Data returned %v; NthData returned %v.", i, nth, nthData)
+ }
+ }
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/menu.go b/vendor/github.com/gotk3/gotk3/glib/menu.go
new file mode 100644
index 0000000..ce9d268
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/menu.go
@@ -0,0 +1,350 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// MenuModel is a representation of GMenuModel.
+type MenuModel struct {
+ *Object
+}
+
+// native() returns a pointer to the underlying GMenuModel.
+func (v *MenuModel) native() *C.GMenuModel {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGMenuModel(unsafe.Pointer(v.GObject))
+}
+
+func (v *MenuModel) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalMenuModel(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapMenuModel(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapMenuModel(obj *Object) *MenuModel {
+ return &MenuModel{obj}
+}
+
+// IsMutable is a wrapper around g_menu_model_is_mutable().
+func (v *MenuModel) IsMutable() bool {
+ return gobool(C.g_menu_model_is_mutable(v.native()))
+}
+
+// GetNItems is a wrapper around g_menu_model_get_n_items().
+func (v *MenuModel) GetNItems() int {
+ return int(C.g_menu_model_get_n_items(v.native()))
+}
+
+// GetItemLink is a wrapper around g_menu_model_get_item_link().
+func (v *MenuModel) GetItemLink(index int, link string) *MenuModel {
+ cstr := (*C.gchar)(C.CString(link))
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.g_menu_model_get_item_link(v.native(), C.gint(index), cstr)
+ if c == nil {
+ return nil
+ }
+ return wrapMenuModel(wrapObject(unsafe.Pointer(c)))
+}
+
+// ItemsChanged is a wrapper around g_menu_model_items_changed().
+func (v *MenuModel) ItemsChanged(position, removed, added int) {
+ C.g_menu_model_items_changed(v.native(), C.gint(position), C.gint(removed), C.gint(added))
+}
+
+// GVariant * g_menu_model_get_item_attribute_value ()
+// gboolean g_menu_model_get_item_attribute ()
+// GMenuAttributeIter * g_menu_model_iterate_item_attributes ()
+// GMenuLinkIter * g_menu_model_iterate_item_links ()
+
+// Menu is a representation of GMenu.
+type Menu struct {
+ MenuModel
+}
+
+// native() returns a pointer to the underlying GMenu.
+func (m *Menu) native() *C.GMenu {
+ if m == nil || m.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(m.GObject)
+ return C.toGMenu(p)
+}
+
+func marshalMenu(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapMenu(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapMenu(obj *Object) *Menu {
+ return &Menu{MenuModel{obj}}
+}
+
+// MenuNew is a wrapper around g_menu_new().
+func MenuNew() *Menu {
+ c := C.g_menu_new()
+ if c == nil {
+ return nil
+ }
+ return wrapMenu(wrapObject(unsafe.Pointer(c)))
+}
+
+// Freeze is a wrapper around g_menu_freeze().
+func (v *Menu) Freeze() {
+ C.g_menu_freeze(v.native())
+}
+
+// Insert is a wrapper around g_menu_insert().
+func (v *Menu) Insert(position int, label, detailed_action string) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cstr2 := (*C.gchar)(C.CString(detailed_action))
+ defer C.free(unsafe.Pointer(cstr2))
+
+ C.g_menu_insert(v.native(), C.gint(position), cstr1, cstr2)
+}
+
+// Prepend is a wrapper around g_menu_prepend().
+func (v *Menu) Prepend(label, detailed_action string) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cstr2 := (*C.gchar)(C.CString(detailed_action))
+ defer C.free(unsafe.Pointer(cstr2))
+
+ C.g_menu_prepend(v.native(), cstr1, cstr2)
+}
+
+// Append is a wrapper around g_menu_append().
+func (v *Menu) Append(label, detailed_action string) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cstr2 := (*C.gchar)(C.CString(detailed_action))
+ defer C.free(unsafe.Pointer(cstr2))
+
+ C.g_menu_append(v.native(), cstr1, cstr2)
+}
+
+// InsertItem is a wrapper around g_menu_insert_item().
+func (v *Menu) InsertItem(position int, item *MenuItem) {
+ C.g_menu_insert_item(v.native(), C.gint(position), item.native())
+}
+
+// AppendItem is a wrapper around g_menu_append_item().
+func (v *Menu) AppendItem(item *MenuItem) {
+ C.g_menu_append_item(v.native(), item.native())
+}
+
+// PrependItem is a wrapper around g_menu_prepend_item().
+func (v *Menu) PrependItem(item *MenuItem) {
+ C.g_menu_prepend_item(v.native(), item.native())
+}
+
+// InsertSection is a wrapper around g_menu_insert_section().
+func (v *Menu) InsertSection(position int, label string, section *MenuModel) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_menu_insert_section(v.native(), C.gint(position), cstr1, section.native())
+}
+
+// PrependSection is a wrapper around g_menu_prepend_section().
+func (v *Menu) PrependSection(label string, section *MenuModel) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_menu_prepend_section(v.native(), cstr1, section.native())
+}
+
+// AppendSection is a wrapper around g_menu_append_section().
+func (v *Menu) AppendSection(label string, section *MenuModel) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_menu_append_section(v.native(), cstr1, section.native())
+}
+
+// InsertSectionWithoutLabel is a wrapper around g_menu_insert_section()
+// with label set to null.
+func (v *Menu) InsertSectionWithoutLabel(position int, section *MenuModel) {
+ C.g_menu_insert_section(v.native(), C.gint(position), nil, section.native())
+}
+
+// PrependSectionWithoutLabel is a wrapper around
+// g_menu_prepend_section() with label set to null.
+func (v *Menu) PrependSectionWithoutLabel(section *MenuModel) {
+ C.g_menu_prepend_section(v.native(), nil, section.native())
+}
+
+// AppendSectionWithoutLabel is a wrapper around g_menu_append_section()
+// with label set to null.
+func (v *Menu) AppendSectionWithoutLabel(section *MenuModel) {
+ C.g_menu_append_section(v.native(), nil, section.native())
+}
+
+// InsertSubmenu is a wrapper around g_menu_insert_submenu().
+func (v *Menu) InsertSubmenu(position int, label string, submenu *MenuModel) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_menu_insert_submenu(v.native(), C.gint(position), cstr1, submenu.native())
+}
+
+// PrependSubmenu is a wrapper around g_menu_prepend_submenu().
+func (v *Menu) PrependSubmenu(label string, submenu *MenuModel) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_menu_prepend_submenu(v.native(), cstr1, submenu.native())
+}
+
+// AppendSubmenu is a wrapper around g_menu_append_submenu().
+func (v *Menu) AppendSubmenu(label string, submenu *MenuModel) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_menu_append_submenu(v.native(), cstr1, submenu.native())
+}
+
+// Remove is a wrapper around g_menu_remove().
+func (v *Menu) Remove(position int) {
+ C.g_menu_remove(v.native(), C.gint(position))
+}
+
+// RemoveAll is a wrapper around g_menu_remove_all().
+func (v *Menu) RemoveAll() {
+ C.g_menu_remove_all(v.native())
+}
+
+// MenuItem is a representation of GMenuItem.
+type MenuItem struct {
+ *Object
+}
+
+// native() returns a pointer to the underlying GMenuItem.
+func (m *MenuItem) native() *C.GMenuItem {
+ if m == nil || m.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(m.GObject)
+ return C.toGMenuItem(p)
+}
+
+func marshalMenuItem(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapMenuItem(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapMenuItem(obj *Object) *MenuItem {
+ return &MenuItem{obj}
+}
+
+// MenuItemNew is a wrapper around g_menu_item_new().
+func MenuItemNew(label, detailed_action string) *MenuItem {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cstr2 := (*C.gchar)(C.CString(detailed_action))
+ defer C.free(unsafe.Pointer(cstr2))
+
+ c := C.g_menu_item_new(cstr1, cstr2)
+ if c == nil {
+ return nil
+ }
+ return wrapMenuItem(wrapObject(unsafe.Pointer(c)))
+}
+
+// MenuItemNewSection is a wrapper around g_menu_item_new_section().
+func MenuItemNewSection(label string, section *MenuModel) *MenuItem {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ c := C.g_menu_item_new_section(cstr1, section.native())
+ if c == nil {
+ return nil
+ }
+ return wrapMenuItem(wrapObject(unsafe.Pointer(c)))
+}
+
+// MenuItemNewSubmenu is a wrapper around g_menu_item_new_submenu().
+func MenuItemNewSubmenu(label string, submenu *MenuModel) *MenuItem {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ c := C.g_menu_item_new_submenu(cstr1, submenu.native())
+ if c == nil {
+ return nil
+ }
+ return wrapMenuItem(wrapObject(unsafe.Pointer(c)))
+}
+
+// MenuItemNewFromModel is a wrapper around g_menu_item_new_from_model().
+func MenuItemNewFromModel(model *MenuModel, index int) *MenuItem {
+ c := C.g_menu_item_new_from_model(model.native(), C.gint(index))
+ if c == nil {
+ return nil
+ }
+ return wrapMenuItem(wrapObject(unsafe.Pointer(c)))
+}
+
+//SetLabel is a wrapper around g_menu_item_set_label().
+func (v *MenuItem) SetLabel(label string) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_menu_item_set_label(v.native(), cstr1)
+}
+
+//SetDetailedAction is a wrapper around g_menu_item_set_detailed_action().
+func (v *MenuItem) SetDetailedAction(act string) {
+ cstr1 := (*C.gchar)(C.CString(act))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_menu_item_set_detailed_action(v.native(), cstr1)
+}
+
+//SetSection is a wrapper around g_menu_item_set_section().
+func (v *MenuItem) SetSection(section *MenuModel) {
+ C.g_menu_item_set_section(v.native(), section.native())
+}
+
+//SetSubmenu is a wrapper around g_menu_item_set_submenu().
+func (v *MenuItem) SetSubmenu(submenu *MenuModel) {
+ C.g_menu_item_set_submenu(v.native(), submenu.native())
+}
+
+//GetLink is a wrapper around g_menu_item_get_link().
+func (v *MenuItem) GetLink(link string) *MenuModel {
+ cstr1 := (*C.gchar)(C.CString(link))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ c := C.g_menu_item_get_link(v.native(), cstr1)
+ if c == nil {
+ return nil
+ }
+ return wrapMenuModel(wrapObject(unsafe.Pointer(c)))
+}
+
+//SetLink is a wrapper around g_menu_item_Set_link().
+func (v *MenuItem) SetLink(link string, model *MenuModel) {
+ cstr1 := (*C.gchar)(C.CString(link))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_menu_item_set_link(v.native(), cstr1, model.native())
+}
+
+// void g_menu_item_set_action_and_target_value ()
+// void g_menu_item_set_action_and_target ()
+// GVariant * g_menu_item_get_attribute_value ()
+// gboolean g_menu_item_get_attribute ()
+// void g_menu_item_set_attribute_value ()
+// void g_menu_item_set_attribute ()
diff --git a/vendor/github.com/gotk3/gotk3/glib/notifications.go b/vendor/github.com/gotk3/gotk3/glib/notifications.go
new file mode 100644
index 0000000..9f1ec6a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/notifications.go
@@ -0,0 +1,105 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// Only available from 2.42
+// // NotificationPriority is a representation of GLib's GNotificationPriority.
+// type NotificationPriority int
+
+// const (
+// NOTIFICATION_PRIORITY_NORMAL NotificationPriority = C.G_NOTIFICATION_PRIORITY_NORMAL
+// NOTIFICATION_PRIORITY_LOW NotificationPriority = C.G_NOTIFICATION_PRIORITY_LOW
+// NOTIFICATION_PRIORITY_HIGH NotificationPriority = C.G_NOTIFICATION_PRIORITY_HIGH
+// NOTIFICATION_PRIORITY_URGENT NotificationPriority = C.G_NOTIFICATION_PRIORITY_URGENT
+// )
+
+// Notification is a representation of GNotification.
+type Notification struct {
+ *Object
+}
+
+// native() returns a pointer to the underlying GNotification.
+func (v *Notification) native() *C.GNotification {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGNotification(unsafe.Pointer(v.GObject))
+}
+
+func (v *Notification) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalNotification(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapNotification(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapNotification(obj *Object) *Notification {
+ return &Notification{obj}
+}
+
+// NotificationNew is a wrapper around g_notification_new().
+func NotificationNew(title string) *Notification {
+ cstr1 := (*C.gchar)(C.CString(title))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ c := C.g_notification_new(cstr1)
+ if c == nil {
+ return nil
+ }
+ return wrapNotification(wrapObject(unsafe.Pointer(c)))
+}
+
+// SetTitle is a wrapper around g_notification_set_title().
+func (v *Notification) SetTitle(title string) {
+ cstr1 := (*C.gchar)(C.CString(title))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_notification_set_title(v.native(), cstr1)
+}
+
+// SetBody is a wrapper around g_notification_set_body().
+func (v *Notification) SetBody(body string) {
+ cstr1 := (*C.gchar)(C.CString(body))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_notification_set_body(v.native(), cstr1)
+}
+
+// Only available from 2.42
+// // SetPriority is a wrapper around g_notification_set_priority().
+// func (v *Notification) SetPriority(prio NotificationPriority) {
+// C.g_notification_set_priority(v.native(), C.GNotificationPriority(prio))
+// }
+
+// SetDefaultAction is a wrapper around g_notification_set_default_action().
+func (v *Notification) SetDefaultAction(detailedAction string) {
+ cstr1 := (*C.gchar)(C.CString(detailedAction))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_notification_set_default_action(v.native(), cstr1)
+}
+
+// AddButton is a wrapper around g_notification_add_button().
+func (v *Notification) AddButton(label, detailedAction string) {
+ cstr1 := (*C.gchar)(C.CString(label))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cstr2 := (*C.gchar)(C.CString(detailedAction))
+ defer C.free(unsafe.Pointer(cstr2))
+
+ C.g_notification_add_button(v.native(), cstr1, cstr2)
+}
+
+// void g_notification_set_default_action_and_target () // requires varargs
+// void g_notification_set_default_action_and_target_value () // requires variant
+// void g_notification_add_button_with_target () // requires varargs
+// void g_notification_add_button_with_target_value () //requires variant
+// void g_notification_set_urgent () // Deprecated, so not implemented
+// void g_notification_set_icon () // Requires support for GIcon, which we don't have yet.
diff --git a/vendor/github.com/gotk3/gotk3/glib/settings.go b/vendor/github.com/gotk3/gotk3/glib/settings.go
new file mode 100644
index 0000000..1bca146
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/settings.go
@@ -0,0 +1,304 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// Settings is a representation of GSettings.
+type Settings struct {
+ *Object
+}
+
+// native() returns a pointer to the underlying GSettings.
+func (v *Settings) native() *C.GSettings {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGSettings(unsafe.Pointer(v.GObject))
+}
+
+func (v *Settings) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalSettings(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapSettings(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapSettings(obj *Object) *Settings {
+ return &Settings{obj}
+}
+
+func wrapFullSettings(obj *C.GSettings) *Settings {
+ if obj == nil {
+ return nil
+ }
+ return wrapSettings(wrapObject(unsafe.Pointer(obj)))
+}
+
+// SettingsNew is a wrapper around g_settings_new().
+func SettingsNew(schemaID string) *Settings {
+ cstr := (*C.gchar)(C.CString(schemaID))
+ defer C.free(unsafe.Pointer(cstr))
+
+ return wrapFullSettings(C.g_settings_new(cstr))
+}
+
+// SettingsNewWithPath is a wrapper around g_settings_new_with_path().
+func SettingsNewWithPath(schemaID, path string) *Settings {
+ cstr1 := (*C.gchar)(C.CString(schemaID))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cstr2 := (*C.gchar)(C.CString(path))
+ defer C.free(unsafe.Pointer(cstr2))
+
+ return wrapFullSettings(C.g_settings_new_with_path(cstr1, cstr2))
+}
+
+// SettingsNewWithBackend is a wrapper around g_settings_new_with_backend().
+func SettingsNewWithBackend(schemaID string, backend *SettingsBackend) *Settings {
+ cstr1 := (*C.gchar)(C.CString(schemaID))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return wrapFullSettings(C.g_settings_new_with_backend(cstr1, backend.native()))
+}
+
+// SettingsNewWithBackendAndPath is a wrapper around g_settings_new_with_backend_and_path().
+func SettingsNewWithBackendAndPath(schemaID string, backend *SettingsBackend, path string) *Settings {
+ cstr1 := (*C.gchar)(C.CString(schemaID))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cstr2 := (*C.gchar)(C.CString(path))
+ defer C.free(unsafe.Pointer(cstr2))
+
+ return wrapFullSettings(C.g_settings_new_with_backend_and_path(cstr1, backend.native(), cstr2))
+}
+
+// SettingsNewFull is a wrapper around g_settings_new_full().
+func SettingsNewFull(schema *SettingsSchema, backend *SettingsBackend, path string) *Settings {
+ cstr1 := (*C.gchar)(C.CString(path))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return wrapFullSettings(C.g_settings_new_full(schema.native(), backend.native(), cstr1))
+}
+
+// SettingsSync is a wrapper around g_settings_sync().
+func SettingsSync() {
+ C.g_settings_sync()
+}
+
+// IsWritable is a wrapper around g_settings_is_writable().
+func (v *Settings) IsWritable(name string) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return gobool(C.g_settings_is_writable(v.native(), cstr1))
+}
+
+// Delay is a wrapper around g_settings_delay().
+func (v *Settings) Delay() {
+ C.g_settings_delay(v.native())
+}
+
+// Apply is a wrapper around g_settings_apply().
+func (v *Settings) Apply() {
+ C.g_settings_apply(v.native())
+}
+
+// Revert is a wrapper around g_settings_revert().
+func (v *Settings) Revert() {
+ C.g_settings_revert(v.native())
+}
+
+// GetHasUnapplied is a wrapper around g_settings_get_has_unapplied().
+func (v *Settings) GetHasUnapplied() bool {
+ return gobool(C.g_settings_get_has_unapplied(v.native()))
+}
+
+// GetChild is a wrapper around g_settings_get_child().
+func (v *Settings) GetChild(name string) *Settings {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return wrapFullSettings(C.g_settings_get_child(v.native(), cstr1))
+}
+
+// Reset is a wrapper around g_settings_reset().
+func (v *Settings) Reset(name string) {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ C.g_settings_reset(v.native(), cstr1)
+}
+
+// ListChildren is a wrapper around g_settings_list_children().
+func (v *Settings) ListChildren() []string {
+ return toGoStringArray(C.g_settings_list_children(v.native()))
+}
+
+// GetBoolean is a wrapper around g_settings_get_boolean().
+func (v *Settings) GetBoolean(name string) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return gobool(C.g_settings_get_boolean(v.native(), cstr1))
+}
+
+// SetBoolean is a wrapper around g_settings_set_boolean().
+func (v *Settings) SetBoolean(name string, value bool) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return gobool(C.g_settings_set_boolean(v.native(), cstr1, gbool(value)))
+}
+
+// GetInt is a wrapper around g_settings_get_int().
+func (v *Settings) GetInt(name string) int {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return int(C.g_settings_get_int(v.native(), cstr1))
+}
+
+// SetInt is a wrapper around g_settings_set_int().
+func (v *Settings) SetInt(name string, value int) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return gobool(C.g_settings_set_int(v.native(), cstr1, C.gint(value)))
+}
+
+// GetUInt is a wrapper around g_settings_get_uint().
+func (v *Settings) GetUInt(name string) uint {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return uint(C.g_settings_get_uint(v.native(), cstr1))
+}
+
+// SetUInt is a wrapper around g_settings_set_uint().
+func (v *Settings) SetUInt(name string, value uint) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return gobool(C.g_settings_set_uint(v.native(), cstr1, C.guint(value)))
+}
+
+// GetDouble is a wrapper around g_settings_get_double().
+func (v *Settings) GetDouble(name string) float64 {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return float64(C.g_settings_get_double(v.native(), cstr1))
+}
+
+// SetDouble is a wrapper around g_settings_set_double().
+func (v *Settings) SetDouble(name string, value float64) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return gobool(C.g_settings_set_double(v.native(), cstr1, C.gdouble(value)))
+}
+
+// GetString is a wrapper around g_settings_get_string().
+func (v *Settings) GetString(name string) string {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return C.GoString((*C.char)(C.g_settings_get_string(v.native(), cstr1)))
+}
+
+// SetString is a wrapper around g_settings_set_string().
+func (v *Settings) SetString(name string, value string) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cstr2 := (*C.gchar)(C.CString(value))
+ defer C.free(unsafe.Pointer(cstr2))
+
+ return gobool(C.g_settings_set_string(v.native(), cstr1, cstr2))
+}
+
+// GetEnum is a wrapper around g_settings_get_enum().
+func (v *Settings) GetEnum(name string) int {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return int(C.g_settings_get_enum(v.native(), cstr1))
+}
+
+// GetStrv is a wrapper around g_settings_get_strv().
+func (v *Settings) GetStrv(name string) []string {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+ return toGoStringArray(C.g_settings_get_strv(v.native(), cstr1))
+}
+
+// SetStrv is a wrapper around g_settings_set_strv().
+func (v *Settings) SetStrv(name string, values []string) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cvalues := make([]*C.gchar, len(values))
+ for i, accel := range values {
+ cvalues[i] = (*C.gchar)(C.CString(accel))
+ defer C.free(unsafe.Pointer(cvalues[i]))
+ }
+ cvalues = append(cvalues, nil)
+
+ return gobool(C.g_settings_set_strv(v.native(), cstr1, &cvalues[0]))
+}
+
+// SetEnum is a wrapper around g_settings_set_enum().
+func (v *Settings) SetEnum(name string, value int) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return gobool(C.g_settings_set_enum(v.native(), cstr1, C.gint(value)))
+}
+
+// GetFlags is a wrapper around g_settings_get_flags().
+func (v *Settings) GetFlags(name string) uint {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return uint(C.g_settings_get_flags(v.native(), cstr1))
+}
+
+// SetFlags is a wrapper around g_settings_set_flags().
+func (v *Settings) SetFlags(name string, value uint) bool {
+ cstr1 := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return gobool(C.g_settings_set_flags(v.native(), cstr1, C.guint(value)))
+}
+
+func (v *Settings) GetValue(name string) *Variant {
+ cstr := (*C.gchar)(C.CString(name))
+ defer C.free(unsafe.Pointer(cstr))
+ return newVariant(C.g_settings_get_value(v.native(), cstr))
+}
+
+// GVariant * g_settings_get_value ()
+// gboolean g_settings_set_value ()
+// GVariant * g_settings_get_user_value ()
+// GVariant * g_settings_get_default_value ()
+// const gchar * const * g_settings_list_schemas ()
+// const gchar * const * g_settings_list_relocatable_schemas ()
+// gchar ** g_settings_list_keys ()
+// GVariant * g_settings_get_range ()
+// gboolean g_settings_range_check ()
+// void g_settings_get ()
+// gboolean g_settings_set ()
+// gpointer g_settings_get_mapped ()
+// void g_settings_bind ()
+// void g_settings_bind_with_mapping ()
+// void g_settings_bind_writable ()
+// void g_settings_unbind ()
+// gaction * g_settings_create_action ()
+// gchar ** g_settings_get_strv ()
+// gboolean g_settings_set_strv ()
diff --git a/vendor/github.com/gotk3/gotk3/glib/settings_backend.go b/vendor/github.com/gotk3/gotk3/glib/settings_backend.go
new file mode 100644
index 0000000..3579ee4
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/settings_backend.go
@@ -0,0 +1,70 @@
+package glib
+
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// SettingsBackend is a representation of GSettingsBackend.
+type SettingsBackend struct {
+ *Object
+}
+
+// native() returns a pointer to the underlying GSettingsBackend.
+func (v *SettingsBackend) native() *C.GSettingsBackend {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGSettingsBackend(unsafe.Pointer(v.GObject))
+}
+
+func (v *SettingsBackend) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func marshalSettingsBackend(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapSettingsBackend(wrapObject(unsafe.Pointer(c))), nil
+}
+
+func wrapSettingsBackend(obj *Object) *SettingsBackend {
+ return &SettingsBackend{obj}
+}
+
+// SettingsBackendGetDefault is a wrapper around g_settings_backend_get_default().
+func SettingsBackendGetDefault() *SettingsBackend {
+ return wrapSettingsBackend(wrapObject(unsafe.Pointer(C.g_settings_backend_get_default())))
+}
+
+// KeyfileSettingsBackendNew is a wrapper around g_keyfile_settings_backend_new().
+func KeyfileSettingsBackendNew(filename, rootPath, rootGroup string) *SettingsBackend {
+ cstr1 := (*C.gchar)(C.CString(filename))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ cstr2 := (*C.gchar)(C.CString(rootPath))
+ defer C.free(unsafe.Pointer(cstr2))
+
+ cstr3 := (*C.gchar)(C.CString(rootGroup))
+ defer C.free(unsafe.Pointer(cstr3))
+
+ return wrapSettingsBackend(wrapObject(unsafe.Pointer(C.g_keyfile_settings_backend_new(cstr1, cstr2, cstr3))))
+}
+
+// MemorySettingsBackendNew is a wrapper around g_memory_settings_backend_new().
+func MemorySettingsBackendNew() *SettingsBackend {
+ return wrapSettingsBackend(wrapObject(unsafe.Pointer(C.g_memory_settings_backend_new())))
+}
+
+// NullSettingsBackendNew is a wrapper around g_null_settings_backend_new().
+func NullSettingsBackendNew() *SettingsBackend {
+ return wrapSettingsBackend(wrapObject(unsafe.Pointer(C.g_null_settings_backend_new())))
+}
+
+// void g_settings_backend_changed ()
+// void g_settings_backend_path_changed ()
+// void g_settings_backend_keys_changed ()
+// void g_settings_backend_path_writable_changed ()
+// void g_settings_backend_writable_changed ()
+// void g_settings_backend_changed_tree ()
+// void g_settings_backend_flatten_tree ()
diff --git a/vendor/github.com/gotk3/gotk3/glib/settings_schema.go b/vendor/github.com/gotk3/gotk3/glib/settings_schema.go
new file mode 100644
index 0000000..41839b1
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/settings_schema.go
@@ -0,0 +1,95 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// SettingsSchema is a representation of GSettingsSchema.
+type SettingsSchema struct {
+ schema *C.GSettingsSchema
+}
+
+func wrapSettingsSchema(obj *C.GSettingsSchema) *SettingsSchema {
+ if obj == nil {
+ return nil
+ }
+ return &SettingsSchema{obj}
+}
+
+func (v *SettingsSchema) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.schema))
+}
+
+func (v *SettingsSchema) native() *C.GSettingsSchema {
+ if v == nil || v.schema == nil {
+ return nil
+ }
+ return v.schema
+}
+
+// Ref() is a wrapper around g_settings_schema_ref().
+func (v *SettingsSchema) Ref() *SettingsSchema {
+ return wrapSettingsSchema(C.g_settings_schema_ref(v.native()))
+}
+
+// Unref() is a wrapper around g_settings_schema_unref().
+func (v *SettingsSchema) Unref() {
+ C.g_settings_schema_unref(v.native())
+}
+
+// GetID() is a wrapper around g_settings_schema_get_id().
+func (v *SettingsSchema) GetID() string {
+ return C.GoString((*C.char)(C.g_settings_schema_get_id(v.native())))
+}
+
+// GetPath() is a wrapper around g_settings_schema_get_path().
+func (v *SettingsSchema) GetPath() string {
+ return C.GoString((*C.char)(C.g_settings_schema_get_path(v.native())))
+}
+
+// HasKey() is a wrapper around g_settings_schema_has_key().
+func (v *SettingsSchema) HasKey(v1 string) bool {
+ cstr := (*C.gchar)(C.CString(v1))
+ defer C.free(unsafe.Pointer(cstr))
+
+ return gobool(C.g_settings_schema_has_key(v.native(), cstr))
+}
+
+func toGoStringArray(c **C.gchar) []string {
+ var strs []string
+ originalc := c
+ defer C.g_strfreev(originalc)
+
+ for *c != nil {
+ strs = append(strs, C.GoString((*C.char)(*c)))
+ c = C.next_gcharptr(c)
+ }
+
+ return strs
+
+}
+
+// // ListChildren() is a wrapper around g_settings_schema_list_children().
+// func (v *SettingsSchema) ListChildren() []string {
+// return toGoStringArray(C.g_settings_schema_list_children(v.native()))
+// }
+
+// // ListKeys() is a wrapper around g_settings_schema_list_keys().
+// func (v *SettingsSchema) ListKeys() []string {
+// return toGoStringArray(C.g_settings_schema_list_keys(v.native()))
+// }
+
+// const GVariantType * g_settings_schema_key_get_value_type ()
+// GVariant * g_settings_schema_key_get_default_value ()
+// GVariant * g_settings_schema_key_get_range ()
+// gboolean g_settings_schema_key_range_check ()
+// const gchar * g_settings_schema_key_get_name ()
+// const gchar * g_settings_schema_key_get_summary ()
+// const gchar * g_settings_schema_key_get_description ()
+
+// GSettingsSchemaKey * g_settings_schema_get_key ()
+// GSettingsSchemaKey * g_settings_schema_key_ref ()
+// void g_settings_schema_key_unref ()
diff --git a/vendor/github.com/gotk3/gotk3/glib/settings_schema_source.go b/vendor/github.com/gotk3/gotk3/glib/settings_schema_source.go
new file mode 100644
index 0000000..a66a4c1
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/settings_schema_source.go
@@ -0,0 +1,69 @@
+package glib
+
+// #include <gio/gio.h>
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// SettingsSchemaSource is a representation of GSettingsSchemaSource.
+type SettingsSchemaSource struct {
+ source *C.GSettingsSchemaSource
+}
+
+func wrapSettingsSchemaSource(obj *C.GSettingsSchemaSource) *SettingsSchemaSource {
+ if obj == nil {
+ return nil
+ }
+ return &SettingsSchemaSource{obj}
+}
+
+func (v *SettingsSchemaSource) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.source))
+}
+
+func (v *SettingsSchemaSource) native() *C.GSettingsSchemaSource {
+ if v == nil || v.source == nil {
+ return nil
+ }
+ return v.source
+}
+
+// SettingsSchemaSourceGetDefault is a wrapper around g_settings_schema_source_get_default().
+func SettingsSchemaSourceGetDefault() *SettingsSchemaSource {
+ return wrapSettingsSchemaSource(C.g_settings_schema_source_get_default())
+}
+
+// Ref() is a wrapper around g_settings_schema_source_ref().
+func (v *SettingsSchemaSource) Ref() *SettingsSchemaSource {
+ return wrapSettingsSchemaSource(C.g_settings_schema_source_ref(v.native()))
+}
+
+// Unref() is a wrapper around g_settings_schema_source_unref().
+func (v *SettingsSchemaSource) Unref() {
+ C.g_settings_schema_source_unref(v.native())
+}
+
+// SettingsSchemaSourceNewFromDirectory() is a wrapper around g_settings_schema_source_new_from_directory().
+func SettingsSchemaSourceNewFromDirectory(dir string, parent *SettingsSchemaSource, trusted bool) *SettingsSchemaSource {
+ cstr := (*C.gchar)(C.CString(dir))
+ defer C.free(unsafe.Pointer(cstr))
+
+ return wrapSettingsSchemaSource(C.g_settings_schema_source_new_from_directory(cstr, parent.native(), gbool(trusted), nil))
+}
+
+// Lookup() is a wrapper around g_settings_schema_source_lookup().
+func (v *SettingsSchemaSource) Lookup(schema string, recursive bool) *SettingsSchema {
+ cstr := (*C.gchar)(C.CString(schema))
+ defer C.free(unsafe.Pointer(cstr))
+
+ return wrapSettingsSchema(C.g_settings_schema_source_lookup(v.native(), cstr, gbool(recursive)))
+}
+
+// ListSchemas is a wrapper around g_settings_schema_source_list_schemas().
+func (v *SettingsSchemaSource) ListSchemas(recursive bool) (nonReolcatable, relocatable []string) {
+ var nonRel, rel **C.gchar
+ C.g_settings_schema_source_list_schemas(v.native(), gbool(recursive), &nonRel, &rel)
+ return toGoStringArray(nonRel), toGoStringArray(rel)
+}
diff --git a/vendor/github.com/gotk3/gotk3/glib/slist.go b/vendor/github.com/gotk3/gotk3/glib/slist.go
new file mode 100644
index 0000000..134e682
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/glib/slist.go
@@ -0,0 +1,109 @@
+package glib
+
+// #include <glib.h>
+// #include <glib-object.h>
+// #include "glib.go.h"
+import "C"
+import "unsafe"
+
+// SList is a representation of Glib's GSList. A SList must be manually freed
+// by either calling Free() or FreeFull()
+type SList struct {
+ list *C.struct__GSList
+}
+
+func WrapSList(obj uintptr) *SList {
+ return wrapSList((*C.struct__GSList)(unsafe.Pointer(obj)))
+}
+
+func wrapSList(obj *C.struct__GSList) *SList {
+ if obj == nil {
+ return nil
+ }
+
+ //NOTE a list should be freed by calling either
+ //g_slist_free() or g_slist_free_full(). However, it's not possible to use a
+ //finalizer for this.
+ return &SList{obj}
+}
+
+func (v *SList) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.list))
+}
+
+func (v *SList) native() *C.struct__GSList {
+ if v == nil || v.list == nil {
+ return nil
+ }
+ return v.list
+}
+
+func (v *SList) Append(data uintptr) *SList {
+ ret := C.g_slist_append(v.native(), C.gpointer(data))
+ if ret == v.native() {
+ return v
+ }
+
+ return wrapSList(ret)
+}
+
+// Length is a wrapper around g_slist_length().
+func (v *SList) Length() uint {
+ return uint(C.g_slist_length(v.native()))
+}
+
+// Next is a wrapper around the next struct field
+func (v *SList) Next() *SList {
+ n := v.native()
+ if n == nil {
+ return nil
+ }
+
+ return wrapSList(n.next)
+}
+
+// Foreach acts the same as g_slist_foreach().
+// No user_data argument is implemented because of Go clojure capabilities.
+func (v *SList) Foreach(fn func(ptr unsafe.Pointer)) {
+ for l := v; l != nil; l = l.Next() {
+ fn(unsafe.Pointer(l.native().data))
+ }
+}
+
+// Free is a wrapper around g_slist_free().
+func (v *SList) Free() {
+ C.g_slist_free(v.native())
+ v.list = nil
+}
+
+// FreeFull is a wrapper around g_slist_free_full().
+func (v *SList) FreeFull() {
+ //TODO implement GDestroyNotify callback
+ C.g_slist_free_full(v.native(), nil)
+ v.list = nil
+}
+
+// GSList * g_slist_alloc ()
+// GSList * g_slist_prepend ()
+// GSList * g_slist_insert ()
+// GSList * g_slist_insert_before ()
+// GSList * g_slist_insert_sorted ()
+// GSList * g_slist_remove ()
+// GSList * g_slist_remove_link ()
+// GSList * g_slist_delete_link ()
+// GSList * g_slist_remove_all ()
+// void g_slist_free_1 ()
+// GSList * g_slist_copy ()
+// GSList * g_slist_copy_deep ()
+// GSList * g_slist_reverse ()
+// GSList * g_slist_insert_sorted_with_data ()
+// GSList * g_slist_sort ()
+// GSList * g_slist_sort_with_data ()
+// GSList * g_slist_concat ()
+// GSList * g_slist_last ()
+// GSList * g_slist_nth ()
+// gpointer g_slist_nth_data ()
+// GSList * g_slist_find ()
+// GSList * g_slist_find_custom ()
+// gint g_slist_position ()
+// gint g_slist_index ()
diff --git a/vendor/github.com/gotk3/gotk3/gtk/aboutdialog.go b/vendor/github.com/gotk3/gotk3/gtk/aboutdialog.go
new file mode 100644
index 0000000..5bb61b3
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/aboutdialog.go
@@ -0,0 +1,324 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_about_dialog_get_type()), marshalAboutDialog},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkAboutDialog"] = wrapAboutDialog
+}
+
+/*
+ * GtkAboutDialog
+ */
+
+// AboutDialog is a representation of GTK's GtkAboutDialog.
+type AboutDialog struct {
+ Dialog
+}
+
+// native returns a pointer to the underlying GtkAboutDialog.
+func (v *AboutDialog) native() *C.GtkAboutDialog {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAboutDialog(p)
+}
+
+func marshalAboutDialog(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAboutDialog(obj), nil
+}
+
+func wrapAboutDialog(obj *glib.Object) *AboutDialog {
+ return &AboutDialog{Dialog{Window{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}}}
+}
+
+// AboutDialogNew is a wrapper around gtk_about_dialog_new().
+func AboutDialogNew() (*AboutDialog, error) {
+ c := C.gtk_about_dialog_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAboutDialog(obj), nil
+}
+
+// GetComments is a wrapper around gtk_about_dialog_get_comments().
+func (v *AboutDialog) GetComments() string {
+ c := C.gtk_about_dialog_get_comments(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetComments is a wrapper around gtk_about_dialog_set_comments().
+func (v *AboutDialog) SetComments(comments string) {
+ cstr := C.CString(comments)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_about_dialog_set_comments(v.native(), (*C.gchar)(cstr))
+}
+
+// GetCopyright is a wrapper around gtk_about_dialog_get_copyright().
+func (v *AboutDialog) GetCopyright() string {
+ c := C.gtk_about_dialog_get_copyright(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetCopyright is a wrapper around gtk_about_dialog_set_copyright().
+func (v *AboutDialog) SetCopyright(copyright string) {
+ cstr := C.CString(copyright)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_about_dialog_set_copyright(v.native(), (*C.gchar)(cstr))
+}
+
+// GetLicense is a wrapper around gtk_about_dialog_get_license().
+func (v *AboutDialog) GetLicense() string {
+ c := C.gtk_about_dialog_get_license(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetLicense is a wrapper around gtk_about_dialog_set_license().
+func (v *AboutDialog) SetLicense(license string) {
+ cstr := C.CString(license)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_about_dialog_set_license(v.native(), (*C.gchar)(cstr))
+}
+
+// GetLicenseType is a wrapper around gtk_about_dialog_get_license_type().
+func (v *AboutDialog) GetLicenseType() License {
+ c := C.gtk_about_dialog_get_license_type(v.native())
+ return License(c)
+}
+
+// SetLicenseType is a wrapper around gtk_about_dialog_set_license_type().
+func (v *AboutDialog) SetLicenseType(license License) {
+ C.gtk_about_dialog_set_license_type(v.native(), C.GtkLicense(license))
+}
+
+// GetLogo is a wrapper around gtk_about_dialog_get_logo().
+func (v *AboutDialog) GetLogo() (*gdk.Pixbuf, error) {
+ c := C.gtk_about_dialog_get_logo(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ p := &gdk.Pixbuf{glib.Take(unsafe.Pointer(c))}
+ return p, nil
+}
+
+// SetLogo is a wrapper around gtk_about_dialog_set_logo().
+func (v *AboutDialog) SetLogo(logo *gdk.Pixbuf) {
+ logoPtr := (*C.GdkPixbuf)(unsafe.Pointer(logo.Native()))
+ C.gtk_about_dialog_set_logo(v.native(), logoPtr)
+}
+
+// GetLogoIconName is a wrapper around gtk_about_dialog_get_logo_icon_name().
+func (v *AboutDialog) GetLogoIconName() string {
+ c := C.gtk_about_dialog_get_logo_icon_name(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetLogoIconName is a wrapper around gtk_about_dialog_set_logo_icon_name().
+func (v *AboutDialog) SetLogoIconName(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_about_dialog_set_logo_icon_name(v.native(), (*C.gchar)(cstr))
+}
+
+// GetProgramName is a wrapper around gtk_about_dialog_get_program_name().
+func (v *AboutDialog) GetProgramName() string {
+ c := C.gtk_about_dialog_get_program_name(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetProgramName is a wrapper around gtk_about_dialog_set_program_name().
+func (v *AboutDialog) SetProgramName(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_about_dialog_set_program_name(v.native(), (*C.gchar)(cstr))
+}
+
+// GetAuthors is a wrapper around gtk_about_dialog_get_authors().
+func (v *AboutDialog) GetAuthors() []string {
+ var authors []string
+ cauthors := C.gtk_about_dialog_get_authors(v.native())
+ if cauthors == nil {
+ return nil
+ }
+ for {
+ if *cauthors == nil {
+ break
+ }
+ authors = append(authors, C.GoString((*C.char)(*cauthors)))
+ cauthors = C.next_gcharptr(cauthors)
+ }
+ return authors
+}
+
+// SetAuthors is a wrapper around gtk_about_dialog_set_authors().
+func (v *AboutDialog) SetAuthors(authors []string) {
+ cauthors := C.make_strings(C.int(len(authors) + 1))
+ for i, author := range authors {
+ cstr := C.CString(author)
+ defer C.free(unsafe.Pointer(cstr))
+ C.set_string(cauthors, C.int(i), (*C.gchar)(cstr))
+ }
+
+ C.set_string(cauthors, C.int(len(authors)), nil)
+ C.gtk_about_dialog_set_authors(v.native(), cauthors)
+ C.destroy_strings(cauthors)
+}
+
+// GetArtists is a wrapper around gtk_about_dialog_get_artists().
+func (v *AboutDialog) GetArtists() []string {
+ var artists []string
+ cartists := C.gtk_about_dialog_get_artists(v.native())
+ if cartists == nil {
+ return nil
+ }
+ for {
+ if *cartists == nil {
+ break
+ }
+ artists = append(artists, C.GoString((*C.char)(*cartists)))
+ cartists = C.next_gcharptr(cartists)
+ }
+ return artists
+}
+
+// SetArtists is a wrapper around gtk_about_dialog_set_artists().
+func (v *AboutDialog) SetArtists(artists []string) {
+ cartists := C.make_strings(C.int(len(artists) + 1))
+ for i, artist := range artists {
+ cstr := C.CString(artist)
+ defer C.free(unsafe.Pointer(cstr))
+ C.set_string(cartists, C.int(i), (*C.gchar)(cstr))
+ }
+
+ C.set_string(cartists, C.int(len(artists)), nil)
+ C.gtk_about_dialog_set_artists(v.native(), cartists)
+ C.destroy_strings(cartists)
+}
+
+// GetDocumenters is a wrapper around gtk_about_dialog_get_documenters().
+func (v *AboutDialog) GetDocumenters() []string {
+ var documenters []string
+ cdocumenters := C.gtk_about_dialog_get_documenters(v.native())
+ if cdocumenters == nil {
+ return nil
+ }
+ for {
+ if *cdocumenters == nil {
+ break
+ }
+ documenters = append(documenters, C.GoString((*C.char)(*cdocumenters)))
+ cdocumenters = C.next_gcharptr(cdocumenters)
+ }
+ return documenters
+}
+
+// SetDocumenters is a wrapper around gtk_about_dialog_set_documenters().
+func (v *AboutDialog) SetDocumenters(documenters []string) {
+ cdocumenters := C.make_strings(C.int(len(documenters) + 1))
+ for i, doc := range documenters {
+ cstr := C.CString(doc)
+ defer C.free(unsafe.Pointer(cstr))
+ C.set_string(cdocumenters, C.int(i), (*C.gchar)(cstr))
+ }
+
+ C.set_string(cdocumenters, C.int(len(documenters)), nil)
+ C.gtk_about_dialog_set_documenters(v.native(), cdocumenters)
+ C.destroy_strings(cdocumenters)
+}
+
+// GetTranslatorCredits is a wrapper around gtk_about_dialog_get_translator_credits().
+func (v *AboutDialog) GetTranslatorCredits() string {
+ c := C.gtk_about_dialog_get_translator_credits(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetTranslatorCredits is a wrapper around gtk_about_dialog_set_translator_credits().
+func (v *AboutDialog) SetTranslatorCredits(translatorCredits string) {
+ cstr := C.CString(translatorCredits)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_about_dialog_set_translator_credits(v.native(), (*C.gchar)(cstr))
+}
+
+// GetVersion is a wrapper around gtk_about_dialog_get_version().
+func (v *AboutDialog) GetVersion() string {
+ c := C.gtk_about_dialog_get_version(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetVersion is a wrapper around gtk_about_dialog_set_version().
+func (v *AboutDialog) SetVersion(version string) {
+ cstr := C.CString(version)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_about_dialog_set_version(v.native(), (*C.gchar)(cstr))
+}
+
+// GetWebsite is a wrapper around gtk_about_dialog_get_website().
+func (v *AboutDialog) GetWebsite() string {
+ c := C.gtk_about_dialog_get_website(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetWebsite is a wrapper around gtk_about_dialog_set_website().
+func (v *AboutDialog) SetWebsite(website string) {
+ cstr := C.CString(website)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_about_dialog_set_website(v.native(), (*C.gchar)(cstr))
+}
+
+// GetWebsiteLabel is a wrapper around gtk_about_dialog_get_website_label().
+func (v *AboutDialog) GetWebsiteLabel() string {
+ c := C.gtk_about_dialog_get_website_label(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetWebsiteLabel is a wrapper around gtk_about_dialog_set_website_label().
+func (v *AboutDialog) SetWebsiteLabel(websiteLabel string) {
+ cstr := C.CString(websiteLabel)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_about_dialog_set_website_label(v.native(), (*C.gchar)(cstr))
+}
+
+// GetWrapLicense is a wrapper around gtk_about_dialog_get_wrap_license().
+func (v *AboutDialog) GetWrapLicense() bool {
+ return gobool(C.gtk_about_dialog_get_wrap_license(v.native()))
+}
+
+// SetWrapLicense is a wrapper around gtk_about_dialog_set_wrap_license().
+func (v *AboutDialog) SetWrapLicense(wrapLicense bool) {
+ C.gtk_about_dialog_set_wrap_license(v.native(), gbool(wrapLicense))
+}
+
+// AddCreditSection is a wrapper around gtk_about_dialog_add_credit_section().
+func (v *AboutDialog) AddCreditSection(sectionName string, people []string) {
+ cname := (*C.gchar)(C.CString(sectionName))
+ defer C.free(unsafe.Pointer(cname))
+
+ cpeople := C.make_strings(C.int(len(people)) + 1)
+ defer C.destroy_strings(cpeople)
+ for i, p := range people {
+ cp := (*C.gchar)(C.CString(p))
+ defer C.free(unsafe.Pointer(cp))
+ C.set_string(cpeople, C.int(i), cp)
+ }
+ C.set_string(cpeople, C.int(len(people)), nil)
+
+ C.gtk_about_dialog_add_credit_section(v.native(), cname, cpeople)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/accel.go b/vendor/github.com/gotk3/gotk3/gtk/accel.go
new file mode 100644
index 0000000..b740e6c
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/accel.go
@@ -0,0 +1,435 @@
+// 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 (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+// AccelFlags is a representation of GTK's GtkAccelFlags
+type AccelFlags int
+
+const (
+ ACCEL_VISIBLE AccelFlags = C.GTK_ACCEL_VISIBLE
+ ACCEL_LOCKED AccelFlags = C.GTK_ACCEL_LOCKED
+ ACCEL_MASK AccelFlags = C.GTK_ACCEL_MASK
+)
+
+func marshalAccelFlags(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return AccelFlags(c), nil
+}
+
+// AcceleratorName is a wrapper around gtk_accelerator_name().
+func AcceleratorName(key uint, mods gdk.ModifierType) string {
+ c := C.gtk_accelerator_name(C.guint(key), C.GdkModifierType(mods))
+ defer C.free(unsafe.Pointer(c))
+ return C.GoString((*C.char)(c))
+}
+
+// AcceleratorValid is a wrapper around gtk_accelerator_valid().
+func AcceleratorValid(key uint, mods gdk.ModifierType) bool {
+ return gobool(C.gtk_accelerator_valid(C.guint(key), C.GdkModifierType(mods)))
+}
+
+// AcceleratorGetDefaultModMask is a wrapper around gtk_accelerator_get_default_mod_mask().
+func AcceleratorGetDefaultModMask() gdk.ModifierType {
+ return gdk.ModifierType(C.gtk_accelerator_get_default_mod_mask())
+}
+
+// AcceleratorParse is a wrapper around gtk_accelerator_parse().
+func AcceleratorParse(acc string) (key uint, mods gdk.ModifierType) {
+ cstr := C.CString(acc)
+ defer C.free(unsafe.Pointer(cstr))
+
+ k := C.guint(0)
+ m := C.GdkModifierType(0)
+
+ C.gtk_accelerator_parse((*C.gchar)(cstr), &k, &m)
+ return uint(k), gdk.ModifierType(m)
+}
+
+// AcceleratorGetLabel is a wrapper around gtk_accelerator_get_label().
+func AcceleratorGetLabel(key uint, mods gdk.ModifierType) string {
+ c := C.gtk_accelerator_get_label(C.guint(key), C.GdkModifierType(mods))
+ defer C.free(unsafe.Pointer(c))
+ return C.GoString((*C.char)(c))
+}
+
+// AcceleratorSetDefaultModMask is a wrapper around gtk_accelerator_set_default_mod_mask().
+func AcceleratorSetDefaultModMask(mods gdk.ModifierType) {
+ C.gtk_accelerator_set_default_mod_mask(C.GdkModifierType(mods))
+}
+
+/*
+ * GtkAccelGroup
+ */
+
+// AccelGroup is a representation of GTK's GtkAccelGroup.
+type AccelGroup struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkAccelGroup.
+func (v *AccelGroup) native() *C.GtkAccelGroup {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAccelGroup(p)
+}
+
+func marshalAccelGroup(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAccelGroup(obj), nil
+}
+
+func wrapAccelGroup(obj *glib.Object) *AccelGroup {
+ return &AccelGroup{obj}
+}
+
+// AccelGroup is a wrapper around gtk_accel_group_new().
+func AccelGroupNew() (*AccelGroup, error) {
+ c := C.gtk_accel_group_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAccelGroup(obj), nil
+}
+
+// Connect is a wrapper around gtk_accel_group_connect().
+func (v *AccelGroup) Connect(key uint, mods gdk.ModifierType, flags AccelFlags, f interface{}) {
+ closure, _ := glib.ClosureNew(f)
+ cl := (*C.struct__GClosure)(unsafe.Pointer(closure))
+ C.gtk_accel_group_connect(
+ v.native(),
+ C.guint(key),
+ C.GdkModifierType(mods),
+ C.GtkAccelFlags(flags),
+ cl)
+}
+
+// ConnectByPath is a wrapper around gtk_accel_group_connect_by_path().
+func (v *AccelGroup) ConnectByPath(path string, f interface{}) {
+ closure, _ := glib.ClosureNew(f)
+ cl := (*C.struct__GClosure)(unsafe.Pointer(closure))
+
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_accel_group_connect_by_path(
+ v.native(),
+ (*C.gchar)(cstr),
+ cl)
+}
+
+// Disconnect is a wrapper around gtk_accel_group_disconnect().
+func (v *AccelGroup) Disconnect(f interface{}) {
+ closure, _ := glib.ClosureNew(f)
+ cl := (*C.struct__GClosure)(unsafe.Pointer(closure))
+ C.gtk_accel_group_disconnect(v.native(), cl)
+}
+
+// DisconnectKey is a wrapper around gtk_accel_group_disconnect_key().
+func (v *AccelGroup) DisconnectKey(key uint, mods gdk.ModifierType) {
+ C.gtk_accel_group_disconnect_key(v.native(), C.guint(key), C.GdkModifierType(mods))
+}
+
+// Lock is a wrapper around gtk_accel_group_lock().
+func (v *AccelGroup) Lock() {
+ C.gtk_accel_group_lock(v.native())
+}
+
+// Unlock is a wrapper around gtk_accel_group_unlock().
+func (v *AccelGroup) Unlock() {
+ C.gtk_accel_group_unlock(v.native())
+}
+
+// IsLocked is a wrapper around gtk_accel_group_get_is_locked().
+func (v *AccelGroup) IsLocked() bool {
+ return gobool(C.gtk_accel_group_get_is_locked(v.native()))
+}
+
+// AccelGroupFromClosure is a wrapper around gtk_accel_group_from_accel_closure().
+func AccelGroupFromClosure(f interface{}) *AccelGroup {
+ closure, _ := glib.ClosureNew(f)
+ cl := (*C.struct__GClosure)(unsafe.Pointer(closure))
+ c := C.gtk_accel_group_from_accel_closure(cl)
+ if c == nil {
+ return nil
+ }
+ return wrapAccelGroup(glib.Take(unsafe.Pointer(c)))
+}
+
+// GetModifierMask is a wrapper around gtk_accel_group_get_modifier_mask().
+func (v *AccelGroup) GetModifierMask() gdk.ModifierType {
+ return gdk.ModifierType(C.gtk_accel_group_get_modifier_mask(v.native()))
+}
+
+// AccelGroupsActivate is a wrapper around gtk_accel_groups_activate().
+func AccelGroupsActivate(obj *glib.Object, key uint, mods gdk.ModifierType) bool {
+ return gobool(C.gtk_accel_groups_activate((*C.GObject)(unsafe.Pointer(obj.Native())), C.guint(key), C.GdkModifierType(mods)))
+}
+
+// Activate is a wrapper around gtk_accel_group_activate().
+func (v *AccelGroup) Activate(quark glib.Quark, acceleratable *glib.Object, key uint, mods gdk.ModifierType) bool {
+ return gobool(C.gtk_accel_group_activate(v.native(), C.GQuark(quark), (*C.GObject)(unsafe.Pointer(acceleratable.Native())), C.guint(key), C.GdkModifierType(mods)))
+}
+
+// AccelGroupsFromObject is a wrapper around gtk_accel_groups_from_object().
+func AccelGroupsFromObject(obj *glib.Object) *glib.SList {
+ res := C.gtk_accel_groups_from_object((*C.GObject)(unsafe.Pointer(obj.Native())))
+ if res == nil {
+ return nil
+ }
+ return (*glib.SList)(unsafe.Pointer(res))
+}
+
+/*
+ * GtkAccelMap
+ */
+
+// AccelMap is a representation of GTK's GtkAccelMap.
+type AccelMap struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkAccelMap.
+func (v *AccelMap) native() *C.GtkAccelMap {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAccelMap(p)
+}
+
+func marshalAccelMap(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAccelMap(obj), nil
+}
+
+func wrapAccelMap(obj *glib.Object) *AccelMap {
+ return &AccelMap{obj}
+}
+
+// AccelMapAddEntry is a wrapper around gtk_accel_map_add_entry().
+func AccelMapAddEntry(path string, key uint, mods gdk.ModifierType) {
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_accel_map_add_entry((*C.gchar)(cstr), C.guint(key), C.GdkModifierType(mods))
+}
+
+type AccelKey struct {
+ key uint
+ mods gdk.ModifierType
+ flags uint16
+}
+
+func (v *AccelKey) native() *C.struct__GtkAccelKey {
+ if v == nil {
+ return nil
+ }
+
+ var val C.struct__GtkAccelKey
+ val.accel_key = C.guint(v.key)
+ val.accel_mods = C.GdkModifierType(v.mods)
+ val.accel_flags = v.flags
+ return &val
+}
+
+func wrapAccelKey(obj *C.struct__GtkAccelKey) *AccelKey {
+ var v AccelKey
+
+ v.key = uint(obj.accel_key)
+ v.mods = gdk.ModifierType(obj.accel_mods)
+ v.flags = uint16(obj.accel_flags)
+
+ return &v
+}
+
+// AccelMapLookupEntry is a wrapper around gtk_accel_map_lookup_entry().
+func AccelMapLookupEntry(path string) *AccelKey {
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+
+ var v *C.struct__GtkAccelKey
+
+ C.gtk_accel_map_lookup_entry((*C.gchar)(cstr), v)
+ return wrapAccelKey(v)
+}
+
+// AccelMapChangeEntry is a wrapper around gtk_accel_map_change_entry().
+func AccelMapChangeEntry(path string, key uint, mods gdk.ModifierType, replace bool) bool {
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+
+ return gobool(C.gtk_accel_map_change_entry((*C.gchar)(cstr), C.guint(key), C.GdkModifierType(mods), gbool(replace)))
+}
+
+// AccelMapLoad is a wrapper around gtk_accel_map_load().
+func AccelMapLoad(fileName string) {
+ cstr := C.CString(fileName)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_accel_map_load((*C.gchar)(cstr))
+}
+
+// AccelMapSave is a wrapper around gtk_accel_map_save().
+func AccelMapSave(fileName string) {
+ cstr := C.CString(fileName)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_accel_map_save((*C.gchar)(cstr))
+}
+
+// AccelMapLoadFD is a wrapper around gtk_accel_map_load_fd().
+func AccelMapLoadFD(fd int) {
+ C.gtk_accel_map_load_fd(C.gint(fd))
+}
+
+// AccelMapSaveFD is a wrapper around gtk_accel_map_save_fd().
+func AccelMapSaveFD(fd int) {
+ C.gtk_accel_map_save_fd(C.gint(fd))
+}
+
+// AccelMapAddFilter is a wrapper around gtk_accel_map_add_filter().
+func AccelMapAddFilter(filter string) {
+ cstr := C.CString(filter)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_accel_map_add_filter((*C.gchar)(cstr))
+}
+
+// AccelMapGet is a wrapper around gtk_accel_map_get().
+func AccelMapGet() *AccelMap {
+ c := C.gtk_accel_map_get()
+ if c == nil {
+ return nil
+ }
+ return wrapAccelMap(glib.Take(unsafe.Pointer(c)))
+}
+
+// AccelMapLockPath is a wrapper around gtk_accel_map_lock_path().
+func AccelMapLockPath(path string) {
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_accel_map_lock_path((*C.gchar)(cstr))
+}
+
+// AccelMapUnlockPath is a wrapper around gtk_accel_map_unlock_path().
+func AccelMapUnlockPath(path string) {
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_accel_map_unlock_path((*C.gchar)(cstr))
+}
+
+// SetAccelGroup is a wrapper around gtk_menu_set_accel_group().
+func (v *Menu) SetAccelGroup(accelGroup *AccelGroup) {
+ C.gtk_menu_set_accel_group(v.native(), accelGroup.native())
+}
+
+// GetAccelGroup is a wrapper around gtk_menu_get_accel_group().
+func (v *Menu) GetAccelGroup() *AccelGroup {
+ c := C.gtk_menu_get_accel_group(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapAccelGroup(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetAccelPath is a wrapper around gtk_menu_set_accel_path().
+func (v *Menu) SetAccelPath(path string) {
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_menu_set_accel_path(v.native(), (*C.gchar)(cstr))
+}
+
+// GetAccelPath is a wrapper around gtk_menu_get_accel_path().
+func (v *Menu) GetAccelPath() string {
+ c := C.gtk_menu_get_accel_path(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetAccelPath is a wrapper around gtk_menu_item_set_accel_path().
+func (v *MenuItem) SetAccelPath(path string) {
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_menu_item_set_accel_path(v.native(), (*C.gchar)(cstr))
+}
+
+// GetAccelPath is a wrapper around gtk_menu_item_get_accel_path().
+func (v *MenuItem) GetAccelPath() string {
+ c := C.gtk_menu_item_get_accel_path(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// AddAccelerator is a wrapper around gtk_widget_add_accelerator().
+func (v *Widget) AddAccelerator(signal string, group *AccelGroup, key uint, mods gdk.ModifierType, flags AccelFlags) {
+ csignal := (*C.gchar)(C.CString(signal))
+ defer C.free(unsafe.Pointer(csignal))
+
+ C.gtk_widget_add_accelerator(v.native(),
+ csignal,
+ group.native(),
+ C.guint(key),
+ C.GdkModifierType(mods),
+ C.GtkAccelFlags(flags))
+}
+
+// RemoveAccelerator is a wrapper around gtk_widget_remove_accelerator().
+func (v *Widget) RemoveAccelerator(group *AccelGroup, key uint, mods gdk.ModifierType) bool {
+ return gobool(C.gtk_widget_remove_accelerator(v.native(),
+ group.native(),
+ C.guint(key),
+ C.GdkModifierType(mods)))
+}
+
+// SetAccelPath is a wrapper around gtk_widget_set_accel_path().
+func (v *Widget) SetAccelPath(path string, group *AccelGroup) {
+ cstr := (*C.gchar)(C.CString(path))
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_widget_set_accel_path(v.native(), cstr, group.native())
+}
+
+// CanActivateAccel is a wrapper around gtk_widget_can_activate_accel().
+func (v *Widget) CanActivateAccel(signalId uint) bool {
+ return gobool(C.gtk_widget_can_activate_accel(v.native(), C.guint(signalId)))
+}
+
+// AddAccelGroup() is a wrapper around gtk_window_add_accel_group().
+func (v *Window) AddAccelGroup(accelGroup *AccelGroup) {
+ C.gtk_window_add_accel_group(v.native(), accelGroup.native())
+}
+
+// RemoveAccelGroup() is a wrapper around gtk_window_add_accel_group().
+func (v *Window) RemoveAccelGroup(accelGroup *AccelGroup) {
+ C.gtk_window_remove_accel_group(v.native(), accelGroup.native())
+}
+
+// These three functions are for system level access - thus not as high priority to implement
+// TODO: void gtk_accelerator_parse_with_keycode ()
+// TODO: gchar * gtk_accelerator_name_with_keycode ()
+// TODO: gchar * gtk_accelerator_get_label_with_keycode ()
+
+// TODO: GtkAccelKey * gtk_accel_group_find () - this function uses a function type - I don't know how to represent it in cgo
+// TODO: gtk_accel_map_foreach_unfiltered - can't be done without a function type
+// TODO: gtk_accel_map_foreach - can't be done without a function type
+
+// TODO: gtk_accel_map_load_scanner
+// TODO: gtk_widget_list_accel_closures
diff --git a/vendor/github.com/gotk3/gotk3/gtk/accel_test.go b/vendor/github.com/gotk3/gotk3/gtk/accel_test.go
new file mode 100644
index 0000000..938fd22
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/accel_test.go
@@ -0,0 +1,34 @@
+// Same copyright and license as the rest of the files in this project
+
+package gtk
+
+import "testing"
+
+func Test_AccelGroup_Locking(t *testing.T) {
+ ag, _ := AccelGroupNew()
+ if ag.IsLocked() {
+ t.Error("A newly created AccelGroup should not be locked")
+ }
+
+ ag.Lock()
+
+ if !ag.IsLocked() {
+ t.Error("A locked AccelGroup should report being locked")
+ }
+
+ ag.Unlock()
+
+ if ag.IsLocked() {
+ t.Error("An unlocked AccelGroup should report being unlocked")
+ }
+}
+
+func Test_AcceleratorParse(t *testing.T) {
+ l, r := AcceleratorParse("<Shift><Alt>F1")
+ if l != 65470 {
+ t.Errorf("Expected parsed key to equal %d but was %d", 65470, l)
+ }
+ if r != 9 {
+ t.Errorf("Expected parsed mods to equal %d but was %d", 9, r)
+ }
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/actionable.go b/vendor/github.com/gotk3/gotk3/gtk/actionable.go
new file mode 100644
index 0000000..70b357d
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/actionable.go
@@ -0,0 +1,117 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+// #include "actionable.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_actionable_get_type()), marshalActionable},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkActionable"] = marshalActionable
+}
+
+// IActionable is a representation of the GtkActionable GInterface,
+// used to avoid duplication when embedding the type in a wrapper of another GObject-based type.
+// The non-Interface version should only be used Actionable is used if the concrete type is not known.
+type IActionable interface {
+ Native() uintptr
+ toActionable() *C.GtkActionable
+
+ SetActionName(name string)
+ GetActionName() (string, error)
+ // SetActionTargetValue(value *glib.Variant)
+ // GetActionTargetValue() (*glib.Variant, error)
+ // SetActionTarget(string, params...)
+ SetDetailedActionName(name string)
+}
+
+// Actionable is a representation of the GtkActionable GInterface.
+// Do not embed this concrete type in implementing structs but rather use IActionable
+// (see Button wrapper for an example)
+type Actionable struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkActionable.
+func (v *Actionable) native() *C.GtkActionable {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkActionable(p)
+}
+
+func marshalActionable(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapActionable(obj), nil
+}
+
+func wrapActionable(obj *glib.Object) *Actionable {
+ return &Actionable{obj}
+}
+
+func (v *Actionable) toActionable() *C.GtkActionable {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// SetActionName is a wrapper around gtk_actionable_set_action_name().
+// Since 3.4
+func (v *Actionable) SetActionName(action_name string) {
+ cstr := C.CString(action_name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_actionable_set_action_name(v.native(), (*C.gchar)(cstr))
+}
+
+// GetActionName is a wrapper around gtk_actionable_set_action_name().
+// Since 3.4
+func (v *Actionable) GetActionName() (string, error) {
+ c := C.gtk_actionable_get_action_name(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return C.GoString((*C.char)(c)), nil
+}
+
+// SetDetailedActionName is a wrapper around gtk_actionable_set_detailed_action_name().
+// Since 3.4
+func (v *Actionable) SetDetailedActionName(detailed_action_name string) {
+ cstr := C.CString(detailed_action_name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_actionable_set_detailed_action_name(v.native(), (*C.gchar)(cstr))
+}
+
+// SetActionTargetValue is a wrapper around gtk_actionable_set_action_target_value().
+// Since 3.4
+/*func (v *Actionable) SetActionTargetValue(value *glib.Variant) {
+ // FIXME ToGVariant does not work here
+ C.gtk_actionable_set_action_target_value(v.native(), value.ToGVariant())
+}*/
+
+// GetActionTargetValue is a wrapper around gtk_actionable_get_action_target_value().
+// Since 3.4
+/*func (v *Actionable) GetActionTargetValue() (*glib.Variant, error) {
+ // FIXME: newVariant is not exported from glib
+ return newVariant(C.gtk_actionable_get_action_target_value(v.native(), cstr))
+}*/
+
+/*
+// Since 3.4
+void
+gtk_actionable_set_action_target (GtkActionable *actionable,
+ const gchar *format_string,
+ ...);
+*/
diff --git a/vendor/github.com/gotk3/gotk3/gtk/actionable.go.h b/vendor/github.com/gotk3/gotk3/gtk/actionable.go.h
new file mode 100644
index 0000000..d9ff505
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/actionable.go.h
@@ -0,0 +1,5 @@
+static GtkActionable *
+toGtkActionable(void *p)
+{
+ return (GTK_ACTIONABLE(p));
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/actionable_test.go b/vendor/github.com/gotk3/gotk3/gtk/actionable_test.go
new file mode 100644
index 0000000..5a572a9
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/actionable_test.go
@@ -0,0 +1,35 @@
+package gtk
+
+import "testing"
+
+func TestActionableImplementsIActionable(t *testing.T) {
+ var cut interface{}
+ cut = &Actionable{}
+ _, ok := cut.(IActionable)
+
+ if !ok {
+ t.Error("Actionable does not implement IActionable")
+ return
+ }
+}
+
+// TestGetSetActionName tests the getter and setter for action name
+// using a button, as we need an actual instance implementing Actionable.
+func TestGetSetActionName(t *testing.T) {
+ cut, err := ButtonNew()
+ if err != nil {
+ t.Fatal("Error creating button", err.Error())
+ }
+
+ expected := "app.stuff"
+ cut.SetActionName(expected)
+
+ actual, err := cut.GetActionName()
+ if err != nil {
+ t.Fatal("Error getting action name", err.Error())
+ }
+
+ if expected != actual {
+ t.Fatalf("Expected %s got %s", expected, actual)
+ }
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/actionbar_since_3_12.go b/vendor/github.com/gotk3/gotk3/gtk/actionbar_since_3_12.go
new file mode 100644
index 0000000..cb9501c
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/actionbar_since_3_12.go
@@ -0,0 +1,105 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrapers for symbols included since GTK 3.12, and
+// and should not be included in a build intended to target any older GTK
+// versions. To target an older build, such as 3.10, use
+// 'go build -tags gtk_3_10'. Otherwise, if no build tags are used, GTK 3.12
+// is assumed and this file is built.
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "actionbar_since_3_12.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_action_bar_get_type()), marshalActionBar},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkActionBar"] = wrapActionBar
+}
+
+//GtkActionBar
+type ActionBar struct {
+ Bin
+}
+
+func (v *ActionBar) native() *C.GtkActionBar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkActionBar(p)
+}
+
+func marshalActionBar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapActionBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func wrapActionBar(obj *glib.Object) *ActionBar {
+ return &ActionBar{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+//gtk_action_bar_new()
+func ActionBarNew() (*ActionBar, error) {
+ c := C.gtk_action_bar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapActionBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+//gtk_action_bar_pack_start(GtkActionBar *action_bar,GtkWidget *child)
+func (a *ActionBar) PackStart(child IWidget) {
+ C.gtk_action_bar_pack_start(a.native(), child.toWidget())
+}
+
+//gtk_action_bar_pack_end(GtkActionBar *action_bar,GtkWidget *child)
+func (a *ActionBar) PackEnd(child IWidget) {
+ C.gtk_action_bar_pack_end(a.native(), child.toWidget())
+}
+
+//gtk_action_bar_set_center_widget(GtkActionBar *action_bar,GtkWidget *center_widget)
+func (a *ActionBar) SetCenterWidget(child IWidget) {
+ if child == nil {
+ C.gtk_action_bar_set_center_widget(a.native(), nil)
+ } else {
+ C.gtk_action_bar_set_center_widget(a.native(), child.toWidget())
+ }
+}
+
+//gtk_action_bar_get_center_widget(GtkActionBar *action_bar)
+func (a *ActionBar) GetCenterWidget() *Widget {
+ w := C.gtk_action_bar_get_center_widget(a.native())
+ if w == nil {
+ return nil
+ }
+ return &Widget{glib.InitiallyUnowned{glib.Take(unsafe.Pointer(w))}}
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/actionbar_since_3_12.go.h b/vendor/github.com/gotk3/gotk3/gtk/actionbar_since_3_12.go.h
new file mode 100644
index 0000000..d58e36a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/actionbar_since_3_12.go.h
@@ -0,0 +1,25 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12
+
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+static GtkActionBar *
+toGtkActionBar(void *p)
+{
+ return (GTK_ACTION_BAR(p));
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/app_chooser.go b/vendor/github.com/gotk3/gotk3/gtk/app_chooser.go
new file mode 100644
index 0000000..dc90e03
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/app_chooser.go
@@ -0,0 +1,378 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_app_chooser_get_type()), marshalAppChooser},
+ {glib.Type(C.gtk_app_chooser_button_get_type()), marshalAppChooserButton},
+ {glib.Type(C.gtk_app_chooser_widget_get_type()), marshalAppChooserWidget},
+ {glib.Type(C.gtk_app_chooser_dialog_get_type()), marshalAppChooserDialog},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkAppChooser"] = wrapAppChooser
+ WrapMap["GtkAppChooserButton"] = wrapAppChooserButton
+ WrapMap["GtkAppChooserWidget"] = wrapAppChooserWidget
+ WrapMap["GtkAppChooserDialog"] = wrapAppChooserDialog
+}
+
+/*
+ * GtkAppChooser
+ */
+
+// AppChooser is a representation of GTK's GtkAppChooser GInterface.
+type AppChooser struct {
+ *glib.Object
+}
+
+// IAppChooser is an interface type implemented by all structs
+// embedding an AppChooser. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkAppChooser.
+type IAppChooser interface {
+ toAppChooser() *C.GtkAppChooser
+}
+
+// native returns a pointer to the underlying GtkAppChooser.
+func (v *AppChooser) native() *C.GtkAppChooser {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAppChooser(p)
+}
+
+func marshalAppChooser(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAppChooser(obj), nil
+}
+
+func wrapAppChooser(obj *glib.Object) *AppChooser {
+ return &AppChooser{obj}
+}
+
+func (v *AppChooser) toAppChooser() *C.GtkAppChooser {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// TODO: Needs gio/GAppInfo implementation first
+// gtk_app_chooser_get_app_info ()
+
+// GetContentType is a wrapper around gtk_app_chooser_get_content_type().
+func (v *AppChooser) GetContentType() string {
+ cstr := C.gtk_app_chooser_get_content_type(v.native())
+ defer C.free(unsafe.Pointer(cstr))
+ return C.GoString((*C.char)(cstr))
+}
+
+// Refresh is a wrapper around gtk_app_chooser_refresh().
+func (v *AppChooser) Refresh() {
+ C.gtk_app_chooser_refresh(v.native())
+}
+
+/*
+ * GtkAppChooserButton
+ */
+
+// AppChooserButton is a representation of GTK's GtkAppChooserButton.
+type AppChooserButton struct {
+ ComboBox
+
+ // Interfaces
+ AppChooser
+}
+
+// native returns a pointer to the underlying GtkAppChooserButton.
+func (v *AppChooserButton) native() *C.GtkAppChooserButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAppChooserButton(p)
+}
+
+func marshalAppChooserButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapAppChooserButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func wrapAppChooserButton(obj *glib.Object) *AppChooserButton {
+ cl := wrapCellLayout(obj)
+ ac := wrapAppChooser(obj)
+ return &AppChooserButton{ComboBox{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}, *cl}, *ac}
+}
+
+// AppChooserButtonNew() is a wrapper around gtk_app_chooser_button_new().
+func AppChooserButtonNew(content_type string) (*AppChooserButton, error) {
+ cstr := C.CString(content_type)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_app_chooser_button_new((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapAppChooserButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// TODO: Needs gio/GIcon implemented first
+// gtk_app_chooser_button_append_custom_item ()
+
+// AppendSeparator() is a wrapper around gtk_app_chooser_button_append_separator().
+func (v *AppChooserButton) AppendSeparator() {
+ C.gtk_app_chooser_button_append_separator(v.native())
+}
+
+// SetActiveCustomItem() is a wrapper around gtk_app_chooser_button_set_active_custom_item().
+func (v *AppChooserButton) SetActiveCustomItem(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_app_chooser_button_set_active_custom_item(v.native(), (*C.gchar)(cstr))
+}
+
+// GetShowDefaultItem() is a wrapper around gtk_app_chooser_button_get_show_default_item().
+func (v *AppChooserButton) GetShowDefaultItem() bool {
+ return gobool(C.gtk_app_chooser_button_get_show_default_item(v.native()))
+}
+
+// SetShowDefaultItem() is a wrapper around gtk_app_chooser_button_set_show_default_item().
+func (v *AppChooserButton) SetShowDefaultItem(setting bool) {
+ C.gtk_app_chooser_button_set_show_default_item(v.native(), gbool(setting))
+}
+
+// GetShowDialogItem() is a wrapper around gtk_app_chooser_button_get_show_dialog_item().
+func (v *AppChooserButton) GetShowDialogItem() bool {
+ return gobool(C.gtk_app_chooser_button_get_show_dialog_item(v.native()))
+}
+
+// SetShowDialogItem() is a wrapper around gtk_app_chooser_button_set_show_dialog_item().
+func (v *AppChooserButton) SetShowDialogItem(setting bool) {
+ C.gtk_app_chooser_button_set_show_dialog_item(v.native(), gbool(setting))
+}
+
+// GetHeading() is a wrapper around gtk_app_chooser_button_get_heading().
+// In case when gtk_app_chooser_button_get_heading() returns a nil string,
+// GetHeading() returns a non-nil error.
+func (v *AppChooserButton) GetHeading() (string, error) {
+ cstr := C.gtk_app_chooser_button_get_heading(v.native())
+ if cstr == nil {
+ return "", nilPtrErr
+ }
+ defer C.free(unsafe.Pointer(cstr))
+ return C.GoString((*C.char)(cstr)), nil
+}
+
+// SetHeading() is a wrapper around gtk_app_chooser_button_set_heading().
+func (v *AppChooserButton) SetHeading(heading string) {
+ cstr := C.CString(heading)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_app_chooser_button_set_heading(v.native(), (*C.gchar)(cstr))
+}
+
+/*
+ * GtkAppChooserWidget
+ */
+
+// AppChooserWidget is a representation of GTK's GtkAppChooserWidget.
+type AppChooserWidget struct {
+ Box
+
+ // Interfaces
+ AppChooser
+}
+
+// native returns a pointer to the underlying GtkAppChooserWidget.
+func (v *AppChooserWidget) native() *C.GtkAppChooserWidget {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAppChooserWidget(p)
+}
+
+func marshalAppChooserWidget(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapAppChooserWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func wrapAppChooserWidget(obj *glib.Object) *AppChooserWidget {
+ box := wrapBox(obj)
+ ac := wrapAppChooser(obj)
+ return &AppChooserWidget{*box, *ac}
+}
+
+// AppChooserWidgetNew() is a wrapper around gtk_app_chooser_widget_new().
+func AppChooserWidgetNew(content_type string) (*AppChooserWidget, error) {
+ cstr := C.CString(content_type)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_app_chooser_widget_new((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapAppChooserWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetShowDefault() is a wrapper around gtk_app_chooser_widget_get_show_default().
+func (v *AppChooserWidget) GetShowDefault() bool {
+ return gobool(C.gtk_app_chooser_widget_get_show_default(v.native()))
+}
+
+// SetShowDefault() is a wrapper around gtk_app_chooser_widget_set_show_default().
+func (v *AppChooserWidget) SetShowDefault(setting bool) {
+ C.gtk_app_chooser_widget_set_show_default(v.native(), gbool(setting))
+}
+
+// GetShowRecommended() is a wrapper around gtk_app_chooser_widget_get_show_recommended().
+func (v *AppChooserWidget) GetShowRecommended() bool {
+ return gobool(C.gtk_app_chooser_widget_get_show_recommended(v.native()))
+}
+
+// SetShowRecommended() is a wrapper around gtk_app_chooser_widget_set_show_recommended().
+func (v *AppChooserWidget) SetShowRecommended(setting bool) {
+ C.gtk_app_chooser_widget_set_show_recommended(v.native(), gbool(setting))
+}
+
+// GetShowFallback() is a wrapper around gtk_app_chooser_widget_get_show_fallback().
+func (v *AppChooserWidget) GetShowFallback() bool {
+ return gobool(C.gtk_app_chooser_widget_get_show_fallback(v.native()))
+}
+
+// SetShowFallback() is a wrapper around gtk_app_chooser_widget_set_show_fallback().
+func (v *AppChooserWidget) SetShowFallback(setting bool) {
+ C.gtk_app_chooser_widget_set_show_fallback(v.native(), gbool(setting))
+}
+
+// GetShowOther() is a wrapper around gtk_app_chooser_widget_get_show_other().
+func (v *AppChooserWidget) GetShowOther() bool {
+ return gobool(C.gtk_app_chooser_widget_get_show_other(v.native()))
+}
+
+// SetShowOther() is a wrapper around gtk_app_chooser_widget_set_show_other().
+func (v *AppChooserWidget) SetShowOther(setting bool) {
+ C.gtk_app_chooser_widget_set_show_other(v.native(), gbool(setting))
+}
+
+// GetShowAll() is a wrapper around gtk_app_chooser_widget_get_show_all().
+func (v *AppChooserWidget) GetShowAll() bool {
+ return gobool(C.gtk_app_chooser_widget_get_show_all(v.native()))
+}
+
+// SetShowAll() is a wrapper around gtk_app_chooser_widget_set_show_all().
+func (v *AppChooserWidget) SetShowAll(setting bool) {
+ C.gtk_app_chooser_widget_set_show_all(v.native(), gbool(setting))
+}
+
+// GetDefaultText() is a wrapper around gtk_app_chooser_widget_get_default_text().
+// In case when gtk_app_chooser_widget_get_default_text() returns a nil string,
+// GetDefaultText() returns a non-nil error.
+func (v *AppChooserWidget) GetDefaultText() (string, error) {
+ cstr := C.gtk_app_chooser_widget_get_default_text(v.native())
+ if cstr == nil {
+ return "", nilPtrErr
+ }
+ defer C.free(unsafe.Pointer(cstr))
+ return C.GoString((*C.char)(cstr)), nil
+}
+
+// SetDefaultText() is a wrapper around gtk_app_chooser_widget_set_default_text().
+func (v *AppChooserWidget) SetDefaultText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_app_chooser_widget_set_default_text(v.native(), (*C.gchar)(cstr))
+}
+
+/*
+ * GtkAppChooserDialog
+ */
+
+// AppChooserDialog is a representation of GTK's GtkAppChooserDialog.
+type AppChooserDialog struct {
+ Dialog
+
+ // Interfaces
+ AppChooser
+}
+
+// native returns a pointer to the underlying GtkAppChooserButton.
+func (v *AppChooserDialog) native() *C.GtkAppChooserDialog {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAppChooserDialog(p)
+}
+
+func marshalAppChooserDialog(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapAppChooserDialog(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func wrapAppChooserDialog(obj *glib.Object) *AppChooserDialog {
+ dialog := wrapDialog(obj)
+ ac := wrapAppChooser(obj)
+ return &AppChooserDialog{*dialog, *ac}
+}
+
+// TODO: Uncomment when gio builds successfully
+// AppChooserDialogNew() is a wrapper around gtk_app_chooser_dialog_new().
+// func AppChooserDialogNew(parent *Window, flags DialogFlags, file *gio.File) (*AppChooserDialog, error) {
+// var gfile *C.GFile
+// if file != nil {
+// gfile = (*C.GFile)(unsafe.Pointer(file.Native()))
+// }
+// c := C.gtk_app_chooser_dialog_new(parent.native(), C.GtkDialogFlags(flags), gfile)
+// if c == nil {
+// return nil, nilPtrErr
+// }
+// return wrapAppChooserDialog(glib.Take(unsafe.Pointer(c))), nil
+// }
+
+// AppChooserDialogNewForContentType() is a wrapper around gtk_app_chooser_dialog_new_for_content_type().
+func AppChooserDialogNewForContentType(parent *Window, flags DialogFlags, content_type string) (*AppChooserDialog, error) {
+ cstr := C.CString(content_type)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_app_chooser_dialog_new_for_content_type(parent.native(), C.GtkDialogFlags(flags), (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapAppChooserDialog(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetWidget() is a wrapper around gtk_app_chooser_dialog_get_widget().
+func (v *AppChooserDialog) GetWidget() *AppChooserWidget {
+ c := C.gtk_app_chooser_dialog_get_widget(v.native())
+ return wrapAppChooserWidget(glib.Take(unsafe.Pointer(c)))
+}
+
+// GetHeading() is a wrapper around gtk_app_chooser_dialog_get_heading().
+// In case when gtk_app_chooser_dialog_get_heading() returns a nil string,
+// GetHeading() returns a non-nil error.
+func (v *AppChooserDialog) GetHeading() (string, error) {
+ cstr := C.gtk_app_chooser_dialog_get_heading(v.native())
+ if cstr == nil {
+ return "", nilPtrErr
+ }
+ defer C.free(unsafe.Pointer(cstr))
+ return C.GoString((*C.char)(cstr)), nil
+}
+
+// SetHeading() is a wrapper around gtk_app_chooser_dialog_set_heading().
+func (v *AppChooserDialog) SetHeading(heading string) {
+ cstr := C.CString(heading)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_app_chooser_dialog_set_heading(v.native(), (*C.gchar)(cstr))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/application.go b/vendor/github.com/gotk3/gotk3/gtk/application.go
new file mode 100644
index 0000000..8b30707
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/application.go
@@ -0,0 +1,158 @@
+// Same copyright and license as the rest of the files in this project
+// This file contains style related functions and structures
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "runtime"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+// ApplicationInhibitFlags is a representation of GTK's GtkApplicationInhibitFlags.
+type ApplicationInhibitFlags int
+
+const (
+ APPLICATION_INHIBIT_LOGOUT ApplicationInhibitFlags = C.GTK_APPLICATION_INHIBIT_LOGOUT
+ APPLICATION_INHIBIT_SWITCH ApplicationInhibitFlags = C.GTK_APPLICATION_INHIBIT_SWITCH
+ APPLICATION_INHIBIT_SUSPEND ApplicationInhibitFlags = C.GTK_APPLICATION_INHIBIT_SUSPEND
+ APPLICATION_INHIBIT_IDLE ApplicationInhibitFlags = C.GTK_APPLICATION_INHIBIT_IDLE
+)
+
+/*
+ * GtkApplication
+ */
+
+// Application is a representation of GTK's GtkApplication.
+type Application struct {
+ glib.Application
+}
+
+// native returns a pointer to the underlying GtkApplication.
+func (v *Application) native() *C.GtkApplication {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ return C.toGtkApplication(unsafe.Pointer(v.GObject))
+}
+
+func marshalApplication(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapApplication(obj), nil
+}
+
+func wrapApplication(obj *glib.Object) *Application {
+ am := &glib.ActionMap{obj}
+ ag := &glib.ActionGroup{obj}
+ return &Application{glib.Application{obj, am, ag}}
+}
+
+// ApplicationNew is a wrapper around gtk_application_new().
+func ApplicationNew(appId string, flags glib.ApplicationFlags) (*Application, error) {
+ cstr := (*C.gchar)(C.CString(appId))
+ defer C.free(unsafe.Pointer(cstr))
+
+ c := C.gtk_application_new(cstr, C.GApplicationFlags(flags))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapApplication(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// AddWindow is a wrapper around gtk_application_add_window().
+func (v *Application) AddWindow(w *Window) {
+ C.gtk_application_add_window(v.native(), w.native())
+}
+
+// RemoveWindow is a wrapper around gtk_application_remove_window().
+func (v *Application) RemoveWindow(w *Window) {
+ C.gtk_application_remove_window(v.native(), w.native())
+}
+
+// GetWindowByID is a wrapper around gtk_application_get_window_by_id().
+func (v *Application) GetWindowByID(id uint) *Window {
+ c := C.gtk_application_get_window_by_id(v.native(), C.guint(id))
+ if c == nil {
+ return nil
+ }
+ return wrapWindow(glib.Take(unsafe.Pointer(c)))
+}
+
+// GetActiveWindow is a wrapper around gtk_application_get_active_window().
+func (v *Application) GetActiveWindow() *Window {
+ c := C.gtk_application_get_active_window(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapWindow(glib.Take(unsafe.Pointer(c)))
+}
+
+// Uninhibit is a wrapper around gtk_application_uninhibit().
+func (v *Application) Uninhibit(cookie uint) {
+ C.gtk_application_uninhibit(v.native(), C.guint(cookie))
+}
+
+// GetAppMenu is a wrapper around gtk_application_get_app_menu().
+func (v *Application) GetAppMenu() *glib.MenuModel {
+ c := C.gtk_application_get_app_menu(v.native())
+ if c == nil {
+ return nil
+ }
+ return &glib.MenuModel{glib.Take(unsafe.Pointer(c))}
+}
+
+// SetAppMenu is a wrapper around gtk_application_set_app_menu().
+func (v *Application) SetAppMenu(m *glib.MenuModel) {
+ mptr := (*C.GMenuModel)(unsafe.Pointer(m.Native()))
+ C.gtk_application_set_app_menu(v.native(), mptr)
+}
+
+// GetMenubar is a wrapper around gtk_application_get_menubar().
+func (v *Application) GetMenubar() *glib.MenuModel {
+ c := C.gtk_application_get_menubar(v.native())
+ if c == nil {
+ return nil
+ }
+ return &glib.MenuModel{glib.Take(unsafe.Pointer(c))}
+}
+
+// SetMenubar is a wrapper around gtk_application_set_menubar().
+func (v *Application) SetMenubar(m *glib.MenuModel) {
+ mptr := (*C.GMenuModel)(unsafe.Pointer(m.Native()))
+ C.gtk_application_set_menubar(v.native(), mptr)
+}
+
+// IsInhibited is a wrapper around gtk_application_is_inhibited().
+func (v *Application) IsInhibited(flags ApplicationInhibitFlags) bool {
+ return gobool(C.gtk_application_is_inhibited(v.native(), C.GtkApplicationInhibitFlags(flags)))
+}
+
+// Inhibited is a wrapper around gtk_application_inhibit().
+func (v *Application) Inhibited(w *Window, flags ApplicationInhibitFlags, reason string) uint {
+ cstr1 := (*C.gchar)(C.CString(reason))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ return uint(C.gtk_application_inhibit(v.native(), w.native(), C.GtkApplicationInhibitFlags(flags), cstr1))
+}
+
+// void gtk_application_add_accelerator () // deprecated and uses a gvariant paramater
+// void gtk_application_remove_accelerator () // deprecated and uses a gvariant paramater
+
+// GetWindows is a wrapper around gtk_application_get_windows().
+// Returned list is wrapped to return *gtk.Window elements.
+func (v *Application) GetWindows() *glib.List {
+ glist := C.gtk_application_get_windows(v.native())
+ list := glib.WrapList(uintptr(unsafe.Pointer(glist)))
+ list.DataWrapper(func(ptr unsafe.Pointer) interface{} {
+ return wrapWindow(glib.Take(ptr))
+ })
+ runtime.SetFinalizer(list, func(l *glib.List) {
+ l.Free()
+ })
+ return list
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/application_since_3_12.go b/vendor/github.com/gotk3/gotk3/gtk/application_since_3_12.go
new file mode 100644
index 0000000..1fd55fb
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/application_since_3_12.go
@@ -0,0 +1,62 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+
+// See: https://developer.gnome.org/gtk3/3.12/api-index-3-12.html
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import "unsafe"
+
+// GetAccelsForAction is a wrapper around gtk_application_get_accels_for_action().
+func (v *Application) GetAccelsForAction(act string) []string {
+ cstr1 := (*C.gchar)(C.CString(act))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ var descs []string
+ c := C.gtk_application_get_accels_for_action(v.native(), cstr1)
+ originalc := c
+ defer C.g_strfreev(originalc)
+
+ for *c != nil {
+ descs = append(descs, C.GoString((*C.char)(*c)))
+ c = C.next_gcharptr(c)
+ }
+
+ return descs
+}
+
+// SetAccelsForAction is a wrapper around gtk_application_set_accels_for_action().
+func (v *Application) SetAccelsForAction(act string, accels []string) {
+ cstr1 := (*C.gchar)(C.CString(act))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ caccels := C.make_strings(C.int(len(accels) + 1))
+ defer C.destroy_strings(caccels)
+
+ for i, accel := range accels {
+ cstr := C.CString(accel)
+ defer C.free(unsafe.Pointer(cstr))
+ C.set_string(caccels, C.int(i), (*C.gchar)(cstr))
+ }
+
+ C.set_string(caccels, C.int(len(accels)), nil)
+
+ C.gtk_application_set_accels_for_action(v.native(), cstr1, caccels)
+}
+
+// ListActionDescriptions is a wrapper around gtk_application_list_action_descriptions().
+func (v *Application) ListActionDescriptions() []string {
+ var descs []string
+ c := C.gtk_application_list_action_descriptions(v.native())
+ originalc := c
+ defer C.g_strfreev(originalc)
+
+ for *c != nil {
+ descs = append(descs, C.GoString((*C.char)(*c)))
+ c = C.next_gcharptr(c)
+ }
+
+ return descs
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/application_since_3_14.go b/vendor/github.com/gotk3/gotk3/gtk/application_since_3_14.go
new file mode 100644
index 0000000..2a93edb
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/application_since_3_14.go
@@ -0,0 +1,49 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12
+
+// See: https://developer.gnome.org/gtk3/3.14/api-index-3-14.html
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+// PrefersAppMenu is a wrapper around gtk_application_prefers_app_menu().
+func (v *Application) PrefersAppMenu() bool {
+ return gobool(C.gtk_application_prefers_app_menu(v.native()))
+}
+
+// GetActionsForAccel is a wrapper around gtk_application_get_actions_for_accel().
+func (v *Application) GetActionsForAccel(acc string) []string {
+ cstr1 := (*C.gchar)(C.CString(acc))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ var acts []string
+ c := C.gtk_application_get_actions_for_accel(v.native(), cstr1)
+ originalc := c
+ defer C.g_strfreev(originalc)
+
+ for *c != nil {
+ acts = append(acts, C.GoString((*C.char)(*c)))
+ c = C.next_gcharptr(c)
+ }
+
+ return acts
+}
+
+// GetMenuByID is a wrapper around gtk_application_get_menu_by_id().
+func (v *Application) GetMenuByID(id string) *glib.Menu {
+ cstr1 := (*C.gchar)(C.CString(id))
+ defer C.free(unsafe.Pointer(cstr1))
+
+ c := C.gtk_application_get_menu_by_id(v.native(), cstr1)
+ if c == nil {
+ return nil
+ }
+ return &glib.Menu{glib.MenuModel{glib.Take(unsafe.Pointer(c))}}
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/application_window.go b/vendor/github.com/gotk3/gotk3/gtk/application_window.go
new file mode 100644
index 0000000..cc6a295
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/application_window.go
@@ -0,0 +1,71 @@
+// Same copyright and license as the rest of the files in this project
+// This file contains style related functions and structures
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkApplicationWindow
+ */
+
+// ApplicationWindow is a representation of GTK's GtkApplicationWindow.
+type ApplicationWindow struct {
+ Window
+
+ // Interfaces
+ glib.IActionMap
+ glib.IActionGroup
+}
+
+// native returns a pointer to the underlying GtkApplicationWindow.
+func (v *ApplicationWindow) native() *C.GtkApplicationWindow {
+ if v == nil || v.Window.GObject == nil { // v.Window is necessary because v.GObject would be ambiguous
+ return nil
+ }
+ p := unsafe.Pointer(v.Window.GObject)
+ return C.toGtkApplicationWindow(p)
+}
+
+func marshalApplicationWindow(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapApplicationWindow(obj), nil
+}
+
+func wrapApplicationWindow(obj *glib.Object) *ApplicationWindow {
+ am := &glib.ActionMap{obj}
+ ag := &glib.ActionGroup{obj}
+ return &ApplicationWindow{Window{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}, am, ag}
+}
+
+// ApplicationWindowNew is a wrapper around gtk_application_window_new().
+func ApplicationWindowNew(app *Application) (*ApplicationWindow, error) {
+ c := C.gtk_application_window_new(app.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapApplicationWindow(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetShowMenubar is a wrapper around gtk_application_window_set_show_menubar().
+func (v *ApplicationWindow) SetShowMenubar(b bool) {
+ C.gtk_application_window_set_show_menubar(v.native(), gbool(b))
+}
+
+// GetShowMenubar is a wrapper around gtk_application_window_get_show_menubar().
+func (v *ApplicationWindow) GetShowMenubar() bool {
+ return gobool(C.gtk_application_window_get_show_menubar(v.native()))
+}
+
+// GetID is a wrapper around gtk_application_window_get_id().
+func (v *ApplicationWindow) GetID() uint {
+ return uint(C.gtk_application_window_get_id(v.native()))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/box_since_3_12.go b/vendor/github.com/gotk3/gotk3/gtk/box_since_3_12.go
new file mode 100644
index 0000000..c9e02e2
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/box_since_3_12.go
@@ -0,0 +1,53 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrapers for symbols included since GTK 3.12, and
+// and should not be included in a build intended to target any older GTK
+// versions. To target an older build, such as 3.10, use
+// 'go build -tags gtk_3_10'. Otherwise, if no build tags are used, GTK 3.12
+// is assumed and this file is built.
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+//gtk_box_bar_set_center_widget(GtkBox *box,GtkWidget *center_widget)
+func (a *Box) SetCenterWidget(child IWidget) {
+ if child == nil {
+ C.gtk_box_set_center_widget(a.native(), nil)
+ } else {
+ C.gtk_box_set_center_widget(a.native(), child.toWidget())
+ }
+}
+
+//gtk_box_bar_get_center_widget(GtkBox *box)
+func (a *Box) GetCenterWidget() *Widget {
+ w := C.gtk_box_get_center_widget(a.native())
+ if w == nil {
+ return nil
+ }
+ return &Widget{glib.InitiallyUnowned{glib.Take(unsafe.Pointer(w))}}
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/color_chooser.go b/vendor/github.com/gotk3/gotk3/gtk/color_chooser.go
new file mode 100644
index 0000000..c95bb04
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/color_chooser.go
@@ -0,0 +1,148 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_color_chooser_get_type()), marshalColorChooser},
+ {glib.Type(C.gtk_color_chooser_dialog_get_type()), marshalColorChooserDialog},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkColorChooser"] = wrapColorChooser
+ WrapMap["GtkColorChooserDialog"] = wrapColorChooserDialog
+}
+
+/*
+ * GtkColorChooser
+ */
+
+// ColorChooser is a representation of GTK's GtkColorChooser GInterface.
+type ColorChooser struct {
+ *glib.Object
+}
+
+// IColorChooser is an interface type implemented by all structs
+// embedding an ColorChooser. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkColorChooser.
+type IColorChooser interface {
+ toColorChooser() *C.GtkColorChooser
+}
+
+// native returns a pointer to the underlying GtkColorChooser.
+func (v *ColorChooser) native() *C.GtkColorChooser {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkColorChooser(p)
+}
+
+func marshalColorChooser(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapColorChooser(obj), nil
+}
+
+func wrapColorChooser(obj *glib.Object) *ColorChooser {
+ return &ColorChooser{obj}
+}
+
+func (v *ColorChooser) toColorChooser() *C.GtkColorChooser {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// GetRGBA() is a wrapper around gtk_color_chooser_get_rgba().
+func (v *ColorChooser) GetRGBA() *gdk.RGBA {
+ gdkColor := gdk.NewRGBA()
+ C.gtk_color_chooser_get_rgba(v.native(), (*C.GdkRGBA)(unsafe.Pointer(gdkColor.Native())))
+ return gdkColor
+}
+
+// SetRGBA() is a wrapper around gtk_color_chooser_set_rgba().
+func (v *ColorChooser) SetRGBA(gdkColor *gdk.RGBA) {
+ C.gtk_color_chooser_set_rgba(v.native(), (*C.GdkRGBA)(unsafe.Pointer(gdkColor.Native())))
+}
+
+// GetUseAlpha() is a wrapper around gtk_color_chooser_get_use_alpha().
+func (v *ColorChooser) GetUseAlpha() bool {
+ return gobool(C.gtk_color_chooser_get_use_alpha(v.native()))
+}
+
+// SetUseAlpha() is a wrapper around gtk_color_chooser_set_use_alpha().
+func (v *ColorChooser) SetUseAlpha(use_alpha bool) {
+ C.gtk_color_chooser_set_use_alpha(v.native(), gbool(use_alpha))
+}
+
+// AddPalette() is a wrapper around gtk_color_chooser_add_palette().
+func (v *ColorChooser) AddPalette(orientation Orientation, colors_per_line int, colors []*gdk.RGBA) {
+ n_colors := len(colors)
+ var c_colors []C.GdkRGBA
+ for _, c := range colors {
+ c_colors = append(c_colors, *(*C.GdkRGBA)(unsafe.Pointer(c.Native())))
+ }
+ C.gtk_color_chooser_add_palette(
+ v.native(),
+ C.GtkOrientation(orientation),
+ C.gint(colors_per_line),
+ C.gint(n_colors),
+ &c_colors[0],
+ )
+}
+
+/*
+ * GtkColorChooserDialog
+ */
+
+// ColorChooserDialog is a representation of GTK's GtkColorChooserDialog.
+type ColorChooserDialog struct {
+ Dialog
+
+ // Interfaces
+ ColorChooser
+}
+
+// native returns a pointer to the underlying GtkColorChooserButton.
+func (v *ColorChooserDialog) native() *C.GtkColorChooserDialog {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkColorChooserDialog(p)
+}
+
+func marshalColorChooserDialog(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapColorChooserDialog(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func wrapColorChooserDialog(obj *glib.Object) *ColorChooserDialog {
+ dialog := wrapDialog(obj)
+ cc := wrapColorChooser(obj)
+ return &ColorChooserDialog{*dialog, *cc}
+}
+
+// ColorChooserDialogNew() is a wrapper around gtk_color_chooser_dialog_new().
+func ColorChooserDialogNew(title string, parent *Window) (*ColorChooserDialog, error) {
+ cstr := C.CString(title)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_color_chooser_dialog_new((*C.gchar)(cstr), parent.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapColorChooserDialog(glib.Take(unsafe.Pointer(c))), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/combo_box.go b/vendor/github.com/gotk3/gotk3/gtk/combo_box.go
new file mode 100644
index 0000000..e2062da
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/combo_box.go
@@ -0,0 +1,272 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "errors"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_combo_box_get_type()), marshalComboBox},
+ {glib.Type(C.gtk_combo_box_text_get_type()), marshalComboBoxText},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkComboBox"] = wrapComboBox
+ WrapMap["GtkComboBoxText"] = wrapComboBoxText
+}
+
+/*
+ * GtkComboBox
+ */
+
+// ComboBox is a representation of GTK's GtkComboBox.
+type ComboBox struct {
+ Bin
+
+ // Interfaces
+ CellLayout
+}
+
+// native returns a pointer to the underlying GtkComboBox.
+func (v *ComboBox) native() *C.GtkComboBox {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkComboBox(p)
+}
+
+func (v *ComboBox) toCellLayout() *C.GtkCellLayout {
+ if v == nil {
+ return nil
+ }
+ return C.toGtkCellLayout(unsafe.Pointer(v.GObject))
+}
+
+func marshalComboBox(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapComboBox(obj), nil
+}
+
+func wrapComboBox(obj *glib.Object) *ComboBox {
+ cl := wrapCellLayout(obj)
+ return &ComboBox{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}, *cl}
+}
+
+// ComboBoxNew() is a wrapper around gtk_combo_box_new().
+func ComboBoxNew() (*ComboBox, error) {
+ c := C.gtk_combo_box_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapComboBox(obj), nil
+}
+
+// ComboBoxNewWithEntry() is a wrapper around gtk_combo_box_new_with_entry().
+func ComboBoxNewWithEntry() (*ComboBox, error) {
+ c := C.gtk_combo_box_new_with_entry()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapComboBox(obj), nil
+}
+
+// ComboBoxNewWithModel() is a wrapper around gtk_combo_box_new_with_model().
+func ComboBoxNewWithModel(model ITreeModel) (*ComboBox, error) {
+ c := C.gtk_combo_box_new_with_model(model.toTreeModel())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapComboBox(obj), nil
+}
+
+// GetActive() is a wrapper around gtk_combo_box_get_active().
+func (v *ComboBox) GetActive() int {
+ c := C.gtk_combo_box_get_active(v.native())
+ return int(c)
+}
+
+// SetActive() is a wrapper around gtk_combo_box_set_active().
+func (v *ComboBox) SetActive(index int) {
+ C.gtk_combo_box_set_active(v.native(), C.gint(index))
+}
+
+// GetActiveIter is a wrapper around gtk_combo_box_get_active_iter().
+func (v *ComboBox) GetActiveIter() (*TreeIter, error) {
+ var cIter C.GtkTreeIter
+ c := C.gtk_combo_box_get_active_iter(v.native(), &cIter)
+ if !gobool(c) {
+ return nil, errors.New("unable to get active iter")
+ }
+ return &TreeIter{cIter}, nil
+}
+
+// SetActiveIter is a wrapper around gtk_combo_box_set_active_iter().
+func (v *ComboBox) SetActiveIter(iter *TreeIter) {
+ var cIter *C.GtkTreeIter
+ if iter != nil {
+ cIter = &iter.GtkTreeIter
+ }
+ C.gtk_combo_box_set_active_iter(v.native(), cIter)
+}
+
+// GetActiveID is a wrapper around gtk_combo_box_get_active_id().
+func (v *ComboBox) GetActiveID() string {
+ c := C.gtk_combo_box_get_active_id(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetActiveID is a wrapper around gtk_combo_box_set_active_id().
+func (v *ComboBox) SetActiveID(id string) bool {
+ cid := C.CString(id)
+ defer C.free(unsafe.Pointer(cid))
+ c := C.gtk_combo_box_set_active_id(v.native(), (*C.gchar)(cid))
+ return gobool(c)
+}
+
+// GetModel is a wrapper around gtk_combo_box_get_model().
+func (v *ComboBox) GetModel() (*TreeModel, error) {
+ c := C.gtk_combo_box_get_model(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTreeModel(obj), nil
+}
+
+// SetModel is a wrapper around gtk_combo_box_set_model().
+func (v *ComboBox) SetModel(model ITreeModel) {
+ C.gtk_combo_box_set_model(v.native(), model.toTreeModel())
+}
+
+func (v *ComboBox) Popup() {
+ C.gtk_combo_box_popup(v.native())
+}
+
+func (v *ComboBox) Popdown() {
+ C.gtk_combo_box_popdown(v.native())
+}
+
+/*
+ * GtkComboBoxText
+ */
+
+// ComboBoxText is a representation of GTK's GtkComboBoxText.
+type ComboBoxText struct {
+ ComboBox
+}
+
+// native returns a pointer to the underlying GtkComboBoxText.
+func (v *ComboBoxText) native() *C.GtkComboBoxText {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkComboBoxText(p)
+}
+
+func marshalComboBoxText(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapComboBoxText(obj), nil
+}
+
+func wrapComboBoxText(obj *glib.Object) *ComboBoxText {
+ return &ComboBoxText{*wrapComboBox(obj)}
+}
+
+// ComboBoxTextNew is a wrapper around gtk_combo_box_text_new().
+func ComboBoxTextNew() (*ComboBoxText, error) {
+ c := C.gtk_combo_box_text_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapComboBoxText(obj), nil
+}
+
+// ComboBoxTextNewWithEntry is a wrapper around gtk_combo_box_text_new_with_entry().
+func ComboBoxTextNewWithEntry() (*ComboBoxText, error) {
+ c := C.gtk_combo_box_text_new_with_entry()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapComboBoxText(obj), nil
+}
+
+// Append is a wrapper around gtk_combo_box_text_append().
+func (v *ComboBoxText) Append(id, text string) {
+ cid := C.CString(id)
+ ctext := C.CString(text)
+ defer C.free(unsafe.Pointer(cid))
+ defer C.free(unsafe.Pointer(ctext))
+ C.gtk_combo_box_text_append(v.native(), (*C.gchar)(cid), (*C.gchar)(ctext))
+}
+
+// Prepend is a wrapper around gtk_combo_box_text_prepend().
+func (v *ComboBoxText) Prepend(id, text string) {
+ cid := C.CString(id)
+ ctext := C.CString(text)
+ defer C.free(unsafe.Pointer(cid))
+ defer C.free(unsafe.Pointer(ctext))
+ C.gtk_combo_box_text_prepend(v.native(), (*C.gchar)(cid), (*C.gchar)(ctext))
+}
+
+// Insert is a wrapper around gtk_combo_box_text_insert().
+func (v *ComboBoxText) Insert(position int, id, text string) {
+ cid := C.CString(id)
+ ctext := C.CString(text)
+ defer C.free(unsafe.Pointer(cid))
+ defer C.free(unsafe.Pointer(ctext))
+ C.gtk_combo_box_text_insert(v.native(), C.gint(position), (*C.gchar)(cid), (*C.gchar)(ctext))
+}
+
+// AppendText is a wrapper around gtk_combo_box_text_append_text().
+func (v *ComboBoxText) AppendText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_combo_box_text_append_text(v.native(), (*C.gchar)(cstr))
+}
+
+// PrependText is a wrapper around gtk_combo_box_text_prepend_text().
+func (v *ComboBoxText) PrependText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_combo_box_text_prepend_text(v.native(), (*C.gchar)(cstr))
+}
+
+// InsertText is a wrapper around gtk_combo_box_text_insert_text().
+func (v *ComboBoxText) InsertText(position int, text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_combo_box_text_insert_text(v.native(), C.gint(position), (*C.gchar)(cstr))
+}
+
+// Remove is a wrapper around gtk_combo_box_text_remove().
+func (v *ComboBoxText) Remove(position int) {
+ C.gtk_combo_box_text_remove(v.native(), C.gint(position))
+}
+
+// RemoveAll is a wrapper around gtk_combo_box_text_remove_all().
+func (v *ComboBoxText) RemoveAll() {
+ C.gtk_combo_box_text_remove_all(v.native())
+}
+
+// GetActiveText is a wrapper around gtk_combo_box_text_get_active_text().
+func (v *ComboBoxText) GetActiveText() string {
+ c := (*C.char)(C.gtk_combo_box_text_get_active_text(v.native()))
+ defer C.free(unsafe.Pointer(c))
+ return C.GoString(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/fixed.go b/vendor/github.com/gotk3/gotk3/gtk/fixed.go
new file mode 100644
index 0000000..edf6648
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/fixed.go
@@ -0,0 +1,68 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+// #include "fixed.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_fixed_get_type()), marshalFixed},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkFixed"] = wrapFixed
+}
+
+/*
+ * GtkFixed
+ */
+
+// Fixed is a representation of GTK's GtkFixed.
+type Fixed struct {
+ Container
+}
+
+func (v *Fixed) native() *C.GtkFixed {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFixed(p)
+}
+
+func marshalFixed(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFixed(obj), nil
+}
+
+func wrapFixed(obj *glib.Object) *Fixed {
+ return &Fixed{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// FixedNew is a wrapper around gtk_fixed_new().
+func FixedNew() (*Fixed, error) {
+ c := C.gtk_fixed_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFixed(obj), nil
+}
+
+// Put is a wrapper around gtk_fixed_put().
+func (v *Fixed) Put(w IWidget, x, y int) {
+ C.gtk_fixed_put(v.native(), w.toWidget(), C.gint(x), C.gint(y))
+}
+
+// Move is a wrapper around gtk_fixed_move().
+func (v *Fixed) Move(w IWidget, x, y int) {
+ C.gtk_fixed_move(v.native(), w.toWidget(), C.gint(x), C.gint(y))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/fixed.go.h b/vendor/github.com/gotk3/gotk3/gtk/fixed.go.h
new file mode 100644
index 0000000..6007f53
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/fixed.go.h
@@ -0,0 +1,5 @@
+static GtkFixed *
+toGtkFixed(void *p)
+{
+ return (GTK_FIXED(p));
+} \ No newline at end of file
diff --git a/vendor/github.com/gotk3/gotk3/gtk/font_chooser.go b/vendor/github.com/gotk3/gotk3/gtk/font_chooser.go
new file mode 100644
index 0000000..270d5f9
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/font_chooser.go
@@ -0,0 +1,148 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_font_chooser_get_type()), marshalFontChooser},
+ {glib.Type(C.gtk_font_button_get_type()), marshalFontButton},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkFontChooser"] = wrapFontChooser
+ WrapMap["GtkFontButton"] = wrapFontButton
+
+}
+
+/*
+ * GtkFontChooser
+ */
+
+// FontChooser is a representation of GTK's GtkFontChooser GInterface.
+type FontChooser struct {
+ *glib.Object
+}
+
+// IFontChooser is an interface type implemented by all structs
+// embedding an FontChooser. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkFontChooser.
+type IFontChooser interface {
+ toFontChooser() *C.GtkFontChooser
+}
+
+// native returns a pointer to the underlying GtkFontChooser.
+func (v *FontChooser) native() *C.GtkFontChooser {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFontChooser(p)
+}
+
+func marshalFontChooser(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFontChooser(obj), nil
+}
+
+func wrapFontChooser(obj *glib.Object) *FontChooser {
+ return &FontChooser{obj}
+}
+
+func (v *FontChooser) toFontChooser() *C.GtkFontChooser {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// GetFont is a wrapper around gtk_font_chooser_get_font().
+func (v *FontChooser) GetFont() string {
+ c := C.gtk_font_chooser_get_font(v.native())
+ return goString(c)
+}
+
+// SetFont is a wrapper around gtk_font_chooser_set_font().
+func (v *FontChooser) SetFont(font string) {
+ cstr := C.CString(font)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_font_chooser_set_font(v.native(), (*C.gchar)(cstr))
+}
+
+//PangoFontFamily * gtk_font_chooser_get_font_family ()
+//PangoFontFace * gtk_font_chooser_get_font_face ()
+//gint gtk_font_chooser_get_font_size ()
+//PangoFontDescription * gtk_font_chooser_get_font_desc ()
+//void gtk_font_chooser_set_font_desc ()
+//gchar * gtk_font_chooser_get_preview_text ()
+//void gtk_font_chooser_set_preview_text ()
+//gboolean gtk_font_chooser_get_show_preview_entry ()
+//void gtk_font_chooser_set_show_preview_entry ()
+//gboolean (*GtkFontFilterFunc) ()
+//void gtk_font_chooser_set_filter_func ()
+//void gtk_font_chooser_set_font_map ()
+//PangoFontMap * gtk_font_chooser_get_font_map ()
+
+/*
+ * GtkFontButton
+ */
+
+// FontButton is a representation of GTK's GtkFontButton.
+type FontButton struct {
+ Button
+
+ // Interfaces
+ FontChooser
+}
+
+// native returns a pointer to the underlying GtkFontButton.
+func (v *FontButton) native() *C.GtkFontButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFontButton(p)
+}
+
+func marshalFontButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFontButton(obj), nil
+}
+
+func wrapFontButton(obj *glib.Object) *FontButton {
+ button := wrapButton(obj)
+ fc := wrapFontChooser(obj)
+ return &FontButton{*button, *fc}
+}
+
+// FontButtonNew is a wrapper around gtk_font_button_new().
+func FontButtonNew() (*FontButton, error) {
+ c := C.gtk_font_button_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFontButton(obj), nil
+}
+
+// FontButtonNewWithFont is a wrapper around gtk_font_button_new_with_font().
+func FontButtonNewWithFont(fontname string) (*FontButton, error) {
+ cstr := C.CString(fontname)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_font_button_new_with_font((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFontButton(obj), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gdk.go b/vendor/github.com/gotk3/gotk3/gtk/gdk.go
new file mode 100644
index 0000000..901a6f7
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gdk.go
@@ -0,0 +1,20 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import "github.com/gotk3/gotk3/gdk"
+
+func nativeGdkRectangle(rect gdk.Rectangle) *C.GdkRectangle {
+ // Note: Here we can't use rect.GdkRectangle because it would return
+ // C type prefixed with gdk package. A ways how to resolve this Go
+ // issue with same C structs in different Go packages is documented
+ // here https://github.com/golang/go/issues/13467 .
+ // This is the easiest way how to resolve the problem.
+ return &C.GdkRectangle{
+ x: C.int(rect.GetX()),
+ y: C.int(rect.GetY()),
+ width: C.int(rect.GetWidth()),
+ height: C.int(rect.GetHeight()),
+ }
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk.go b/vendor/github.com/gotk3/gotk3/gtk/gtk.go
new file mode 100644
index 0000000..3ed6ca0
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk.go
@@ -0,0 +1,8935 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// Go bindings for GTK+ 3. Supports version 3.6 and later.
+//
+// Functions use the same names as the native C function calls, but use
+// CamelCase. In cases where native GTK uses pointers to values to
+// simulate multiple return values, Go's native multiple return values
+// are used instead. Whenever a native GTK call could return an
+// unexpected NULL pointer, an additional error is returned in the Go
+// binding.
+//
+// GTK's C API documentation can be very useful for understanding how the
+// functions in this package work and what each type is for. This
+// documentation can be found at https://developer.gnome.org/gtk3/.
+//
+// In addition to Go versions of the C GTK functions, every struct type
+// includes a method named Native (either by direct implementation, or
+// by means of struct embedding). These methods return a uintptr of the
+// native C object the binding type represents. These pointers may be
+// type switched to a native C pointer using unsafe and used with cgo
+// function calls outside this package.
+//
+// Memory management is handled in proper Go fashion, using runtime
+// finalizers to properly free memory when it is no longer needed. Each
+// time a Go type is created with a pointer to a GObject, a reference is
+// added for Go, sinking the floating reference when necessary. After
+// going out of scope and the next time Go's garbage collector is run, a
+// finalizer is run to remove Go's reference to the GObject. When this
+// reference count hits zero (when neither Go nor GTK holds ownership)
+// the object will be freed internally by GTK.
+package gtk
+
+// #cgo pkg-config: gdk-3.0 gio-2.0 glib-2.0 gobject-2.0 gtk+-3.0
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "errors"
+ "fmt"
+ "reflect"
+ "runtime"
+ "sync"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/cairo"
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Enums
+ {glib.Type(C.gtk_align_get_type()), marshalAlign},
+ {glib.Type(C.gtk_accel_flags_get_type()), marshalAccelFlags},
+ {glib.Type(C.gtk_accel_group_get_type()), marshalAccelGroup},
+ {glib.Type(C.gtk_accel_map_get_type()), marshalAccelMap},
+ {glib.Type(C.gtk_arrow_placement_get_type()), marshalArrowPlacement},
+ {glib.Type(C.gtk_arrow_type_get_type()), marshalArrowType},
+ {glib.Type(C.gtk_assistant_page_type_get_type()), marshalAssistantPageType},
+ {glib.Type(C.gtk_buttons_type_get_type()), marshalButtonsType},
+ {glib.Type(C.gtk_calendar_display_options_get_type()), marshalCalendarDisplayOptions},
+ {glib.Type(C.gtk_dest_defaults_get_type()), marshalDestDefaults},
+ {glib.Type(C.gtk_dialog_flags_get_type()), marshalDialogFlags},
+ {glib.Type(C.gtk_entry_icon_position_get_type()), marshalEntryIconPosition},
+ {glib.Type(C.gtk_file_chooser_action_get_type()), marshalFileChooserAction},
+ {glib.Type(C.gtk_icon_lookup_flags_get_type()), marshalSortType},
+ {glib.Type(C.gtk_icon_size_get_type()), marshalIconSize},
+ {glib.Type(C.gtk_image_type_get_type()), marshalImageType},
+ {glib.Type(C.gtk_input_hints_get_type()), marshalInputHints},
+ {glib.Type(C.gtk_input_purpose_get_type()), marshalInputPurpose},
+ {glib.Type(C.gtk_justification_get_type()), marshalJustification},
+ {glib.Type(C.gtk_license_get_type()), marshalLicense},
+ {glib.Type(C.gtk_message_type_get_type()), marshalMessageType},
+ {glib.Type(C.gtk_orientation_get_type()), marshalOrientation},
+ {glib.Type(C.gtk_pack_type_get_type()), marshalPackType},
+ {glib.Type(C.gtk_path_type_get_type()), marshalPathType},
+ {glib.Type(C.gtk_policy_type_get_type()), marshalPolicyType},
+ {glib.Type(C.gtk_position_type_get_type()), marshalPositionType},
+ {glib.Type(C.gtk_relief_style_get_type()), marshalReliefStyle},
+ {glib.Type(C.gtk_response_type_get_type()), marshalResponseType},
+ {glib.Type(C.gtk_selection_mode_get_type()), marshalSelectionMode},
+ {glib.Type(C.gtk_shadow_type_get_type()), marshalShadowType},
+ {glib.Type(C.gtk_sort_type_get_type()), marshalSortType},
+ {glib.Type(C.gtk_state_flags_get_type()), marshalStateFlags},
+ {glib.Type(C.gtk_target_flags_get_type()), marshalTargetFlags},
+ {glib.Type(C.gtk_text_direction_get_type()), marshalTextDirection},
+ {glib.Type(C.gtk_toolbar_style_get_type()), marshalToolbarStyle},
+ {glib.Type(C.gtk_tree_model_flags_get_type()), marshalTreeModelFlags},
+ {glib.Type(C.gtk_window_position_get_type()), marshalWindowPosition},
+ {glib.Type(C.gtk_window_type_get_type()), marshalWindowType},
+ {glib.Type(C.gtk_wrap_mode_get_type()), marshalWrapMode},
+
+ // Objects/Interfaces
+ {glib.Type(C.gtk_accel_group_get_type()), marshalAccelGroup},
+ {glib.Type(C.gtk_accel_map_get_type()), marshalAccelMap},
+ {glib.Type(C.gtk_adjustment_get_type()), marshalAdjustment},
+ {glib.Type(C.gtk_application_get_type()), marshalApplication},
+ {glib.Type(C.gtk_application_window_get_type()), marshalApplicationWindow},
+ {glib.Type(C.gtk_assistant_get_type()), marshalAssistant},
+ {glib.Type(C.gtk_bin_get_type()), marshalBin},
+ {glib.Type(C.gtk_builder_get_type()), marshalBuilder},
+ {glib.Type(C.gtk_button_get_type()), marshalButton},
+ {glib.Type(C.gtk_box_get_type()), marshalBox},
+ {glib.Type(C.gtk_calendar_get_type()), marshalCalendar},
+ {glib.Type(C.gtk_cell_layout_get_type()), marshalCellLayout},
+ {glib.Type(C.gtk_cell_renderer_get_type()), marshalCellRenderer},
+ {glib.Type(C.gtk_cell_renderer_spinner_get_type()), marshalCellRendererSpinner},
+ {glib.Type(C.gtk_cell_renderer_pixbuf_get_type()), marshalCellRendererPixbuf},
+ {glib.Type(C.gtk_cell_renderer_text_get_type()), marshalCellRendererText},
+ {glib.Type(C.gtk_cell_renderer_toggle_get_type()), marshalCellRendererToggle},
+ {glib.Type(C.gtk_check_button_get_type()), marshalCheckButton},
+ {glib.Type(C.gtk_check_menu_item_get_type()), marshalCheckMenuItem},
+ {glib.Type(C.gtk_clipboard_get_type()), marshalClipboard},
+ {glib.Type(C.gtk_container_get_type()), marshalContainer},
+ {glib.Type(C.gtk_dialog_get_type()), marshalDialog},
+ {glib.Type(C.gtk_drawing_area_get_type()), marshalDrawingArea},
+ {glib.Type(C.gtk_editable_get_type()), marshalEditable},
+ {glib.Type(C.gtk_entry_get_type()), marshalEntry},
+ {glib.Type(C.gtk_entry_buffer_get_type()), marshalEntryBuffer},
+ {glib.Type(C.gtk_entry_completion_get_type()), marshalEntryCompletion},
+ {glib.Type(C.gtk_event_box_get_type()), marshalEventBox},
+ {glib.Type(C.gtk_expander_get_type()), marshalExpander},
+ {glib.Type(C.gtk_file_chooser_get_type()), marshalFileChooser},
+ {glib.Type(C.gtk_file_chooser_button_get_type()), marshalFileChooserButton},
+ {glib.Type(C.gtk_file_chooser_dialog_get_type()), marshalFileChooserDialog},
+ {glib.Type(C.gtk_file_chooser_widget_get_type()), marshalFileChooserWidget},
+ {glib.Type(C.gtk_frame_get_type()), marshalFrame},
+ {glib.Type(C.gtk_aspect_frame_get_type()), marshalAspectFrame},
+ {glib.Type(C.gtk_grid_get_type()), marshalGrid},
+ {glib.Type(C.gtk_icon_view_get_type()), marshalIconView},
+ {glib.Type(C.gtk_image_get_type()), marshalImage},
+ {glib.Type(C.gtk_label_get_type()), marshalLabel},
+ {glib.Type(C.gtk_link_button_get_type()), marshalLinkButton},
+ {glib.Type(C.gtk_layout_get_type()), marshalLayout},
+ {glib.Type(C.gtk_list_store_get_type()), marshalListStore},
+ {glib.Type(C.gtk_menu_get_type()), marshalMenu},
+ {glib.Type(C.gtk_menu_bar_get_type()), marshalMenuBar},
+ {glib.Type(C.gtk_menu_button_get_type()), marshalMenuButton},
+ {glib.Type(C.gtk_menu_item_get_type()), marshalMenuItem},
+ {glib.Type(C.gtk_menu_shell_get_type()), marshalMenuShell},
+ {glib.Type(C.gtk_message_dialog_get_type()), marshalMessageDialog},
+ {glib.Type(C.gtk_notebook_get_type()), marshalNotebook},
+ {glib.Type(C.gtk_offscreen_window_get_type()), marshalOffscreenWindow},
+ {glib.Type(C.gtk_orientable_get_type()), marshalOrientable},
+ {glib.Type(C.gtk_overlay_get_type()), marshalOverlay},
+ {glib.Type(C.gtk_paned_get_type()), marshalPaned},
+ {glib.Type(C.gtk_progress_bar_get_type()), marshalProgressBar},
+ {glib.Type(C.gtk_radio_button_get_type()), marshalRadioButton},
+ {glib.Type(C.gtk_radio_menu_item_get_type()), marshalRadioMenuItem},
+ {glib.Type(C.gtk_range_get_type()), marshalRange},
+ {glib.Type(C.gtk_scale_button_get_type()), marshalScaleButton},
+ {glib.Type(C.gtk_scale_get_type()), marshalScale},
+ {glib.Type(C.gtk_scrollbar_get_type()), marshalScrollbar},
+ {glib.Type(C.gtk_scrolled_window_get_type()), marshalScrolledWindow},
+ {glib.Type(C.gtk_search_entry_get_type()), marshalSearchEntry},
+ //{glib.Type(C.gtk_selection_data_get_type()), marshalSelectionData},
+ {glib.Type(C.gtk_separator_get_type()), marshalSeparator},
+ {glib.Type(C.gtk_separator_menu_item_get_type()), marshalSeparatorMenuItem},
+ {glib.Type(C.gtk_separator_tool_item_get_type()), marshalSeparatorToolItem},
+ {glib.Type(C.gtk_spin_button_get_type()), marshalSpinButton},
+ {glib.Type(C.gtk_spinner_get_type()), marshalSpinner},
+ {glib.Type(C.gtk_statusbar_get_type()), marshalStatusbar},
+ {glib.Type(C.gtk_switch_get_type()), marshalSwitch},
+ {glib.Type(C.gtk_text_view_get_type()), marshalTextView},
+ {glib.Type(C.gtk_text_tag_get_type()), marshalTextTag},
+ {glib.Type(C.gtk_text_tag_table_get_type()), marshalTextTagTable},
+ {glib.Type(C.gtk_text_buffer_get_type()), marshalTextBuffer},
+ {glib.Type(C.gtk_toggle_button_get_type()), marshalToggleButton},
+ {glib.Type(C.gtk_toolbar_get_type()), marshalToolbar},
+ {glib.Type(C.gtk_tool_button_get_type()), marshalToolButton},
+ {glib.Type(C.gtk_tool_item_get_type()), marshalToolItem},
+ {glib.Type(C.gtk_tooltip_get_type()), marshalTooltip},
+ {glib.Type(C.gtk_tree_model_get_type()), marshalTreeModel},
+ {glib.Type(C.gtk_tree_selection_get_type()), marshalTreeSelection},
+ {glib.Type(C.gtk_tree_store_get_type()), marshalTreeStore},
+ {glib.Type(C.gtk_tree_view_get_type()), marshalTreeView},
+ {glib.Type(C.gtk_tree_view_column_get_type()), marshalTreeViewColumn},
+ {glib.Type(C.gtk_volume_button_get_type()), marshalVolumeButton},
+ {glib.Type(C.gtk_widget_get_type()), marshalWidget},
+ {glib.Type(C.gtk_window_get_type()), marshalWindow},
+
+ // Boxed
+ {glib.Type(C.gtk_target_entry_get_type()), marshalTargetEntry},
+ {glib.Type(C.gtk_text_iter_get_type()), marshalTextIter},
+ {glib.Type(C.gtk_text_mark_get_type()), marshalTextMark},
+ {glib.Type(C.gtk_tree_iter_get_type()), marshalTreeIter},
+ {glib.Type(C.gtk_tree_path_get_type()), marshalTreePath},
+ }
+ glib.RegisterGValueMarshalers(tm)
+}
+
+/*
+ * Type conversions
+ */
+
+func gbool(b bool) C.gboolean {
+ if b {
+ return C.gboolean(1)
+ }
+ return C.gboolean(0)
+}
+
+func gobool(b C.gboolean) bool {
+ return b != C.FALSE
+}
+
+func cGSList(clist *glib.SList) *C.GSList {
+ if clist == nil {
+ return nil
+ }
+ return (*C.GSList)(unsafe.Pointer(clist.Native()))
+}
+
+func free(str ...interface{}) {
+ for _, s := range str {
+ switch x := s.(type) {
+ case *C.char:
+ C.free(unsafe.Pointer(x))
+ case []*C.char:
+ for _, cp := range x {
+ C.free(unsafe.Pointer(cp))
+ }
+ /*
+ case C.gpointer:
+ C.g_free(C.gpointer(c))
+ */
+ default:
+ fmt.Printf("utils.go free(): Unknown type: %T\n", x)
+ }
+
+ }
+}
+
+func goString(cstr *C.gchar) string {
+ return C.GoString((*C.char)(cstr))
+}
+
+// Wrapper function for TestBoolConvs since cgo can't be used with
+// testing package
+func testBoolConvs() error {
+ b := gobool(gbool(true))
+ if b != true {
+ return errors.New("Unexpected bool conversion result")
+ }
+
+ cb := gbool(gobool(C.gboolean(0)))
+ if cb != C.gboolean(0) {
+ return errors.New("Unexpected bool conversion result")
+ }
+
+ return nil
+}
+
+/*
+ * Unexported vars
+ */
+
+var nilPtrErr = errors.New("cgo returned unexpected nil pointer")
+
+/*
+ * Constants
+ */
+
+// Align is a representation of GTK's GtkAlign.
+type Align int
+
+const (
+ ALIGN_FILL Align = C.GTK_ALIGN_FILL
+ ALIGN_START Align = C.GTK_ALIGN_START
+ ALIGN_END Align = C.GTK_ALIGN_END
+ ALIGN_CENTER Align = C.GTK_ALIGN_CENTER
+)
+
+func marshalAlign(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Align(c), nil
+}
+
+// ArrowPlacement is a representation of GTK's GtkArrowPlacement.
+type ArrowPlacement int
+
+const (
+ ARROWS_BOTH ArrowPlacement = C.GTK_ARROWS_BOTH
+ ARROWS_START ArrowPlacement = C.GTK_ARROWS_START
+ ARROWS_END ArrowPlacement = C.GTK_ARROWS_END
+)
+
+func marshalArrowPlacement(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return ArrowPlacement(c), nil
+}
+
+// ArrowType is a representation of GTK's GtkArrowType.
+type ArrowType int
+
+const (
+ ARROW_UP ArrowType = C.GTK_ARROW_UP
+ ARROW_DOWN ArrowType = C.GTK_ARROW_DOWN
+ ARROW_LEFT ArrowType = C.GTK_ARROW_LEFT
+ ARROW_RIGHT ArrowType = C.GTK_ARROW_RIGHT
+ ARROW_NONE ArrowType = C.GTK_ARROW_NONE
+)
+
+func marshalArrowType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return ArrowType(c), nil
+}
+
+// AssistantPageType is a representation of GTK's GtkAssistantPageType.
+type AssistantPageType int
+
+const (
+ ASSISTANT_PAGE_CONTENT AssistantPageType = C.GTK_ASSISTANT_PAGE_CONTENT
+ ASSISTANT_PAGE_INTRO AssistantPageType = C.GTK_ASSISTANT_PAGE_INTRO
+ ASSISTANT_PAGE_CONFIRM AssistantPageType = C.GTK_ASSISTANT_PAGE_CONFIRM
+ ASSISTANT_PAGE_SUMMARY AssistantPageType = C.GTK_ASSISTANT_PAGE_SUMMARY
+ ASSISTANT_PAGE_PROGRESS AssistantPageType = C.GTK_ASSISTANT_PAGE_PROGRESS
+ ASSISTANT_PAGE_CUSTOM AssistantPageType = C.GTK_ASSISTANT_PAGE_CUSTOM
+)
+
+func marshalAssistantPageType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return AssistantPageType(c), nil
+}
+
+// ButtonsType is a representation of GTK's GtkButtonsType.
+type ButtonsType int
+
+const (
+ BUTTONS_NONE ButtonsType = C.GTK_BUTTONS_NONE
+ BUTTONS_OK ButtonsType = C.GTK_BUTTONS_OK
+ BUTTONS_CLOSE ButtonsType = C.GTK_BUTTONS_CLOSE
+ BUTTONS_CANCEL ButtonsType = C.GTK_BUTTONS_CANCEL
+ BUTTONS_YES_NO ButtonsType = C.GTK_BUTTONS_YES_NO
+ BUTTONS_OK_CANCEL ButtonsType = C.GTK_BUTTONS_OK_CANCEL
+)
+
+func marshalButtonsType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return ButtonsType(c), nil
+}
+
+// CalendarDisplayOptions is a representation of GTK's GtkCalendarDisplayOptions
+type CalendarDisplayOptions int
+
+const (
+ CALENDAR_SHOW_HEADING CalendarDisplayOptions = C.GTK_CALENDAR_SHOW_HEADING
+ CALENDAR_SHOW_DAY_NAMES CalendarDisplayOptions = C.GTK_CALENDAR_SHOW_DAY_NAMES
+ CALENDAR_NO_MONTH_CHANGE CalendarDisplayOptions = C.GTK_CALENDAR_NO_MONTH_CHANGE
+ CALENDAR_SHOW_WEEK_NUMBERS CalendarDisplayOptions = C.GTK_CALENDAR_SHOW_WEEK_NUMBERS
+ CALENDAR_SHOW_DETAILS CalendarDisplayOptions = C.GTK_CALENDAR_SHOW_DETAILS
+)
+
+func marshalCalendarDisplayOptions(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return CalendarDisplayOptions(c), nil
+}
+
+// DestDefaults is a representation of GTK's GtkDestDefaults.
+type DestDefaults int
+
+const (
+ DEST_DEFAULT_MOTION DestDefaults = C.GTK_DEST_DEFAULT_MOTION
+ DEST_DEFAULT_HIGHLIGHT DestDefaults = C.GTK_DEST_DEFAULT_HIGHLIGHT
+ DEST_DEFAULT_DROP DestDefaults = C.GTK_DEST_DEFAULT_DROP
+ DEST_DEFAULT_ALL DestDefaults = C.GTK_DEST_DEFAULT_ALL
+)
+
+func marshalDestDefaults(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return DestDefaults(c), nil
+}
+
+// DialogFlags is a representation of GTK's GtkDialogFlags.
+type DialogFlags int
+
+const (
+ DIALOG_MODAL DialogFlags = C.GTK_DIALOG_MODAL
+ DIALOG_DESTROY_WITH_PARENT DialogFlags = C.GTK_DIALOG_DESTROY_WITH_PARENT
+)
+
+func marshalDialogFlags(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return DialogFlags(c), nil
+}
+
+// EntryIconPosition is a representation of GTK's GtkEntryIconPosition.
+type EntryIconPosition int
+
+const (
+ ENTRY_ICON_PRIMARY EntryIconPosition = C.GTK_ENTRY_ICON_PRIMARY
+ ENTRY_ICON_SECONDARY EntryIconPosition = C.GTK_ENTRY_ICON_SECONDARY
+)
+
+func marshalEntryIconPosition(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return EntryIconPosition(c), nil
+}
+
+// FileChooserAction is a representation of GTK's GtkFileChooserAction.
+type FileChooserAction int
+
+const (
+ FILE_CHOOSER_ACTION_OPEN FileChooserAction = C.GTK_FILE_CHOOSER_ACTION_OPEN
+ FILE_CHOOSER_ACTION_SAVE FileChooserAction = C.GTK_FILE_CHOOSER_ACTION_SAVE
+ FILE_CHOOSER_ACTION_SELECT_FOLDER FileChooserAction = C.GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
+ FILE_CHOOSER_ACTION_CREATE_FOLDER FileChooserAction = C.GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
+)
+
+func marshalFileChooserAction(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return FileChooserAction(c), nil
+}
+
+// IconLookupFlags is a representation of GTK's GtkIconLookupFlags.
+type IconLookupFlags int
+
+const (
+ ICON_LOOKUP_NO_SVG IconLookupFlags = C.GTK_ICON_LOOKUP_NO_SVG
+ ICON_LOOKUP_FORCE_SVG = C.GTK_ICON_LOOKUP_FORCE_SVG
+ ICON_LOOKUP_USE_BUILTIN = C.GTK_ICON_LOOKUP_USE_BUILTIN
+ ICON_LOOKUP_GENERIC_FALLBACK = C.GTK_ICON_LOOKUP_GENERIC_FALLBACK
+ ICON_LOOKUP_FORCE_SIZE = C.GTK_ICON_LOOKUP_FORCE_SIZE
+)
+
+func marshalIconLookupFlags(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return IconLookupFlags(c), nil
+}
+
+// IconSize is a representation of GTK's GtkIconSize.
+type IconSize int
+
+const (
+ ICON_SIZE_INVALID IconSize = C.GTK_ICON_SIZE_INVALID
+ ICON_SIZE_MENU IconSize = C.GTK_ICON_SIZE_MENU
+ ICON_SIZE_SMALL_TOOLBAR IconSize = C.GTK_ICON_SIZE_SMALL_TOOLBAR
+ ICON_SIZE_LARGE_TOOLBAR IconSize = C.GTK_ICON_SIZE_LARGE_TOOLBAR
+ ICON_SIZE_BUTTON IconSize = C.GTK_ICON_SIZE_BUTTON
+ ICON_SIZE_DND IconSize = C.GTK_ICON_SIZE_DND
+ ICON_SIZE_DIALOG IconSize = C.GTK_ICON_SIZE_DIALOG
+)
+
+func marshalIconSize(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return IconSize(c), nil
+}
+
+// ImageType is a representation of GTK's GtkImageType.
+type ImageType int
+
+const (
+ IMAGE_EMPTY ImageType = C.GTK_IMAGE_EMPTY
+ IMAGE_PIXBUF ImageType = C.GTK_IMAGE_PIXBUF
+ IMAGE_STOCK ImageType = C.GTK_IMAGE_STOCK
+ IMAGE_ICON_SET ImageType = C.GTK_IMAGE_ICON_SET
+ IMAGE_ANIMATION ImageType = C.GTK_IMAGE_ANIMATION
+ IMAGE_ICON_NAME ImageType = C.GTK_IMAGE_ICON_NAME
+ IMAGE_GICON ImageType = C.GTK_IMAGE_GICON
+)
+
+func marshalImageType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return ImageType(c), nil
+}
+
+// InputHints is a representation of GTK's GtkInputHints.
+type InputHints int
+
+const (
+ INPUT_HINT_NONE InputHints = C.GTK_INPUT_HINT_NONE
+ INPUT_HINT_SPELLCHECK InputHints = C.GTK_INPUT_HINT_SPELLCHECK
+ INPUT_HINT_NO_SPELLCHECK InputHints = C.GTK_INPUT_HINT_NO_SPELLCHECK
+ INPUT_HINT_WORD_COMPLETION InputHints = C.GTK_INPUT_HINT_WORD_COMPLETION
+ INPUT_HINT_LOWERCASE InputHints = C.GTK_INPUT_HINT_LOWERCASE
+ INPUT_HINT_UPPERCASE_CHARS InputHints = C.GTK_INPUT_HINT_UPPERCASE_CHARS
+ INPUT_HINT_UPPERCASE_WORDS InputHints = C.GTK_INPUT_HINT_UPPERCASE_WORDS
+ INPUT_HINT_UPPERCASE_SENTENCES InputHints = C.GTK_INPUT_HINT_UPPERCASE_SENTENCES
+ INPUT_HINT_INHIBIT_OSK InputHints = C.GTK_INPUT_HINT_INHIBIT_OSK
+)
+
+func marshalInputHints(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return InputHints(c), nil
+}
+
+// InputPurpose is a representation of GTK's GtkInputPurpose.
+type InputPurpose int
+
+const (
+ INPUT_PURPOSE_FREE_FORM InputPurpose = C.GTK_INPUT_PURPOSE_FREE_FORM
+ INPUT_PURPOSE_ALPHA InputPurpose = C.GTK_INPUT_PURPOSE_ALPHA
+ INPUT_PURPOSE_DIGITS InputPurpose = C.GTK_INPUT_PURPOSE_DIGITS
+ INPUT_PURPOSE_NUMBER InputPurpose = C.GTK_INPUT_PURPOSE_NUMBER
+ INPUT_PURPOSE_PHONE InputPurpose = C.GTK_INPUT_PURPOSE_PHONE
+ INPUT_PURPOSE_URL InputPurpose = C.GTK_INPUT_PURPOSE_URL
+ INPUT_PURPOSE_EMAIL InputPurpose = C.GTK_INPUT_PURPOSE_EMAIL
+ INPUT_PURPOSE_NAME InputPurpose = C.GTK_INPUT_PURPOSE_NAME
+ INPUT_PURPOSE_PASSWORD InputPurpose = C.GTK_INPUT_PURPOSE_PASSWORD
+ INPUT_PURPOSE_PIN InputPurpose = C.GTK_INPUT_PURPOSE_PIN
+)
+
+func marshalInputPurpose(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return InputPurpose(c), nil
+}
+
+// Justify is a representation of GTK's GtkJustification.
+type Justification int
+
+const (
+ JUSTIFY_LEFT Justification = C.GTK_JUSTIFY_LEFT
+ JUSTIFY_RIGHT Justification = C.GTK_JUSTIFY_RIGHT
+ JUSTIFY_CENTER Justification = C.GTK_JUSTIFY_CENTER
+ JUSTIFY_FILL Justification = C.GTK_JUSTIFY_FILL
+)
+
+func marshalJustification(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Justification(c), nil
+}
+
+// License is a representation of GTK's GtkLicense.
+type License int
+
+const (
+ LICENSE_UNKNOWN License = C.GTK_LICENSE_UNKNOWN
+ LICENSE_CUSTOM License = C.GTK_LICENSE_CUSTOM
+ LICENSE_GPL_2_0 License = C.GTK_LICENSE_GPL_2_0
+ LICENSE_GPL_3_0 License = C.GTK_LICENSE_GPL_3_0
+ LICENSE_LGPL_2_1 License = C.GTK_LICENSE_LGPL_2_1
+ LICENSE_LGPL_3_0 License = C.GTK_LICENSE_LGPL_3_0
+ LICENSE_BSD License = C.GTK_LICENSE_BSD
+ LICENSE_MIT_X11 License = C.GTK_LICENSE_MIT_X11
+ LICENSE_GTK_ARTISTIC License = C.GTK_LICENSE_ARTISTIC
+)
+
+func marshalLicense(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return License(c), nil
+}
+
+// MessageType is a representation of GTK's GtkMessageType.
+type MessageType int
+
+const (
+ MESSAGE_INFO MessageType = C.GTK_MESSAGE_INFO
+ MESSAGE_WARNING MessageType = C.GTK_MESSAGE_WARNING
+ MESSAGE_QUESTION MessageType = C.GTK_MESSAGE_QUESTION
+ MESSAGE_ERROR MessageType = C.GTK_MESSAGE_ERROR
+ MESSAGE_OTHER MessageType = C.GTK_MESSAGE_OTHER
+)
+
+func marshalMessageType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return MessageType(c), nil
+}
+
+// Orientation is a representation of GTK's GtkOrientation.
+type Orientation int
+
+const (
+ ORIENTATION_HORIZONTAL Orientation = C.GTK_ORIENTATION_HORIZONTAL
+ ORIENTATION_VERTICAL Orientation = C.GTK_ORIENTATION_VERTICAL
+)
+
+func marshalOrientation(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Orientation(c), nil
+}
+
+// PackType is a representation of GTK's GtkPackType.
+type PackType int
+
+const (
+ PACK_START PackType = C.GTK_PACK_START
+ PACK_END PackType = C.GTK_PACK_END
+)
+
+func marshalPackType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PackType(c), nil
+}
+
+// PathType is a representation of GTK's GtkPathType.
+type PathType int
+
+const (
+ PATH_WIDGET PathType = C.GTK_PATH_WIDGET
+ PATH_WIDGET_CLASS PathType = C.GTK_PATH_WIDGET_CLASS
+ PATH_CLASS PathType = C.GTK_PATH_CLASS
+)
+
+func marshalPathType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PathType(c), nil
+}
+
+// PolicyType is a representation of GTK's GtkPolicyType.
+type PolicyType int
+
+const (
+ POLICY_ALWAYS PolicyType = C.GTK_POLICY_ALWAYS
+ POLICY_AUTOMATIC PolicyType = C.GTK_POLICY_AUTOMATIC
+ POLICY_NEVER PolicyType = C.GTK_POLICY_NEVER
+)
+
+func marshalPolicyType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PolicyType(c), nil
+}
+
+// PositionType is a representation of GTK's GtkPositionType.
+type PositionType int
+
+const (
+ POS_LEFT PositionType = C.GTK_POS_LEFT
+ POS_RIGHT PositionType = C.GTK_POS_RIGHT
+ POS_TOP PositionType = C.GTK_POS_TOP
+ POS_BOTTOM PositionType = C.GTK_POS_BOTTOM
+)
+
+func marshalPositionType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PositionType(c), nil
+}
+
+// ReliefStyle is a representation of GTK's GtkReliefStyle.
+type ReliefStyle int
+
+const (
+ RELIEF_NORMAL ReliefStyle = C.GTK_RELIEF_NORMAL
+ RELIEF_HALF ReliefStyle = C.GTK_RELIEF_HALF
+ RELIEF_NONE ReliefStyle = C.GTK_RELIEF_NONE
+)
+
+func marshalReliefStyle(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return ReliefStyle(c), nil
+}
+
+// ResponseType is a representation of GTK's GtkResponseType.
+type ResponseType int
+
+const (
+ RESPONSE_NONE ResponseType = C.GTK_RESPONSE_NONE
+ RESPONSE_REJECT ResponseType = C.GTK_RESPONSE_REJECT
+ RESPONSE_ACCEPT ResponseType = C.GTK_RESPONSE_ACCEPT
+ RESPONSE_DELETE_EVENT ResponseType = C.GTK_RESPONSE_DELETE_EVENT
+ RESPONSE_OK ResponseType = C.GTK_RESPONSE_OK
+ RESPONSE_CANCEL ResponseType = C.GTK_RESPONSE_CANCEL
+ RESPONSE_CLOSE ResponseType = C.GTK_RESPONSE_CLOSE
+ RESPONSE_YES ResponseType = C.GTK_RESPONSE_YES
+ RESPONSE_NO ResponseType = C.GTK_RESPONSE_NO
+ RESPONSE_APPLY ResponseType = C.GTK_RESPONSE_APPLY
+ RESPONSE_HELP ResponseType = C.GTK_RESPONSE_HELP
+)
+
+func marshalResponseType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return ResponseType(c), nil
+}
+
+// SelectionMode is a representation of GTK's GtkSelectionMode.
+type SelectionMode int
+
+const (
+ SELECTION_NONE SelectionMode = C.GTK_SELECTION_NONE
+ SELECTION_SINGLE SelectionMode = C.GTK_SELECTION_SINGLE
+ SELECTION_BROWSE SelectionMode = C.GTK_SELECTION_BROWSE
+ SELECTION_MULTIPLE SelectionMode = C.GTK_SELECTION_MULTIPLE
+)
+
+func marshalSelectionMode(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return SelectionMode(c), nil
+}
+
+// ShadowType is a representation of GTK's GtkShadowType.
+type ShadowType int
+
+const (
+ SHADOW_NONE ShadowType = C.GTK_SHADOW_NONE
+ SHADOW_IN ShadowType = C.GTK_SHADOW_IN
+ SHADOW_OUT ShadowType = C.GTK_SHADOW_OUT
+ SHADOW_ETCHED_IN ShadowType = C.GTK_SHADOW_ETCHED_IN
+ SHADOW_ETCHED_OUT ShadowType = C.GTK_SHADOW_ETCHED_OUT
+)
+
+func marshalShadowType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return ShadowType(c), nil
+}
+
+// SizeGroupMode is a representation of GTK's GtkSizeGroupMode
+type SizeGroupMode int
+
+const (
+ SIZE_GROUP_NONE SizeGroupMode = C.GTK_SIZE_GROUP_NONE
+ SIZE_GROUP_HORIZONTAL SizeGroupMode = C.GTK_SIZE_GROUP_HORIZONTAL
+ SIZE_GROUP_VERTICAL SizeGroupMode = C.GTK_SIZE_GROUP_VERTICAL
+ SIZE_GROUP_BOTH SizeGroupMode = C.GTK_SIZE_GROUP_BOTH
+)
+
+func marshalSizeGroupMode(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return SizeGroupMode(c), nil
+}
+
+// SortType is a representation of GTK's GtkSortType.
+type SortType int
+
+const (
+ SORT_ASCENDING SortType = C.GTK_SORT_ASCENDING
+ SORT_DESCENDING = C.GTK_SORT_DESCENDING
+)
+
+// Use as column id in SetSortColumnId to specify ListStore sorted
+// by default column or unsorted
+const (
+ SORT_COLUMN_DEFAULT int = -1
+ SORT_COLUMN_UNSORTED int = -2
+)
+
+func marshalSortType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return SortType(c), nil
+}
+
+// StateFlags is a representation of GTK's GtkStateFlags.
+type StateFlags int
+
+const (
+ STATE_FLAG_NORMAL StateFlags = C.GTK_STATE_FLAG_NORMAL
+ STATE_FLAG_ACTIVE StateFlags = C.GTK_STATE_FLAG_ACTIVE
+ STATE_FLAG_PRELIGHT StateFlags = C.GTK_STATE_FLAG_PRELIGHT
+ STATE_FLAG_SELECTED StateFlags = C.GTK_STATE_FLAG_SELECTED
+ STATE_FLAG_INSENSITIVE StateFlags = C.GTK_STATE_FLAG_INSENSITIVE
+ STATE_FLAG_INCONSISTENT StateFlags = C.GTK_STATE_FLAG_INCONSISTENT
+ STATE_FLAG_FOCUSED StateFlags = C.GTK_STATE_FLAG_FOCUSED
+ STATE_FLAG_BACKDROP StateFlags = C.GTK_STATE_FLAG_BACKDROP
+)
+
+func marshalStateFlags(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return StateFlags(c), nil
+}
+
+// TextDirection is a representation of GTK's GtkTextDirection.
+type TextDirection int
+
+const (
+ TEXT_DIR_NONE TextDirection = C.GTK_TEXT_DIR_NONE
+ TEXT_DIR_LTR TextDirection = C.GTK_TEXT_DIR_LTR
+ TEXT_DIR_RTL TextDirection = C.GTK_TEXT_DIR_RTL
+)
+
+func marshalTextDirection(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return TextDirection(c), nil
+}
+
+// TargetFlags is a representation of GTK's GtkTargetFlags.
+type TargetFlags int
+
+const (
+ TARGET_SAME_APP TargetFlags = C.GTK_TARGET_SAME_APP
+ TARGET_SAME_WIDGET TargetFlags = C.GTK_TARGET_SAME_WIDGET
+ TARGET_OTHER_APP TargetFlags = C.GTK_TARGET_OTHER_APP
+ TARGET_OTHER_WIDGET TargetFlags = C.GTK_TARGET_OTHER_WIDGET
+)
+
+func marshalTargetFlags(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return TargetFlags(c), nil
+}
+
+// ToolbarStyle is a representation of GTK's GtkToolbarStyle.
+type ToolbarStyle int
+
+const (
+ TOOLBAR_ICONS ToolbarStyle = C.GTK_TOOLBAR_ICONS
+ TOOLBAR_TEXT ToolbarStyle = C.GTK_TOOLBAR_TEXT
+ TOOLBAR_BOTH ToolbarStyle = C.GTK_TOOLBAR_BOTH
+ TOOLBAR_BOTH_HORIZ ToolbarStyle = C.GTK_TOOLBAR_BOTH_HORIZ
+)
+
+func marshalToolbarStyle(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return ToolbarStyle(c), nil
+}
+
+// TreeModelFlags is a representation of GTK's GtkTreeModelFlags.
+type TreeModelFlags int
+
+const (
+ TREE_MODEL_ITERS_PERSIST TreeModelFlags = C.GTK_TREE_MODEL_ITERS_PERSIST
+ TREE_MODEL_LIST_ONLY TreeModelFlags = C.GTK_TREE_MODEL_LIST_ONLY
+)
+
+func marshalTreeModelFlags(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return TreeModelFlags(c), nil
+}
+
+// WindowPosition is a representation of GTK's GtkWindowPosition.
+type WindowPosition int
+
+const (
+ WIN_POS_NONE WindowPosition = C.GTK_WIN_POS_NONE
+ WIN_POS_CENTER WindowPosition = C.GTK_WIN_POS_CENTER
+ WIN_POS_MOUSE WindowPosition = C.GTK_WIN_POS_MOUSE
+ WIN_POS_CENTER_ALWAYS WindowPosition = C.GTK_WIN_POS_CENTER_ALWAYS
+ WIN_POS_CENTER_ON_PARENT WindowPosition = C.GTK_WIN_POS_CENTER_ON_PARENT
+)
+
+func marshalWindowPosition(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return WindowPosition(c), nil
+}
+
+// WindowType is a representation of GTK's GtkWindowType.
+type WindowType int
+
+const (
+ WINDOW_TOPLEVEL WindowType = C.GTK_WINDOW_TOPLEVEL
+ WINDOW_POPUP WindowType = C.GTK_WINDOW_POPUP
+)
+
+func marshalWindowType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return WindowType(c), nil
+}
+
+// WrapMode is a representation of GTK's GtkWrapMode.
+type WrapMode int
+
+const (
+ WRAP_NONE WrapMode = C.GTK_WRAP_NONE
+ WRAP_CHAR WrapMode = C.GTK_WRAP_CHAR
+ WRAP_WORD WrapMode = C.GTK_WRAP_WORD
+ WRAP_WORD_CHAR WrapMode = C.GTK_WRAP_WORD_CHAR
+)
+
+func marshalWrapMode(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return WrapMode(c), nil
+}
+
+/*
+ * Init and main event loop
+ */
+
+/*
+Init() is a wrapper around gtk_init() and must be called before any
+other GTK calls and is used to initialize everything necessary.
+
+In addition to setting up GTK for usage, a pointer to a slice of
+strings may be passed in to parse standard GTK command line arguments.
+args will be modified to remove any flags that were handled.
+Alternatively, nil may be passed in to not perform any command line
+parsing.
+*/
+func Init(args *[]string) {
+ if args != nil {
+ argc := C.int(len(*args))
+ argv := C.make_strings(argc)
+ defer C.destroy_strings(argv)
+
+ for i, arg := range *args {
+ cstr := C.CString(arg)
+ C.set_string(argv, C.int(i), (*C.gchar)(cstr))
+ }
+
+ C.gtk_init((*C.int)(unsafe.Pointer(&argc)),
+ (***C.char)(unsafe.Pointer(&argv)))
+
+ unhandled := make([]string, argc)
+ for i := 0; i < int(argc); i++ {
+ cstr := C.get_string(argv, C.int(i))
+ unhandled[i] = goString(cstr)
+ C.free(unsafe.Pointer(cstr))
+ }
+ *args = unhandled
+ } else {
+ C.gtk_init(nil, nil)
+ }
+}
+
+/*
+InitCheck() is a wrapper around gtk_init_check() and works exactly like Init()
+only that it doesn't terminate the program if initialization fails.
+*/
+func InitCheck(args *[]string) error {
+ success := false
+ if args != nil {
+ argc := C.int(len(*args))
+ argv := C.make_strings(argc)
+ defer C.destroy_strings(argv)
+
+ for i, arg := range *args {
+ cstr := C.CString(arg)
+ C.set_string(argv, C.int(i), (*C.gchar)(cstr))
+ }
+
+ success = gobool(C.gtk_init_check((*C.int)(unsafe.Pointer(&argc)),
+ (***C.char)(unsafe.Pointer(&argv))))
+
+ unhandled := make([]string, argc)
+ for i := 0; i < int(argc); i++ {
+ cstr := C.get_string(argv, C.int(i))
+ unhandled[i] = goString(cstr)
+ C.free(unsafe.Pointer(cstr))
+ }
+ *args = unhandled
+ } else {
+ success = gobool(C.gtk_init_check(nil, nil))
+ }
+ if success {
+ return nil
+ } else {
+ return errors.New("Unable to initialize GTK")
+ }
+}
+
+// Main() is a wrapper around gtk_main() and runs the GTK main loop,
+// blocking until MainQuit() is called.
+func Main() {
+ C.gtk_main()
+}
+
+// MainIteration is a wrapper around gtk_main_iteration.
+func MainIteration() bool {
+ return gobool(C.gtk_main_iteration())
+}
+
+// MainIterationDo is a wrapper around gtk_main_iteration_do.
+func MainIterationDo(blocking bool) bool {
+ return gobool(C.gtk_main_iteration_do(gbool(blocking)))
+}
+
+// EventsPending is a wrapper around gtk_events_pending.
+func EventsPending() bool {
+ return gobool(C.gtk_events_pending())
+}
+
+// MainQuit() is a wrapper around gtk_main_quit() is used to terminate
+// the GTK main loop (started by Main()).
+func MainQuit() {
+ C.gtk_main_quit()
+}
+
+/*
+ * GtkAdjustment
+ */
+
+// Adjustment is a representation of GTK's GtkAdjustment.
+type Adjustment struct {
+ glib.InitiallyUnowned
+}
+
+// native returns a pointer to the underlying GtkAdjustment.
+func (v *Adjustment) native() *C.GtkAdjustment {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAdjustment(p)
+}
+
+func marshalAdjustment(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAdjustment(obj), nil
+}
+
+func wrapAdjustment(obj *glib.Object) *Adjustment {
+ return &Adjustment{glib.InitiallyUnowned{obj}}
+}
+
+// AdjustmentNew is a wrapper around gtk_adjustment_new().
+func AdjustmentNew(value, lower, upper, stepIncrement, pageIncrement, pageSize float64) (*Adjustment, error) {
+ c := C.gtk_adjustment_new(C.gdouble(value),
+ C.gdouble(lower),
+ C.gdouble(upper),
+ C.gdouble(stepIncrement),
+ C.gdouble(pageIncrement),
+ C.gdouble(pageSize))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAdjustment(obj), nil
+}
+
+// GetValue is a wrapper around gtk_adjustment_get_value().
+func (v *Adjustment) GetValue() float64 {
+ c := C.gtk_adjustment_get_value(v.native())
+ return float64(c)
+}
+
+// SetValue is a wrapper around gtk_adjustment_set_value().
+func (v *Adjustment) SetValue(value float64) {
+ C.gtk_adjustment_set_value(v.native(), C.gdouble(value))
+}
+
+// GetLower is a wrapper around gtk_adjustment_get_lower().
+func (v *Adjustment) GetLower() float64 {
+ c := C.gtk_adjustment_get_lower(v.native())
+ return float64(c)
+}
+
+// GetPageSize is a wrapper around gtk_adjustment_get_page_size().
+func (v *Adjustment) GetPageSize() float64 {
+ return float64(C.gtk_adjustment_get_page_size(v.native()))
+}
+
+// SetPageSize is a wrapper around gtk_adjustment_set_page_size().
+func (v *Adjustment) SetPageSize(value float64) {
+ C.gtk_adjustment_set_page_size(v.native(), C.gdouble(value))
+}
+
+// Configure is a wrapper around gtk_adjustment_configure().
+func (v *Adjustment) Configure(value, lower, upper, stepIncrement, pageIncrement, pageSize float64) {
+ C.gtk_adjustment_configure(v.native(), C.gdouble(value),
+ C.gdouble(lower), C.gdouble(upper), C.gdouble(stepIncrement),
+ C.gdouble(pageIncrement), C.gdouble(pageSize))
+}
+
+// SetLower is a wrapper around gtk_adjustment_set_lower().
+func (v *Adjustment) SetLower(value float64) {
+ C.gtk_adjustment_set_lower(v.native(), C.gdouble(value))
+}
+
+// GetUpper is a wrapper around gtk_adjustment_get_upper().
+func (v *Adjustment) GetUpper() float64 {
+ c := C.gtk_adjustment_get_upper(v.native())
+ return float64(c)
+}
+
+// SetUpper is a wrapper around gtk_adjustment_set_upper().
+func (v *Adjustment) SetUpper(value float64) {
+ C.gtk_adjustment_set_upper(v.native(), C.gdouble(value))
+}
+
+// GetPageIncrement is a wrapper around gtk_adjustment_get_page_increment().
+func (v *Adjustment) GetPageIncrement() float64 {
+ c := C.gtk_adjustment_get_page_increment(v.native())
+ return float64(c)
+}
+
+// SetPageIncrement is a wrapper around gtk_adjustment_set_page_increment().
+func (v *Adjustment) SetPageIncrement(value float64) {
+ C.gtk_adjustment_set_page_increment(v.native(), C.gdouble(value))
+}
+
+// GetStepIncrement is a wrapper around gtk_adjustment_get_step_increment().
+func (v *Adjustment) GetStepIncrement() float64 {
+ c := C.gtk_adjustment_get_step_increment(v.native())
+ return float64(c)
+}
+
+// SetStepIncrement is a wrapper around gtk_adjustment_set_step_increment().
+func (v *Adjustment) SetStepIncrement(value float64) {
+ C.gtk_adjustment_set_step_increment(v.native(), C.gdouble(value))
+}
+
+// GetMinimumIncrement is a wrapper around gtk_adjustment_get_minimum_increment().
+func (v *Adjustment) GetMinimumIncrement() float64 {
+ c := C.gtk_adjustment_get_minimum_increment(v.native())
+ return float64(c)
+}
+
+/*
+void gtk_adjustment_clamp_page ()
+void gtk_adjustment_changed ()
+void gtk_adjustment_value_changed ()
+void gtk_adjustment_configure ()
+*/
+
+/*
+ * GtkAssistant
+ */
+
+// Assistant is a representation of GTK's GtkAssistant.
+type Assistant struct {
+ Window
+}
+
+// native returns a pointer to the underlying GtkAssistant.
+func (v *Assistant) native() *C.GtkAssistant {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAssistant(p)
+}
+
+func marshalAssistant(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAssistant(obj), nil
+}
+
+func wrapAssistant(obj *glib.Object) *Assistant {
+ return &Assistant{Window{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}}
+}
+
+// AssistantNew is a wrapper around gtk_assistant_new().
+func AssistantNew() (*Assistant, error) {
+ c := C.gtk_assistant_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAssistant(obj), nil
+}
+
+// GetCurrentPage is a wrapper around gtk_assistant_get_current_page().
+func (v *Assistant) GetCurrentPage() int {
+ c := C.gtk_assistant_get_current_page(v.native())
+ return int(c)
+}
+
+// SetCurrentPage is a wrapper around gtk_assistant_set_current_page().
+func (v *Assistant) SetCurrentPage(pageNum int) {
+ C.gtk_assistant_set_current_page(v.native(), C.gint(pageNum))
+}
+
+// GetNPages is a wrapper around gtk_assistant_get_n_pages().
+func (v *Assistant) GetNPages() int {
+ c := C.gtk_assistant_get_n_pages(v.native())
+ return int(c)
+}
+
+// GetNthPage is a wrapper around gtk_assistant_get_nth_page().
+func (v *Assistant) GetNthPage(pageNum int) (*Widget, error) {
+ c := C.gtk_assistant_get_nth_page(v.native(), C.gint(pageNum))
+ if c == nil {
+ return nil, fmt.Errorf("page %d is out of bounds", pageNum)
+ }
+
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapWidget(obj), nil
+}
+
+// PrependPage is a wrapper around gtk_assistant_prepend_page().
+func (v *Assistant) PrependPage(page IWidget) int {
+ c := C.gtk_assistant_prepend_page(v.native(), page.toWidget())
+ return int(c)
+}
+
+// AppendPage is a wrapper around gtk_assistant_append_page().
+func (v *Assistant) AppendPage(page IWidget) int {
+ c := C.gtk_assistant_append_page(v.native(), page.toWidget())
+ return int(c)
+}
+
+// InsertPage is a wrapper around gtk_assistant_insert_page().
+func (v *Assistant) InsertPage(page IWidget, position int) int {
+ c := C.gtk_assistant_insert_page(v.native(), page.toWidget(),
+ C.gint(position))
+ return int(c)
+}
+
+// RemovePage is a wrapper around gtk_assistant_remove_page().
+func (v *Assistant) RemovePage(pageNum int) {
+ C.gtk_assistant_remove_page(v.native(), C.gint(pageNum))
+}
+
+// TODO: gtk_assistant_set_forward_page_func
+
+// SetPageType is a wrapper around gtk_assistant_set_page_type().
+func (v *Assistant) SetPageType(page IWidget, ptype AssistantPageType) {
+ C.gtk_assistant_set_page_type(v.native(), page.toWidget(),
+ C.GtkAssistantPageType(ptype))
+}
+
+// GetPageType is a wrapper around gtk_assistant_get_page_type().
+func (v *Assistant) GetPageType(page IWidget) AssistantPageType {
+ c := C.gtk_assistant_get_page_type(v.native(), page.toWidget())
+ return AssistantPageType(c)
+}
+
+// SetPageTitle is a wrapper around gtk_assistant_set_page_title().
+func (v *Assistant) SetPageTitle(page IWidget, title string) {
+ cstr := C.CString(title)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_assistant_set_page_title(v.native(), page.toWidget(),
+ (*C.gchar)(cstr))
+}
+
+// GetPageTitle is a wrapper around gtk_assistant_get_page_title().
+func (v *Assistant) GetPageTitle(page IWidget) string {
+ return goString(C.gtk_assistant_get_page_title(v.native(), page.toWidget()))
+}
+
+// SetPageComplete is a wrapper around gtk_assistant_set_page_complete().
+func (v *Assistant) SetPageComplete(page IWidget, complete bool) {
+ C.gtk_assistant_set_page_complete(v.native(), page.toWidget(),
+ gbool(complete))
+}
+
+// GetPageComplete is a wrapper around gtk_assistant_get_page_complete().
+func (v *Assistant) GetPageComplete(page IWidget) bool {
+ c := C.gtk_assistant_get_page_complete(v.native(), page.toWidget())
+ return gobool(c)
+}
+
+// AddActionWidget is a wrapper around gtk_assistant_add_action_widget().
+func (v *Assistant) AddActionWidget(child IWidget) {
+ C.gtk_assistant_add_action_widget(v.native(), child.toWidget())
+}
+
+// RemoveActionWidget is a wrapper around gtk_assistant_remove_action_widget().
+func (v *Assistant) RemoveActionWidget(child IWidget) {
+ C.gtk_assistant_remove_action_widget(v.native(), child.toWidget())
+}
+
+// UpdateButtonsState is a wrapper around gtk_assistant_update_buttons_state().
+func (v *Assistant) UpdateButtonsState() {
+ C.gtk_assistant_update_buttons_state(v.native())
+}
+
+// Commit is a wrapper around gtk_assistant_commit().
+func (v *Assistant) Commit() {
+ C.gtk_assistant_commit(v.native())
+}
+
+// NextPage is a wrapper around gtk_assistant_next_page().
+func (v *Assistant) NextPage() {
+ C.gtk_assistant_next_page(v.native())
+}
+
+// PreviousPage is a wrapper around gtk_assistant_previous_page().
+func (v *Assistant) PreviousPage() {
+ C.gtk_assistant_previous_page(v.native())
+}
+
+/*
+ * GtkBin
+ */
+
+// Bin is a representation of GTK's GtkBin.
+type Bin struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkBin.
+func (v *Bin) native() *C.GtkBin {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkBin(p)
+}
+
+func marshalBin(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapBin(obj), nil
+}
+
+func wrapBin(obj *glib.Object) *Bin {
+ return &Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// GetChild is a wrapper around gtk_bin_get_child().
+func (v *Bin) GetChild() (*Widget, error) {
+ c := C.gtk_bin_get_child(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapWidget(obj), nil
+}
+
+/*
+ * GtkBuilder
+ */
+
+// Builder is a representation of GTK's GtkBuilder.
+type Builder struct {
+ *glib.Object
+}
+
+// native() returns a pointer to the underlying GtkBuilder.
+func (b *Builder) native() *C.GtkBuilder {
+ if b == nil || b.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(b.GObject)
+ return C.toGtkBuilder(p)
+}
+
+func marshalBuilder(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return &Builder{obj}, nil
+}
+
+// BuilderNew is a wrapper around gtk_builder_new().
+func BuilderNew() (*Builder, error) {
+ c := C.gtk_builder_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return &Builder{obj}, nil
+}
+
+// BuilderNewFromFile is a wrapper around gtk_builder_new_from_file().
+func BuilderNewFromFile(filePath string) (*Builder, error) {
+ cstr := C.CString(filePath)
+ defer C.free(unsafe.Pointer(cstr))
+
+ c := C.gtk_builder_new_from_file((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := glib.Take(unsafe.Pointer(c))
+ return &Builder{obj}, nil
+}
+
+// BuilderNewFromResource is a wrapper around gtk_builder_new_from_resource().
+func BuilderNewFromResource(resourcePath string) (*Builder, error) {
+ cstr := C.CString(resourcePath)
+ defer C.free(unsafe.Pointer(cstr))
+
+ c := C.gtk_builder_new_from_resource((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := glib.Take(unsafe.Pointer(c))
+ return &Builder{obj}, nil
+}
+
+// AddFromFile is a wrapper around gtk_builder_add_from_file().
+func (b *Builder) AddFromFile(filename string) error {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ res := C.gtk_builder_add_from_file(b.native(), (*C.gchar)(cstr), &err)
+ if res == 0 {
+ defer C.g_error_free(err)
+ return errors.New(goString(err.message))
+ }
+ return nil
+}
+
+// AddFromResource is a wrapper around gtk_builder_add_from_resource().
+func (b *Builder) AddFromResource(path string) error {
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ res := C.gtk_builder_add_from_resource(b.native(), (*C.gchar)(cstr), &err)
+ if res == 0 {
+ defer C.g_error_free(err)
+ return errors.New(goString(err.message))
+ }
+ return nil
+}
+
+// AddFromString is a wrapper around gtk_builder_add_from_string().
+func (b *Builder) AddFromString(str string) error {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ length := (C.gsize)(len(str))
+ var err *C.GError = nil
+ res := C.gtk_builder_add_from_string(b.native(), (*C.gchar)(cstr), length, &err)
+ if res == 0 {
+ defer C.g_error_free(err)
+ return errors.New(goString(err.message))
+ }
+ return nil
+}
+
+// GetObject is a wrapper around gtk_builder_get_object(). The returned result
+// is an IObject, so it will need to be type-asserted to the appropriate type before
+// being used. For example, to get an object and type assert it as a window:
+//
+// obj, err := builder.GetObject("window")
+// if err != nil {
+// // object not found
+// return
+// }
+// if w, ok := obj.(*gtk.Window); ok {
+// // do stuff with w here
+// } else {
+// // not a *gtk.Window
+// }
+//
+func (b *Builder) GetObject(name string) (glib.IObject, error) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_builder_get_object(b.native(), (*C.gchar)(cstr))
+ if c == nil {
+ return nil, errors.New("object '" + name + "' not found")
+ }
+ obj, err := cast(c)
+ if err != nil {
+ return nil, err
+ }
+ return obj, nil
+}
+
+var (
+ builderSignals = struct {
+ sync.RWMutex
+ m map[*C.GtkBuilder]map[string]interface{}
+ }{
+ m: make(map[*C.GtkBuilder]map[string]interface{}),
+ }
+)
+
+// ConnectSignals is a wrapper around gtk_builder_connect_signals_full().
+func (b *Builder) ConnectSignals(signals map[string]interface{}) {
+ builderSignals.Lock()
+ builderSignals.m[b.native()] = signals
+ builderSignals.Unlock()
+
+ C._gtk_builder_connect_signals_full(b.native())
+}
+
+/*
+ * GtkButton
+ */
+
+// Button is a representation of GTK's GtkButton.
+type Button struct {
+ Bin
+
+ // Interfaces
+ IActionable
+}
+
+// native() returns a pointer to the underlying GtkButton.
+func (v *Button) native() *C.GtkButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkButton(p)
+}
+
+func marshalButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapButton(obj), nil
+}
+
+func wrapButton(obj *glib.Object) *Button {
+ actionable := &Actionable{obj}
+ return &Button{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}, actionable}
+}
+
+// ButtonNew() is a wrapper around gtk_button_new().
+func ButtonNew() (*Button, error) {
+ c := C.gtk_button_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapButton(obj), nil
+}
+
+// ButtonNewWithLabel() is a wrapper around gtk_button_new_with_label().
+func ButtonNewWithLabel(label string) (*Button, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_button_new_with_label((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapButton(obj), nil
+}
+
+// ButtonNewWithMnemonic() is a wrapper around gtk_button_new_with_mnemonic().
+func ButtonNewWithMnemonic(label string) (*Button, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_button_new_with_mnemonic((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapButton(obj), nil
+}
+
+// Clicked() is a wrapper around gtk_button_clicked().
+func (v *Button) Clicked() {
+ C.gtk_button_clicked(v.native())
+}
+
+// SetRelief() is a wrapper around gtk_button_set_relief().
+func (v *Button) SetRelief(newStyle ReliefStyle) {
+ C.gtk_button_set_relief(v.native(), C.GtkReliefStyle(newStyle))
+}
+
+// GetRelief() is a wrapper around gtk_button_get_relief().
+func (v *Button) GetRelief() ReliefStyle {
+ c := C.gtk_button_get_relief(v.native())
+ return ReliefStyle(c)
+}
+
+// SetLabel() is a wrapper around gtk_button_set_label().
+func (v *Button) SetLabel(label string) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_button_set_label(v.native(), (*C.gchar)(cstr))
+}
+
+// GetLabel() is a wrapper around gtk_button_get_label().
+func (v *Button) GetLabel() (string, error) {
+ c := C.gtk_button_get_label(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return goString(c), nil
+}
+
+// SetUseUnderline() is a wrapper around gtk_button_set_use_underline().
+func (v *Button) SetUseUnderline(useUnderline bool) {
+ C.gtk_button_set_use_underline(v.native(), gbool(useUnderline))
+}
+
+// GetUseUnderline() is a wrapper around gtk_button_get_use_underline().
+func (v *Button) GetUseUnderline() bool {
+ c := C.gtk_button_get_use_underline(v.native())
+ return gobool(c)
+}
+
+// SetImage() is a wrapper around gtk_button_set_image().
+func (v *Button) SetImage(image IWidget) {
+ C.gtk_button_set_image(v.native(), image.toWidget())
+}
+
+// GetImage() is a wrapper around gtk_button_get_image().
+func (v *Button) GetImage() (*Widget, error) {
+ c := C.gtk_button_get_image(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapWidget(obj), nil
+}
+
+// SetImagePosition() is a wrapper around gtk_button_set_image_position().
+func (v *Button) SetImagePosition(position PositionType) {
+ C.gtk_button_set_image_position(v.native(), C.GtkPositionType(position))
+}
+
+// GetImagePosition() is a wrapper around gtk_button_get_image_position().
+func (v *Button) GetImagePosition() PositionType {
+ c := C.gtk_button_get_image_position(v.native())
+ return PositionType(c)
+}
+
+// SetAlwaysShowImage() is a wrapper around gtk_button_set_always_show_image().
+func (v *Button) SetAlwaysShowImage(alwaysShow bool) {
+ C.gtk_button_set_always_show_image(v.native(), gbool(alwaysShow))
+}
+
+// GetAlwaysShowImage() is a wrapper around gtk_button_get_always_show_image().
+func (v *Button) GetAlwaysShowImage() bool {
+ c := C.gtk_button_get_always_show_image(v.native())
+ return gobool(c)
+}
+
+// GetEventWindow() is a wrapper around gtk_button_get_event_window().
+func (v *Button) GetEventWindow() (*gdk.Window, error) {
+ c := C.gtk_button_get_event_window(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ w := &gdk.Window{glib.Take(unsafe.Pointer(c))}
+ return w, nil
+}
+
+/*
+ * GtkColorButton
+ */
+
+// ColorButton is a representation of GTK's GtkColorButton.
+type ColorButton struct {
+ Button
+
+ // Interfaces
+ ColorChooser
+}
+
+// Native returns a pointer to the underlying GtkColorButton.
+func (v *ColorButton) native() *C.GtkColorButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkColorButton(p)
+}
+
+func wrapColorButton(obj *glib.Object) *ColorButton {
+ cc := wrapColorChooser(obj)
+ actionable := wrapActionable(obj)
+ return &ColorButton{Button{Bin{Container{Widget{
+ glib.InitiallyUnowned{obj}}}}, actionable}, *cc}
+}
+
+// ColorButtonNew is a wrapper around gtk_color_button_new().
+func ColorButtonNew() (*ColorButton, error) {
+ c := C.gtk_color_button_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapColorButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// ColorButtonNewWithRGBA is a wrapper around gtk_color_button_new_with_rgba().
+func ColorButtonNewWithRGBA(gdkColor *gdk.RGBA) (*ColorButton, error) {
+ c := C.gtk_color_button_new_with_rgba((*C.GdkRGBA)(unsafe.Pointer(gdkColor.Native())))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapColorButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkBox
+ */
+
+// Box is a representation of GTK's GtkBox.
+type Box struct {
+ Container
+}
+
+// native() returns a pointer to the underlying GtkBox.
+func (v *Box) native() *C.GtkBox {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkBox(p)
+}
+
+func marshalBox(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapBox(obj), nil
+}
+
+func wrapBox(obj *glib.Object) *Box {
+ return &Box{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+func (v *Box) toOrientable() *C.GtkOrientable {
+ if v == nil {
+ return nil
+ }
+ return C.toGtkOrientable(unsafe.Pointer(v.GObject))
+}
+
+// GetOrientation() is a wrapper around C.gtk_orientable_get_orientation() for a GtkBox
+func (v *Box) GetOrientation() Orientation {
+ return Orientation(C.gtk_orientable_get_orientation(v.toOrientable()))
+}
+
+// SetOrientation() is a wrapper around C.gtk_orientable_set_orientation() for a GtkBox
+func (v *Box) SetOrientation(o Orientation) {
+ C.gtk_orientable_set_orientation(v.toOrientable(), C.GtkOrientation(o))
+}
+
+// BoxNew() is a wrapper around gtk_box_new().
+func BoxNew(orientation Orientation, spacing int) (*Box, error) {
+ c := C.gtk_box_new(C.GtkOrientation(orientation), C.gint(spacing))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapBox(obj), nil
+}
+
+// PackStart() is a wrapper around gtk_box_pack_start().
+func (v *Box) PackStart(child IWidget, expand, fill bool, padding uint) {
+ C.gtk_box_pack_start(v.native(), child.toWidget(), gbool(expand),
+ gbool(fill), C.guint(padding))
+}
+
+// PackEnd() is a wrapper around gtk_box_pack_end().
+func (v *Box) PackEnd(child IWidget, expand, fill bool, padding uint) {
+ C.gtk_box_pack_end(v.native(), child.toWidget(), gbool(expand),
+ gbool(fill), C.guint(padding))
+}
+
+// GetHomogeneous() is a wrapper around gtk_box_get_homogeneous().
+func (v *Box) GetHomogeneous() bool {
+ c := C.gtk_box_get_homogeneous(v.native())
+ return gobool(c)
+}
+
+// SetHomogeneous() is a wrapper around gtk_box_set_homogeneous().
+func (v *Box) SetHomogeneous(homogeneous bool) {
+ C.gtk_box_set_homogeneous(v.native(), gbool(homogeneous))
+}
+
+// GetSpacing() is a wrapper around gtk_box_get_spacing().
+func (v *Box) GetSpacing() int {
+ c := C.gtk_box_get_spacing(v.native())
+ return int(c)
+}
+
+// SetSpacing() is a wrapper around gtk_box_set_spacing()
+func (v *Box) SetSpacing(spacing int) {
+ C.gtk_box_set_spacing(v.native(), C.gint(spacing))
+}
+
+// ReorderChild() is a wrapper around gtk_box_reorder_child().
+func (v *Box) ReorderChild(child IWidget, position int) {
+ C.gtk_box_reorder_child(v.native(), child.toWidget(), C.gint(position))
+}
+
+// QueryChildPacking() is a wrapper around gtk_box_query_child_packing().
+func (v *Box) QueryChildPacking(child IWidget) (expand, fill bool, padding uint, packType PackType) {
+ var cexpand, cfill C.gboolean
+ var cpadding C.guint
+ var cpackType C.GtkPackType
+
+ C.gtk_box_query_child_packing(v.native(), child.toWidget(), &cexpand,
+ &cfill, &cpadding, &cpackType)
+ return gobool(cexpand), gobool(cfill), uint(cpadding), PackType(cpackType)
+}
+
+// SetChildPacking() is a wrapper around gtk_box_set_child_packing().
+func (v *Box) SetChildPacking(child IWidget, expand, fill bool, padding uint, packType PackType) {
+ C.gtk_box_set_child_packing(v.native(), child.toWidget(), gbool(expand),
+ gbool(fill), C.guint(padding), C.GtkPackType(packType))
+}
+
+/*
+ * GtkCalendar
+ */
+
+// Calendar is a representation of GTK's GtkCalendar.
+type Calendar struct {
+ Widget
+}
+
+// native() returns a pointer to the underlying GtkCalendar.
+func (v *Calendar) native() *C.GtkCalendar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCalendar(p)
+}
+
+func marshalCalendar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCalendar(obj), nil
+}
+
+func wrapCalendar(obj *glib.Object) *Calendar {
+ return &Calendar{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// CalendarNew is a wrapper around gtk_calendar_new().
+func CalendarNew() (*Calendar, error) {
+ c := C.gtk_calendar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCalendar(obj), nil
+}
+
+// SelectMonth is a wrapper around gtk_calendar_select_month().
+func (v *Calendar) SelectMonth(month, year uint) {
+ C.gtk_calendar_select_month(v.native(), C.guint(month), C.guint(year))
+}
+
+// SelectDay is a wrapper around gtk_calendar_select_day().
+func (v *Calendar) SelectDay(day uint) {
+ C.gtk_calendar_select_day(v.native(), C.guint(day))
+}
+
+// MarkDay is a wrapper around gtk_calendar_mark_day().
+func (v *Calendar) MarkDay(day uint) {
+ C.gtk_calendar_mark_day(v.native(), C.guint(day))
+}
+
+// UnmarkDay is a wrapper around gtk_calendar_unmark_day().
+func (v *Calendar) UnmarkDay(day uint) {
+ C.gtk_calendar_unmark_day(v.native(), C.guint(day))
+}
+
+// GetDayIsMarked is a wrapper around gtk_calendar_get_day_is_marked().
+func (v *Calendar) GetDayIsMarked(day uint) bool {
+ c := C.gtk_calendar_get_day_is_marked(v.native(), C.guint(day))
+ return gobool(c)
+}
+
+// ClearMarks is a wrapper around gtk_calendar_clear_marks().
+func (v *Calendar) ClearMarks() {
+ C.gtk_calendar_clear_marks(v.native())
+}
+
+// GetDisplayOptions is a wrapper around gtk_calendar_get_display_options().
+func (v *Calendar) GetDisplayOptions() CalendarDisplayOptions {
+ c := C.gtk_calendar_get_display_options(v.native())
+ return CalendarDisplayOptions(c)
+}
+
+// SetDisplayOptions is a wrapper around gtk_calendar_set_display_options().
+func (v *Calendar) SetDisplayOptions(flags CalendarDisplayOptions) {
+ C.gtk_calendar_set_display_options(v.native(),
+ C.GtkCalendarDisplayOptions(flags))
+}
+
+// GetDate is a wrapper around gtk_calendar_get_date().
+func (v *Calendar) GetDate() (year, month, day uint) {
+ var cyear, cmonth, cday C.guint
+ C.gtk_calendar_get_date(v.native(), &cyear, &cmonth, &cday)
+ return uint(cyear), uint(cmonth), uint(cday)
+}
+
+// TODO gtk_calendar_set_detail_func
+
+// GetDetailWidthChars is a wrapper around gtk_calendar_get_detail_width_chars().
+func (v *Calendar) GetDetailWidthChars() int {
+ c := C.gtk_calendar_get_detail_width_chars(v.native())
+ return int(c)
+}
+
+// SetDetailWidthChars is a wrapper around gtk_calendar_set_detail_width_chars().
+func (v *Calendar) SetDetailWidthChars(chars int) {
+ C.gtk_calendar_set_detail_width_chars(v.native(), C.gint(chars))
+}
+
+// GetDetailHeightRows is a wrapper around gtk_calendar_get_detail_height_rows().
+func (v *Calendar) GetDetailHeightRows() int {
+ c := C.gtk_calendar_get_detail_height_rows(v.native())
+ return int(c)
+}
+
+// SetDetailHeightRows is a wrapper around gtk_calendar_set_detail_height_rows().
+func (v *Calendar) SetDetailHeightRows(rows int) {
+ C.gtk_calendar_set_detail_height_rows(v.native(), C.gint(rows))
+}
+
+/*
+ * GtkCellLayout
+ */
+
+// CellLayout is a representation of GTK's GtkCellLayout GInterface.
+type CellLayout struct {
+ *glib.Object
+}
+
+// ICellLayout is an interface type implemented by all structs
+// embedding a CellLayout. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkCellLayout.
+type ICellLayout interface {
+ toCellLayout() *C.GtkCellLayout
+}
+
+// native() returns a pointer to the underlying GObject as a GtkCellLayout.
+func (v *CellLayout) native() *C.GtkCellLayout {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCellLayout(p)
+}
+
+func marshalCellLayout(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellLayout(obj), nil
+}
+
+func wrapCellLayout(obj *glib.Object) *CellLayout {
+ return &CellLayout{obj}
+}
+
+func (v *CellLayout) toCellLayout() *C.GtkCellLayout {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// PackStart() is a wrapper around gtk_cell_layout_pack_start().
+func (v *CellLayout) PackStart(cell ICellRenderer, expand bool) {
+ C.gtk_cell_layout_pack_start(v.native(), cell.toCellRenderer(),
+ gbool(expand))
+}
+
+// AddAttribute() is a wrapper around gtk_cell_layout_add_attribute().
+func (v *CellLayout) AddAttribute(cell ICellRenderer, attribute string, column int) {
+ cstr := C.CString(attribute)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_cell_layout_add_attribute(v.native(), cell.toCellRenderer(),
+ (*C.gchar)(cstr), C.gint(column))
+}
+
+/*
+ * GtkCellRenderer
+ */
+
+// CellRenderer is a representation of GTK's GtkCellRenderer.
+type CellRenderer struct {
+ glib.InitiallyUnowned
+}
+
+// ICellRenderer is an interface type implemented by all structs
+// embedding a CellRenderer. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkCellRenderer.
+type ICellRenderer interface {
+ toCellRenderer() *C.GtkCellRenderer
+}
+
+// native returns a pointer to the underlying GtkCellRenderer.
+func (v *CellRenderer) native() *C.GtkCellRenderer {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCellRenderer(p)
+}
+
+func (v *CellRenderer) toCellRenderer() *C.GtkCellRenderer {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func marshalCellRenderer(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellRenderer(obj), nil
+}
+
+func wrapCellRenderer(obj *glib.Object) *CellRenderer {
+ return &CellRenderer{glib.InitiallyUnowned{obj}}
+}
+
+/*
+ * GtkCellRendererSpinner
+ */
+
+// CellRendererSpinner is a representation of GTK's GtkCellRendererSpinner.
+type CellRendererSpinner struct {
+ CellRenderer
+}
+
+// native returns a pointer to the underlying GtkCellRendererSpinner.
+func (v *CellRendererSpinner) native() *C.GtkCellRendererSpinner {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCellRendererSpinner(p)
+}
+
+func marshalCellRendererSpinner(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellRendererSpinner(obj), nil
+}
+
+func wrapCellRendererSpinner(obj *glib.Object) *CellRendererSpinner {
+ return &CellRendererSpinner{CellRenderer{glib.InitiallyUnowned{obj}}}
+}
+
+// CellRendererSpinnerNew is a wrapper around gtk_cell_renderer_text_new().
+func CellRendererSpinnerNew() (*CellRendererSpinner, error) {
+ c := C.gtk_cell_renderer_spinner_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellRendererSpinner(obj), nil
+}
+
+/*
+ * GtkCellRendererPixbuf
+ */
+
+// CellRendererPixbuf is a representation of GTK's GtkCellRendererPixbuf.
+type CellRendererPixbuf struct {
+ CellRenderer
+}
+
+// native returns a pointer to the underlying GtkCellRendererPixbuf.
+func (v *CellRendererPixbuf) native() *C.GtkCellRendererPixbuf {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCellRendererPixbuf(p)
+}
+
+func marshalCellRendererPixbuf(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellRendererPixbuf(obj), nil
+}
+
+func wrapCellRendererPixbuf(obj *glib.Object) *CellRendererPixbuf {
+ return &CellRendererPixbuf{CellRenderer{glib.InitiallyUnowned{obj}}}
+}
+
+// CellRendererPixbufNew is a wrapper around gtk_cell_renderer_pixbuf_new().
+func CellRendererPixbufNew() (*CellRendererPixbuf, error) {
+ c := C.gtk_cell_renderer_pixbuf_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellRendererPixbuf(obj), nil
+}
+
+/*
+ * GtkCellRendererText
+ */
+
+// CellRendererText is a representation of GTK's GtkCellRendererText.
+type CellRendererText struct {
+ CellRenderer
+}
+
+// native returns a pointer to the underlying GtkCellRendererText.
+func (v *CellRendererText) native() *C.GtkCellRendererText {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCellRendererText(p)
+}
+
+func marshalCellRendererText(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellRendererText(obj), nil
+}
+
+func wrapCellRendererText(obj *glib.Object) *CellRendererText {
+ return &CellRendererText{CellRenderer{glib.InitiallyUnowned{obj}}}
+}
+
+// CellRendererTextNew is a wrapper around gtk_cell_renderer_text_new().
+func CellRendererTextNew() (*CellRendererText, error) {
+ c := C.gtk_cell_renderer_text_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellRendererText(obj), nil
+}
+
+/*
+ * GtkCellRendererToggle
+ */
+
+// CellRendererToggle is a representation of GTK's GtkCellRendererToggle.
+type CellRendererToggle struct {
+ CellRenderer
+}
+
+// native returns a pointer to the underlying GtkCellRendererToggle.
+func (v *CellRendererToggle) native() *C.GtkCellRendererToggle {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCellRendererToggle(p)
+}
+
+func (v *CellRendererToggle) toCellRenderer() *C.GtkCellRenderer {
+ if v == nil {
+ return nil
+ }
+ return v.CellRenderer.native()
+}
+
+func marshalCellRendererToggle(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellRendererToggle(obj), nil
+}
+
+func wrapCellRendererToggle(obj *glib.Object) *CellRendererToggle {
+ return &CellRendererToggle{CellRenderer{glib.InitiallyUnowned{obj}}}
+}
+
+// CellRendererToggleNew is a wrapper around gtk_cell_renderer_toggle_new().
+func CellRendererToggleNew() (*CellRendererToggle, error) {
+ c := C.gtk_cell_renderer_toggle_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCellRendererToggle(obj), nil
+}
+
+// SetRadio is a wrapper around gtk_cell_renderer_toggle_set_radio().
+func (v *CellRendererToggle) SetRadio(set bool) {
+ C.gtk_cell_renderer_toggle_set_radio(v.native(), gbool(set))
+}
+
+// GetRadio is a wrapper around gtk_cell_renderer_toggle_get_radio().
+func (v *CellRendererToggle) GetRadio() bool {
+ c := C.gtk_cell_renderer_toggle_get_radio(v.native())
+ return gobool(c)
+}
+
+// SetActive is a wrapper around gtk_cell_renderer_toggle_set_active().
+func (v *CellRendererToggle) SetActive(active bool) {
+ C.gtk_cell_renderer_toggle_set_active(v.native(), gbool(active))
+}
+
+// GetActive is a wrapper around gtk_cell_renderer_toggle_get_active().
+func (v *CellRendererToggle) GetActive() bool {
+ c := C.gtk_cell_renderer_toggle_get_active(v.native())
+ return gobool(c)
+}
+
+// SetActivatable is a wrapper around gtk_cell_renderer_toggle_set_activatable().
+func (v *CellRendererToggle) SetActivatable(activatable bool) {
+ C.gtk_cell_renderer_toggle_set_activatable(v.native(),
+ gbool(activatable))
+}
+
+// GetActivatable is a wrapper around gtk_cell_renderer_toggle_get_activatable().
+func (v *CellRendererToggle) GetActivatable() bool {
+ c := C.gtk_cell_renderer_toggle_get_activatable(v.native())
+ return gobool(c)
+}
+
+/*
+ * GtkCheckButton
+ */
+
+// CheckButton is a wrapper around GTK's GtkCheckButton.
+type CheckButton struct {
+ ToggleButton
+}
+
+// native returns a pointer to the underlying GtkCheckButton.
+func (v *CheckButton) native() *C.GtkCheckButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCheckButton(p)
+}
+
+func marshalCheckButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCheckButton(obj), nil
+}
+
+func wrapCheckButton(obj *glib.Object) *CheckButton {
+ actionable := wrapActionable(obj)
+ return &CheckButton{ToggleButton{Button{Bin{Container{Widget{
+ glib.InitiallyUnowned{obj}}}}, actionable}}}
+}
+
+// CheckButtonNew is a wrapper around gtk_check_button_new().
+func CheckButtonNew() (*CheckButton, error) {
+ c := C.gtk_check_button_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCheckButton(obj), nil
+}
+
+// CheckButtonNewWithLabel is a wrapper around
+// gtk_check_button_new_with_label().
+func CheckButtonNewWithLabel(label string) (*CheckButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_check_button_new_with_label((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapCheckButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// CheckButtonNewWithMnemonic is a wrapper around
+// gtk_check_button_new_with_mnemonic().
+func CheckButtonNewWithMnemonic(label string) (*CheckButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_check_button_new_with_mnemonic((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCheckButton(obj), nil
+}
+
+/*
+ * GtkCheckMenuItem
+ */
+
+type CheckMenuItem struct {
+ MenuItem
+}
+
+// native returns a pointer to the underlying GtkCheckMenuItem.
+func (v *CheckMenuItem) native() *C.GtkCheckMenuItem {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCheckMenuItem(p)
+}
+
+func marshalCheckMenuItem(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCheckMenuItem(obj), nil
+}
+
+func wrapCheckMenuItem(obj *glib.Object) *CheckMenuItem {
+ return &CheckMenuItem{MenuItem{Bin{Container{Widget{
+ glib.InitiallyUnowned{obj}}}}}}
+}
+
+// CheckMenuItemNew is a wrapper around gtk_check_menu_item_new().
+func CheckMenuItemNew() (*CheckMenuItem, error) {
+ c := C.gtk_check_menu_item_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCheckMenuItem(obj), nil
+}
+
+// CheckMenuItemNewWithLabel is a wrapper around
+// gtk_check_menu_item_new_with_label().
+func CheckMenuItemNewWithLabel(label string) (*CheckMenuItem, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_check_menu_item_new_with_label((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCheckMenuItem(obj), nil
+}
+
+// CheckMenuItemNewWithMnemonic is a wrapper around
+// gtk_check_menu_item_new_with_mnemonic().
+func CheckMenuItemNewWithMnemonic(label string) (*CheckMenuItem, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_check_menu_item_new_with_mnemonic((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCheckMenuItem(obj), nil
+}
+
+// GetActive is a wrapper around gtk_check_menu_item_get_active().
+func (v *CheckMenuItem) GetActive() bool {
+ c := C.gtk_check_menu_item_get_active(v.native())
+ return gobool(c)
+}
+
+// SetActive is a wrapper around gtk_check_menu_item_set_active().
+func (v *CheckMenuItem) SetActive(isActive bool) {
+ C.gtk_check_menu_item_set_active(v.native(), gbool(isActive))
+}
+
+// Toggled is a wrapper around gtk_check_menu_item_toggled().
+func (v *CheckMenuItem) Toggled() {
+ C.gtk_check_menu_item_toggled(v.native())
+}
+
+// GetInconsistent is a wrapper around gtk_check_menu_item_get_inconsistent().
+func (v *CheckMenuItem) GetInconsistent() bool {
+ c := C.gtk_check_menu_item_get_inconsistent(v.native())
+ return gobool(c)
+}
+
+// SetInconsistent is a wrapper around gtk_check_menu_item_set_inconsistent().
+func (v *CheckMenuItem) SetInconsistent(setting bool) {
+ C.gtk_check_menu_item_set_inconsistent(v.native(), gbool(setting))
+}
+
+// SetDrawAsRadio is a wrapper around gtk_check_menu_item_set_draw_as_radio().
+func (v *CheckMenuItem) SetDrawAsRadio(drawAsRadio bool) {
+ C.gtk_check_menu_item_set_draw_as_radio(v.native(), gbool(drawAsRadio))
+}
+
+// GetDrawAsRadio is a wrapper around gtk_check_menu_item_get_draw_as_radio().
+func (v *CheckMenuItem) GetDrawAsRadio() bool {
+ c := C.gtk_check_menu_item_get_draw_as_radio(v.native())
+ return gobool(c)
+}
+
+/*
+ * GtkClipboard
+ */
+
+// Clipboard is a wrapper around GTK's GtkClipboard.
+type Clipboard struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkClipboard.
+func (v *Clipboard) native() *C.GtkClipboard {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkClipboard(p)
+}
+
+func marshalClipboard(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapClipboard(obj), nil
+}
+
+func wrapClipboard(obj *glib.Object) *Clipboard {
+ return &Clipboard{obj}
+}
+
+// Store is a wrapper around gtk_clipboard_store
+func (v *Clipboard) Store() {
+ C.gtk_clipboard_store(v.native())
+}
+
+// ClipboardGet() is a wrapper around gtk_clipboard_get().
+func ClipboardGet(atom gdk.Atom) (*Clipboard, error) {
+ c := C.gtk_clipboard_get(C.GdkAtom(unsafe.Pointer(atom)))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ cb := &Clipboard{glib.Take(unsafe.Pointer(c))}
+ return cb, nil
+}
+
+// ClipboardGetForDisplay() is a wrapper around gtk_clipboard_get_for_display().
+func ClipboardGetForDisplay(display *gdk.Display, atom gdk.Atom) (*Clipboard, error) {
+ displayPtr := (*C.GdkDisplay)(unsafe.Pointer(display.Native()))
+ c := C.gtk_clipboard_get_for_display(displayPtr,
+ C.GdkAtom(unsafe.Pointer(atom)))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ cb := &Clipboard{glib.Take(unsafe.Pointer(c))}
+ return cb, nil
+}
+
+// WaitIsTextAvailable is a wrapper around gtk_clipboard_wait_is_text_available
+func (v *Clipboard) WaitIsTextAvailable() bool {
+ c := C.gtk_clipboard_wait_is_text_available(v.native())
+ return gobool(c)
+}
+
+// WaitForText is a wrapper around gtk_clipboard_wait_for_text
+func (v *Clipboard) WaitForText() (string, error) {
+ c := C.gtk_clipboard_wait_for_text(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ defer C.g_free(C.gpointer(c))
+ return goString(c), nil
+}
+
+// SetText() is a wrapper around gtk_clipboard_set_text().
+func (v *Clipboard) SetText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_clipboard_set_text(v.native(), (*C.gchar)(cstr),
+ C.gint(len(text)))
+}
+
+// WaitIsRichTextAvailable is a wrapper around gtk_clipboard_wait_is_rich_text_available
+func (v *Clipboard) WaitIsRichTextAvailable(buf *TextBuffer) bool {
+ c := C.gtk_clipboard_wait_is_rich_text_available(v.native(), buf.native())
+ return gobool(c)
+}
+
+// WaitIsUrisAvailable is a wrapper around gtk_clipboard_wait_is_uris_available
+func (v *Clipboard) WaitIsUrisAvailable() bool {
+ c := C.gtk_clipboard_wait_is_uris_available(v.native())
+ return gobool(c)
+}
+
+// WaitIsImageAvailable is a wrapper around gtk_clipboard_wait_is_image_available
+func (v *Clipboard) WaitIsImageAvailable() bool {
+ c := C.gtk_clipboard_wait_is_image_available(v.native())
+ return gobool(c)
+}
+
+// SetImage is a wrapper around gtk_clipboard_set_image
+func (v *Clipboard) SetImage(pixbuf *gdk.Pixbuf) {
+ C.gtk_clipboard_set_image(v.native(), (*C.GdkPixbuf)(unsafe.Pointer(pixbuf.Native())))
+}
+
+// WaitForImage is a wrapper around gtk_clipboard_wait_for_image
+func (v *Clipboard) WaitForImage() (*gdk.Pixbuf, error) {
+ c := C.gtk_clipboard_wait_for_image(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ p := &gdk.Pixbuf{glib.Take(unsafe.Pointer(c))}
+ return p, nil
+}
+
+// WaitIsTargetAvailable is a wrapper around gtk_clipboard_wait_is_target_available
+func (v *Clipboard) WaitIsTargetAvailable(target gdk.Atom) bool {
+ c := C.gtk_clipboard_wait_is_target_available(v.native(), C.GdkAtom(unsafe.Pointer(target)))
+ return gobool(c)
+}
+
+// WaitForContents is a wrapper around gtk_clipboard_wait_for_contents
+func (v *Clipboard) WaitForContents(target gdk.Atom) (*SelectionData, error) {
+ c := C.gtk_clipboard_wait_for_contents(v.native(), C.GdkAtom(unsafe.Pointer(target)))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ p := &SelectionData{c}
+ runtime.SetFinalizer(p, (*SelectionData).free)
+ return p, nil
+}
+
+/*
+ * GtkContainer
+ */
+
+// Container is a representation of GTK's GtkContainer.
+type Container struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkContainer.
+func (v *Container) native() *C.GtkContainer {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkContainer(p)
+}
+
+func marshalContainer(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapContainer(obj), nil
+}
+
+func wrapContainer(obj *glib.Object) *Container {
+ return &Container{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// Add is a wrapper around gtk_container_add().
+func (v *Container) Add(w IWidget) {
+ C.gtk_container_add(v.native(), w.toWidget())
+}
+
+// Remove is a wrapper around gtk_container_remove().
+func (v *Container) Remove(w IWidget) {
+ C.gtk_container_remove(v.native(), w.toWidget())
+}
+
+// TODO: gtk_container_add_with_properties
+
+// CheckResize is a wrapper around gtk_container_check_resize().
+func (v *Container) CheckResize() {
+ C.gtk_container_check_resize(v.native())
+}
+
+// TODO: gtk_container_foreach
+
+// GetChildren is a wrapper around gtk_container_get_children().
+func (v *Container) GetChildren() *glib.List {
+ clist := C.gtk_container_get_children(v.native())
+ glist := glib.WrapList(uintptr(unsafe.Pointer(clist)))
+ glist.DataWrapper(func(ptr unsafe.Pointer) interface{} {
+ return wrapWidget(glib.Take(ptr))
+ })
+
+ return glist
+}
+
+// TODO: gtk_container_get_path_for_child
+
+// GetFocusChild is a wrapper around gtk_container_get_focus_child().
+func (v *Container) GetFocusChild() *Widget {
+ c := C.gtk_container_get_focus_child(v.native())
+ if c == nil {
+ return nil
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapWidget(obj)
+}
+
+// SetFocusChild is a wrapper around gtk_container_set_focus_child().
+func (v *Container) SetFocusChild(child IWidget) {
+ C.gtk_container_set_focus_child(v.native(), child.toWidget())
+}
+
+// GetFocusVAdjustment is a wrapper around
+// gtk_container_get_focus_vadjustment().
+func (v *Container) GetFocusVAdjustment() *Adjustment {
+ c := C.gtk_container_get_focus_vadjustment(v.native())
+ if c == nil {
+ return nil
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAdjustment(obj)
+}
+
+// SetFocusVAdjustment is a wrapper around
+// gtk_container_set_focus_vadjustment().
+func (v *Container) SetFocusVAdjustment(adjustment *Adjustment) {
+ C.gtk_container_set_focus_vadjustment(v.native(), adjustment.native())
+}
+
+// GetFocusHAdjustment is a wrapper around
+// gtk_container_get_focus_hadjustment().
+func (v *Container) GetFocusHAdjustment() *Adjustment {
+ c := C.gtk_container_get_focus_hadjustment(v.native())
+ if c == nil {
+ return nil
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAdjustment(obj)
+}
+
+// SetFocusHAdjustment is a wrapper around
+// gtk_container_set_focus_hadjustment().
+func (v *Container) SetFocusHAdjustment(adjustment *Adjustment) {
+ C.gtk_container_set_focus_hadjustment(v.native(), adjustment.native())
+}
+
+// ChildType is a wrapper around gtk_container_child_type().
+func (v *Container) ChildType() glib.Type {
+ c := C.gtk_container_child_type(v.native())
+ return glib.Type(c)
+}
+
+// TODO: gtk_container_child_get_valist
+// TODO: gtk_container_child_set_valist
+
+// ChildNotify is a wrapper around gtk_container_child_notify().
+func (v *Container) ChildNotify(child IWidget, childProperty string) {
+ cstr := C.CString(childProperty)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_container_child_notify(v.native(), child.toWidget(),
+ (*C.gchar)(cstr))
+}
+
+// ChildGetProperty is a wrapper around gtk_container_child_get_property().
+func (v *Container) ChildGetProperty(child IWidget, name string, valueType glib.Type) (interface{}, error) {
+ gv, e := glib.ValueInit(valueType)
+ if e != nil {
+ return nil, e
+ }
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_container_child_get_property(v.native(), child.toWidget(), (*C.gchar)(cstr), (*C.GValue)(unsafe.Pointer(gv.Native())))
+ return gv.GoValue()
+}
+
+// ChildSetProperty is a wrapper around gtk_container_child_set_property().
+func (v *Container) ChildSetProperty(child IWidget, name string, value interface{}) error {
+ gv, e := glib.GValue(value)
+ if e != nil {
+ return e
+ }
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_container_child_set_property(v.native(), child.toWidget(), (*C.gchar)(cstr), (*C.GValue)(unsafe.Pointer(gv.Native())))
+ return nil
+}
+
+// TODO: gtk_container_forall
+
+// GetBorderWidth is a wrapper around gtk_container_get_border_width().
+func (v *Container) GetBorderWidth() uint {
+ c := C.gtk_container_get_border_width(v.native())
+ return uint(c)
+}
+
+// SetBorderWidth is a wrapper around gtk_container_set_border_width().
+func (v *Container) SetBorderWidth(borderWidth uint) {
+ C.gtk_container_set_border_width(v.native(), C.guint(borderWidth))
+}
+
+// PropagateDraw is a wrapper around gtk_container_propagate_draw().
+func (v *Container) PropagateDraw(child IWidget, cr *cairo.Context) {
+ context := (*C.cairo_t)(unsafe.Pointer(cr.Native()))
+ C.gtk_container_propagate_draw(v.native(), child.toWidget(), context)
+}
+
+// GdkCairoSetSourcePixBuf() is a wrapper around gdk_cairo_set_source_pixbuf().
+func GdkCairoSetSourcePixBuf(cr *cairo.Context, pixbuf *gdk.Pixbuf, pixbufX, pixbufY float64) {
+ context := (*C.cairo_t)(unsafe.Pointer(cr.Native()))
+ ptr := (*C.GdkPixbuf)(unsafe.Pointer(pixbuf.Native()))
+ C.gdk_cairo_set_source_pixbuf(context, ptr, C.gdouble(pixbufX), C.gdouble(pixbufY))
+}
+
+/*
+ * GtkCssProvider
+ */
+
+// CssProvider is a representation of GTK's GtkCssProvider.
+type CssProvider struct {
+ *glib.Object
+}
+
+func (v *CssProvider) toStyleProvider() *C.GtkStyleProvider {
+ if v == nil {
+ return nil
+ }
+ return C.toGtkStyleProvider(unsafe.Pointer(v.native()))
+}
+
+// native returns a pointer to the underlying GtkCssProvider.
+func (v *CssProvider) native() *C.GtkCssProvider {
+ if v == nil || v.Object == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkCssProvider(p)
+}
+
+func wrapCssProvider(obj *glib.Object) *CssProvider {
+ return &CssProvider{obj}
+}
+
+// CssProviderNew is a wrapper around gtk_css_provider_new().
+func CssProviderNew() (*CssProvider, error) {
+ c := C.gtk_css_provider_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return wrapCssProvider(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// LoadFromPath is a wrapper around gtk_css_provider_load_from_path().
+func (v *CssProvider) LoadFromPath(path string) error {
+ cpath := C.CString(path)
+ defer C.free(unsafe.Pointer(cpath))
+ var gerr *C.GError
+ if C.gtk_css_provider_load_from_path(v.native(), (*C.gchar)(cpath), &gerr) == 0 {
+ defer C.g_error_free(gerr)
+ return errors.New(goString(gerr.message))
+ }
+ return nil
+}
+
+// LoadFromData is a wrapper around gtk_css_provider_load_from_data().
+func (v *CssProvider) LoadFromData(data string) error {
+ cdata := C.CString(data)
+ defer C.free(unsafe.Pointer(cdata))
+ var gerr *C.GError
+ if C.gtk_css_provider_load_from_data(v.native(), (*C.gchar)(unsafe.Pointer(cdata)), C.gssize(len(data)), &gerr) == 0 {
+ defer C.g_error_free(gerr)
+ return errors.New(goString(gerr.message))
+ }
+ return nil
+}
+
+// ToString is a wrapper around gtk_css_provider_to_string().
+func (v *CssProvider) ToString() (string, error) {
+ c := C.gtk_css_provider_to_string(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return C.GoString(c), nil
+}
+
+// GetNamed is a wrapper around gtk_css_provider_get_named().
+func CssProviderGetNamed(name string, variant string) (*CssProvider, error) {
+ cname := C.CString(name)
+ defer C.free(unsafe.Pointer(cname))
+ cvariant := C.CString(variant)
+ defer C.free(unsafe.Pointer(cvariant))
+
+ c := C.gtk_css_provider_get_named((*C.gchar)(cname), (*C.gchar)(cvariant))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCssProvider(obj), nil
+}
+
+/*
+ * GtkDialog
+ */
+
+// Dialog is a representation of GTK's GtkDialog.
+type Dialog struct {
+ Window
+}
+
+// native returns a pointer to the underlying GtkDialog.
+func (v *Dialog) native() *C.GtkDialog {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkDialog(p)
+}
+
+func marshalDialog(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapDialog(obj), nil
+}
+
+func wrapDialog(obj *glib.Object) *Dialog {
+ return &Dialog{Window{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}}
+}
+
+// DialogNew() is a wrapper around gtk_dialog_new().
+func DialogNew() (*Dialog, error) {
+ c := C.gtk_dialog_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapDialog(obj), nil
+}
+
+// Run() is a wrapper around gtk_dialog_run().
+func (v *Dialog) Run() ResponseType {
+ c := C.gtk_dialog_run(v.native())
+ return ResponseType(c)
+}
+
+// Response() is a wrapper around gtk_dialog_response().
+func (v *Dialog) Response(response ResponseType) {
+ C.gtk_dialog_response(v.native(), C.gint(response))
+}
+
+// AddButton() is a wrapper around gtk_dialog_add_button(). text may
+// be either the literal button text, or if using GTK 3.8 or earlier, a
+// Stock type converted to a string.
+func (v *Dialog) AddButton(text string, id ResponseType) (*Button, error) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_dialog_add_button(v.native(), (*C.gchar)(cstr), C.gint(id))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapButton(obj), nil
+}
+
+// AddActionWidget() is a wrapper around gtk_dialog_add_action_widget().
+func (v *Dialog) AddActionWidget(child IWidget, id ResponseType) {
+ C.gtk_dialog_add_action_widget(v.native(), child.toWidget(), C.gint(id))
+}
+
+// SetDefaultResponse() is a wrapper around gtk_dialog_set_default_response().
+func (v *Dialog) SetDefaultResponse(id ResponseType) {
+ C.gtk_dialog_set_default_response(v.native(), C.gint(id))
+}
+
+// SetResponseSensitive() is a wrapper around
+// gtk_dialog_set_response_sensitive().
+func (v *Dialog) SetResponseSensitive(id ResponseType, setting bool) {
+ C.gtk_dialog_set_response_sensitive(v.native(), C.gint(id),
+ gbool(setting))
+}
+
+// GetResponseForWidget() is a wrapper around
+// gtk_dialog_get_response_for_widget().
+func (v *Dialog) GetResponseForWidget(widget IWidget) ResponseType {
+ c := C.gtk_dialog_get_response_for_widget(v.native(), widget.toWidget())
+ return ResponseType(c)
+}
+
+// GetWidgetForResponse() is a wrapper around
+// gtk_dialog_get_widget_for_response().
+func (v *Dialog) GetWidgetForResponse(id ResponseType) (*Widget, error) {
+ c := C.gtk_dialog_get_widget_for_response(v.native(), C.gint(id))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapWidget(obj), nil
+}
+
+// GetContentArea() is a wrapper around gtk_dialog_get_content_area().
+func (v *Dialog) GetContentArea() (*Box, error) {
+ c := C.gtk_dialog_get_content_area(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ b := &Box{Container{Widget{glib.InitiallyUnowned{obj}}}}
+ return b, nil
+}
+
+// TODO(jrick)
+/*
+func (v *gdk.Screen) AlternativeDialogButtonOrder() bool {
+ c := C.gtk_alternative_dialog_button_order(v.native())
+ return gobool(c)
+}
+*/
+
+// TODO(jrick)
+/*
+func SetAlternativeButtonOrder(ids ...ResponseType) {
+}
+*/
+
+/*
+ * GtkDrawingArea
+ */
+
+// DrawingArea is a representation of GTK's GtkDrawingArea.
+type DrawingArea struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkDrawingArea.
+func (v *DrawingArea) native() *C.GtkDrawingArea {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkDrawingArea(p)
+}
+
+func marshalDrawingArea(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapDrawingArea(obj), nil
+}
+
+func wrapDrawingArea(obj *glib.Object) *DrawingArea {
+ return &DrawingArea{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// DrawingAreaNew is a wrapper around gtk_drawing_area_new().
+func DrawingAreaNew() (*DrawingArea, error) {
+ c := C.gtk_drawing_area_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapDrawingArea(obj), nil
+}
+
+/*
+ * GtkEditable
+ */
+
+// Editable is a representation of GTK's GtkEditable GInterface.
+type Editable struct {
+ *glib.Object
+}
+
+// IEditable is an interface type implemented by all structs
+// embedding an Editable. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkEditable.
+type IEditable interface {
+ toEditable() *C.GtkEditable
+}
+
+// native() returns a pointer to the underlying GObject as a GtkEditable.
+func (v *Editable) native() *C.GtkEditable {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkEditable(p)
+}
+
+func marshalEditable(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapEditable(obj), nil
+}
+
+func wrapEditable(obj *glib.Object) *Editable {
+ return &Editable{obj}
+}
+
+func (v *Editable) toEditable() *C.GtkEditable {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// SelectRegion is a wrapper around gtk_editable_select_region().
+func (v *Editable) SelectRegion(startPos, endPos int) {
+ C.gtk_editable_select_region(v.native(), C.gint(startPos),
+ C.gint(endPos))
+}
+
+// GetSelectionBounds is a wrapper around gtk_editable_get_selection_bounds().
+func (v *Editable) GetSelectionBounds() (start, end int, nonEmpty bool) {
+ var cstart, cend C.gint
+ c := C.gtk_editable_get_selection_bounds(v.native(), &cstart, &cend)
+ return int(cstart), int(cend), gobool(c)
+}
+
+// InsertText is a wrapper around gtk_editable_insert_text(). The returned
+// int is the position after the inserted text.
+func (v *Editable) InsertText(newText string, position int) int {
+ cstr := C.CString(newText)
+ defer C.free(unsafe.Pointer(cstr))
+ pos := new(C.gint)
+ *pos = C.gint(position)
+ C.gtk_editable_insert_text(v.native(), (*C.gchar)(cstr),
+ C.gint(len(newText)), pos)
+ return int(*pos)
+}
+
+// DeleteText is a wrapper around gtk_editable_delete_text().
+func (v *Editable) DeleteText(startPos, endPos int) {
+ C.gtk_editable_delete_text(v.native(), C.gint(startPos), C.gint(endPos))
+}
+
+// GetChars is a wrapper around gtk_editable_get_chars().
+func (v *Editable) GetChars(startPos, endPos int) string {
+ c := C.gtk_editable_get_chars(v.native(), C.gint(startPos),
+ C.gint(endPos))
+ defer C.free(unsafe.Pointer(c))
+ return goString(c)
+}
+
+// CutClipboard is a wrapper around gtk_editable_cut_clipboard().
+func (v *Editable) CutClipboard() {
+ C.gtk_editable_cut_clipboard(v.native())
+}
+
+// CopyClipboard is a wrapper around gtk_editable_copy_clipboard().
+func (v *Editable) CopyClipboard() {
+ C.gtk_editable_copy_clipboard(v.native())
+}
+
+// PasteClipboard is a wrapper around gtk_editable_paste_clipboard().
+func (v *Editable) PasteClipboard() {
+ C.gtk_editable_paste_clipboard(v.native())
+}
+
+// DeleteSelection is a wrapper around gtk_editable_delete_selection().
+func (v *Editable) DeleteSelection() {
+ C.gtk_editable_delete_selection(v.native())
+}
+
+// SetPosition is a wrapper around gtk_editable_set_position().
+func (v *Editable) SetPosition(position int) {
+ C.gtk_editable_set_position(v.native(), C.gint(position))
+}
+
+// GetPosition is a wrapper around gtk_editable_get_position().
+func (v *Editable) GetPosition() int {
+ c := C.gtk_editable_get_position(v.native())
+ return int(c)
+}
+
+// SetEditable is a wrapper around gtk_editable_set_editable().
+func (v *Editable) SetEditable(isEditable bool) {
+ C.gtk_editable_set_editable(v.native(), gbool(isEditable))
+}
+
+// GetEditable is a wrapper around gtk_editable_get_editable().
+func (v *Editable) GetEditable() bool {
+ c := C.gtk_editable_get_editable(v.native())
+ return gobool(c)
+}
+
+/*
+ * GtkEntry
+ */
+
+// Entry is a representation of GTK's GtkEntry.
+type Entry struct {
+ Widget
+
+ // Interfaces
+ Editable
+}
+
+type IEntry interface {
+ toEntry() *C.GtkEntry
+}
+
+func (v *Entry) toEntry() *C.GtkEntry {
+ return v.native()
+}
+
+// native returns a pointer to the underlying GtkEntry.
+func (v *Entry) native() *C.GtkEntry {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkEntry(p)
+}
+
+func marshalEntry(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapEntry(obj), nil
+}
+
+func wrapEntry(obj *glib.Object) *Entry {
+ e := wrapEditable(obj)
+ return &Entry{Widget{glib.InitiallyUnowned{obj}}, *e}
+}
+
+// EntryNew() is a wrapper around gtk_entry_new().
+func EntryNew() (*Entry, error) {
+ c := C.gtk_entry_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapEntry(obj), nil
+}
+
+// EntryNewWithBuffer() is a wrapper around gtk_entry_new_with_buffer().
+func EntryNewWithBuffer(buffer *EntryBuffer) (*Entry, error) {
+ c := C.gtk_entry_new_with_buffer(buffer.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapEntry(obj), nil
+}
+
+// GetBuffer() is a wrapper around gtk_entry_get_buffer().
+func (v *Entry) GetBuffer() (*EntryBuffer, error) {
+ c := C.gtk_entry_get_buffer(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return &EntryBuffer{obj}, nil
+}
+
+// SetBuffer() is a wrapper around gtk_entry_set_buffer().
+func (v *Entry) SetBuffer(buffer *EntryBuffer) {
+ C.gtk_entry_set_buffer(v.native(), buffer.native())
+}
+
+// SetText() is a wrapper around gtk_entry_set_text().
+func (v *Entry) SetText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_entry_set_text(v.native(), (*C.gchar)(cstr))
+}
+
+// GetText() is a wrapper around gtk_entry_get_text().
+func (v *Entry) GetText() (string, error) {
+ c := C.gtk_entry_get_text(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return goString(c), nil
+}
+
+// GetTextLength() is a wrapper around gtk_entry_get_text_length().
+func (v *Entry) GetTextLength() uint16 {
+ c := C.gtk_entry_get_text_length(v.native())
+ return uint16(c)
+}
+
+// TODO(jrick) GdkRectangle
+/*
+func (v *Entry) GetTextArea() {
+}
+*/
+
+// SetVisibility() is a wrapper around gtk_entry_set_visibility().
+func (v *Entry) SetVisibility(visible bool) {
+ C.gtk_entry_set_visibility(v.native(), gbool(visible))
+}
+
+// SetInvisibleChar() is a wrapper around gtk_entry_set_invisible_char().
+func (v *Entry) SetInvisibleChar(ch rune) {
+ C.gtk_entry_set_invisible_char(v.native(), C.gunichar(ch))
+}
+
+// UnsetInvisibleChar() is a wrapper around gtk_entry_unset_invisible_char().
+func (v *Entry) UnsetInvisibleChar() {
+ C.gtk_entry_unset_invisible_char(v.native())
+}
+
+// SetMaxLength() is a wrapper around gtk_entry_set_max_length().
+func (v *Entry) SetMaxLength(len int) {
+ C.gtk_entry_set_max_length(v.native(), C.gint(len))
+}
+
+// GetActivatesDefault() is a wrapper around gtk_entry_get_activates_default().
+func (v *Entry) GetActivatesDefault() bool {
+ c := C.gtk_entry_get_activates_default(v.native())
+ return gobool(c)
+}
+
+// GetHasFrame() is a wrapper around gtk_entry_get_has_frame().
+func (v *Entry) GetHasFrame() bool {
+ c := C.gtk_entry_get_has_frame(v.native())
+ return gobool(c)
+}
+
+// GetWidthChars() is a wrapper around gtk_entry_get_width_chars().
+func (v *Entry) GetWidthChars() int {
+ c := C.gtk_entry_get_width_chars(v.native())
+ return int(c)
+}
+
+// SetActivatesDefault() is a wrapper around gtk_entry_set_activates_default().
+func (v *Entry) SetActivatesDefault(setting bool) {
+ C.gtk_entry_set_activates_default(v.native(), gbool(setting))
+}
+
+// SetHasFrame() is a wrapper around gtk_entry_set_has_frame().
+func (v *Entry) SetHasFrame(setting bool) {
+ C.gtk_entry_set_has_frame(v.native(), gbool(setting))
+}
+
+// SetWidthChars() is a wrapper around gtk_entry_set_width_chars().
+func (v *Entry) SetWidthChars(nChars int) {
+ C.gtk_entry_set_width_chars(v.native(), C.gint(nChars))
+}
+
+// GetInvisibleChar() is a wrapper around gtk_entry_get_invisible_char().
+func (v *Entry) GetInvisibleChar() rune {
+ c := C.gtk_entry_get_invisible_char(v.native())
+ return rune(c)
+}
+
+// SetAlignment() is a wrapper around gtk_entry_set_alignment().
+func (v *Entry) SetAlignment(xalign float32) {
+ C.gtk_entry_set_alignment(v.native(), C.gfloat(xalign))
+}
+
+// GetAlignment() is a wrapper around gtk_entry_get_alignment().
+func (v *Entry) GetAlignment() float32 {
+ c := C.gtk_entry_get_alignment(v.native())
+ return float32(c)
+}
+
+// SetPlaceholderText() is a wrapper around gtk_entry_set_placeholder_text().
+func (v *Entry) SetPlaceholderText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_entry_set_placeholder_text(v.native(), (*C.gchar)(cstr))
+}
+
+// GetPlaceholderText() is a wrapper around gtk_entry_get_placeholder_text().
+func (v *Entry) GetPlaceholderText() (string, error) {
+ c := C.gtk_entry_get_placeholder_text(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return goString(c), nil
+}
+
+// SetOverwriteMode() is a wrapper around gtk_entry_set_overwrite_mode().
+func (v *Entry) SetOverwriteMode(overwrite bool) {
+ C.gtk_entry_set_overwrite_mode(v.native(), gbool(overwrite))
+}
+
+// GetOverwriteMode() is a wrapper around gtk_entry_get_overwrite_mode().
+func (v *Entry) GetOverwriteMode() bool {
+ c := C.gtk_entry_get_overwrite_mode(v.native())
+ return gobool(c)
+}
+
+// TODO(jrick) Pangolayout
+/*
+func (v *Entry) GetLayout() {
+}
+*/
+
+// GetLayoutOffsets() is a wrapper around gtk_entry_get_layout_offsets().
+func (v *Entry) GetLayoutOffsets() (x, y int) {
+ var gx, gy C.gint
+ C.gtk_entry_get_layout_offsets(v.native(), &gx, &gy)
+ return int(gx), int(gy)
+}
+
+// LayoutIndexToTextIndex() is a wrapper around
+// gtk_entry_layout_index_to_text_index().
+func (v *Entry) LayoutIndexToTextIndex(layoutIndex int) int {
+ c := C.gtk_entry_layout_index_to_text_index(v.native(),
+ C.gint(layoutIndex))
+ return int(c)
+}
+
+// TextIndexToLayoutIndex() is a wrapper around
+// gtk_entry_text_index_to_layout_index().
+func (v *Entry) TextIndexToLayoutIndex(textIndex int) int {
+ c := C.gtk_entry_text_index_to_layout_index(v.native(),
+ C.gint(textIndex))
+ return int(c)
+}
+
+// TODO(jrick) PandoAttrList
+/*
+func (v *Entry) SetAttributes() {
+}
+*/
+
+// TODO(jrick) PandoAttrList
+/*
+func (v *Entry) GetAttributes() {
+}
+*/
+
+// GetMaxLength() is a wrapper around gtk_entry_get_max_length().
+func (v *Entry) GetMaxLength() int {
+ c := C.gtk_entry_get_max_length(v.native())
+ return int(c)
+}
+
+// GetVisibility() is a wrapper around gtk_entry_get_visibility().
+func (v *Entry) GetVisibility() bool {
+ c := C.gtk_entry_get_visibility(v.native())
+ return gobool(c)
+}
+
+// SetCompletion() is a wrapper around gtk_entry_set_completion().
+func (v *Entry) SetCompletion(completion *EntryCompletion) {
+ C.gtk_entry_set_completion(v.native(), completion.native())
+}
+
+// GetCompletion() is a wrapper around gtk_entry_get_completion().
+func (v *Entry) GetCompletion() (*EntryCompletion, error) {
+ c := C.gtk_entry_get_completion(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ e := &EntryCompletion{glib.Take(unsafe.Pointer(c))}
+ return e, nil
+}
+
+// SetCursorHAdjustment() is a wrapper around
+// gtk_entry_set_cursor_hadjustment().
+func (v *Entry) SetCursorHAdjustment(adjustment *Adjustment) {
+ C.gtk_entry_set_cursor_hadjustment(v.native(), adjustment.native())
+}
+
+// GetCursorHAdjustment() is a wrapper around
+// gtk_entry_get_cursor_hadjustment().
+func (v *Entry) GetCursorHAdjustment() (*Adjustment, error) {
+ c := C.gtk_entry_get_cursor_hadjustment(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return &Adjustment{glib.InitiallyUnowned{obj}}, nil
+}
+
+// SetProgressFraction() is a wrapper around gtk_entry_set_progress_fraction().
+func (v *Entry) SetProgressFraction(fraction float64) {
+ C.gtk_entry_set_progress_fraction(v.native(), C.gdouble(fraction))
+}
+
+// GetProgressFraction() is a wrapper around gtk_entry_get_progress_fraction().
+func (v *Entry) GetProgressFraction() float64 {
+ c := C.gtk_entry_get_progress_fraction(v.native())
+ return float64(c)
+}
+
+// SetProgressPulseStep() is a wrapper around
+// gtk_entry_set_progress_pulse_step().
+func (v *Entry) SetProgressPulseStep(fraction float64) {
+ C.gtk_entry_set_progress_pulse_step(v.native(), C.gdouble(fraction))
+}
+
+// GetProgressPulseStep() is a wrapper around
+// gtk_entry_get_progress_pulse_step().
+func (v *Entry) GetProgressPulseStep() float64 {
+ c := C.gtk_entry_get_progress_pulse_step(v.native())
+ return float64(c)
+}
+
+// ProgressPulse() is a wrapper around gtk_entry_progress_pulse().
+func (v *Entry) ProgressPulse() {
+ C.gtk_entry_progress_pulse(v.native())
+}
+
+// TODO(jrick) GdkEventKey
+/*
+func (v *Entry) IMContextFilterKeypress() {
+}
+*/
+
+// ResetIMContext() is a wrapper around gtk_entry_reset_im_context().
+func (v *Entry) ResetIMContext() {
+ C.gtk_entry_reset_im_context(v.native())
+}
+
+// SetIconFromPixbuf is a wrapper around gtk_entry_set_icon_from_pixbuf().
+func (v *Entry) SetIconFromPixbuf(iconPos EntryIconPosition, pixbuf *gdk.Pixbuf) {
+ C.gtk_entry_set_icon_from_pixbuf(v.native(),
+ C.GtkEntryIconPosition(iconPos),
+ (*C.GdkPixbuf)(unsafe.Pointer(pixbuf.Native())))
+}
+
+// SetIconFromIconName() is a wrapper around
+// gtk_entry_set_icon_from_icon_name().
+func (v *Entry) SetIconFromIconName(iconPos EntryIconPosition, name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_entry_set_icon_from_icon_name(v.native(),
+ C.GtkEntryIconPosition(iconPos), (*C.gchar)(cstr))
+}
+
+// TODO(jrick) GIcon
+/*
+func (v *Entry) SetIconFromGIcon() {
+}
+*/
+
+// GetIconStorageType() is a wrapper around gtk_entry_get_icon_storage_type().
+func (v *Entry) GetIconStorageType(iconPos EntryIconPosition) ImageType {
+ c := C.gtk_entry_get_icon_storage_type(v.native(),
+ C.GtkEntryIconPosition(iconPos))
+ return ImageType(c)
+}
+
+// TODO(jrick) GdkPixbuf
+/*
+func (v *Entry) GetIconPixbuf() {
+}
+*/
+
+// GetIconName() is a wrapper around gtk_entry_get_icon_name().
+func (v *Entry) GetIconName(iconPos EntryIconPosition) (string, error) {
+ c := C.gtk_entry_get_icon_name(v.native(),
+ C.GtkEntryIconPosition(iconPos))
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return goString(c), nil
+}
+
+// TODO(jrick) GIcon
+/*
+func (v *Entry) GetIconGIcon() {
+}
+*/
+
+// SetIconActivatable() is a wrapper around gtk_entry_set_icon_activatable().
+func (v *Entry) SetIconActivatable(iconPos EntryIconPosition, activatable bool) {
+ C.gtk_entry_set_icon_activatable(v.native(),
+ C.GtkEntryIconPosition(iconPos), gbool(activatable))
+}
+
+// GetIconActivatable() is a wrapper around gtk_entry_get_icon_activatable().
+func (v *Entry) GetIconActivatable(iconPos EntryIconPosition) bool {
+ c := C.gtk_entry_get_icon_activatable(v.native(),
+ C.GtkEntryIconPosition(iconPos))
+ return gobool(c)
+}
+
+// SetIconSensitive() is a wrapper around gtk_entry_set_icon_sensitive().
+func (v *Entry) SetIconSensitive(iconPos EntryIconPosition, sensitive bool) {
+ C.gtk_entry_set_icon_sensitive(v.native(),
+ C.GtkEntryIconPosition(iconPos), gbool(sensitive))
+}
+
+// GetIconSensitive() is a wrapper around gtk_entry_get_icon_sensitive().
+func (v *Entry) GetIconSensitive(iconPos EntryIconPosition) bool {
+ c := C.gtk_entry_get_icon_sensitive(v.native(),
+ C.GtkEntryIconPosition(iconPos))
+ return gobool(c)
+}
+
+// GetIconAtPos() is a wrapper around gtk_entry_get_icon_at_pos().
+func (v *Entry) GetIconAtPos(x, y int) int {
+ c := C.gtk_entry_get_icon_at_pos(v.native(), C.gint(x), C.gint(y))
+ return int(c)
+}
+
+// SetIconTooltipText() is a wrapper around gtk_entry_set_icon_tooltip_text().
+func (v *Entry) SetIconTooltipText(iconPos EntryIconPosition, tooltip string) {
+ cstr := C.CString(tooltip)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_entry_set_icon_tooltip_text(v.native(),
+ C.GtkEntryIconPosition(iconPos), (*C.gchar)(cstr))
+}
+
+// GetIconTooltipText() is a wrapper around gtk_entry_get_icon_tooltip_text().
+func (v *Entry) GetIconTooltipText(iconPos EntryIconPosition) (string, error) {
+ c := C.gtk_entry_get_icon_tooltip_text(v.native(),
+ C.GtkEntryIconPosition(iconPos))
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return goString(c), nil
+}
+
+// SetIconTooltipMarkup() is a wrapper around
+// gtk_entry_set_icon_tooltip_markup().
+func (v *Entry) SetIconTooltipMarkup(iconPos EntryIconPosition, tooltip string) {
+ cstr := C.CString(tooltip)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_entry_set_icon_tooltip_markup(v.native(),
+ C.GtkEntryIconPosition(iconPos), (*C.gchar)(cstr))
+}
+
+// GetIconTooltipMarkup() is a wrapper around
+// gtk_entry_get_icon_tooltip_markup().
+func (v *Entry) GetIconTooltipMarkup(iconPos EntryIconPosition) (string, error) {
+ c := C.gtk_entry_get_icon_tooltip_markup(v.native(),
+ C.GtkEntryIconPosition(iconPos))
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return goString(c), nil
+}
+
+// TODO(jrick) GdkDragAction
+/*
+func (v *Entry) SetIconDragSource() {
+}
+*/
+
+// GetCurrentIconDragSource() is a wrapper around
+// gtk_entry_get_current_icon_drag_source().
+func (v *Entry) GetCurrentIconDragSource() int {
+ c := C.gtk_entry_get_current_icon_drag_source(v.native())
+ return int(c)
+}
+
+// TODO(jrick) GdkRectangle
+/*
+func (v *Entry) GetIconArea() {
+}
+*/
+
+// SetInputPurpose() is a wrapper around gtk_entry_set_input_purpose().
+func (v *Entry) SetInputPurpose(purpose InputPurpose) {
+ C.gtk_entry_set_input_purpose(v.native(), C.GtkInputPurpose(purpose))
+}
+
+// GetInputPurpose() is a wrapper around gtk_entry_get_input_purpose().
+func (v *Entry) GetInputPurpose() InputPurpose {
+ c := C.gtk_entry_get_input_purpose(v.native())
+ return InputPurpose(c)
+}
+
+// SetInputHints() is a wrapper around gtk_entry_set_input_hints().
+func (v *Entry) SetInputHints(hints InputHints) {
+ C.gtk_entry_set_input_hints(v.native(), C.GtkInputHints(hints))
+}
+
+// GetInputHints() is a wrapper around gtk_entry_get_input_hints().
+func (v *Entry) GetInputHints() InputHints {
+ c := C.gtk_entry_get_input_hints(v.native())
+ return InputHints(c)
+}
+
+/*
+ * GtkEntryBuffer
+ */
+
+// EntryBuffer is a representation of GTK's GtkEntryBuffer.
+type EntryBuffer struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkEntryBuffer.
+func (v *EntryBuffer) native() *C.GtkEntryBuffer {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkEntryBuffer(p)
+}
+
+func marshalEntryBuffer(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapEntryBuffer(obj), nil
+}
+
+func wrapEntryBuffer(obj *glib.Object) *EntryBuffer {
+ return &EntryBuffer{obj}
+}
+
+// EntryBufferNew() is a wrapper around gtk_entry_buffer_new().
+func EntryBufferNew(initialChars string, nInitialChars int) (*EntryBuffer, error) {
+ cstr := C.CString(initialChars)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_entry_buffer_new((*C.gchar)(cstr), C.gint(nInitialChars))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ e := wrapEntryBuffer(glib.Take(unsafe.Pointer(c)))
+ return e, nil
+}
+
+// GetText() is a wrapper around gtk_entry_buffer_get_text(). A
+// non-nil error is returned in the case that gtk_entry_buffer_get_text
+// returns NULL to differentiate between NULL and an empty string.
+func (v *EntryBuffer) GetText() (string, error) {
+ c := C.gtk_entry_buffer_get_text(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return goString(c), nil
+}
+
+// SetText() is a wrapper around gtk_entry_buffer_set_text().
+func (v *EntryBuffer) SetText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_entry_buffer_set_text(v.native(), (*C.gchar)(cstr),
+ C.gint(len(text)))
+}
+
+// GetBytes() is a wrapper around gtk_entry_buffer_get_bytes().
+func (v *EntryBuffer) GetBytes() uint {
+ c := C.gtk_entry_buffer_get_bytes(v.native())
+ return uint(c)
+}
+
+// GetLength() is a wrapper around gtk_entry_buffer_get_length().
+func (v *EntryBuffer) GetLength() uint {
+ c := C.gtk_entry_buffer_get_length(v.native())
+ return uint(c)
+}
+
+// GetMaxLength() is a wrapper around gtk_entry_buffer_get_max_length().
+func (v *EntryBuffer) GetMaxLength() int {
+ c := C.gtk_entry_buffer_get_max_length(v.native())
+ return int(c)
+}
+
+// SetMaxLength() is a wrapper around gtk_entry_buffer_set_max_length().
+func (v *EntryBuffer) SetMaxLength(maxLength int) {
+ C.gtk_entry_buffer_set_max_length(v.native(), C.gint(maxLength))
+}
+
+// InsertText() is a wrapper around gtk_entry_buffer_insert_text().
+func (v *EntryBuffer) InsertText(position uint, text string) uint {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_entry_buffer_insert_text(v.native(), C.guint(position),
+ (*C.gchar)(cstr), C.gint(len(text)))
+ return uint(c)
+}
+
+// DeleteText() is a wrapper around gtk_entry_buffer_delete_text().
+func (v *EntryBuffer) DeleteText(position uint, nChars int) uint {
+ c := C.gtk_entry_buffer_delete_text(v.native(), C.guint(position),
+ C.gint(nChars))
+ return uint(c)
+}
+
+// EmitDeletedText() is a wrapper around gtk_entry_buffer_emit_deleted_text().
+func (v *EntryBuffer) EmitDeletedText(pos, nChars uint) {
+ C.gtk_entry_buffer_emit_deleted_text(v.native(), C.guint(pos),
+ C.guint(nChars))
+}
+
+// EmitInsertedText() is a wrapper around gtk_entry_buffer_emit_inserted_text().
+func (v *EntryBuffer) EmitInsertedText(pos uint, text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_entry_buffer_emit_inserted_text(v.native(), C.guint(pos),
+ (*C.gchar)(cstr), C.guint(len(text)))
+}
+
+/*
+ * GtkEntryCompletion
+ */
+
+// EntryCompletion is a representation of GTK's GtkEntryCompletion.
+type EntryCompletion struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkEntryCompletion.
+func (v *EntryCompletion) native() *C.GtkEntryCompletion {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkEntryCompletion(p)
+}
+
+func marshalEntryCompletion(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapEntryCompletion(obj), nil
+}
+
+func wrapEntryCompletion(obj *glib.Object) *EntryCompletion {
+ return &EntryCompletion{obj}
+}
+
+/*
+ * GtkEventBox
+ */
+
+// EventBox is a representation of GTK's GtkEventBox.
+type EventBox struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkEventBox.
+func (v *EventBox) native() *C.GtkEventBox {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkEventBox(p)
+}
+
+func marshalEventBox(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapEventBox(obj), nil
+}
+
+func wrapEventBox(obj *glib.Object) *EventBox {
+ return &EventBox{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// EventBoxNew is a wrapper around gtk_event_box_new().
+func EventBoxNew() (*EventBox, error) {
+ c := C.gtk_event_box_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapEventBox(obj), nil
+}
+
+// SetAboveChild is a wrapper around gtk_event_box_set_above_child().
+func (v *EventBox) SetAboveChild(aboveChild bool) {
+ C.gtk_event_box_set_above_child(v.native(), gbool(aboveChild))
+}
+
+// GetAboveChild is a wrapper around gtk_event_box_get_above_child().
+func (v *EventBox) GetAboveChild() bool {
+ c := C.gtk_event_box_get_above_child(v.native())
+ return gobool(c)
+}
+
+// SetVisibleWindow is a wrapper around gtk_event_box_set_visible_window().
+func (v *EventBox) SetVisibleWindow(visibleWindow bool) {
+ C.gtk_event_box_set_visible_window(v.native(), gbool(visibleWindow))
+}
+
+// GetVisibleWindow is a wrapper around gtk_event_box_get_visible_window().
+func (v *EventBox) GetVisibleWindow() bool {
+ c := C.gtk_event_box_get_visible_window(v.native())
+ return gobool(c)
+}
+
+/*
+ * GtkExpander
+ */
+
+// Expander is a representation of GTK's GtkExpander.
+type Expander struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkExpander.
+func (v *Expander) native() *C.GtkExpander {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkExpander(p)
+}
+
+func marshalExpander(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapExpander(obj), nil
+}
+
+func wrapExpander(obj *glib.Object) *Expander {
+ return &Expander{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// ExpanderNew is a wrapper around gtk_expander_new().
+func ExpanderNew(label string) (*Expander, error) {
+ var cstr *C.gchar
+ if label != "" {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ }
+ c := C.gtk_expander_new((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapExpander(obj), nil
+}
+
+// SetExpanded is a wrapper around gtk_expander_set_expanded().
+func (v *Expander) SetExpanded(expanded bool) {
+ C.gtk_expander_set_expanded(v.native(), gbool(expanded))
+}
+
+// GetExpanded is a wrapper around gtk_expander_get_expanded().
+func (v *Expander) GetExpanded() bool {
+ c := C.gtk_expander_get_expanded(v.native())
+ return gobool(c)
+}
+
+// SetLabel is a wrapper around gtk_expander_set_label().
+func (v *Expander) SetLabel(label string) {
+ var cstr *C.char
+ if label != "" {
+ cstr = C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ }
+ C.gtk_expander_set_label(v.native(), (*C.gchar)(cstr))
+}
+
+// GetLabel is a wrapper around gtk_expander_get_label().
+func (v *Expander) GetLabel() string {
+ c := C.gtk_expander_get_label(v.native())
+ return goString(c)
+}
+
+// SetLabelWidget is a wrapper around gtk_expander_set_label_widget().
+func (v *Expander) SetLabelWidget(widget IWidget) {
+ C.gtk_expander_set_label_widget(v.native(), widget.toWidget())
+}
+
+/*
+ * GtkFileChooser
+ */
+
+// FileChoser is a representation of GTK's GtkFileChooser GInterface.
+type FileChooser struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GObject as a GtkFileChooser.
+func (v *FileChooser) native() *C.GtkFileChooser {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFileChooser(p)
+}
+
+func marshalFileChooser(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileChooser(obj), nil
+}
+
+func wrapFileChooser(obj *glib.Object) *FileChooser {
+ return &FileChooser{obj}
+}
+
+// SetFilename is a wrapper around gtk_file_chooser_set_filename().
+func (v *FileChooser) SetFilename(filename string) bool {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_file_chooser_set_filename(v.native(), cstr)
+ return gobool(c)
+}
+
+// GetFilename is a wrapper around gtk_file_chooser_get_filename().
+func (v *FileChooser) GetFilename() string {
+ c := C.gtk_file_chooser_get_filename(v.native())
+ s := goString(c)
+ defer C.g_free((C.gpointer)(c))
+ return s
+}
+
+// GetFilenames is a wrapper around gtk_file_chooser_get_filenames().
+func (v *FileChooser) GetFilenames() (*glib.SList, error) {
+ c := C.gtk_file_chooser_get_filenames(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return glib.WrapSList(uintptr(unsafe.Pointer(c))), nil
+}
+
+// GetURIs is a wrapper around gtk_file_chooser_get_uris().
+func (v FileChooser) GetURIs() (*glib.SList, error) {
+ c := C.gtk_file_chooser_get_uris(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return glib.WrapSList(uintptr(unsafe.Pointer(c))), nil
+}
+
+// SetDoOverwriteConfirmation is a wrapper around gtk_file_chooser_set_do_overwrite_confirmation().
+func (v *FileChooser) SetDoOverwriteConfirmation(value bool) {
+ C.gtk_file_chooser_set_do_overwrite_confirmation(v.native(), gbool(value))
+}
+
+// GetDoOverwriteConfirmation is a wrapper around gtk_file_chooser_get_do_overwrite_confirmation().
+func (v *FileChooser) GetDoOverwriteConfirmation() bool {
+ c := C.gtk_file_chooser_get_do_overwrite_confirmation(v.native())
+ return gobool(c)
+}
+
+// SetCreateFolders is a wrapper around gtk_file_chooser_set_create_folders().
+func (v *FileChooser) SetCreateFolders(value bool) {
+ C.gtk_file_chooser_set_create_folders(v.native(), gbool(value))
+}
+
+// GetCreateFolders is a wrapper around gtk_file_chooser_get_create_folders().
+func (v *FileChooser) GetCreateFolders() bool {
+ c := C.gtk_file_chooser_get_create_folders(v.native())
+ return gobool(c)
+}
+
+// SetCurrentName is a wrapper around gtk_file_chooser_set_current_name().
+func (v *FileChooser) SetCurrentName(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_file_chooser_set_current_name(v.native(), (*C.gchar)(cstr))
+ return
+}
+
+// SetCurrentFolder is a wrapper around gtk_file_chooser_set_current_folder().
+func (v *FileChooser) SetCurrentFolder(folder string) bool {
+ cstr := C.CString(folder)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_file_chooser_set_current_folder(v.native(), (*C.gchar)(cstr))
+ return gobool(c)
+}
+
+// GetCurrentFolder is a wrapper around gtk_file_chooser_get_current_folder().
+func (v *FileChooser) GetCurrentFolder() (string, error) {
+ c := C.gtk_file_chooser_get_current_folder(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ defer C.free(unsafe.Pointer(c))
+ return goString(c), nil
+}
+
+// SetPreviewWidget is a wrapper around gtk_file_chooser_set_preview_widget().
+func (v *FileChooser) SetPreviewWidget(widget IWidget) {
+ C.gtk_file_chooser_set_preview_widget(v.native(), widget.toWidget())
+}
+
+// SetPreviewWidgetActive is a wrapper around gtk_file_chooser_set_preview_widget_active().
+func (v *FileChooser) SetPreviewWidgetActive(active bool) {
+ C.gtk_file_chooser_set_preview_widget_active(v.native(), gbool(active))
+}
+
+// GetPreviewFilename is a wrapper around gtk_file_chooser_get_preview_filename().
+func (v *FileChooser) GetPreviewFilename() string {
+ c := C.gtk_file_chooser_get_preview_filename(v.native())
+ defer C.free(unsafe.Pointer(c))
+ return C.GoString(c)
+}
+
+// GetURI is a wrapper around gtk_file_chooser_get_uri().
+func (v *FileChooser) GetURI() string {
+ c := C.gtk_file_chooser_get_uri(v.native())
+ s := goString(c)
+ defer C.g_free((C.gpointer)(c))
+ return s
+}
+
+// AddFilter is a wrapper around gtk_file_chooser_add_filter().
+func (v *FileChooser) AddFilter(filter *FileFilter) {
+ C.gtk_file_chooser_add_filter(v.native(), filter.native())
+}
+
+// RemoveFilter is a wrapper around gtk_file_chooser_remove_filter().
+func (v *FileChooser) RemoveFilter(filter *FileFilter) {
+ C.gtk_file_chooser_remove_filter(v.native(), filter.native())
+}
+
+// SetFilter is a wrapper around gtk_file_chooser_set_filter().
+func (v *FileChooser) SetFilter(filter *FileFilter) {
+ C.gtk_file_chooser_set_filter(v.native(), filter.native())
+}
+
+// AddShortcutFolder is a wrapper around gtk_file_chooser_add_shortcut_folder().
+func (v *FileChooser) AddShortcutFolder(folder string) bool {
+ cstr := C.CString(folder)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_file_chooser_add_shortcut_folder(v.native(), cstr, nil)
+ return gobool(c)
+}
+
+// SetLocalOnly is a wrapper around gtk_file_chooser_set_local_only().
+func (v *FileChooser) SetLocalOnly(value bool) {
+ C.gtk_file_chooser_set_local_only(v.native(), gbool(value))
+}
+
+// GetLocalOnly is a wrapper around gtk_file_chooser_get_local_only().
+func (v *FileChooser) GetLocalOnly() bool {
+ c := C.gtk_file_chooser_get_local_only(v.native())
+ return gobool(c)
+}
+
+// SetSelectMultiple is a wrapper around gtk_file_chooser_set_select_multiple().
+func (v *FileChooser) SetSelectMultiple(value bool) {
+ C.gtk_file_chooser_set_select_multiple(v.native(), gbool(value))
+}
+
+// GetSelectMultiple is a wrapper around gtk_file_chooser_get_select_multiple().
+func (v *FileChooser) GetSelectMultiple() bool {
+ c := C.gtk_file_chooser_get_select_multiple(v.native())
+ return gobool(c)
+}
+
+/*
+ * GtkFileChooserButton
+ */
+
+// FileChooserButton is a representation of GTK's GtkFileChooserButton.
+type FileChooserButton struct {
+ Box
+
+ // Interfaces
+ FileChooser
+}
+
+// native returns a pointer to the underlying GtkFileChooserButton.
+func (v *FileChooserButton) native() *C.GtkFileChooserButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFileChooserButton(p)
+}
+
+func marshalFileChooserButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileChooserButton(obj), nil
+}
+
+func wrapFileChooserButton(obj *glib.Object) *FileChooserButton {
+ fc := wrapFileChooser(obj)
+ return &FileChooserButton{Box{Container{Widget{glib.InitiallyUnowned{obj}}}}, *fc}
+}
+
+// FileChooserButtonNew is a wrapper around gtk_file_chooser_button_new().
+func FileChooserButtonNew(title string, action FileChooserAction) (*FileChooserButton, error) {
+ cstr := C.CString(title)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_file_chooser_button_new((*C.gchar)(cstr),
+ (C.GtkFileChooserAction)(action))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileChooserButton(obj), nil
+}
+
+/*
+ * GtkFileChooserDialog
+ */
+
+// FileChooserDialog is a representation of GTK's GtkFileChooserDialog.
+type FileChooserDialog struct {
+ Dialog
+
+ // Interfaces
+ FileChooser
+}
+
+// native returns a pointer to the underlying GtkFileChooserDialog.
+func (v *FileChooserDialog) native() *C.GtkFileChooserDialog {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFileChooserDialog(p)
+}
+
+func marshalFileChooserDialog(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileChooserDialog(obj), nil
+}
+
+func wrapFileChooserDialog(obj *glib.Object) *FileChooserDialog {
+ fc := wrapFileChooser(obj)
+ return &FileChooserDialog{Dialog{Window{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}}, *fc}
+}
+
+// FileChooserDialogNewWith1Button is a wrapper around gtk_file_chooser_dialog_new() with one button.
+func FileChooserDialogNewWith1Button(
+ title string,
+ parent *Window,
+ action FileChooserAction,
+ first_button_text string,
+ first_button_id ResponseType) (*FileChooserDialog, error) {
+ c_title := C.CString(title)
+ defer C.free(unsafe.Pointer(c_title))
+ c_first_button_text := C.CString(first_button_text)
+ defer C.free(unsafe.Pointer(c_first_button_text))
+ c := C.gtk_file_chooser_dialog_new_1(
+ (*C.gchar)(c_title), parent.native(), C.GtkFileChooserAction(action),
+ (*C.gchar)(c_first_button_text), C.int(first_button_id))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileChooserDialog(obj), nil
+}
+
+// FileChooserDialogNewWith2Buttons is a wrapper around gtk_file_chooser_dialog_new() with two buttons.
+func FileChooserDialogNewWith2Buttons(
+ title string,
+ parent *Window,
+ action FileChooserAction,
+ first_button_text string,
+ first_button_id ResponseType,
+ second_button_text string,
+ second_button_id ResponseType) (*FileChooserDialog, error) {
+ c_title := C.CString(title)
+ defer C.free(unsafe.Pointer(c_title))
+ c_first_button_text := C.CString(first_button_text)
+ defer C.free(unsafe.Pointer(c_first_button_text))
+ c_second_button_text := C.CString(second_button_text)
+ defer C.free(unsafe.Pointer(c_second_button_text))
+ c := C.gtk_file_chooser_dialog_new_2(
+ (*C.gchar)(c_title), parent.native(), C.GtkFileChooserAction(action),
+ (*C.gchar)(c_first_button_text), C.int(first_button_id),
+ (*C.gchar)(c_second_button_text), C.int(second_button_id))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileChooserDialog(obj), nil
+}
+
+/*
+ * GtkFileChooserWidget
+ */
+
+// FileChooserWidget is a representation of GTK's GtkFileChooserWidget.
+type FileChooserWidget struct {
+ Box
+
+ // Interfaces
+ FileChooser
+}
+
+// native returns a pointer to the underlying GtkFileChooserWidget.
+func (v *FileChooserWidget) native() *C.GtkFileChooserWidget {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFileChooserWidget(p)
+}
+
+func marshalFileChooserWidget(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileChooserWidget(obj), nil
+}
+
+func wrapFileChooserWidget(obj *glib.Object) *FileChooserWidget {
+ fc := wrapFileChooser(obj)
+ return &FileChooserWidget{Box{Container{Widget{glib.InitiallyUnowned{obj}}}}, *fc}
+}
+
+// FileChooserWidgetNew is a wrapper around gtk_file_chooser_widget_new().
+func FileChooserWidgetNew(action FileChooserAction) (*FileChooserWidget, error) {
+ c := C.gtk_file_chooser_widget_new((C.GtkFileChooserAction)(action))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileChooserWidget(obj), nil
+}
+
+/*
+ * GtkFileFilter
+ */
+
+// FileChoser is a representation of GTK's GtkFileFilter GInterface.
+type FileFilter struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GObject as a GtkFileFilter.
+func (v *FileFilter) native() *C.GtkFileFilter {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFileFilter(p)
+}
+
+func marshalFileFilter(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileFilter(obj), nil
+}
+
+func wrapFileFilter(obj *glib.Object) *FileFilter {
+ return &FileFilter{obj}
+}
+
+// FileFilterNew is a wrapper around gtk_file_filter_new().
+func FileFilterNew() (*FileFilter, error) {
+ c := C.gtk_file_filter_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileFilter(obj), nil
+}
+
+// SetName is a wrapper around gtk_file_filter_set_name().
+func (v *FileFilter) SetName(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_file_filter_set_name(v.native(), (*C.gchar)(cstr))
+}
+
+// AddPattern is a wrapper around gtk_file_filter_add_pattern().
+func (v *FileFilter) AddPattern(pattern string) {
+ cstr := C.CString(pattern)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_file_filter_add_pattern(v.native(), (*C.gchar)(cstr))
+}
+
+// AddPixbufFormats is a wrapper around gtk_file_filter_add_pixbuf_formats().
+func (v *FileFilter) AddPixbufFormats() {
+ C.gtk_file_filter_add_pixbuf_formats(v.native())
+}
+
+/*
+ * GtkFrame
+ */
+
+// Frame is a representation of GTK's GtkFrame.
+type Frame struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkFrame.
+func (v *Frame) native() *C.GtkFrame {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFrame(p)
+}
+
+func marshalFrame(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFrame(obj), nil
+}
+
+func wrapFrame(obj *glib.Object) *Frame {
+ return &Frame{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// FrameNew is a wrapper around gtk_frame_new().
+func FrameNew(label string) (*Frame, error) {
+ var cstr *C.char
+ if label != "" {
+ cstr = C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ }
+ c := C.gtk_frame_new((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFrame(obj), nil
+}
+
+// SetLabel is a wrapper around gtk_frame_set_label().
+func (v *Frame) SetLabel(label string) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_frame_set_label(v.native(), (*C.gchar)(cstr))
+}
+
+// SetLabelWidget is a wrapper around gtk_frame_set_label_widget().
+func (v *Frame) SetLabelWidget(labelWidget IWidget) {
+ C.gtk_frame_set_label_widget(v.native(), labelWidget.toWidget())
+}
+
+// SetLabelAlign is a wrapper around gtk_frame_set_label_align().
+func (v *Frame) SetLabelAlign(xAlign, yAlign float32) {
+ C.gtk_frame_set_label_align(v.native(), C.gfloat(xAlign),
+ C.gfloat(yAlign))
+}
+
+// SetShadowType is a wrapper around gtk_frame_set_shadow_type().
+func (v *Frame) SetShadowType(t ShadowType) {
+ C.gtk_frame_set_shadow_type(v.native(), C.GtkShadowType(t))
+}
+
+// GetLabel is a wrapper around gtk_frame_get_label().
+func (v *Frame) GetLabel() string {
+ c := C.gtk_frame_get_label(v.native())
+ return goString(c)
+}
+
+// GetLabelAlign is a wrapper around gtk_frame_get_label_align().
+func (v *Frame) GetLabelAlign() (xAlign, yAlign float32) {
+ var x, y C.gfloat
+ C.gtk_frame_get_label_align(v.native(), &x, &y)
+ return float32(x), float32(y)
+}
+
+// GetLabelWidget is a wrapper around gtk_frame_get_label_widget().
+func (v *Frame) GetLabelWidget() (*Widget, error) {
+ c := C.gtk_frame_get_label_widget(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapWidget(obj), nil
+}
+
+// GetShadowType is a wrapper around gtk_frame_get_shadow_type().
+func (v *Frame) GetShadowType() ShadowType {
+ c := C.gtk_frame_get_shadow_type(v.native())
+ return ShadowType(c)
+}
+
+/*
+ * GtkAspectFrame
+ */
+
+// AspectFrame is a representation of GTK's GtkAspectFrame.
+type AspectFrame struct {
+ Frame
+}
+
+// native returns a pointer to the underlying GtkAspectFrame.
+func (v *AspectFrame) native() *C.GtkAspectFrame {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAspectFrame(p)
+}
+
+func marshalAspectFrame(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAspectFrame(obj), nil
+}
+
+func wrapAspectFrame(obj *glib.Object) *AspectFrame {
+ return &AspectFrame{Frame{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}}
+}
+
+func AspectFrameNew(label string, xalign, yalign, ratio float32, obeyChild bool) (*AspectFrame, error) {
+ var cstr *C.char
+ if label != "" {
+ cstr = C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ }
+ c := C.gtk_aspect_frame_new((*C.gchar)(cstr), (C.gfloat)(xalign), (C.gfloat)(yalign), (C.gfloat)(ratio), gbool(obeyChild))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAspectFrame(obj), nil
+}
+
+/*
+ * GtkGrid
+ */
+
+// Grid is a representation of GTK's GtkGrid.
+type Grid struct {
+ Container
+
+ // Interfaces
+ Orientable
+}
+
+// native returns a pointer to the underlying GtkGrid.
+func (v *Grid) native() *C.GtkGrid {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkGrid(p)
+}
+
+func (v *Grid) toOrientable() *C.GtkOrientable {
+ if v == nil {
+ return nil
+ }
+ return C.toGtkOrientable(unsafe.Pointer(v.GObject))
+}
+
+func marshalGrid(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapGrid(obj), nil
+}
+
+func wrapGrid(obj *glib.Object) *Grid {
+ o := wrapOrientable(obj)
+ return &Grid{Container{Widget{glib.InitiallyUnowned{obj}}}, *o}
+}
+
+// GridNew() is a wrapper around gtk_grid_new().
+func GridNew() (*Grid, error) {
+ c := C.gtk_grid_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapGrid(obj), nil
+}
+
+// Attach() is a wrapper around gtk_grid_attach().
+func (v *Grid) Attach(child IWidget, left, top, width, height int) {
+ C.gtk_grid_attach(v.native(), child.toWidget(), C.gint(left),
+ C.gint(top), C.gint(width), C.gint(height))
+}
+
+// AttachNextTo() is a wrapper around gtk_grid_attach_next_to().
+func (v *Grid) AttachNextTo(child, sibling IWidget, side PositionType, width, height int) {
+ C.gtk_grid_attach_next_to(v.native(), child.toWidget(),
+ sibling.toWidget(), C.GtkPositionType(side), C.gint(width),
+ C.gint(height))
+}
+
+// GetChildAt() is a wrapper around gtk_grid_get_child_at().
+func (v *Grid) GetChildAt(left, top int) (*Widget, error) {
+ c := C.gtk_grid_get_child_at(v.native(), C.gint(left), C.gint(top))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapWidget(obj), nil
+}
+
+// InsertRow() is a wrapper around gtk_grid_insert_row().
+func (v *Grid) InsertRow(position int) {
+ C.gtk_grid_insert_row(v.native(), C.gint(position))
+}
+
+// InsertColumn() is a wrapper around gtk_grid_insert_column().
+func (v *Grid) InsertColumn(position int) {
+ C.gtk_grid_insert_column(v.native(), C.gint(position))
+}
+
+// InsertNextTo() is a wrapper around gtk_grid_insert_next_to()
+func (v *Grid) InsertNextTo(sibling IWidget, side PositionType) {
+ C.gtk_grid_insert_next_to(v.native(), sibling.toWidget(),
+ C.GtkPositionType(side))
+}
+
+// SetRowHomogeneous() is a wrapper around gtk_grid_set_row_homogeneous().
+func (v *Grid) SetRowHomogeneous(homogeneous bool) {
+ C.gtk_grid_set_row_homogeneous(v.native(), gbool(homogeneous))
+}
+
+// GetRowHomogeneous() is a wrapper around gtk_grid_get_row_homogeneous().
+func (v *Grid) GetRowHomogeneous() bool {
+ c := C.gtk_grid_get_row_homogeneous(v.native())
+ return gobool(c)
+}
+
+// SetRowSpacing() is a wrapper around gtk_grid_set_row_spacing().
+func (v *Grid) SetRowSpacing(spacing uint) {
+ C.gtk_grid_set_row_spacing(v.native(), C.guint(spacing))
+}
+
+// GetRowSpacing() is a wrapper around gtk_grid_get_row_spacing().
+func (v *Grid) GetRowSpacing() uint {
+ c := C.gtk_grid_get_row_spacing(v.native())
+ return uint(c)
+}
+
+// SetColumnHomogeneous() is a wrapper around gtk_grid_set_column_homogeneous().
+func (v *Grid) SetColumnHomogeneous(homogeneous bool) {
+ C.gtk_grid_set_column_homogeneous(v.native(), gbool(homogeneous))
+}
+
+// GetColumnHomogeneous() is a wrapper around gtk_grid_get_column_homogeneous().
+func (v *Grid) GetColumnHomogeneous() bool {
+ c := C.gtk_grid_get_column_homogeneous(v.native())
+ return gobool(c)
+}
+
+// SetColumnSpacing() is a wrapper around gtk_grid_set_column_spacing().
+func (v *Grid) SetColumnSpacing(spacing uint) {
+ C.gtk_grid_set_column_spacing(v.native(), C.guint(spacing))
+}
+
+// GetColumnSpacing() is a wrapper around gtk_grid_get_column_spacing().
+func (v *Grid) GetColumnSpacing() uint {
+ c := C.gtk_grid_get_column_spacing(v.native())
+ return uint(c)
+}
+
+/*
+ * GtkIconTheme
+ */
+
+// IconTheme is a representation of GTK's GtkIconTheme
+type IconTheme struct {
+ Theme *C.GtkIconTheme
+}
+
+// IconThemeGetDefault is a wrapper around gtk_icon_theme_get_default().
+func IconThemeGetDefault() (*IconTheme, error) {
+ c := C.gtk_icon_theme_get_default()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return &IconTheme{c}, nil
+}
+
+// IconThemeGetForScreen is a wrapper around gtk_icon_theme_get_for_screen().
+func IconThemeGetForScreen(screen gdk.Screen) (*IconTheme, error) {
+ cScreen := (*C.GdkScreen)(unsafe.Pointer(screen.Native()))
+ c := C.gtk_icon_theme_get_for_screen(cScreen)
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return &IconTheme{c}, nil
+}
+
+// LoadIcon is a wrapper around gtk_icon_theme_load_icon().
+func (v *IconTheme) LoadIcon(iconName string, size int, flags IconLookupFlags) (*gdk.Pixbuf, error) {
+ cstr := C.CString(iconName)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ c := C.gtk_icon_theme_load_icon(v.Theme, (*C.gchar)(cstr), C.gint(size), C.GtkIconLookupFlags(flags), &err)
+ if c == nil {
+ defer C.g_error_free(err)
+ return nil, errors.New(goString(err.message))
+ }
+ return &gdk.Pixbuf{glib.Take(unsafe.Pointer(c))}, nil
+}
+
+/*
+ * GtkImage
+ */
+
+// Image is a representation of GTK's GtkImage.
+type Image struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkImage.
+func (v *Image) native() *C.GtkImage {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkImage(p)
+}
+
+func marshalImage(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapImage(obj), nil
+}
+
+func wrapImage(obj *glib.Object) *Image {
+ return &Image{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// ImageNew() is a wrapper around gtk_image_new().
+func ImageNew() (*Image, error) {
+ c := C.gtk_image_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapImage(obj), nil
+}
+
+// ImageNewFromFile() is a wrapper around gtk_image_new_from_file().
+func ImageNewFromFile(filename string) (*Image, error) {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_image_new_from_file((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapImage(obj), nil
+}
+
+// ImageNewFromResource() is a wrapper around gtk_image_new_from_resource().
+func ImageNewFromResource(resourcePath string) (*Image, error) {
+ cstr := C.CString(resourcePath)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_image_new_from_resource((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapImage(obj), nil
+}
+
+// ImageNewFromPixbuf is a wrapper around gtk_image_new_from_pixbuf().
+func ImageNewFromPixbuf(pixbuf *gdk.Pixbuf) (*Image, error) {
+ c := C.gtk_image_new_from_pixbuf((*C.GdkPixbuf)(pixbuf.NativePrivate()))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapImage(obj), nil
+}
+
+// TODO(jrick) GtkIconSet
+/*
+func ImageNewFromIconSet() {
+}
+*/
+
+// TODO(jrick) GdkPixbufAnimation
+/*
+func ImageNewFromAnimation() {
+}
+*/
+
+// ImageNewFromIconName() is a wrapper around gtk_image_new_from_icon_name().
+func ImageNewFromIconName(iconName string, size IconSize) (*Image, error) {
+ cstr := C.CString(iconName)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_image_new_from_icon_name((*C.gchar)(cstr),
+ C.GtkIconSize(size))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapImage(obj), nil
+}
+
+// TODO(jrick) GIcon
+/*
+func ImageNewFromGIcon() {
+}
+*/
+
+// Clear() is a wrapper around gtk_image_clear().
+func (v *Image) Clear() {
+ C.gtk_image_clear(v.native())
+}
+
+// SetFromFile() is a wrapper around gtk_image_set_from_file().
+func (v *Image) SetFromFile(filename string) {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_image_set_from_file(v.native(), (*C.gchar)(cstr))
+}
+
+// SetFromResource() is a wrapper around gtk_image_set_from_resource().
+func (v *Image) SetFromResource(resourcePath string) {
+ cstr := C.CString(resourcePath)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_image_set_from_resource(v.native(), (*C.gchar)(cstr))
+}
+
+// SetFromFixbuf is a wrapper around gtk_image_set_from_pixbuf().
+func (v *Image) SetFromPixbuf(pixbuf *gdk.Pixbuf) {
+ pbptr := (*C.GdkPixbuf)(unsafe.Pointer(pixbuf.Native()))
+ C.gtk_image_set_from_pixbuf(v.native(), pbptr)
+}
+
+// TODO(jrick) GtkIconSet
+/*
+func (v *Image) SetFromIconSet() {
+}
+*/
+
+// TODO(jrick) GdkPixbufAnimation
+/*
+func (v *Image) SetFromAnimation() {
+}
+*/
+
+// SetFromIconName() is a wrapper around gtk_image_set_from_icon_name().
+func (v *Image) SetFromIconName(iconName string, size IconSize) {
+ cstr := C.CString(iconName)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_image_set_from_icon_name(v.native(), (*C.gchar)(cstr),
+ C.GtkIconSize(size))
+}
+
+// TODO(jrick) GIcon
+/*
+func (v *Image) SetFromGIcon() {
+}
+*/
+
+// SetPixelSize() is a wrapper around gtk_image_set_pixel_size().
+func (v *Image) SetPixelSize(pixelSize int) {
+ C.gtk_image_set_pixel_size(v.native(), C.gint(pixelSize))
+}
+
+// GetStorageType() is a wrapper around gtk_image_get_storage_type().
+func (v *Image) GetStorageType() ImageType {
+ c := C.gtk_image_get_storage_type(v.native())
+ return ImageType(c)
+}
+
+// GetPixbuf() is a wrapper around gtk_image_get_pixbuf().
+func (v *Image) GetPixbuf() *gdk.Pixbuf {
+ c := C.gtk_image_get_pixbuf(v.native())
+ if c == nil {
+ return nil
+ }
+
+ pb := &gdk.Pixbuf{glib.Take(unsafe.Pointer(c))}
+ return pb
+}
+
+// TODO(jrick) GtkIconSet
+/*
+func (v *Image) GetIconSet() {
+}
+*/
+
+// TODO(jrick) GdkPixbufAnimation
+/*
+func (v *Image) GetAnimation() {
+}
+*/
+
+// GetIconName() is a wrapper around gtk_image_get_icon_name().
+func (v *Image) GetIconName() (string, IconSize) {
+ var iconName *C.gchar
+ var size C.GtkIconSize
+ C.gtk_image_get_icon_name(v.native(), &iconName, &size)
+ return goString(iconName), IconSize(size)
+}
+
+// TODO(jrick) GIcon
+/*
+func (v *Image) GetGIcon() {
+}
+*/
+
+// GetPixelSize() is a wrapper around gtk_image_get_pixel_size().
+func (v *Image) GetPixelSize() int {
+ c := C.gtk_image_get_pixel_size(v.native())
+ return int(c)
+}
+
+// added by terrak
+/*
+ * GtkLayout
+ */
+
+// Layout is a representation of GTK's GtkLayout.
+type Layout struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkDrawingArea.
+func (v *Layout) native() *C.GtkLayout {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkLayout(p)
+}
+
+func marshalLayout(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapLayout(obj), nil
+}
+
+func wrapLayout(obj *glib.Object) *Layout {
+ return &Layout{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// LayoutNew is a wrapper around gtk_layout_new().
+func LayoutNew(hadjustment, vadjustment *Adjustment) (*Layout, error) {
+ c := C.gtk_layout_new(hadjustment.native(), vadjustment.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapLayout(obj), nil
+}
+
+// Layout.Put is a wrapper around gtk_layout_put().
+func (v *Layout) Put(w IWidget, x, y int) {
+ C.gtk_layout_put(v.native(), w.toWidget(), C.gint(x), C.gint(y))
+}
+
+// Layout.Move is a wrapper around gtk_layout_move().
+func (v *Layout) Move(w IWidget, x, y int) {
+ C.gtk_layout_move(v.native(), w.toWidget(), C.gint(x), C.gint(y))
+}
+
+// Layout.SetSize is a wrapper around gtk_layout_set_size
+func (v *Layout) SetSize(width, height uint) {
+ C.gtk_layout_set_size(v.native(), C.guint(width), C.guint(height))
+}
+
+// Layout.GetSize is a wrapper around gtk_layout_get_size
+func (v *Layout) GetSize() (width, height uint) {
+ var w, h C.guint
+ C.gtk_layout_get_size(v.native(), &w, &h)
+ return uint(w), uint(h)
+}
+
+/*
+ * GtkLinkButton
+ */
+
+// LinkButton is a representation of GTK's GtkLinkButton.
+type LinkButton struct {
+ Button
+}
+
+// native returns a pointer to the underlying GtkLinkButton.
+func (v *LinkButton) native() *C.GtkLinkButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkLinkButton(p)
+}
+
+func marshalLinkButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapLinkButton(obj), nil
+}
+
+func wrapLinkButton(obj *glib.Object) *LinkButton {
+ actionable := wrapActionable(obj)
+ return &LinkButton{Button{Bin{Container{Widget{
+ glib.InitiallyUnowned{obj}}}}, actionable}}
+}
+
+// LinkButtonNew is a wrapper around gtk_link_button_new().
+func LinkButtonNew(label string) (*LinkButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_link_button_new((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapLinkButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// LinkButtonNewWithLabel is a wrapper around gtk_link_button_new_with_label().
+func LinkButtonNewWithLabel(uri, label string) (*LinkButton, error) {
+ curi := C.CString(uri)
+ defer C.free(unsafe.Pointer(curi))
+ clabel := C.CString(label)
+ defer C.free(unsafe.Pointer(clabel))
+ c := C.gtk_link_button_new_with_label((*C.gchar)(curi), (*C.gchar)(clabel))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapLinkButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetUri is a wrapper around gtk_link_button_get_uri().
+func (v *LinkButton) GetUri() string {
+ c := C.gtk_link_button_get_uri(v.native())
+ return goString(c)
+}
+
+// SetUri is a wrapper around gtk_link_button_set_uri().
+func (v *LinkButton) SetUri(uri string) {
+ cstr := C.CString(uri)
+ C.gtk_link_button_set_uri(v.native(), (*C.gchar)(cstr))
+}
+
+/*
+ * GtkListStore
+ */
+
+// ListStore is a representation of GTK's GtkListStore.
+type ListStore struct {
+ *glib.Object
+
+ // Interfaces
+ TreeModel
+}
+
+// native returns a pointer to the underlying GtkListStore.
+func (v *ListStore) native() *C.GtkListStore {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkListStore(p)
+}
+
+func marshalListStore(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapListStore(obj), nil
+}
+
+func wrapListStore(obj *glib.Object) *ListStore {
+ tm := wrapTreeModel(obj)
+ return &ListStore{obj, *tm}
+}
+
+func (v *ListStore) toTreeModel() *C.GtkTreeModel {
+ if v == nil {
+ return nil
+ }
+ return C.toGtkTreeModel(unsafe.Pointer(v.GObject))
+}
+
+// ListStoreNew is a wrapper around gtk_list_store_newv().
+func ListStoreNew(types ...glib.Type) (*ListStore, error) {
+ gtypes := C.alloc_types(C.int(len(types)))
+ for n, val := range types {
+ C.set_type(gtypes, C.int(n), C.GType(val))
+ }
+ defer C.g_free(C.gpointer(gtypes))
+ c := C.gtk_list_store_newv(C.gint(len(types)), gtypes)
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ ls := wrapListStore(glib.Take(unsafe.Pointer(c)))
+ return ls, nil
+}
+
+// Remove is a wrapper around gtk_list_store_remove().
+func (v *ListStore) Remove(iter *TreeIter) bool {
+ c := C.gtk_list_store_remove(v.native(), iter.native())
+ return gobool(c)
+}
+
+// TODO(jrick)
+/*
+func (v *ListStore) SetColumnTypes(types ...glib.Type) {
+}
+*/
+
+// Set() is a wrapper around gtk_list_store_set_value() but provides
+// a function similar to gtk_list_store_set() in that multiple columns
+// may be set by one call. The length of columns and values slices must
+// match, or Set() will return a non-nil error.
+//
+// As an example, a call to:
+// store.Set(iter, []int{0, 1}, []interface{}{"Foo", "Bar"})
+// is functionally equivalent to calling the native C GTK function:
+// gtk_list_store_set(store, iter, 0, "Foo", 1, "Bar", -1);
+func (v *ListStore) Set(iter *TreeIter, columns []int, values []interface{}) error {
+ if len(columns) != len(values) {
+ return errors.New("columns and values lengths do not match")
+ }
+ for i, val := range values {
+ v.SetValue(iter, columns[i], val)
+ }
+ return nil
+}
+
+// SetValue is a wrapper around gtk_list_store_set_value().
+func (v *ListStore) SetValue(iter *TreeIter, column int, value interface{}) error {
+ switch value.(type) {
+ case *gdk.Pixbuf:
+ pix := value.(*gdk.Pixbuf)
+ C._gtk_list_store_set(v.native(), iter.native(), C.gint(column), unsafe.Pointer(pix.Native()))
+
+ default:
+ gv, err := glib.GValue(value)
+ if err != nil {
+ return err
+ }
+
+ C.gtk_list_store_set_value(v.native(), iter.native(),
+ C.gint(column),
+ (*C.GValue)(unsafe.Pointer(gv.Native())))
+ }
+
+ return nil
+}
+
+// func (v *ListStore) Model(model ITreeModel) {
+// obj := &glib.Object{glib.ToGObject(unsafe.Pointer(model.toTreeModel()))}
+// v.TreeModel = *wrapTreeModel(obj)
+//}
+
+// SetSortColumnId() is a wrapper around gtk_tree_sortable_set_sort_column_id().
+func (v *ListStore) SetSortColumnId(column int, order SortType) {
+ sort := C.toGtkTreeSortable(unsafe.Pointer(v.Native()))
+ C.gtk_tree_sortable_set_sort_column_id(sort, C.gint(column), C.GtkSortType(order))
+}
+
+func (v *ListStore) SetCols(iter *TreeIter, cols Cols) error {
+ for key, value := range cols {
+ err := v.SetValue(iter, key, value)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// Convenient map for Columns and values (See ListStore, TreeStore)
+type Cols map[int]interface{}
+
+// InsertWithValues() is a wrapper around gtk_list_store_insert_with_valuesv().
+func (v *ListStore) InsertWithValues(iter *TreeIter, position int, inColumns []int, inValues []interface{}) error {
+ length := len(inColumns)
+ if len(inValues) < length {
+ length = len(inValues)
+ }
+
+ var cColumns []C.gint
+ var cValues []C.GValue
+ for i := 0; i < length; i++ {
+ cColumns = append(cColumns, C.gint(inColumns[i]))
+
+ gv, err := glib.GValue(inValues[i])
+ if err != nil {
+ return err
+ }
+
+ var cvp *C.GValue = (*C.GValue)(gv.Native())
+ cValues = append(cValues, *cvp)
+ }
+ var cColumnsPointer *C.gint = &cColumns[0]
+ var cValuesPointer *C.GValue = &cValues[0]
+
+ C.gtk_list_store_insert_with_valuesv(v.native(), iter.native(), C.gint(position), cColumnsPointer, cValuesPointer, C.gint(length))
+
+ return nil
+}
+
+// InsertBefore() is a wrapper around gtk_list_store_insert_before().
+func (v *ListStore) InsertBefore(sibling *TreeIter) *TreeIter {
+ var ti C.GtkTreeIter
+ C.gtk_list_store_insert_before(v.native(), &ti, sibling.native())
+ iter := &TreeIter{ti}
+ return iter
+}
+
+// InsertAfter() is a wrapper around gtk_list_store_insert_after().
+func (v *ListStore) InsertAfter(sibling *TreeIter) *TreeIter {
+ var ti C.GtkTreeIter
+ C.gtk_list_store_insert_after(v.native(), &ti, sibling.native())
+ iter := &TreeIter{ti}
+ return iter
+}
+
+// Prepend() is a wrapper around gtk_list_store_prepend().
+func (v *ListStore) Prepend() *TreeIter {
+ var ti C.GtkTreeIter
+ C.gtk_list_store_prepend(v.native(), &ti)
+ iter := &TreeIter{ti}
+ return iter
+}
+
+// Append() is a wrapper around gtk_list_store_append().
+func (v *ListStore) Append() *TreeIter {
+ var ti C.GtkTreeIter
+ C.gtk_list_store_append(v.native(), &ti)
+ iter := &TreeIter{ti}
+ return iter
+}
+
+// Clear() is a wrapper around gtk_list_store_clear().
+func (v *ListStore) Clear() {
+ C.gtk_list_store_clear(v.native())
+}
+
+// IterIsValid() is a wrapper around gtk_list_store_iter_is_valid().
+func (v *ListStore) IterIsValid(iter *TreeIter) bool {
+ c := C.gtk_list_store_iter_is_valid(v.native(), iter.native())
+ return gobool(c)
+}
+
+// TODO(jrick)
+/*
+func (v *ListStore) Reorder(newOrder []int) {
+}
+*/
+
+// Swap() is a wrapper around gtk_list_store_swap().
+func (v *ListStore) Swap(a, b *TreeIter) {
+ C.gtk_list_store_swap(v.native(), a.native(), b.native())
+}
+
+// MoveBefore() is a wrapper around gtk_list_store_move_before().
+func (v *ListStore) MoveBefore(iter, position *TreeIter) {
+ C.gtk_list_store_move_before(v.native(), iter.native(),
+ position.native())
+}
+
+// MoveAfter() is a wrapper around gtk_list_store_move_after().
+func (v *ListStore) MoveAfter(iter, position *TreeIter) {
+ C.gtk_list_store_move_after(v.native(), iter.native(),
+ position.native())
+}
+
+/*
+ * GtkMenuBar
+ */
+
+// MenuBar is a representation of GTK's GtkMenuBar.
+type MenuBar struct {
+ MenuShell
+}
+
+// native() returns a pointer to the underlying GtkMenuBar.
+func (v *MenuBar) native() *C.GtkMenuBar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkMenuBar(p)
+}
+
+func marshalMenuBar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapMenuBar(obj), nil
+}
+
+func wrapMenuBar(obj *glib.Object) *MenuBar {
+ return &MenuBar{MenuShell{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// MenuBarNew() is a wrapper around gtk_menu_bar_new().
+func MenuBarNew() (*MenuBar, error) {
+ c := C.gtk_menu_bar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapMenuBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkMenuButton
+ */
+
+// MenuButton is a representation of GTK's GtkMenuButton.
+type MenuButton struct {
+ ToggleButton
+}
+
+// native returns a pointer to the underlying GtkMenuButton.
+func (v *MenuButton) native() *C.GtkMenuButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkMenuButton(p)
+}
+
+func marshalMenuButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapMenuButton(obj), nil
+}
+
+func wrapMenuButton(obj *glib.Object) *MenuButton {
+ actionable := wrapActionable(obj)
+ return &MenuButton{ToggleButton{Button{Bin{Container{Widget{
+ glib.InitiallyUnowned{obj}}}}, actionable}}}
+}
+
+// MenuButtonNew is a wrapper around gtk_menu_button_new().
+func MenuButtonNew() (*MenuButton, error) {
+ c := C.gtk_menu_button_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapMenuButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetPopup is a wrapper around gtk_menu_button_set_popup().
+func (v *MenuButton) SetPopup(menu IMenu) {
+ C.gtk_menu_button_set_popup(v.native(), menu.toWidget())
+}
+
+// GetPopup is a wrapper around gtk_menu_button_get_popup().
+func (v *MenuButton) GetPopup() *Menu {
+ c := C.gtk_menu_button_get_popup(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapMenu(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetMenuModel is a wrapper around gtk_menu_button_set_menu_model().
+func (v *MenuButton) SetMenuModel(menuModel *glib.MenuModel) {
+ C.gtk_menu_button_set_menu_model(v.native(), C.toGMenuModel(unsafe.Pointer(menuModel.Native())))
+}
+
+// GetMenuModel is a wrapper around gtk_menu_button_get_menu_model().
+func (v *MenuButton) GetMenuModel() *glib.MenuModel {
+ c := C.gtk_menu_button_get_menu_model(v.native())
+ if c == nil {
+ return nil
+ }
+ return &glib.MenuModel{glib.Take(unsafe.Pointer(c))}
+}
+
+// SetDirection is a wrapper around gtk_menu_button_set_direction().
+func (v *MenuButton) SetDirection(direction ArrowType) {
+ C.gtk_menu_button_set_direction(v.native(), C.GtkArrowType(direction))
+}
+
+// GetDirection is a wrapper around gtk_menu_button_get_direction().
+func (v *MenuButton) GetDirection() ArrowType {
+ c := C.gtk_menu_button_get_direction(v.native())
+ return ArrowType(c)
+}
+
+// SetAlignWidget is a wrapper around gtk_menu_button_set_align_widget().
+func (v *MenuButton) SetAlignWidget(alignWidget IWidget) {
+ C.gtk_menu_button_set_align_widget(v.native(), alignWidget.toWidget())
+}
+
+// GetAlignWidget is a wrapper around gtk_menu_button_get_align_widget().
+func (v *MenuButton) GetAlignWidget() *Widget {
+ c := C.gtk_menu_button_get_align_widget(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c)))
+}
+
+/*
+ * GtkMenuItem
+ */
+
+// MenuItem is a representation of GTK's GtkMenuItem.
+type MenuItem struct {
+ Bin
+}
+
+// IMenuItem is an interface type implemented by all structs
+// embedding a MenuItem. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkMenuItem.
+type IMenuItem interface {
+ toMenuItem() *C.GtkMenuItem
+ toWidget() *C.GtkWidget
+}
+
+// native returns a pointer to the underlying GtkMenuItem.
+func (v *MenuItem) native() *C.GtkMenuItem {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkMenuItem(p)
+}
+
+func (v *MenuItem) toMenuItem() *C.GtkMenuItem {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func marshalMenuItem(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapMenuItem(obj), nil
+}
+
+func wrapMenuItem(obj *glib.Object) *MenuItem {
+ return &MenuItem{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// MenuItemNew() is a wrapper around gtk_menu_item_new().
+func MenuItemNew() (*MenuItem, error) {
+ c := C.gtk_menu_item_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// MenuItemNewWithLabel() is a wrapper around gtk_menu_item_new_with_label().
+func MenuItemNewWithLabel(label string) (*MenuItem, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_menu_item_new_with_label((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// MenuItemNewWithMnemonic() is a wrapper around
+// gtk_menu_item_new_with_mnemonic().
+func MenuItemNewWithMnemonic(label string) (*MenuItem, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_menu_item_new_with_mnemonic((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetSubmenu() is a wrapper around gtk_menu_item_set_submenu().
+func (v *MenuItem) SetSubmenu(submenu IWidget) {
+ C.gtk_menu_item_set_submenu(v.native(), submenu.toWidget())
+}
+
+// Sets text on the menu_item label
+func (v *MenuItem) SetLabel(label string) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_menu_item_set_label(v.native(), (*C.gchar)(cstr))
+}
+
+// Gets text on the menu_item label
+func (v *MenuItem) GetLabel() string {
+ l := C.gtk_menu_item_get_label(v.native())
+ return goString(l)
+}
+
+/*
+ * GtkMessageDialog
+ */
+
+// MessageDialog is a representation of GTK's GtkMessageDialog.
+type MessageDialog struct {
+ Dialog
+}
+
+// native returns a pointer to the underlying GtkMessageDialog.
+func (v *MessageDialog) native() *C.GtkMessageDialog {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkMessageDialog(p)
+}
+
+func marshalMessageDialog(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapMessageDialog(obj), nil
+}
+
+func wrapMessageDialog(obj *glib.Object) *MessageDialog {
+ return &MessageDialog{Dialog{Window{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}}}
+}
+
+// MessageDialogNew() is a wrapper around gtk_message_dialog_new().
+// The text is created and formatted by the format specifier and any
+// additional arguments.
+func MessageDialogNew(parent IWindow, flags DialogFlags, mType MessageType, buttons ButtonsType, format string, a ...interface{}) *MessageDialog {
+ s := fmt.Sprintf(format, a...)
+ cstr := C.CString(s)
+ defer C.free(unsafe.Pointer(cstr))
+ var w *C.GtkWindow = nil
+ if parent != nil {
+ w = parent.toWindow()
+ }
+ c := C._gtk_message_dialog_new(w,
+ C.GtkDialogFlags(flags), C.GtkMessageType(mType),
+ C.GtkButtonsType(buttons), cstr)
+ return wrapMessageDialog(glib.Take(unsafe.Pointer(c)))
+}
+
+// MessageDialogNewWithMarkup is a wrapper around
+// gtk_message_dialog_new_with_markup().
+func MessageDialogNewWithMarkup(parent IWindow, flags DialogFlags, mType MessageType, buttons ButtonsType, format string, a ...interface{}) *MessageDialog {
+ s := fmt.Sprintf(format, a...)
+ cstr := C.CString(s)
+ defer C.free(unsafe.Pointer(cstr))
+ var w *C.GtkWindow = nil
+ if parent != nil {
+ w = parent.toWindow()
+ }
+ c := C._gtk_message_dialog_new_with_markup(w,
+ C.GtkDialogFlags(flags), C.GtkMessageType(mType),
+ C.GtkButtonsType(buttons), cstr)
+ return wrapMessageDialog(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetMarkup is a wrapper around gtk_message_dialog_set_markup().
+func (v *MessageDialog) SetMarkup(str string) {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_message_dialog_set_markup(v.native(), (*C.gchar)(cstr))
+}
+
+// FormatSecondaryText is a wrapper around
+// gtk_message_dialog_format_secondary_text().
+func (v *MessageDialog) FormatSecondaryText(format string, a ...interface{}) {
+ s := fmt.Sprintf(format, a...)
+ cstr := C.CString(s)
+ defer C.free(unsafe.Pointer(cstr))
+ C._gtk_message_dialog_format_secondary_text(v.native(),
+ (*C.gchar)(cstr))
+}
+
+// FormatSecondaryMarkup is a wrapper around
+// gtk_message_dialog_format_secondary_text().
+func (v *MessageDialog) FormatSecondaryMarkup(format string, a ...interface{}) {
+ s := fmt.Sprintf(format, a...)
+ cstr := C.CString(s)
+ defer C.free(unsafe.Pointer(cstr))
+ C._gtk_message_dialog_format_secondary_markup(v.native(),
+ (*C.gchar)(cstr))
+}
+
+/*
+ * GtkNotebook
+ */
+
+// Notebook is a representation of GTK's GtkNotebook.
+type Notebook struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkNotebook.
+func (v *Notebook) native() *C.GtkNotebook {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkNotebook(p)
+}
+
+func marshalNotebook(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapNotebook(obj), nil
+}
+
+func wrapNotebook(obj *glib.Object) *Notebook {
+ return &Notebook{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// NotebookNew() is a wrapper around gtk_notebook_new().
+func NotebookNew() (*Notebook, error) {
+ c := C.gtk_notebook_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapNotebook(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// AppendPage() is a wrapper around gtk_notebook_append_page().
+func (v *Notebook) AppendPage(child IWidget, tabLabel IWidget) int {
+ cTabLabel := nullableWidget(tabLabel)
+ c := C.gtk_notebook_append_page(v.native(), child.toWidget(), cTabLabel)
+ return int(c)
+}
+
+// AppendPageMenu() is a wrapper around gtk_notebook_append_page_menu().
+func (v *Notebook) AppendPageMenu(child IWidget, tabLabel IWidget, menuLabel IWidget) int {
+ c := C.gtk_notebook_append_page_menu(v.native(), child.toWidget(),
+ tabLabel.toWidget(), menuLabel.toWidget())
+ return int(c)
+}
+
+// PrependPage() is a wrapper around gtk_notebook_prepend_page().
+func (v *Notebook) PrependPage(child IWidget, tabLabel IWidget) int {
+ cTabLabel := nullableWidget(tabLabel)
+ c := C.gtk_notebook_prepend_page(v.native(), child.toWidget(), cTabLabel)
+ return int(c)
+}
+
+// PrependPageMenu() is a wrapper around gtk_notebook_prepend_page_menu().
+func (v *Notebook) PrependPageMenu(child IWidget, tabLabel IWidget, menuLabel IWidget) int {
+ c := C.gtk_notebook_prepend_page_menu(v.native(), child.toWidget(),
+ tabLabel.toWidget(), menuLabel.toWidget())
+ return int(c)
+}
+
+// InsertPage() is a wrapper around gtk_notebook_insert_page().
+func (v *Notebook) InsertPage(child IWidget, tabLabel IWidget, position int) int {
+ label := nullableWidget(tabLabel)
+ c := C.gtk_notebook_insert_page(v.native(), child.toWidget(), label, C.gint(position))
+
+ return int(c)
+}
+
+// InsertPageMenu() is a wrapper around gtk_notebook_insert_page_menu().
+func (v *Notebook) InsertPageMenu(child IWidget, tabLabel IWidget, menuLabel IWidget, position int) int {
+ c := C.gtk_notebook_insert_page_menu(v.native(), child.toWidget(),
+ tabLabel.toWidget(), menuLabel.toWidget(), C.gint(position))
+ return int(c)
+}
+
+// RemovePage() is a wrapper around gtk_notebook_remove_page().
+func (v *Notebook) RemovePage(pageNum int) {
+ C.gtk_notebook_remove_page(v.native(), C.gint(pageNum))
+}
+
+// PageNum() is a wrapper around gtk_notebook_page_num().
+func (v *Notebook) PageNum(child IWidget) int {
+ c := C.gtk_notebook_page_num(v.native(), child.toWidget())
+ return int(c)
+}
+
+// NextPage() is a wrapper around gtk_notebook_next_page().
+func (v *Notebook) NextPage() {
+ C.gtk_notebook_next_page(v.native())
+}
+
+// PrevPage() is a wrapper around gtk_notebook_prev_page().
+func (v *Notebook) PrevPage() {
+ C.gtk_notebook_prev_page(v.native())
+}
+
+// ReorderChild() is a wrapper around gtk_notebook_reorder_child().
+func (v *Notebook) ReorderChild(child IWidget, position int) {
+ C.gtk_notebook_reorder_child(v.native(), child.toWidget(),
+ C.gint(position))
+}
+
+// SetTabPos() is a wrapper around gtk_notebook_set_tab_pos().
+func (v *Notebook) SetTabPos(pos PositionType) {
+ C.gtk_notebook_set_tab_pos(v.native(), C.GtkPositionType(pos))
+}
+
+// SetShowTabs() is a wrapper around gtk_notebook_set_show_tabs().
+func (v *Notebook) SetShowTabs(showTabs bool) {
+ C.gtk_notebook_set_show_tabs(v.native(), gbool(showTabs))
+}
+
+// SetShowBorder() is a wrapper around gtk_notebook_set_show_border().
+func (v *Notebook) SetShowBorder(showBorder bool) {
+ C.gtk_notebook_set_show_border(v.native(), gbool(showBorder))
+}
+
+// SetScrollable() is a wrapper around gtk_notebook_set_scrollable().
+func (v *Notebook) SetScrollable(scrollable bool) {
+ C.gtk_notebook_set_scrollable(v.native(), gbool(scrollable))
+}
+
+// PopupEnable() is a wrapper around gtk_notebook_popup_enable().
+func (v *Notebook) PopupEnable() {
+ C.gtk_notebook_popup_enable(v.native())
+}
+
+// PopupDisable() is a wrapper around gtk_notebook_popup_disable().
+func (v *Notebook) PopupDisable() {
+ C.gtk_notebook_popup_disable(v.native())
+}
+
+// GetCurrentPage() is a wrapper around gtk_notebook_get_current_page().
+func (v *Notebook) GetCurrentPage() int {
+ c := C.gtk_notebook_get_current_page(v.native())
+ return int(c)
+}
+
+// GetMenuLabel() is a wrapper around gtk_notebook_get_menu_label().
+func (v *Notebook) GetMenuLabel(child IWidget) (*Widget, error) {
+ c := C.gtk_notebook_get_menu_label(v.native(), child.toWidget())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetNthPage() is a wrapper around gtk_notebook_get_nth_page().
+func (v *Notebook) GetNthPage(pageNum int) (*Widget, error) {
+ c := C.gtk_notebook_get_nth_page(v.native(), C.gint(pageNum))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetNPages() is a wrapper around gtk_notebook_get_n_pages().
+func (v *Notebook) GetNPages() int {
+ c := C.gtk_notebook_get_n_pages(v.native())
+ return int(c)
+}
+
+// GetTabLabel() is a wrapper around gtk_notebook_get_tab_label().
+func (v *Notebook) GetTabLabel(child IWidget) (*Widget, error) {
+ c := C.gtk_notebook_get_tab_label(v.native(), child.toWidget())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetMenuLabel() is a wrapper around gtk_notebook_set_menu_label().
+func (v *Notebook) SetMenuLabel(child, menuLabel IWidget) {
+ C.gtk_notebook_set_menu_label(v.native(), child.toWidget(),
+ menuLabel.toWidget())
+}
+
+// SetMenuLabelText() is a wrapper around gtk_notebook_set_menu_label_text().
+func (v *Notebook) SetMenuLabelText(child IWidget, menuText string) {
+ cstr := C.CString(menuText)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_notebook_set_menu_label_text(v.native(), child.toWidget(),
+ (*C.gchar)(cstr))
+}
+
+// SetTabLabel() is a wrapper around gtk_notebook_set_tab_label().
+func (v *Notebook) SetTabLabel(child, tabLabel IWidget) {
+ C.gtk_notebook_set_tab_label(v.native(), child.toWidget(),
+ tabLabel.toWidget())
+}
+
+// SetTabLabelText() is a wrapper around gtk_notebook_set_tab_label_text().
+func (v *Notebook) SetTabLabelText(child IWidget, tabText string) {
+ cstr := C.CString(tabText)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_notebook_set_tab_label_text(v.native(), child.toWidget(),
+ (*C.gchar)(cstr))
+}
+
+// SetTabReorderable() is a wrapper around gtk_notebook_set_tab_reorderable().
+func (v *Notebook) SetTabReorderable(child IWidget, reorderable bool) {
+ C.gtk_notebook_set_tab_reorderable(v.native(), child.toWidget(),
+ gbool(reorderable))
+}
+
+// SetTabDetachable() is a wrapper around gtk_notebook_set_tab_detachable().
+func (v *Notebook) SetTabDetachable(child IWidget, detachable bool) {
+ C.gtk_notebook_set_tab_detachable(v.native(), child.toWidget(),
+ gbool(detachable))
+}
+
+// GetMenuLabelText() is a wrapper around gtk_notebook_get_menu_label_text().
+func (v *Notebook) GetMenuLabelText(child IWidget) (string, error) {
+ c := C.gtk_notebook_get_menu_label_text(v.native(), child.toWidget())
+ if c == nil {
+ return "", errors.New("No menu label for widget")
+ }
+ return goString(c), nil
+}
+
+// GetScrollable() is a wrapper around gtk_notebook_get_scrollable().
+func (v *Notebook) GetScrollable() bool {
+ c := C.gtk_notebook_get_scrollable(v.native())
+ return gobool(c)
+}
+
+// GetShowBorder() is a wrapper around gtk_notebook_get_show_border().
+func (v *Notebook) GetShowBorder() bool {
+ c := C.gtk_notebook_get_show_border(v.native())
+ return gobool(c)
+}
+
+// GetShowTabs() is a wrapper around gtk_notebook_get_show_tabs().
+func (v *Notebook) GetShowTabs() bool {
+ c := C.gtk_notebook_get_show_tabs(v.native())
+ return gobool(c)
+}
+
+// GetTabLabelText() is a wrapper around gtk_notebook_get_tab_label_text().
+func (v *Notebook) GetTabLabelText(child IWidget) (string, error) {
+ c := C.gtk_notebook_get_tab_label_text(v.native(), child.toWidget())
+ if c == nil {
+ return "", errors.New("No tab label for widget")
+ }
+ return goString(c), nil
+}
+
+// GetTabPos() is a wrapper around gtk_notebook_get_tab_pos().
+func (v *Notebook) GetTabPos() PositionType {
+ c := C.gtk_notebook_get_tab_pos(v.native())
+ return PositionType(c)
+}
+
+// GetTabReorderable() is a wrapper around gtk_notebook_get_tab_reorderable().
+func (v *Notebook) GetTabReorderable(child IWidget) bool {
+ c := C.gtk_notebook_get_tab_reorderable(v.native(), child.toWidget())
+ return gobool(c)
+}
+
+// GetTabDetachable() is a wrapper around gtk_notebook_get_tab_detachable().
+func (v *Notebook) GetTabDetachable(child IWidget) bool {
+ c := C.gtk_notebook_get_tab_detachable(v.native(), child.toWidget())
+ return gobool(c)
+}
+
+// SetCurrentPage() is a wrapper around gtk_notebook_set_current_page().
+func (v *Notebook) SetCurrentPage(pageNum int) {
+ C.gtk_notebook_set_current_page(v.native(), C.gint(pageNum))
+}
+
+// SetGroupName() is a wrapper around gtk_notebook_set_group_name().
+func (v *Notebook) SetGroupName(groupName string) {
+ cstr := C.CString(groupName)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_notebook_set_group_name(v.native(), (*C.gchar)(cstr))
+}
+
+// GetGroupName() is a wrapper around gtk_notebook_get_group_name().
+func (v *Notebook) GetGroupName() (string, error) {
+ c := C.gtk_notebook_get_group_name(v.native())
+ if c == nil {
+ return "", errors.New("No group name")
+ }
+ return goString(c), nil
+}
+
+// SetActionWidget() is a wrapper around gtk_notebook_set_action_widget().
+func (v *Notebook) SetActionWidget(widget IWidget, packType PackType) {
+ C.gtk_notebook_set_action_widget(v.native(), widget.toWidget(),
+ C.GtkPackType(packType))
+}
+
+// GetActionWidget() is a wrapper around gtk_notebook_get_action_widget().
+func (v *Notebook) GetActionWidget(packType PackType) (*Widget, error) {
+ c := C.gtk_notebook_get_action_widget(v.native(),
+ C.GtkPackType(packType))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkOffscreenWindow
+ */
+
+// OffscreenWindow is a representation of GTK's GtkOffscreenWindow.
+type OffscreenWindow struct {
+ Window
+}
+
+// native returns a pointer to the underlying GtkOffscreenWindow.
+func (v *OffscreenWindow) native() *C.GtkOffscreenWindow {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkOffscreenWindow(p)
+}
+
+func marshalOffscreenWindow(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapOffscreenWindow(obj), nil
+}
+
+func wrapOffscreenWindow(obj *glib.Object) *OffscreenWindow {
+ return &OffscreenWindow{Window{Bin{Container{Widget{
+ glib.InitiallyUnowned{obj}}}}}}
+}
+
+// OffscreenWindowNew is a wrapper around gtk_offscreen_window_new().
+func OffscreenWindowNew() (*OffscreenWindow, error) {
+ c := C.gtk_offscreen_window_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapOffscreenWindow(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetSurface is a wrapper around gtk_offscreen_window_get_surface().
+// The returned surface is safe to use over window resizes.
+func (v *OffscreenWindow) GetSurface() (*cairo.Surface, error) {
+ c := C.gtk_offscreen_window_get_surface(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ cairoPtr := (uintptr)(unsafe.Pointer(c))
+ s := cairo.NewSurface(cairoPtr, true)
+ return s, nil
+}
+
+// GetPixbuf is a wrapper around gtk_offscreen_window_get_pixbuf().
+func (v *OffscreenWindow) GetPixbuf() (*gdk.Pixbuf, error) {
+ c := C.gtk_offscreen_window_get_pixbuf(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ // Pixbuf is returned with ref count of 1, so don't increment.
+ // Is it a floating reference?
+ pb := &gdk.Pixbuf{glib.Take(unsafe.Pointer(c))}
+ return pb, nil
+}
+
+/*
+ * GtkOrientable
+ */
+
+// Orientable is a representation of GTK's GtkOrientable GInterface.
+type Orientable struct {
+ *glib.Object
+}
+
+// IOrientable is an interface type implemented by all structs
+// embedding an Orientable. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkOrientable.
+type IOrientable interface {
+ toOrientable() *C.GtkOrientable
+}
+
+// native returns a pointer to the underlying GObject as a GtkOrientable.
+func (v *Orientable) native() *C.GtkOrientable {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkOrientable(p)
+}
+
+func marshalOrientable(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapOrientable(obj), nil
+}
+
+func wrapOrientable(obj *glib.Object) *Orientable {
+ return &Orientable{obj}
+}
+
+// GetOrientation() is a wrapper around gtk_orientable_get_orientation().
+func (v *Orientable) GetOrientation() Orientation {
+ c := C.gtk_orientable_get_orientation(v.native())
+ return Orientation(c)
+}
+
+// SetOrientation() is a wrapper around gtk_orientable_set_orientation().
+func (v *Orientable) SetOrientation(orientation Orientation) {
+ C.gtk_orientable_set_orientation(v.native(),
+ C.GtkOrientation(orientation))
+}
+
+/*
+ * GtkOverlay
+ */
+
+// Overlay is a representation of GTK's GtkOverlay.
+type Overlay struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkOverlay.
+func (v *Overlay) native() *C.GtkOverlay {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkOverlay(p)
+}
+
+func marshalOverlay(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapOverlay(obj), nil
+}
+
+func wrapOverlay(obj *glib.Object) *Overlay {
+ return &Overlay{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// OverlayNew() is a wrapper around gtk_overlay_new().
+func OverlayNew() (*Overlay, error) {
+ c := C.gtk_overlay_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapOverlay(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// AddOverlay() is a wrapper around gtk_overlay_add_overlay().
+func (v *Overlay) AddOverlay(widget IWidget) {
+ C.gtk_overlay_add_overlay(v.native(), widget.toWidget())
+}
+
+/*
+ * GtkPaned
+ */
+
+// Paned is a representation of GTK's GtkPaned.
+type Paned struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkPaned.
+func (v *Paned) native() *C.GtkPaned {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkPaned(p)
+}
+
+func marshalPaned(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPaned(obj), nil
+}
+
+func wrapPaned(obj *glib.Object) *Paned {
+ return &Paned{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// PanedNew() is a wrapper around gtk_paned_new().
+func PanedNew(orientation Orientation) (*Paned, error) {
+ c := C.gtk_paned_new(C.GtkOrientation(orientation))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapPaned(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// Add1() is a wrapper around gtk_paned_add1().
+func (v *Paned) Add1(child IWidget) {
+ C.gtk_paned_add1(v.native(), child.toWidget())
+}
+
+// Add2() is a wrapper around gtk_paned_add2().
+func (v *Paned) Add2(child IWidget) {
+ C.gtk_paned_add2(v.native(), child.toWidget())
+}
+
+// Pack1() is a wrapper around gtk_paned_pack1().
+func (v *Paned) Pack1(child IWidget, resize, shrink bool) {
+ C.gtk_paned_pack1(v.native(), child.toWidget(), gbool(resize), gbool(shrink))
+}
+
+// Pack2() is a wrapper around gtk_paned_pack2().
+func (v *Paned) Pack2(child IWidget, resize, shrink bool) {
+ C.gtk_paned_pack2(v.native(), child.toWidget(), gbool(resize), gbool(shrink))
+}
+
+// SetPosition() is a wrapper around gtk_paned_set_position().
+func (v *Paned) SetPosition(position int) {
+ C.gtk_paned_set_position(v.native(), C.gint(position))
+}
+
+// GetChild1() is a wrapper around gtk_paned_get_child1().
+func (v *Paned) GetChild1() (*Widget, error) {
+ c := C.gtk_paned_get_child1(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetChild2() is a wrapper around gtk_paned_get_child2().
+func (v *Paned) GetChild2() (*Widget, error) {
+ c := C.gtk_paned_get_child2(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetHandleWindow() is a wrapper around gtk_paned_get_handle_window().
+func (v *Paned) GetHandleWindow() (*Window, error) {
+ c := C.gtk_paned_get_handle_window(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWindow(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetPosition() is a wrapper around gtk_paned_get_position().
+func (v *Paned) GetPosition() int {
+ return int(C.gtk_paned_get_position(v.native()))
+}
+
+/*
+ * GtkProgressBar
+ */
+
+// ProgressBar is a representation of GTK's GtkProgressBar.
+type ProgressBar struct {
+ Widget
+ // Interfaces
+ Orientable
+}
+
+// native returns a pointer to the underlying GtkProgressBar.
+func (v *ProgressBar) native() *C.GtkProgressBar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkProgressBar(p)
+}
+
+func marshalProgressBar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapProgressBar(obj), nil
+}
+
+func wrapProgressBar(obj *glib.Object) *ProgressBar {
+ o := wrapOrientable(obj)
+ return &ProgressBar{Widget{glib.InitiallyUnowned{obj}}, *o}
+}
+
+// ProgressBarNew() is a wrapper around gtk_progress_bar_new().
+func ProgressBarNew() (*ProgressBar, error) {
+ c := C.gtk_progress_bar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapProgressBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetFraction() is a wrapper around gtk_progress_bar_set_fraction().
+func (v *ProgressBar) SetFraction(fraction float64) {
+ C.gtk_progress_bar_set_fraction(v.native(), C.gdouble(fraction))
+}
+
+// GetFraction() is a wrapper around gtk_progress_bar_get_fraction().
+func (v *ProgressBar) GetFraction() float64 {
+ c := C.gtk_progress_bar_get_fraction(v.native())
+ return float64(c)
+}
+
+// SetShowText is a wrapper around gtk_progress_bar_set_show_text().
+func (v *ProgressBar) SetShowText(showText bool) {
+ C.gtk_progress_bar_set_show_text(v.native(), gbool(showText))
+}
+
+// GetShowText is a wrapper around gtk_progress_bar_get_show_text().
+func (v *ProgressBar) GetShowText() bool {
+ c := C.gtk_progress_bar_get_show_text(v.native())
+ return gobool(c)
+}
+
+// SetText() is a wrapper around gtk_progress_bar_set_text().
+func (v *ProgressBar) SetText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_progress_bar_set_text(v.native(), (*C.gchar)(cstr))
+}
+
+// SetPulseStep is a wrapper around gtk_progress_bar_set_pulse_step().
+func (v *ProgressBar) SetPulseStep(fraction float64) {
+ C.gtk_progress_bar_set_pulse_step(v.native(), C.gdouble(fraction))
+}
+
+// GetPulseStep is a wrapper around gtk_progress_bar_get_pulse_step().
+func (v *ProgressBar) GetPulseStep() float64 {
+ c := C.gtk_progress_bar_get_pulse_step(v.native())
+ return float64(c)
+}
+
+// Pulse is a wrapper arountd gtk_progress_bar_pulse().
+func (v *ProgressBar) Pulse() {
+ C.gtk_progress_bar_pulse(v.native())
+}
+
+// SetInverted is a wrapper around gtk_progress_bar_set_inverted().
+func (v *ProgressBar) SetInverted(inverted bool) {
+ C.gtk_progress_bar_set_inverted(v.native(), gbool(inverted))
+}
+
+// GetInverted is a wrapper around gtk_progress_bar_get_inverted().
+func (v *ProgressBar) GetInverted() bool {
+ c := C.gtk_progress_bar_get_inverted(v.native())
+ return gobool(c)
+}
+
+/*
+ * GtkRadioButton
+ */
+
+// RadioButton is a representation of GTK's GtkRadioButton.
+type RadioButton struct {
+ CheckButton
+}
+
+// native returns a pointer to the underlying GtkRadioButton.
+func (v *RadioButton) native() *C.GtkRadioButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkRadioButton(p)
+}
+
+func marshalRadioButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapRadioButton(obj), nil
+}
+
+func wrapRadioButton(obj *glib.Object) *RadioButton {
+ actionable := wrapActionable(obj)
+ return &RadioButton{CheckButton{ToggleButton{Button{Bin{Container{
+ Widget{glib.InitiallyUnowned{obj}}}}, actionable}}}}
+}
+
+// RadioButtonNew is a wrapper around gtk_radio_button_new().
+func RadioButtonNew(group *glib.SList) (*RadioButton, error) {
+ c := C.gtk_radio_button_new(cGSList(group))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioButtonNewFromWidget is a wrapper around
+// gtk_radio_button_new_from_widget().
+func RadioButtonNewFromWidget(radioGroupMember *RadioButton) (*RadioButton, error) {
+ c := C.gtk_radio_button_new_from_widget(radioGroupMember.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioButtonNewWithLabel is a wrapper around
+// gtk_radio_button_new_with_label().
+func RadioButtonNewWithLabel(group *glib.SList, label string) (*RadioButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_radio_button_new_with_label(cGSList(group), (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioButtonNewWithLabelFromWidget is a wrapper around
+// gtk_radio_button_new_with_label_from_widget().
+func RadioButtonNewWithLabelFromWidget(radioGroupMember *RadioButton, label string) (*RadioButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ var cradio *C.GtkRadioButton
+ if radioGroupMember != nil {
+ cradio = radioGroupMember.native()
+ }
+ c := C.gtk_radio_button_new_with_label_from_widget(cradio, (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioButtonNewWithMnemonic is a wrapper around
+// gtk_radio_button_new_with_mnemonic()
+func RadioButtonNewWithMnemonic(group *glib.SList, label string) (*RadioButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_radio_button_new_with_mnemonic(cGSList(group), (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioButtonNewWithMnemonicFromWidget is a wrapper around
+// gtk_radio_button_new_with_mnemonic_from_widget().
+func RadioButtonNewWithMnemonicFromWidget(radioGroupMember *RadioButton, label string) (*RadioButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ var cradio *C.GtkRadioButton
+ if radioGroupMember != nil {
+ cradio = radioGroupMember.native()
+ }
+ c := C.gtk_radio_button_new_with_mnemonic_from_widget(cradio,
+ (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetGroup is a wrapper around gtk_radio_button_set_group().
+func (v *RadioButton) SetGroup(group *glib.SList) {
+ C.gtk_radio_button_set_group(v.native(), cGSList(group))
+}
+
+// GetGroup is a wrapper around gtk_radio_button_get_group().
+func (v *RadioButton) GetGroup() (*glib.SList, error) {
+ c := C.gtk_radio_button_get_group(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return glib.WrapSList(uintptr(unsafe.Pointer(c))), nil
+}
+
+// JoinGroup is a wrapper around gtk_radio_button_join_group().
+func (v *RadioButton) JoinGroup(groupSource *RadioButton) {
+ var cgroup *C.GtkRadioButton
+ if groupSource != nil {
+ cgroup = groupSource.native()
+ }
+ C.gtk_radio_button_join_group(v.native(), cgroup)
+}
+
+/*
+ * GtkRadioMenuItem
+ */
+
+// RadioMenuItem is a representation of GTK's GtkRadioMenuItem.
+type RadioMenuItem struct {
+ CheckMenuItem
+}
+
+// native returns a pointer to the underlying GtkRadioMenuItem.
+func (v *RadioMenuItem) native() *C.GtkRadioMenuItem {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkRadioMenuItem(p)
+}
+
+func marshalRadioMenuItem(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapRadioMenuItem(obj), nil
+}
+
+func wrapRadioMenuItem(obj *glib.Object) *RadioMenuItem {
+ return &RadioMenuItem{CheckMenuItem{MenuItem{Bin{Container{
+ Widget{glib.InitiallyUnowned{obj}}}}}}}
+}
+
+// RadioMenuItemNew is a wrapper around gtk_radio_menu_item_new().
+func RadioMenuItemNew(group *glib.SList) (*RadioMenuItem, error) {
+ c := C.gtk_radio_menu_item_new(cGSList(group))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioMenuItemNewWithLabel is a wrapper around
+// gtk_radio_menu_item_new_with_label().
+func RadioMenuItemNewWithLabel(group *glib.SList, label string) (*RadioMenuItem, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_radio_menu_item_new_with_label(cGSList(group), (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioMenuItemNewWithMnemonic is a wrapper around
+// gtk_radio_menu_item_new_with_mnemonic().
+func RadioMenuItemNewWithMnemonic(group *glib.SList, label string) (*RadioMenuItem, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_radio_menu_item_new_with_mnemonic(cGSList(group), (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioMenuItemNewFromWidget is a wrapper around
+// gtk_radio_menu_item_new_from_widget().
+func RadioMenuItemNewFromWidget(group *RadioMenuItem) (*RadioMenuItem, error) {
+ c := C.gtk_radio_menu_item_new_from_widget(group.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioMenuItemNewWithLabelFromWidget is a wrapper around
+// gtk_radio_menu_item_new_with_label_from_widget().
+func RadioMenuItemNewWithLabelFromWidget(group *RadioMenuItem, label string) (*RadioMenuItem, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_radio_menu_item_new_with_label_from_widget(group.native(),
+ (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// RadioMenuItemNewWithMnemonicFromWidget is a wrapper around
+// gtk_radio_menu_item_new_with_mnemonic_from_widget().
+func RadioMenuItemNewWithMnemonicFromWidget(group *RadioMenuItem, label string) (*RadioMenuItem, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_radio_menu_item_new_with_mnemonic_from_widget(group.native(),
+ (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRadioMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetGroup is a wrapper around gtk_radio_menu_item_set_group().
+func (v *RadioMenuItem) SetGroup(group *glib.SList) {
+ C.gtk_radio_menu_item_set_group(v.native(), cGSList(group))
+}
+
+// GetGroup is a wrapper around gtk_radio_menu_item_get_group().
+func (v *RadioMenuItem) GetGroup() (*glib.SList, error) {
+ c := C.gtk_radio_menu_item_get_group(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return glib.WrapSList(uintptr(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkRange
+ */
+
+// Range is a representation of GTK's GtkRange.
+type Range struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkRange.
+func (v *Range) native() *C.GtkRange {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkRange(p)
+}
+
+func marshalRange(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapRange(obj), nil
+}
+
+func wrapRange(obj *glib.Object) *Range {
+ return &Range{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// GetValue is a wrapper around gtk_range_get_value().
+func (v *Range) GetValue() float64 {
+ c := C.gtk_range_get_value(v.native())
+ return float64(c)
+}
+
+// SetValue is a wrapper around gtk_range_set_value().
+func (v *Range) SetValue(value float64) {
+ C.gtk_range_set_value(v.native(), C.gdouble(value))
+}
+
+// SetIncrements() is a wrapper around gtk_range_set_increments().
+func (v *Range) SetIncrements(step, page float64) {
+ C.gtk_range_set_increments(v.native(), C.gdouble(step), C.gdouble(page))
+}
+
+// SetRange() is a wrapper around gtk_range_set_range().
+func (v *Range) SetRange(min, max float64) {
+ C.gtk_range_set_range(v.native(), C.gdouble(min), C.gdouble(max))
+}
+
+// IRecentChooser is an interface type implemented by all structs
+// embedding a RecentChooser. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkWidget.
+type IRecentChooser interface {
+ toRecentChooser() *C.GtkRecentChooser
+}
+
+/*
+ * GtkRecentChooser
+ */
+
+// RecentChooser is a representation of GTK's GtkRecentChooser.
+type RecentChooser struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkRecentChooser.
+func (v *RecentChooser) native() *C.GtkRecentChooser {
+ if v == nil || v.Object == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkRecentChooser(p)
+}
+
+func wrapRecentChooser(obj *glib.Object) *RecentChooser {
+ return &RecentChooser{obj}
+}
+
+func (v *RecentChooser) toRecentChooser() *C.GtkRecentChooser {
+ return v.native()
+}
+
+func (v *RecentChooser) GetCurrentUri() string {
+ curi := C.gtk_recent_chooser_get_current_uri(v.native())
+ return goString(curi)
+}
+
+func (v *RecentChooser) AddFilter(filter *RecentFilter) {
+ C.gtk_recent_chooser_add_filter(v.native(), filter.native())
+}
+
+func (v *RecentChooser) RemoveFilter(filter *RecentFilter) {
+ C.gtk_recent_chooser_remove_filter(v.native(), filter.native())
+}
+
+/*
+ * GtkRecentChooserMenu
+ */
+
+// RecentChooserMenu is a representation of GTK's GtkRecentChooserMenu.
+type RecentChooserMenu struct {
+ Menu
+ RecentChooser
+}
+
+// native returns a pointer to the underlying GtkRecentManager.
+func (v *RecentChooserMenu) native() *C.GtkRecentChooserMenu {
+ if v == nil || v.Object == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkRecentChooserMenu(p)
+}
+
+func wrapRecentChooserMenu(obj *glib.Object) *RecentChooserMenu {
+ return &RecentChooserMenu{
+ Menu{MenuShell{Container{Widget{glib.InitiallyUnowned{obj}}}}},
+ RecentChooser{obj},
+ }
+}
+
+/*
+ * GtkRecentFilter
+ */
+
+// RecentFilter is a representation of GTK's GtkRecentFilter.
+type RecentFilter struct {
+ glib.InitiallyUnowned
+}
+
+// native returns a pointer to the underlying GtkRecentFilter.
+func (v *RecentFilter) native() *C.GtkRecentFilter {
+ if v == nil || v.Object == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkRecentFilter(p)
+}
+
+func wrapRecentFilter(obj *glib.Object) *RecentFilter {
+ return &RecentFilter{glib.InitiallyUnowned{obj}}
+}
+
+// RecentFilterNew is a wrapper around gtk_recent_filter_new().
+func RecentFilterNew() (*RecentFilter, error) {
+ c := C.gtk_recent_filter_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRecentFilter(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkRecentManager
+ */
+
+// RecentManager is a representation of GTK's GtkRecentManager.
+type RecentManager struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkRecentManager.
+func (v *RecentManager) native() *C.GtkRecentManager {
+ if v == nil || v.Object == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkRecentManager(p)
+}
+
+func marshalRecentManager(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapRecentManager(obj), nil
+}
+
+func wrapRecentManager(obj *glib.Object) *RecentManager {
+ return &RecentManager{obj}
+}
+
+// RecentManagerGetDefault is a wrapper around gtk_recent_manager_get_default().
+func RecentManagerGetDefault() (*RecentManager, error) {
+ c := C.gtk_recent_manager_get_default()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ v := wrapRecentManager(obj)
+ return v, nil
+}
+
+// AddItem is a wrapper around gtk_recent_manager_add_item().
+func (v *RecentManager) AddItem(fileURI string) bool {
+ cstr := C.CString(fileURI)
+ defer C.free(unsafe.Pointer(cstr))
+ cok := C.gtk_recent_manager_add_item(v.native(), (*C.gchar)(cstr))
+ return gobool(cok)
+}
+
+/*
+ * GtkScale
+ */
+
+// Scale is a representation of GTK's GtkScale.
+type Scale struct {
+ Range
+}
+
+// native returns a pointer to the underlying GtkScale.
+func (v *Scale) native() *C.GtkScale {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkScale(p)
+}
+
+func marshalScale(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapScale(obj), nil
+}
+
+func wrapScale(obj *glib.Object) *Scale {
+ return &Scale{Range{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// ScaleNew is a wrapper around gtk_scale_new().
+func ScaleNew(orientation Orientation, adjustment *Adjustment) (*Scale, error) {
+ c := C.gtk_scale_new(C.GtkOrientation(orientation), adjustment.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapScale(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// ScaleNewWithRange is a wrapper around gtk_scale_new_with_range().
+func ScaleNewWithRange(orientation Orientation, min, max, step float64) (*Scale, error) {
+ c := C.gtk_scale_new_with_range(C.GtkOrientation(orientation),
+ C.gdouble(min), C.gdouble(max), C.gdouble(step))
+
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapScale(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetDrawValue() is a wrapper around gtk_scale_set_draw_value().
+func (v *Scale) SetDrawValue(drawValue bool) {
+ C.gtk_scale_set_draw_value(v.native(), gbool(drawValue))
+}
+
+/*
+ * GtkScaleButton
+ */
+
+// ScaleButton is a representation of GTK's GtkScaleButton.
+type ScaleButton struct {
+ Button
+}
+
+// native() returns a pointer to the underlying GtkScaleButton.
+func (v *ScaleButton) native() *C.GtkScaleButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkScaleButton(p)
+}
+
+func marshalScaleButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapScaleButton(obj), nil
+}
+
+func wrapScaleButton(obj *glib.Object) *ScaleButton {
+ actionable := wrapActionable(obj)
+ return &ScaleButton{Button{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}, actionable}}
+}
+
+// ScaleButtonNew() is a wrapper around gtk_scale_button_new().
+func ScaleButtonNew(size IconSize, min, max, step float64, icons []string) (*ScaleButton, error) {
+ cicons := make([]*C.gchar, len(icons))
+ for i, icon := range icons {
+ cicons[i] = (*C.gchar)(C.CString(icon))
+ defer C.free(unsafe.Pointer(cicons[i]))
+ }
+ cicons = append(cicons, nil)
+
+ c := C.gtk_scale_button_new(C.GtkIconSize(size),
+ C.gdouble(min),
+ C.gdouble(max),
+ C.gdouble(step),
+ &cicons[0])
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapScaleButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetAdjustment() is a wrapper around gtk_scale_button_get_adjustment().
+func (v *ScaleButton) GetAdjustment() *Adjustment {
+ c := C.gtk_scale_button_get_adjustment(v.native())
+ obj := glib.Take(unsafe.Pointer(c))
+ return &Adjustment{glib.InitiallyUnowned{obj}}
+}
+
+// GetPopup() is a wrapper around gtk_scale_button_get_popup().
+func (v *ScaleButton) GetPopup() (*Widget, error) {
+ c := C.gtk_scale_button_get_popup(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetValue() is a wrapper around gtk_scale_button_get_value().
+func (v *ScaleButton) GetValue() float64 {
+ return float64(C.gtk_scale_button_get_value(v.native()))
+}
+
+// SetAdjustment() is a wrapper around gtk_scale_button_set_adjustment().
+func (v *ScaleButton) SetAdjustment(adjustment *Adjustment) {
+ C.gtk_scale_button_set_adjustment(v.native(), adjustment.native())
+}
+
+// SetValue() is a wrapper around gtk_scale_button_set_value().
+func (v *ScaleButton) SetValue(value float64) {
+ C.gtk_scale_button_set_value(v.native(), C.gdouble(value))
+}
+
+/*
+ * GtkScrollable
+ */
+
+// IScrollable is an interface type implemented by all structs
+// embedding a Scrollable. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkScrollable.
+type IScrollable interface {
+ toScrollable() *C.GtkScrollable
+}
+
+// Scrollable is a representation of GTK's GtkScrollable GInterface.
+type Scrollable struct {
+ *glib.Object
+}
+
+// native() returns a pointer to the underlying GObject as a GtkScrollable.
+func (v *Scrollable) native() *C.GtkScrollable {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkScrollable(p)
+}
+
+func wrapScrollable(obj *glib.Object) *Scrollable {
+ return &Scrollable{obj}
+}
+
+func (v *Scrollable) toScrollable() *C.GtkScrollable {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// SetHAdjustment is a wrapper around gtk_scrollable_set_hadjustment().
+func (v *Scrollable) SetHAdjustment(adjustment *Adjustment) {
+ C.gtk_scrollable_set_hadjustment(v.native(), adjustment.native())
+}
+
+// GetHAdjustment is a wrapper around gtk_scrollable_get_hadjustment().
+func (v *Scrollable) GetHAdjustment() (*Adjustment, error) {
+ c := C.gtk_scrollable_get_hadjustment(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapAdjustment(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetVAdjustment is a wrapper around gtk_scrollable_set_vadjustment().
+func (v *Scrollable) SetVAdjustment(adjustment *Adjustment) {
+ C.gtk_scrollable_set_vadjustment(v.native(), adjustment.native())
+}
+
+// GetVAdjustment is a wrapper around gtk_scrollable_get_vadjustment().
+func (v *Scrollable) GetVAdjustment() (*Adjustment, error) {
+ c := C.gtk_scrollable_get_vadjustment(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapAdjustment(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkScrollbar
+ */
+
+// Scrollbar is a representation of GTK's GtkScrollbar.
+type Scrollbar struct {
+ Range
+}
+
+// native returns a pointer to the underlying GtkScrollbar.
+func (v *Scrollbar) native() *C.GtkScrollbar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkScrollbar(p)
+}
+
+func marshalScrollbar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapScrollbar(obj), nil
+}
+
+func wrapScrollbar(obj *glib.Object) *Scrollbar {
+ return &Scrollbar{Range{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// ScrollbarNew is a wrapper around gtk_scrollbar_new().
+func ScrollbarNew(orientation Orientation, adjustment *Adjustment) (*Scrollbar, error) {
+ c := C.gtk_scrollbar_new(C.GtkOrientation(orientation), adjustment.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapScrollbar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkScrolledWindow
+ */
+
+// ScrolledWindow is a representation of GTK's GtkScrolledWindow.
+type ScrolledWindow struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkScrolledWindow.
+func (v *ScrolledWindow) native() *C.GtkScrolledWindow {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkScrolledWindow(p)
+}
+
+func marshalScrolledWindow(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapScrolledWindow(obj), nil
+}
+
+func wrapScrolledWindow(obj *glib.Object) *ScrolledWindow {
+ return &ScrolledWindow{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// ScrolledWindowNew() is a wrapper around gtk_scrolled_window_new().
+func ScrolledWindowNew(hadjustment, vadjustment *Adjustment) (*ScrolledWindow, error) {
+ c := C.gtk_scrolled_window_new(hadjustment.native(),
+ vadjustment.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapScrolledWindow(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetPolicy() is a wrapper around gtk_scrolled_window_set_policy().
+func (v *ScrolledWindow) SetPolicy(hScrollbarPolicy, vScrollbarPolicy PolicyType) {
+ C.gtk_scrolled_window_set_policy(v.native(),
+ C.GtkPolicyType(hScrollbarPolicy),
+ C.GtkPolicyType(vScrollbarPolicy))
+}
+
+// GetHAdjustment() is a wrapper around gtk_scrolled_window_get_hadjustment().
+func (v *ScrolledWindow) GetHAdjustment() *Adjustment {
+ c := C.gtk_scrolled_window_get_hadjustment(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapAdjustment(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetHAdjustment is a wrapper around gtk_scrolled_window_set_hadjustment().
+func (v *ScrolledWindow) SetHAdjustment(adjustment *Adjustment) {
+ C.gtk_scrolled_window_set_hadjustment(v.native(), adjustment.native())
+}
+
+// GetVAdjustment() is a wrapper around gtk_scrolled_window_get_vadjustment().
+func (v *ScrolledWindow) GetVAdjustment() *Adjustment {
+ c := C.gtk_scrolled_window_get_vadjustment(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapAdjustment(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetVAdjustment is a wrapper around gtk_scrolled_window_set_vadjustment().
+func (v *ScrolledWindow) SetVAdjustment(adjustment *Adjustment) {
+ C.gtk_scrolled_window_set_vadjustment(v.native(), adjustment.native())
+}
+
+// GetShadowType is a wrapper around gtk_scrolled_window_get_shadow_type().
+func (v *ScrolledWindow) GetShadowType() ShadowType {
+ c := C.gtk_scrolled_window_get_shadow_type(v.native())
+ return ShadowType(c)
+}
+
+// SetShadowType is a wrapper around gtk_scrolled_window_set_shadow_type().
+func (v *ScrolledWindow) SetShadowType(t ShadowType) {
+ C.gtk_scrolled_window_set_shadow_type(v.native(), C.GtkShadowType(t))
+}
+
+/*
+ * GtkSearchEntry
+ */
+
+// SearchEntry is a reprensentation of GTK's GtkSearchEntry.
+type SearchEntry struct {
+ Entry
+}
+
+// native returns a pointer to the underlying GtkSearchEntry.
+func (v *SearchEntry) native() *C.GtkSearchEntry {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSearchEntry(p)
+}
+
+func marshalSearchEntry(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapSearchEntry(obj), nil
+}
+
+func wrapSearchEntry(obj *glib.Object) *SearchEntry {
+ e := wrapEditable(obj)
+ return &SearchEntry{Entry{Widget{glib.InitiallyUnowned{obj}}, *e}}
+}
+
+// SearchEntryNew is a wrapper around gtk_search_entry_new().
+func SearchEntryNew() (*SearchEntry, error) {
+ c := C.gtk_search_entry_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSearchEntry(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+* GtkSelectionData
+ */
+type SelectionData struct {
+ GtkSelectionData *C.GtkSelectionData
+}
+
+func marshalSelectionData(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return (*SelectionData)(unsafe.Pointer(c)), nil
+}
+
+// native returns a pointer to the underlying GtkSelectionData.
+func (v *SelectionData) native() *C.GtkSelectionData {
+ if v == nil {
+ return nil
+ }
+ return v.GtkSelectionData
+}
+
+// GetLength is a wrapper around gtk_selection_data_get_length
+func (v *SelectionData) GetLength() int {
+ return int(C.gtk_selection_data_get_length(v.native()))
+}
+
+// GetData is a wrapper around gtk_selection_data_get_data_with_length.
+// It returns a slice of the correct size with the selection's data.
+func (v *SelectionData) GetData() (data []byte) {
+ var length C.gint
+ c := C.gtk_selection_data_get_data_with_length(v.native(), &length)
+ sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&data))
+ sliceHeader.Data = uintptr(unsafe.Pointer(c))
+ sliceHeader.Len = int(length)
+ sliceHeader.Cap = int(length)
+ return
+}
+
+//fixed GetData directly from ptr
+func GetData(pointer uintptr) (data []byte) {
+ c := (*C.GValue)(unsafe.Pointer(pointer))
+ p := (*C.GtkSelectionData)(unsafe.Pointer(c))
+ C.gtk_selection_data_get_text(p)
+
+ var byteData []byte
+ var length C.gint
+ cptr := C.gtk_selection_data_get_data_with_length(p, &length)
+ sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&byteData))
+ sliceHeader.Data = uintptr(unsafe.Pointer(cptr))
+ sliceHeader.Len = int(length)
+ sliceHeader.Cap = int(length)
+
+ return byteData
+}
+
+func (v *SelectionData) free() {
+ C.gtk_selection_data_free(v.native())
+}
+
+/*
+ * GtkSeparator
+ */
+
+// Separator is a representation of GTK's GtkSeparator.
+type Separator struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkSeperator.
+func (v *Separator) native() *C.GtkSeparator {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSeparator(p)
+}
+
+func marshalSeparator(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapSeparator(obj), nil
+}
+
+func wrapSeparator(obj *glib.Object) *Separator {
+ return &Separator{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// SeparatorNew is a wrapper around gtk_separator_new().
+func SeparatorNew(orientation Orientation) (*Separator, error) {
+ c := C.gtk_separator_new(C.GtkOrientation(orientation))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSeparator(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkSeparatorMenuItem
+ */
+
+// SeparatorMenuItem is a representation of GTK's GtkSeparatorMenuItem.
+type SeparatorMenuItem struct {
+ MenuItem
+}
+
+// native returns a pointer to the underlying GtkSeparatorMenuItem.
+func (v *SeparatorMenuItem) native() *C.GtkSeparatorMenuItem {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSeparatorMenuItem(p)
+}
+
+func marshalSeparatorMenuItem(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapSeparatorMenuItem(obj), nil
+}
+
+func wrapSeparatorMenuItem(obj *glib.Object) *SeparatorMenuItem {
+ return &SeparatorMenuItem{MenuItem{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}}
+}
+
+// SeparatorMenuItemNew is a wrapper around gtk_separator_menu_item_new().
+func SeparatorMenuItemNew() (*SeparatorMenuItem, error) {
+ c := C.gtk_separator_menu_item_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSeparatorMenuItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkSeparatorToolItem
+ */
+
+// SeparatorToolItem is a representation of GTK's GtkSeparatorToolItem.
+type SeparatorToolItem struct {
+ ToolItem
+}
+
+// native returns a pointer to the underlying GtkSeparatorToolItem.
+func (v *SeparatorToolItem) native() *C.GtkSeparatorToolItem {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSeparatorToolItem(p)
+}
+
+func marshalSeparatorToolItem(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapSeparatorToolItem(obj), nil
+}
+
+func wrapSeparatorToolItem(obj *glib.Object) *SeparatorToolItem {
+ return &SeparatorToolItem{ToolItem{Bin{Container{Widget{
+ glib.InitiallyUnowned{obj}}}}}}
+}
+
+// SeparatorToolItemNew is a wrapper around gtk_separator_tool_item_new().
+func SeparatorToolItemNew() (*SeparatorToolItem, error) {
+ c := C.gtk_separator_tool_item_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSeparatorToolItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetDraw is a wrapper around gtk_separator_tool_item_set_draw().
+func (v *SeparatorToolItem) SetDraw(draw bool) {
+ C.gtk_separator_tool_item_set_draw(v.native(), gbool(draw))
+}
+
+// GetDraw is a wrapper around gtk_separator_tool_item_get_draw().
+func (v *SeparatorToolItem) GetDraw() bool {
+ c := C.gtk_separator_tool_item_get_draw(v.native())
+ return gobool(c)
+}
+
+/*
+ * GtkSizeGroup
+ */
+
+// SizeGroup is a representation of GTK's GtkSizeGroup
+type SizeGroup struct {
+ *glib.Object
+}
+
+// native() returns a pointer to the underlying GtkSizeGroup
+func (v *SizeGroup) native() *C.GtkSizeGroup {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSizeGroup(p)
+}
+
+func marshalSizeGroup(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return &SizeGroup{obj}, nil
+}
+
+func wrapSizeGroup(obj *glib.Object) *SizeGroup {
+ return &SizeGroup{obj}
+}
+
+// SizeGroupNew is a wrapper around gtk_size_group_new().
+func SizeGroupNew(mode SizeGroupMode) (*SizeGroup, error) {
+ c := C.gtk_size_group_new(C.GtkSizeGroupMode(mode))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSizeGroup(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func (v *SizeGroup) SetMode(mode SizeGroupMode) {
+ C.gtk_size_group_set_mode(v.native(), C.GtkSizeGroupMode(mode))
+}
+
+func (v *SizeGroup) GetMode() SizeGroupMode {
+ return SizeGroupMode(C.gtk_size_group_get_mode(v.native()))
+}
+
+func (v *SizeGroup) AddWidget(widget IWidget) {
+ C.gtk_size_group_add_widget(v.native(), widget.toWidget())
+}
+
+func (v *SizeGroup) RemoveWidget(widget IWidget) {
+ C.gtk_size_group_remove_widget(v.native(), widget.toWidget())
+}
+
+func (v *SizeGroup) GetWidgets() *glib.SList {
+ c := C.gtk_size_group_get_widgets(v.native())
+ if c == nil {
+ return nil
+ }
+ return glib.WrapSList(uintptr(unsafe.Pointer(c)))
+}
+
+/*
+ * GtkSpinButton
+ */
+
+// SpinButton is a representation of GTK's GtkSpinButton.
+type SpinButton struct {
+ Entry
+}
+
+// native returns a pointer to the underlying GtkSpinButton.
+func (v *SpinButton) native() *C.GtkSpinButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSpinButton(p)
+}
+
+func marshalSpinButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapSpinButton(obj), nil
+}
+
+func wrapSpinButton(obj *glib.Object) *SpinButton {
+ e := wrapEditable(obj)
+ return &SpinButton{Entry{Widget{glib.InitiallyUnowned{obj}}, *e}}
+}
+
+// Configure() is a wrapper around gtk_spin_button_configure().
+func (v *SpinButton) Configure(adjustment *Adjustment, climbRate float64, digits uint) {
+ C.gtk_spin_button_configure(v.native(), adjustment.native(),
+ C.gdouble(climbRate), C.guint(digits))
+}
+
+// SpinButtonNew() is a wrapper around gtk_spin_button_new().
+func SpinButtonNew(adjustment *Adjustment, climbRate float64, digits uint) (*SpinButton, error) {
+ c := C.gtk_spin_button_new(adjustment.native(),
+ C.gdouble(climbRate), C.guint(digits))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSpinButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SpinButtonNewWithRange() is a wrapper around
+// gtk_spin_button_new_with_range().
+func SpinButtonNewWithRange(min, max, step float64) (*SpinButton, error) {
+ c := C.gtk_spin_button_new_with_range(C.gdouble(min), C.gdouble(max),
+ C.gdouble(step))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSpinButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetValueAsInt() is a wrapper around gtk_spin_button_get_value_as_int().
+func (v *SpinButton) GetValueAsInt() int {
+ c := C.gtk_spin_button_get_value_as_int(v.native())
+ return int(c)
+}
+
+// SetValue() is a wrapper around gtk_spin_button_set_value().
+func (v *SpinButton) SetValue(value float64) {
+ C.gtk_spin_button_set_value(v.native(), C.gdouble(value))
+}
+
+// GetValue() is a wrapper around gtk_spin_button_get_value().
+func (v *SpinButton) GetValue() float64 {
+ c := C.gtk_spin_button_get_value(v.native())
+ return float64(c)
+}
+
+// GetAdjustment() is a wrapper around gtk_spin_button_get_adjustment
+func (v *SpinButton) GetAdjustment() *Adjustment {
+ c := C.gtk_spin_button_get_adjustment(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapAdjustment(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetRange is a wrapper around gtk_spin_button_set_range().
+func (v *SpinButton) SetRange(min, max float64) {
+ C.gtk_spin_button_set_range(v.native(), C.gdouble(min), C.gdouble(max))
+}
+
+// SetIncrements() is a wrapper around gtk_spin_button_set_increments().
+func (v *SpinButton) SetIncrements(step, page float64) {
+ C.gtk_spin_button_set_increments(v.native(), C.gdouble(step), C.gdouble(page))
+}
+
+/*
+ * GtkSpinner
+ */
+
+// Spinner is a representation of GTK's GtkSpinner.
+type Spinner struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkSpinner.
+func (v *Spinner) native() *C.GtkSpinner {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSpinner(p)
+}
+
+func marshalSpinner(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapSpinner(obj), nil
+}
+
+func wrapSpinner(obj *glib.Object) *Spinner {
+ return &Spinner{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// SpinnerNew is a wrapper around gtk_spinner_new().
+func SpinnerNew() (*Spinner, error) {
+ c := C.gtk_spinner_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSpinner(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// Start is a wrapper around gtk_spinner_start().
+func (v *Spinner) Start() {
+ C.gtk_spinner_start(v.native())
+}
+
+// Stop is a wrapper around gtk_spinner_stop().
+func (v *Spinner) Stop() {
+ C.gtk_spinner_stop(v.native())
+}
+
+/*
+ * GtkStatusbar
+ */
+
+// Statusbar is a representation of GTK's GtkStatusbar
+type Statusbar struct {
+ Box
+}
+
+// native returns a pointer to the underlying GtkStatusbar
+func (v *Statusbar) native() *C.GtkStatusbar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkStatusbar(p)
+}
+
+func marshalStatusbar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapStatusbar(obj), nil
+}
+
+func wrapStatusbar(obj *glib.Object) *Statusbar {
+ return &Statusbar{Box{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// StatusbarNew() is a wrapper around gtk_statusbar_new().
+func StatusbarNew() (*Statusbar, error) {
+ c := C.gtk_statusbar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapStatusbar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetContextId() is a wrapper around gtk_statusbar_get_context_id().
+func (v *Statusbar) GetContextId(contextDescription string) uint {
+ cstr := C.CString(contextDescription)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_statusbar_get_context_id(v.native(), (*C.gchar)(cstr))
+ return uint(c)
+}
+
+// Push() is a wrapper around gtk_statusbar_push().
+func (v *Statusbar) Push(contextID uint, text string) uint {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_statusbar_push(v.native(), C.guint(contextID),
+ (*C.gchar)(cstr))
+ return uint(c)
+}
+
+// Pop() is a wrapper around gtk_statusbar_pop().
+func (v *Statusbar) Pop(contextID uint) {
+ C.gtk_statusbar_pop(v.native(), C.guint(contextID))
+}
+
+// GetMessageArea() is a wrapper around gtk_statusbar_get_message_area().
+func (v *Statusbar) GetMessageArea() (*Box, error) {
+ c := C.gtk_statusbar_get_message_area(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return &Box{Container{Widget{glib.InitiallyUnowned{obj}}}}, nil
+}
+
+/*
+ * GtkSwitch
+ */
+
+// Switch is a representation of GTK's GtkSwitch.
+type Switch struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkSwitch.
+func (v *Switch) native() *C.GtkSwitch {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSwitch(p)
+}
+
+func marshalSwitch(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapSwitch(obj), nil
+}
+
+func wrapSwitch(obj *glib.Object) *Switch {
+ return &Switch{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// SwitchNew is a wrapper around gtk_switch_new().
+func SwitchNew() (*Switch, error) {
+ c := C.gtk_switch_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSwitch(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetActive is a wrapper around gtk_switch_get_active().
+func (v *Switch) GetActive() bool {
+ c := C.gtk_switch_get_active(v.native())
+ return gobool(c)
+}
+
+// SetActive is a wrapper around gtk_switch_set_active().
+func (v *Switch) SetActive(isActive bool) {
+ C.gtk_switch_set_active(v.native(), gbool(isActive))
+}
+
+/*
+ * GtkTargetEntry
+ */
+
+// TargetEntry is a representation of GTK's GtkTargetEntry
+type TargetEntry C.GtkTargetEntry
+
+func marshalTargetEntry(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return (*TargetEntry)(unsafe.Pointer(c)), nil
+}
+
+func (v *TargetEntry) native() *C.GtkTargetEntry {
+ return (*C.GtkTargetEntry)(unsafe.Pointer(v))
+}
+
+// TargetEntryNew is a wrapper around gtk_target_entry_new().
+func TargetEntryNew(target string, flags TargetFlags, info uint) (*TargetEntry, error) {
+ cstr := C.CString(target)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_target_entry_new((*C.gchar)(cstr), C.guint(flags), C.guint(info))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ t := (*TargetEntry)(unsafe.Pointer(c))
+ // causes setFinilizer error
+ // runtime.SetFinalizer(t, (*TargetEntry).free)
+ return t, nil
+}
+
+func (v *TargetEntry) free() {
+ C.gtk_target_entry_free(v.native())
+}
+
+/*
+ * GtkTextTag
+ */
+
+type TextTag struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GObject as a GtkTextTag.
+func (v *TextTag) native() *C.GtkTextTag {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTextTag(p)
+}
+
+func marshalTextTag(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTextTag(obj), nil
+}
+
+func wrapTextTag(obj *glib.Object) *TextTag {
+ return &TextTag{obj}
+}
+
+func TextTagNew(name string) (*TextTag, error) {
+ cname := C.CString(name)
+ defer C.free(unsafe.Pointer(cname))
+ c := C.gtk_text_tag_new((*C.gchar)(cname))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapTextTag(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetPriority() is a wrapper around gtk_text_tag_get_priority().
+func (v *TextTag) GetPriority() int {
+ return int(C.gtk_text_tag_get_priority(v.native()))
+}
+
+// SetPriority() is a wrapper around gtk_text_tag_set_priority().
+func (v *TextTag) SetPriority(priority int) {
+ C.gtk_text_tag_set_priority(v.native(), C.gint(priority))
+}
+
+// Event() is a wrapper around gtk_text_tag_event().
+func (v *TextTag) Event(eventObject *glib.Object, event *gdk.Event, iter *TextIter) bool {
+ ok := C.gtk_text_tag_event(v.native(),
+ (*C.GObject)(unsafe.Pointer(eventObject.Native())),
+ (*C.GdkEvent)(unsafe.Pointer(event.Native())),
+ (*C.GtkTextIter)(iter),
+ )
+ return gobool(ok)
+}
+
+/*
+ * GtkTextTagTable
+ */
+
+type TextTagTable struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GObject as a GtkTextTagTable.
+func (v *TextTagTable) native() *C.GtkTextTagTable {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTextTagTable(p)
+}
+
+func marshalTextTagTable(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTextTagTable(obj), nil
+}
+
+func wrapTextTagTable(obj *glib.Object) *TextTagTable {
+ return &TextTagTable{obj}
+}
+
+func TextTagTableNew() (*TextTagTable, error) {
+ c := C.gtk_text_tag_table_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapTextTagTable(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// Add() is a wrapper around gtk_text_tag_table_add().
+func (v *TextTagTable) Add(tag *TextTag) {
+ C.gtk_text_tag_table_add(v.native(), tag.native())
+ //return gobool(c) // TODO version-separate
+}
+
+// Lookup() is a wrapper around gtk_text_tag_table_lookup().
+func (v *TextTagTable) Lookup(name string) (*TextTag, error) {
+ cname := C.CString(name)
+ defer C.free(unsafe.Pointer(cname))
+ c := C.gtk_text_tag_table_lookup(v.native(), (*C.gchar)(cname))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapTextTag(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// Remove() is a wrapper around gtk_text_tag_table_remove().
+func (v *TextTagTable) Remove(tag *TextTag) {
+ C.gtk_text_tag_table_remove(v.native(), tag.native())
+}
+
+/*
+ * GtkTextBuffer
+ */
+
+// TextBuffer is a representation of GTK's GtkTextBuffer.
+type TextBuffer struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkTextBuffer.
+func (v *TextBuffer) native() *C.GtkTextBuffer {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTextBuffer(p)
+}
+
+func marshalTextBuffer(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTextBuffer(obj), nil
+}
+
+func wrapTextBuffer(obj *glib.Object) *TextBuffer {
+ return &TextBuffer{obj}
+}
+
+// TextBufferNew() is a wrapper around gtk_text_buffer_new().
+func TextBufferNew(table *TextTagTable) (*TextBuffer, error) {
+ c := C.gtk_text_buffer_new(table.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ e := wrapTextBuffer(glib.Take(unsafe.Pointer(c)))
+ return e, nil
+}
+
+// ApplyTag() is a wrapper around gtk_text_buffer_apply_tag().
+func (v *TextBuffer) ApplyTag(tag *TextTag, start, end *TextIter) {
+ C.gtk_text_buffer_apply_tag(v.native(), tag.native(), (*C.GtkTextIter)(start), (*C.GtkTextIter)(end))
+}
+
+// ApplyTagByName() is a wrapper around gtk_text_buffer_apply_tag_by_name().
+func (v *TextBuffer) ApplyTagByName(name string, start, end *TextIter) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_text_buffer_apply_tag_by_name(v.native(), (*C.gchar)(cstr),
+ (*C.GtkTextIter)(start), (*C.GtkTextIter)(end))
+}
+
+// CreateChildAnchor() is a wrapper around gtk_text_buffer_create_child_anchor().
+// Since it copies garbage from the stack into the padding bytes of iter,
+// iter can't be reliably reused after this call unless GODEBUG=cgocheck=0.
+func (v *TextBuffer) CreateChildAnchor(iter *TextIter) *TextChildAnchor {
+ ret := C.gtk_text_buffer_create_child_anchor(v.native(), iter.native())
+ return (*TextChildAnchor)(ret)
+}
+
+// Delete() is a wrapper around gtk_text_buffer_delete().
+func (v *TextBuffer) Delete(start, end *TextIter) {
+ C.gtk_text_buffer_delete(v.native(), (*C.GtkTextIter)(start), (*C.GtkTextIter)(end))
+}
+
+func (v *TextBuffer) GetBounds() (start, end *TextIter) {
+ start, end = new(TextIter), new(TextIter)
+ C.gtk_text_buffer_get_bounds(v.native(), (*C.GtkTextIter)(start), (*C.GtkTextIter)(end))
+ return
+}
+
+// GetCharCount() is a wrapper around gtk_text_buffer_get_char_count().
+func (v *TextBuffer) GetCharCount() int {
+ return int(C.gtk_text_buffer_get_char_count(v.native()))
+}
+
+// GetIterAtOffset() is a wrapper around gtk_text_buffer_get_iter_at_offset().
+func (v *TextBuffer) GetIterAtOffset(charOffset int) *TextIter {
+ var iter C.GtkTextIter
+ C.gtk_text_buffer_get_iter_at_offset(v.native(), &iter, C.gint(charOffset))
+ return (*TextIter)(&iter)
+}
+
+// GetStartIter() is a wrapper around gtk_text_buffer_get_start_iter().
+func (v *TextBuffer) GetStartIter() *TextIter {
+ var iter C.GtkTextIter
+ C.gtk_text_buffer_get_start_iter(v.native(), &iter)
+ return (*TextIter)(&iter)
+}
+
+// GetEndIter() is a wrapper around gtk_text_buffer_get_end_iter().
+func (v *TextBuffer) GetEndIter() *TextIter {
+ var iter C.GtkTextIter
+ C.gtk_text_buffer_get_end_iter(v.native(), &iter)
+ return (*TextIter)(&iter)
+}
+
+// GetLineCount() is a wrapper around gtk_text_buffer_get_line_count().
+func (v *TextBuffer) GetLineCount() int {
+ return int(C.gtk_text_buffer_get_line_count(v.native()))
+}
+
+// GetModified() is a wrapper around gtk_text_buffer_get_modified().
+func (v *TextBuffer) GetModified() bool {
+ return gobool(C.gtk_text_buffer_get_modified(v.native()))
+}
+
+// GetTagTable() is a wrapper around gtk_text_buffer_get_tag_table().
+func (v *TextBuffer) GetTagTable() (*TextTagTable, error) {
+ c := C.gtk_text_buffer_get_tag_table(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTextTagTable(obj), nil
+}
+
+func (v *TextBuffer) GetText(start, end *TextIter, includeHiddenChars bool) (string, error) {
+ c := C.gtk_text_buffer_get_text(
+ v.native(), (*C.GtkTextIter)(start), (*C.GtkTextIter)(end), gbool(includeHiddenChars),
+ )
+ if c == nil {
+ return "", nilPtrErr
+ }
+ gostr := goString(c)
+ C.g_free(C.gpointer(c))
+ return gostr, nil
+}
+
+// Insert() is a wrapper around gtk_text_buffer_insert().
+func (v *TextBuffer) Insert(iter *TextIter, text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_text_buffer_insert(v.native(), (*C.GtkTextIter)(iter), (*C.gchar)(cstr), C.gint(len(text)))
+}
+
+// InsertAtCursor() is a wrapper around gtk_text_buffer_insert_at_cursor().
+func (v *TextBuffer) InsertAtCursor(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_text_buffer_insert_at_cursor(v.native(), (*C.gchar)(cstr), C.gint(len(text)))
+}
+
+// RemoveTag() is a wrapper around gtk_text_buffer_remove_tag().
+func (v *TextBuffer) RemoveTag(tag *TextTag, start, end *TextIter) {
+ C.gtk_text_buffer_remove_tag(v.native(), tag.native(), (*C.GtkTextIter)(start), (*C.GtkTextIter)(end))
+}
+
+// SetModified() is a wrapper around gtk_text_buffer_set_modified().
+func (v *TextBuffer) SetModified(setting bool) {
+ C.gtk_text_buffer_set_modified(v.native(), gbool(setting))
+}
+
+func (v *TextBuffer) SetText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_text_buffer_set_text(v.native(), (*C.gchar)(cstr),
+ C.gint(len(text)))
+}
+
+// GetIterAtMark() is a wrapper around gtk_text_buffer_get_iter_at_mark().
+func (v *TextBuffer) GetIterAtMark(mark *TextMark) *TextIter {
+ var iter C.GtkTextIter
+ C.gtk_text_buffer_get_iter_at_mark(v.native(), &iter, (*C.GtkTextMark)(mark))
+ return (*TextIter)(&iter)
+}
+
+// CreateMark() is a wrapper around gtk_text_buffer_create_mark().
+func (v *TextBuffer) CreateMark(mark_name string, where *TextIter, left_gravity bool) *TextMark {
+ cstr := C.CString(mark_name)
+ defer C.free(unsafe.Pointer(cstr))
+ ret := C.gtk_text_buffer_create_mark(v.native(), (*C.gchar)(cstr), (*C.GtkTextIter)(where), gbool(left_gravity))
+ return (*TextMark)(ret)
+}
+
+/*
+ * GtkToggleButton
+ */
+
+// ToggleButton is a representation of GTK's GtkToggleButton.
+type ToggleButton struct {
+ Button
+}
+
+// native returns a pointer to the underlying GtkToggleButton.
+func (v *ToggleButton) native() *C.GtkToggleButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkToggleButton(p)
+}
+
+func marshalToggleButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapToggleButton(obj), nil
+}
+
+func wrapToggleButton(obj *glib.Object) *ToggleButton {
+ actionable := wrapActionable(obj)
+ return &ToggleButton{Button{Bin{Container{Widget{
+ glib.InitiallyUnowned{obj}}}}, actionable}}
+}
+
+// ToggleButtonNew is a wrapper around gtk_toggle_button_new().
+func ToggleButtonNew() (*ToggleButton, error) {
+ c := C.gtk_toggle_button_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapToggleButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// ToggleButtonNewWithLabel is a wrapper around
+// gtk_toggle_button_new_with_label().
+func ToggleButtonNewWithLabel(label string) (*ToggleButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_toggle_button_new_with_label((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapToggleButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// ToggleButtonNewWithMnemonic is a wrapper around
+// gtk_toggle_button_new_with_mnemonic().
+func ToggleButtonNewWithMnemonic(label string) (*ToggleButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_toggle_button_new_with_mnemonic((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapToggleButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetActive is a wrapper around gtk_toggle_button_get_active().
+func (v *ToggleButton) GetActive() bool {
+ c := C.gtk_toggle_button_get_active(v.native())
+ return gobool(c)
+}
+
+// SetActive is a wrapper around gtk_toggle_button_set_active().
+func (v *ToggleButton) SetActive(isActive bool) {
+ C.gtk_toggle_button_set_active(v.native(), gbool(isActive))
+}
+
+// GetMode is a wrapper around gtk_toggle_button_get_mode().
+func (v *ToggleButton) GetMode() bool {
+ c := C.gtk_toggle_button_get_mode(v.native())
+ return gobool(c)
+}
+
+// SetMode is a wrapper around gtk_toggle_button_set_mode().
+func (v *ToggleButton) SetMode(drawIndicator bool) {
+ C.gtk_toggle_button_set_mode(v.native(), gbool(drawIndicator))
+}
+
+/*
+ * GtkToolbar
+ */
+
+// Toolbar is a representation of GTK's GtkToolbar.
+type Toolbar struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkToolbar.
+func (v *Toolbar) native() *C.GtkToolbar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkToolbar(p)
+}
+
+func marshalToolbar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapToolbar(obj), nil
+}
+
+func wrapToolbar(obj *glib.Object) *Toolbar {
+ return &Toolbar{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// ToolbarNew is a wrapper around gtk_toolbar_new().
+func ToolbarNew() (*Toolbar, error) {
+ c := C.gtk_toolbar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapToolbar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// Insert is a wrapper around gtk_toolbar_insert().
+func (v *Toolbar) Insert(item IToolItem, pos int) {
+ C.gtk_toolbar_insert(v.native(), item.toToolItem(), C.gint(pos))
+}
+
+// GetItemIndex is a wrapper around gtk_toolbar_get_item_index().
+func (v *Toolbar) GetItemIndex(item IToolItem) int {
+ c := C.gtk_toolbar_get_item_index(v.native(), item.toToolItem())
+ return int(c)
+}
+
+// GetNItems is a wrapper around gtk_toolbar_get_n_items().
+func (v *Toolbar) GetNItems() int {
+ c := C.gtk_toolbar_get_n_items(v.native())
+ return int(c)
+}
+
+// GetNthItem is a wrapper around gtk_toolbar_get_nth_item().
+func (v *Toolbar) GetNthItem(n int) *ToolItem {
+ c := C.gtk_toolbar_get_nth_item(v.native(), C.gint(n))
+ if c == nil {
+ return nil
+ }
+ return wrapToolItem(glib.Take(unsafe.Pointer(c)))
+}
+
+// GetDropIndex is a wrapper around gtk_toolbar_get_drop_index().
+func (v *Toolbar) GetDropIndex(x, y int) int {
+ c := C.gtk_toolbar_get_drop_index(v.native(), C.gint(x), C.gint(y))
+ return int(c)
+}
+
+// SetDropHighlightItem is a wrapper around
+// gtk_toolbar_set_drop_highlight_item().
+func (v *Toolbar) SetDropHighlightItem(toolItem IToolItem, index int) {
+ C.gtk_toolbar_set_drop_highlight_item(v.native(),
+ toolItem.toToolItem(), C.gint(index))
+}
+
+// SetShowArrow is a wrapper around gtk_toolbar_set_show_arrow().
+func (v *Toolbar) SetShowArrow(showArrow bool) {
+ C.gtk_toolbar_set_show_arrow(v.native(), gbool(showArrow))
+}
+
+// UnsetIconSize is a wrapper around gtk_toolbar_unset_icon_size().
+func (v *Toolbar) UnsetIconSize() {
+ C.gtk_toolbar_unset_icon_size(v.native())
+}
+
+// GetShowArrow is a wrapper around gtk_toolbar_get_show_arrow().
+func (v *Toolbar) GetShowArrow() bool {
+ c := C.gtk_toolbar_get_show_arrow(v.native())
+ return gobool(c)
+}
+
+// GetStyle is a wrapper around gtk_toolbar_get_style().
+func (v *Toolbar) GetStyle() ToolbarStyle {
+ c := C.gtk_toolbar_get_style(v.native())
+ return ToolbarStyle(c)
+}
+
+// GetIconSize is a wrapper around gtk_toolbar_get_icon_size().
+func (v *Toolbar) GetIconSize() IconSize {
+ c := C.gtk_toolbar_get_icon_size(v.native())
+ return IconSize(c)
+}
+
+// GetReliefStyle is a wrapper around gtk_toolbar_get_relief_style().
+func (v *Toolbar) GetReliefStyle() ReliefStyle {
+ c := C.gtk_toolbar_get_relief_style(v.native())
+ return ReliefStyle(c)
+}
+
+// SetStyle is a wrapper around gtk_toolbar_set_style().
+func (v *Toolbar) SetStyle(style ToolbarStyle) {
+ C.gtk_toolbar_set_style(v.native(), C.GtkToolbarStyle(style))
+}
+
+// SetIconSize is a wrapper around gtk_toolbar_set_icon_size().
+func (v *Toolbar) SetIconSize(iconSize IconSize) {
+ C.gtk_toolbar_set_icon_size(v.native(), C.GtkIconSize(iconSize))
+}
+
+// UnsetStyle is a wrapper around gtk_toolbar_unset_style().
+func (v *Toolbar) UnsetStyle() {
+ C.gtk_toolbar_unset_style(v.native())
+}
+
+/*
+ * GtkToolButton
+ */
+
+// ToolButton is a representation of GTK's GtkToolButton.
+type ToolButton struct {
+ ToolItem
+}
+
+// native returns a pointer to the underlying GtkToolButton.
+func (v *ToolButton) native() *C.GtkToolButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkToolButton(p)
+}
+
+func marshalToolButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapToolButton(obj), nil
+}
+
+func wrapToolButton(obj *glib.Object) *ToolButton {
+ return &ToolButton{ToolItem{Bin{Container{Widget{
+ glib.InitiallyUnowned{obj}}}}}}
+}
+
+// ToolButtonNew is a wrapper around gtk_tool_button_new().
+func ToolButtonNew(iconWidget IWidget, label string) (*ToolButton, error) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ w := nullableWidget(iconWidget)
+ c := C.gtk_tool_button_new(w, (*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapToolButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetLabel is a wrapper around gtk_tool_button_set_label().
+func (v *ToolButton) SetLabel(label string) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tool_button_set_label(v.native(), (*C.gchar)(cstr))
+}
+
+// GetLabel is a wrapper around gtk_tool_button_get_label().
+func (v *ToolButton) GetLabel() string {
+ c := C.gtk_tool_button_get_label(v.native())
+ return goString(c)
+}
+
+// SetUseUnderline is a wrapper around gtk_tool_button_set_use_underline().
+func (v *ToolButton) SetGetUnderline(useUnderline bool) {
+ C.gtk_tool_button_set_use_underline(v.native(), gbool(useUnderline))
+}
+
+// GetUseUnderline is a wrapper around gtk_tool_button_get_use_underline().
+func (v *ToolButton) GetuseUnderline() bool {
+ c := C.gtk_tool_button_get_use_underline(v.native())
+ return gobool(c)
+}
+
+// SetIconName is a wrapper around gtk_tool_button_set_icon_name().
+func (v *ToolButton) SetIconName(iconName string) {
+ cstr := C.CString(iconName)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tool_button_set_icon_name(v.native(), (*C.gchar)(cstr))
+}
+
+// GetIconName is a wrapper around gtk_tool_button_get_icon_name().
+func (v *ToolButton) GetIconName() string {
+ c := C.gtk_tool_button_get_icon_name(v.native())
+ return goString(c)
+}
+
+// SetIconWidget is a wrapper around gtk_tool_button_set_icon_widget().
+func (v *ToolButton) SetIconWidget(iconWidget IWidget) {
+ C.gtk_tool_button_set_icon_widget(v.native(), iconWidget.toWidget())
+}
+
+// GetIconWidget is a wrapper around gtk_tool_button_get_icon_widget().
+func (v *ToolButton) GetIconWidget() *Widget {
+ c := C.gtk_tool_button_get_icon_widget(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetLabelWidget is a wrapper around gtk_tool_button_set_label_widget().
+func (v *ToolButton) SetLabelWidget(labelWidget IWidget) {
+ C.gtk_tool_button_set_label_widget(v.native(), labelWidget.toWidget())
+}
+
+// GetLabelWidget is a wrapper around gtk_tool_button_get_label_widget().
+func (v *ToolButton) GetLabelWidget() *Widget {
+ c := C.gtk_tool_button_get_label_widget(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c)))
+}
+
+/*
+ * GtkToolItem
+ */
+
+// ToolItem is a representation of GTK's GtkToolItem.
+type ToolItem struct {
+ Bin
+}
+
+// IToolItem is an interface type implemented by all structs embedding
+// a ToolItem. It is meant to be used as an argument type for wrapper
+// functions that wrap around a C GTK function taking a GtkToolItem.
+type IToolItem interface {
+ toToolItem() *C.GtkToolItem
+}
+
+// native returns a pointer to the underlying GtkToolItem.
+func (v *ToolItem) native() *C.GtkToolItem {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkToolItem(p)
+}
+
+func (v *ToolItem) toToolItem() *C.GtkToolItem {
+ return v.native()
+}
+
+func marshalToolItem(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapToolItem(obj), nil
+}
+
+func wrapToolItem(obj *glib.Object) *ToolItem {
+ return &ToolItem{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// ToolItemNew is a wrapper around gtk_tool_item_new().
+func ToolItemNew() (*ToolItem, error) {
+ c := C.gtk_tool_item_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapToolItem(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetHomogeneous is a wrapper around gtk_tool_item_set_homogeneous().
+func (v *ToolItem) SetHomogeneous(homogeneous bool) {
+ C.gtk_tool_item_set_homogeneous(v.native(), gbool(homogeneous))
+}
+
+// GetHomogeneous is a wrapper around gtk_tool_item_get_homogeneous().
+func (v *ToolItem) GetHomogeneous() bool {
+ c := C.gtk_tool_item_get_homogeneous(v.native())
+ return gobool(c)
+}
+
+// SetExpand is a wrapper around gtk_tool_item_set_expand().
+func (v *ToolItem) SetExpand(expand bool) {
+ C.gtk_tool_item_set_expand(v.native(), gbool(expand))
+}
+
+// GetExpand is a wrapper around gtk_tool_item_get_expand().
+func (v *ToolItem) GetExpand() bool {
+ c := C.gtk_tool_item_get_expand(v.native())
+ return gobool(c)
+}
+
+// SetTooltipText is a wrapper around gtk_tool_item_set_tooltip_text().
+func (v *ToolItem) SetTooltipText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tool_item_set_tooltip_text(v.native(), (*C.gchar)(cstr))
+}
+
+// SetTooltipMarkup is a wrapper around gtk_tool_item_set_tooltip_markup().
+func (v *ToolItem) SetTooltipMarkup(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tool_item_set_tooltip_markup(v.native(), (*C.gchar)(cstr))
+}
+
+// SetUseDragWindow is a wrapper around gtk_tool_item_set_use_drag_window().
+func (v *ToolItem) SetUseDragWindow(useDragWindow bool) {
+ C.gtk_tool_item_set_use_drag_window(v.native(), gbool(useDragWindow))
+}
+
+// GetUseDragWindow is a wrapper around gtk_tool_item_get_use_drag_window().
+func (v *ToolItem) GetUseDragWindow() bool {
+ c := C.gtk_tool_item_get_use_drag_window(v.native())
+ return gobool(c)
+}
+
+// SetVisibleHorizontal is a wrapper around
+// gtk_tool_item_set_visible_horizontal().
+func (v *ToolItem) SetVisibleHorizontal(visibleHorizontal bool) {
+ C.gtk_tool_item_set_visible_horizontal(v.native(),
+ gbool(visibleHorizontal))
+}
+
+// GetVisibleHorizontal is a wrapper around
+// gtk_tool_item_get_visible_horizontal().
+func (v *ToolItem) GetVisibleHorizontal() bool {
+ c := C.gtk_tool_item_get_visible_horizontal(v.native())
+ return gobool(c)
+}
+
+// SetVisibleVertical is a wrapper around gtk_tool_item_set_visible_vertical().
+func (v *ToolItem) SetVisibleVertical(visibleVertical bool) {
+ C.gtk_tool_item_set_visible_vertical(v.native(), gbool(visibleVertical))
+}
+
+// GetVisibleVertical is a wrapper around gtk_tool_item_get_visible_vertical().
+func (v *ToolItem) GetVisibleVertical() bool {
+ c := C.gtk_tool_item_get_visible_vertical(v.native())
+ return gobool(c)
+}
+
+// SetIsImportant is a wrapper around gtk_tool_item_set_is_important().
+func (v *ToolItem) SetIsImportant(isImportant bool) {
+ C.gtk_tool_item_set_is_important(v.native(), gbool(isImportant))
+}
+
+// GetIsImportant is a wrapper around gtk_tool_item_get_is_important().
+func (v *ToolItem) GetIsImportant() bool {
+ c := C.gtk_tool_item_get_is_important(v.native())
+ return gobool(c)
+}
+
+// TODO: gtk_tool_item_get_ellipsize_mode
+
+// GetIconSize is a wrapper around gtk_tool_item_get_icon_size().
+func (v *ToolItem) GetIconSize() IconSize {
+ c := C.gtk_tool_item_get_icon_size(v.native())
+ return IconSize(c)
+}
+
+// GetOrientation is a wrapper around gtk_tool_item_get_orientation().
+func (v *ToolItem) GetOrientation() Orientation {
+ c := C.gtk_tool_item_get_orientation(v.native())
+ return Orientation(c)
+}
+
+// GetToolbarStyle is a wrapper around gtk_tool_item_get_toolbar_style().
+func (v *ToolItem) gtk_tool_item_get_toolbar_style() ToolbarStyle {
+ c := C.gtk_tool_item_get_toolbar_style(v.native())
+ return ToolbarStyle(c)
+}
+
+// GetReliefStyle is a wrapper around gtk_tool_item_get_relief_style().
+func (v *ToolItem) GetReliefStyle() ReliefStyle {
+ c := C.gtk_tool_item_get_relief_style(v.native())
+ return ReliefStyle(c)
+}
+
+// GetTextAlignment is a wrapper around gtk_tool_item_get_text_alignment().
+func (v *ToolItem) GetTextAlignment() float32 {
+ c := C.gtk_tool_item_get_text_alignment(v.native())
+ return float32(c)
+}
+
+// GetTextOrientation is a wrapper around gtk_tool_item_get_text_orientation().
+func (v *ToolItem) GetTextOrientation() Orientation {
+ c := C.gtk_tool_item_get_text_orientation(v.native())
+ return Orientation(c)
+}
+
+// RetrieveProxyMenuItem is a wrapper around
+// gtk_tool_item_retrieve_proxy_menu_item()
+func (v *ToolItem) RetrieveProxyMenuItem() *MenuItem {
+ c := C.gtk_tool_item_retrieve_proxy_menu_item(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapMenuItem(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetProxyMenuItem is a wrapper around gtk_tool_item_set_proxy_menu_item().
+func (v *ToolItem) SetProxyMenuItem(menuItemId string, menuItem IMenuItem) {
+ cstr := C.CString(menuItemId)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tool_item_set_proxy_menu_item(v.native(), (*C.gchar)(cstr),
+ C.toGtkWidget(unsafe.Pointer(menuItem.toMenuItem())))
+}
+
+// RebuildMenu is a wrapper around gtk_tool_item_rebuild_menu().
+func (v *ToolItem) RebuildMenu() {
+ C.gtk_tool_item_rebuild_menu(v.native())
+}
+
+// ToolbarReconfigured is a wrapper around gtk_tool_item_toolbar_reconfigured().
+func (v *ToolItem) ToolbarReconfigured() {
+ C.gtk_tool_item_toolbar_reconfigured(v.native())
+}
+
+// TODO: gtk_tool_item_get_text_size_group
+
+/*
+ * GtkTreeIter
+ */
+
+// TreeIter is a representation of GTK's GtkTreeIter.
+type TreeIter struct {
+ GtkTreeIter C.GtkTreeIter
+}
+
+// native returns a pointer to the underlying GtkTreeIter.
+func (v *TreeIter) native() *C.GtkTreeIter {
+ if v == nil {
+ return nil
+ }
+ return &v.GtkTreeIter
+}
+
+func marshalTreeIter(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return (*TreeIter)(unsafe.Pointer(c)), nil
+}
+
+func (v *TreeIter) free() {
+ C.gtk_tree_iter_free(v.native())
+}
+
+// Copy() is a wrapper around gtk_tree_iter_copy().
+func (v *TreeIter) Copy() (*TreeIter, error) {
+ c := C.gtk_tree_iter_copy(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ t := &TreeIter{*c}
+ runtime.SetFinalizer(t, (*TreeIter).free)
+ return t, nil
+}
+
+/*
+ * GtkTreeModel
+ */
+
+// TreeModel is a representation of GTK's GtkTreeModel GInterface.
+type TreeModel struct {
+ *glib.Object
+}
+
+// ITreeModel is an interface type implemented by all structs
+// embedding a TreeModel. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkTreeModel.
+type ITreeModel interface {
+ toTreeModel() *C.GtkTreeModel
+}
+
+// native returns a pointer to the underlying GObject as a GtkTreeModel.
+func (v *TreeModel) native() *C.GtkTreeModel {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTreeModel(p)
+}
+
+func (v *TreeModel) toTreeModel() *C.GtkTreeModel {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func marshalTreeModel(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTreeModel(obj), nil
+}
+
+func wrapTreeModel(obj *glib.Object) *TreeModel {
+ return &TreeModel{obj}
+}
+
+// GetFlags() is a wrapper around gtk_tree_model_get_flags().
+func (v *TreeModel) GetFlags() TreeModelFlags {
+ c := C.gtk_tree_model_get_flags(v.native())
+ return TreeModelFlags(c)
+}
+
+// GetNColumns() is a wrapper around gtk_tree_model_get_n_columns().
+func (v *TreeModel) GetNColumns() int {
+ c := C.gtk_tree_model_get_n_columns(v.native())
+ return int(c)
+}
+
+// GetColumnType() is a wrapper around gtk_tree_model_get_column_type().
+func (v *TreeModel) GetColumnType(index int) glib.Type {
+ c := C.gtk_tree_model_get_column_type(v.native(), C.gint(index))
+ return glib.Type(c)
+}
+
+// GetIter() is a wrapper around gtk_tree_model_get_iter().
+func (v *TreeModel) GetIter(path *TreePath) (*TreeIter, error) {
+ var iter C.GtkTreeIter
+ c := C.gtk_tree_model_get_iter(v.native(), &iter, path.native())
+ if !gobool(c) {
+ return nil, errors.New("Unable to set iterator")
+ }
+ t := &TreeIter{iter}
+ return t, nil
+}
+
+// GetIterFromString() is a wrapper around
+// gtk_tree_model_get_iter_from_string().
+func (v *TreeModel) GetIterFromString(path string) (*TreeIter, error) {
+ var iter C.GtkTreeIter
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_tree_model_get_iter_from_string(v.native(), &iter,
+ (*C.gchar)(cstr))
+ if !gobool(c) {
+ return nil, errors.New("Unable to set iterator")
+ }
+ t := &TreeIter{iter}
+ return t, nil
+}
+
+// GetIterFirst() is a wrapper around gtk_tree_model_get_iter_first().
+func (v *TreeModel) GetIterFirst() (*TreeIter, bool) {
+ var iter C.GtkTreeIter
+ c := C.gtk_tree_model_get_iter_first(v.native(), &iter)
+ if !gobool(c) {
+ return nil, false
+ }
+ t := &TreeIter{iter}
+ return t, true
+}
+
+// GetPath() is a wrapper around gtk_tree_model_get_path().
+func (v *TreeModel) GetPath(iter *TreeIter) (*TreePath, error) {
+ c := C.gtk_tree_model_get_path(v.native(), iter.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ p := &TreePath{c}
+ runtime.SetFinalizer(p, (*TreePath).free)
+ return p, nil
+}
+
+// GetValue() is a wrapper around gtk_tree_model_get_value().
+func (v *TreeModel) GetValue(iter *TreeIter, column int) (*glib.Value, error) {
+ val, err := glib.ValueAlloc()
+ if err != nil {
+ return nil, err
+ }
+ C.gtk_tree_model_get_value(
+ (*C.GtkTreeModel)(unsafe.Pointer(v.native())),
+ iter.native(),
+ C.gint(column),
+ (*C.GValue)(unsafe.Pointer(val.Native())))
+ return val, nil
+}
+
+// IterHasChild() is a wrapper around gtk_tree_model_iter_has_child().
+func (v *TreeModel) IterHasChild(iter *TreeIter) bool {
+ c := C.gtk_tree_model_iter_has_child(v.native(), iter.native())
+ return gobool(c)
+}
+
+// IterNext() is a wrapper around gtk_tree_model_iter_next().
+func (v *TreeModel) IterNext(iter *TreeIter) bool {
+ c := C.gtk_tree_model_iter_next(v.native(), iter.native())
+ return gobool(c)
+}
+
+// IterPrevious is a wrapper around gtk_tree_model_iter_previous().
+func (v *TreeModel) IterPrevious(iter *TreeIter) bool {
+ c := C.gtk_tree_model_iter_previous(v.native(), iter.native())
+ return gobool(c)
+}
+
+// IterParent is a wrapper around gtk_tree_model_iter_parent().
+func (v *TreeModel) IterParent(iter, child *TreeIter) bool {
+ c := C.gtk_tree_model_iter_parent(v.native(), iter.native(), child.native())
+ return gobool(c)
+}
+
+// IterNthChild is a wrapper around gtk_tree_model_iter_nth_child().
+func (v *TreeModel) IterNthChild(iter *TreeIter, parent *TreeIter, n int) bool {
+ c := C.gtk_tree_model_iter_nth_child(v.native(), iter.native(), parent.native(), C.gint(n))
+ return gobool(c)
+}
+
+// IterChildren is a wrapper around gtk_tree_model_iter_children().
+func (v *TreeModel) IterChildren(iter, child *TreeIter) bool {
+ var cIter, cChild *C.GtkTreeIter
+ if iter != nil {
+ cIter = iter.native()
+ }
+ cChild = child.native()
+ c := C.gtk_tree_model_iter_children(v.native(), cChild, cIter)
+ return gobool(c)
+}
+
+// IterNChildren is a wrapper around gtk_tree_model_iter_n_children().
+func (v *TreeModel) IterNChildren(iter *TreeIter) int {
+ var cIter *C.GtkTreeIter
+ if iter != nil {
+ cIter = iter.native()
+ }
+ c := C.gtk_tree_model_iter_n_children(v.native(), cIter)
+ return int(c)
+}
+
+// FilterNew is a wrapper around gtk_tree_model_filter_new().
+func (v *TreeModel) FilterNew(root *TreePath) (*TreeModelFilter, error) {
+ c := C.gtk_tree_model_filter_new(v.native(), root.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTreeModelFilter(obj), nil
+}
+
+/*
+ * GtkTreeModelFilter
+ */
+
+// TreeModelFilter is a representation of GTK's GtkTreeModelFilter.
+type TreeModelFilter struct {
+ *glib.Object
+
+ // Interfaces
+ TreeModel
+}
+
+func (v *TreeModelFilter) native() *C.GtkTreeModelFilter {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTreeModelFilter(p)
+}
+
+func (v *TreeModelFilter) toTreeModelFilter() *C.GtkTreeModelFilter {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func marshalTreeModelFilter(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTreeModelFilter(obj), nil
+}
+
+func wrapTreeModelFilter(obj *glib.Object) *TreeModelFilter {
+ tm := wrapTreeModel(obj)
+ return &TreeModelFilter{obj, *tm}
+}
+
+// SetVisibleColumn is a wrapper around gtk_tree_model_filter_set_visible_column().
+func (v *TreeModelFilter) SetVisibleColumn(column int) {
+ C.gtk_tree_model_filter_set_visible_column(v.native(), C.gint(column))
+}
+
+/*
+ * GtkTreePath
+ */
+
+// TreePath is a representation of GTK's GtkTreePath.
+type TreePath struct {
+ GtkTreePath *C.GtkTreePath
+}
+
+// Return a TreePath from the GList
+func TreePathFromList(list *glib.List) *TreePath {
+ if list == nil {
+ return nil
+ }
+ return &TreePath{(*C.GtkTreePath)(list.Data().(unsafe.Pointer))}
+}
+
+// native returns a pointer to the underlying GtkTreePath.
+func (v *TreePath) native() *C.GtkTreePath {
+ if v == nil {
+ return nil
+ }
+ return v.GtkTreePath
+}
+
+func marshalTreePath(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return &TreePath{(*C.GtkTreePath)(unsafe.Pointer(c))}, nil
+}
+
+func (v *TreePath) free() {
+ C.gtk_tree_path_free(v.native())
+}
+
+// GetIndices is a wrapper around gtk_tree_path_get_indices_with_depth
+func (v *TreePath) GetIndices() []int {
+ var depth C.gint
+ var goindices []int
+ var ginthelp C.gint
+ indices := uintptr(unsafe.Pointer(C.gtk_tree_path_get_indices_with_depth(v.native(), &depth)))
+ size := unsafe.Sizeof(ginthelp)
+ for i := 0; i < int(depth); i++ {
+ goind := int(*((*C.gint)(unsafe.Pointer(indices))))
+ goindices = append(goindices, goind)
+ indices += size
+ }
+ return goindices
+}
+
+// String is a wrapper around gtk_tree_path_to_string().
+func (v *TreePath) String() string {
+ c := C.gtk_tree_path_to_string(v.native())
+ return goString(c)
+}
+
+// TreePathNewFromString is a wrapper around gtk_tree_path_new_from_string().
+func TreePathNewFromString(path string) (*TreePath, error) {
+ cstr := C.CString(path)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_tree_path_new_from_string((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ t := &TreePath{c}
+ runtime.SetFinalizer(t, (*TreePath).free)
+ return t, nil
+}
+
+/*
+ * GtkTreeSelection
+ */
+
+// TreeSelection is a representation of GTK's GtkTreeSelection.
+type TreeSelection struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkTreeSelection.
+func (v *TreeSelection) native() *C.GtkTreeSelection {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTreeSelection(p)
+}
+
+func marshalTreeSelection(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTreeSelection(obj), nil
+}
+
+func wrapTreeSelection(obj *glib.Object) *TreeSelection {
+ return &TreeSelection{obj}
+}
+
+// GetSelected() is a wrapper around gtk_tree_selection_get_selected().
+func (v *TreeSelection) GetSelected() (model ITreeModel, iter *TreeIter, ok bool) {
+ var cmodel *C.GtkTreeModel
+ var citer C.GtkTreeIter
+ c := C.gtk_tree_selection_get_selected(v.native(),
+ &cmodel, &citer)
+ model = wrapTreeModel(glib.Take(unsafe.Pointer(cmodel)))
+ iter = &TreeIter{citer}
+ ok = gobool(c)
+ return
+}
+
+// SelectPath is a wrapper around gtk_tree_selection_select_path().
+func (v *TreeSelection) SelectPath(path *TreePath) {
+ C.gtk_tree_selection_select_path(v.native(), path.native())
+}
+
+// UnselectPath is a wrapper around gtk_tree_selection_unselect_path().
+func (v *TreeSelection) UnselectPath(path *TreePath) {
+ C.gtk_tree_selection_unselect_path(v.native(), path.native())
+}
+
+// GetSelectedRows is a wrapper around gtk_tree_selection_get_selected_rows().
+// All the elements of returned list are wrapped into (*gtk.TreePath) values.
+//
+// Please note that a runtime finalizer is only set on the head of the linked
+// list, and must be kept live while accessing any item in the list, or the
+// Go garbage collector will free the whole list.
+func (v *TreeSelection) GetSelectedRows(model ITreeModel) *glib.List {
+ var pcmodel **C.GtkTreeModel
+ if model != nil {
+ cmodel := model.toTreeModel()
+ pcmodel = &cmodel
+ }
+
+ clist := C.gtk_tree_selection_get_selected_rows(v.native(), pcmodel)
+ if clist == nil {
+ return nil
+ }
+
+ glist := glib.WrapList(uintptr(unsafe.Pointer(clist)))
+ glist.DataWrapper(func(ptr unsafe.Pointer) interface{} {
+ return &TreePath{(*C.GtkTreePath)(ptr)}
+ })
+ runtime.SetFinalizer(glist, func(glist *glib.List) {
+ glist.FreeFull(func(item interface{}) {
+ path := item.(*TreePath)
+ C.gtk_tree_path_free(path.GtkTreePath)
+ })
+ })
+
+ return glist
+}
+
+// CountSelectedRows() is a wrapper around gtk_tree_selection_count_selected_rows().
+func (v *TreeSelection) CountSelectedRows() int {
+ return int(C.gtk_tree_selection_count_selected_rows(v.native()))
+}
+
+// SelectIter is a wrapper around gtk_tree_selection_select_iter().
+func (v *TreeSelection) SelectIter(iter *TreeIter) {
+ C.gtk_tree_selection_select_iter(v.native(), iter.native())
+}
+
+// SetMode() is a wrapper around gtk_tree_selection_set_mode().
+func (v *TreeSelection) SetMode(m SelectionMode) {
+ C.gtk_tree_selection_set_mode(v.native(), C.GtkSelectionMode(m))
+}
+
+// GetMode() is a wrapper around gtk_tree_selection_get_mode().
+func (v *TreeSelection) GetMode() SelectionMode {
+ return SelectionMode(C.gtk_tree_selection_get_mode(v.native()))
+}
+
+// SelectAll() is a wrapper around gtk_tree_selection_select_all()
+func (v *TreeSelection) SelectAll() {
+ C.gtk_tree_selection_select_all(v.native())
+}
+
+// UnelectAll() is a wrapper around gtk_tree_selection_unselect_all()
+func (v *TreeSelection) UnselectAll() {
+ C.gtk_tree_selection_unselect_all(v.native())
+}
+
+/*
+ * GtkTreeStore
+ */
+
+// TreeStore is a representation of GTK's GtkTreeStore.
+type TreeStore struct {
+ *glib.Object
+
+ // Interfaces
+ TreeModel
+}
+
+// native returns a pointer to the underlying GtkTreeStore.
+func (v *TreeStore) native() *C.GtkTreeStore {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTreeStore(p)
+}
+
+func marshalTreeStore(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTreeStore(obj), nil
+}
+
+func wrapTreeStore(obj *glib.Object) *TreeStore {
+ tm := wrapTreeModel(obj)
+ return &TreeStore{obj, *tm}
+}
+
+func (v *TreeStore) toTreeModel() *C.GtkTreeModel {
+ if v == nil {
+ return nil
+ }
+ return C.toGtkTreeModel(unsafe.Pointer(v.GObject))
+}
+
+// TreeStoreNew is a wrapper around gtk_tree_store_newv().
+func TreeStoreNew(types ...glib.Type) (*TreeStore, error) {
+ gtypes := C.alloc_types(C.int(len(types)))
+ for n, val := range types {
+ C.set_type(gtypes, C.int(n), C.GType(val))
+ }
+ defer C.g_free(C.gpointer(gtypes))
+ c := C.gtk_tree_store_newv(C.gint(len(types)), gtypes)
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ ts := wrapTreeStore(glib.Take(unsafe.Pointer(c)))
+ return ts, nil
+}
+
+// Append is a wrapper around gtk_tree_store_append().
+func (v *TreeStore) Append(parent *TreeIter) *TreeIter {
+ var ti C.GtkTreeIter
+ var cParent *C.GtkTreeIter
+ if parent != nil {
+ cParent = parent.native()
+ }
+ C.gtk_tree_store_append(v.native(), &ti, cParent)
+ iter := &TreeIter{ti}
+ return iter
+}
+
+// Insert is a wrapper around gtk_tree_store_insert
+func (v *TreeStore) Insert(parent *TreeIter, position int) *TreeIter {
+ var ti C.GtkTreeIter
+ var cParent *C.GtkTreeIter
+ if parent != nil {
+ cParent = parent.native()
+ }
+ C.gtk_tree_store_insert(v.native(), &ti, cParent, C.gint(position))
+ iter := &TreeIter{ti}
+ return iter
+}
+
+// SetValue is a wrapper around gtk_tree_store_set_value()
+func (v *TreeStore) SetValue(iter *TreeIter, column int, value interface{}) error {
+ switch value.(type) {
+ case *gdk.Pixbuf:
+ pix := value.(*gdk.Pixbuf)
+ C._gtk_tree_store_set(v.native(), iter.native(), C.gint(column), unsafe.Pointer(pix.Native()))
+
+ default:
+ gv, err := glib.GValue(value)
+ if err != nil {
+ return err
+ }
+ C.gtk_tree_store_set_value(v.native(), iter.native(),
+ C.gint(column),
+ (*C.GValue)(C.gpointer(gv.Native())))
+ }
+ return nil
+}
+
+// Remove is a wrapper around gtk_tree_store_remove().
+func (v *TreeStore) Remove(iter *TreeIter) bool {
+ var ti *C.GtkTreeIter
+ if iter != nil {
+ ti = iter.native()
+ }
+ return 0 != C.gtk_tree_store_remove(v.native(), ti)
+}
+
+// Clear is a wrapper around gtk_tree_store_clear().
+func (v *TreeStore) Clear() {
+ C.gtk_tree_store_clear(v.native())
+}
+
+/*
+ * GtkViewport
+ */
+
+// Viewport is a representation of GTK's GtkViewport GInterface.
+type Viewport struct {
+ Bin
+
+ // Interfaces
+ Scrollable
+}
+
+// IViewport is an interface type implemented by all structs
+// embedding a Viewport. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkViewport.
+type IViewport interface {
+ toViewport() *C.GtkViewport
+}
+
+// native() returns a pointer to the underlying GObject as a GtkViewport.
+func (v *Viewport) native() *C.GtkViewport {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkViewport(p)
+}
+
+func wrapViewport(obj *glib.Object) *Viewport {
+ b := wrapBin(obj)
+ s := wrapScrollable(obj)
+ return &Viewport{
+ Bin: *b,
+ Scrollable: *s,
+ }
+}
+
+func (v *Viewport) toViewport() *C.GtkViewport {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// ViewportNew() is a wrapper around gtk_viewport_new().
+func ViewportNew(hadjustment, vadjustment *Adjustment) (*Viewport, error) {
+ c := C.gtk_viewport_new(hadjustment.native(), vadjustment.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapViewport(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func (v *Viewport) SetHAdjustment(adjustment *Adjustment) {
+ wrapScrollable(v.Object).SetHAdjustment(adjustment)
+}
+
+func (v *Viewport) GetHAdjustment() (*Adjustment, error) {
+ return wrapScrollable(v.Object).GetHAdjustment()
+}
+
+func (v *Viewport) SetVAdjustment(adjustment *Adjustment) {
+ wrapScrollable(v.Object).SetVAdjustment(adjustment)
+}
+
+func (v *Viewport) GetVAdjustment() (*Adjustment, error) {
+ return wrapScrollable(v.Object).GetVAdjustment()
+}
+
+/*
+ * GtkVolumeButton
+ */
+
+// VolumeButton is a representation of GTK's GtkVolumeButton.
+type VolumeButton struct {
+ ScaleButton
+}
+
+// native() returns a pointer to the underlying GtkVolumeButton.
+func (v *VolumeButton) native() *C.GtkVolumeButton {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkVolumeButton(p)
+}
+
+func marshalVolumeButton(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapVolumeButton(obj), nil
+}
+
+func wrapVolumeButton(obj *glib.Object) *VolumeButton {
+ actionable := wrapActionable(obj)
+ return &VolumeButton{ScaleButton{Button{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}, actionable}}}
+}
+
+// VolumeButtonNew() is a wrapper around gtk_button_new().
+func VolumeButtonNew() (*VolumeButton, error) {
+ c := C.gtk_volume_button_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapVolumeButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+type WrapFn interface{}
+
+var WrapMap = map[string]WrapFn{
+ "GtkAccelGroup": wrapAccelGroup,
+ "GtkAccelMao": wrapAccelMap,
+ "GtkAdjustment": wrapAdjustment,
+ "GtkApplicationWindow": wrapApplicationWindow,
+ "GtkAssistant": wrapAssistant,
+ "GtkBin": wrapBin,
+ "GtkBox": wrapBox,
+ "GtkButton": wrapButton,
+ "GtkCalendar": wrapCalendar,
+ "GtkCellLayout": wrapCellLayout,
+ "GtkCellRenderer": wrapCellRenderer,
+ "GtkCellRendererSpinner": wrapCellRendererSpinner,
+ "GtkCellRendererPixbuf": wrapCellRendererPixbuf,
+ "GtkCellRendererText": wrapCellRendererText,
+ "GtkCellRendererToggle": wrapCellRendererToggle,
+ "GtkCheckButton": wrapCheckButton,
+ "GtkCheckMenuItem": wrapCheckMenuItem,
+ "GtkClipboard": wrapClipboard,
+ "GtkColorButton": wrapColorButton,
+ "GtkContainer": wrapContainer,
+ "GtkDialog": wrapDialog,
+ "GtkDrawingArea": wrapDrawingArea,
+ "GtkEditable": wrapEditable,
+ "GtkEntry": wrapEntry,
+ "GtkEntryBuffer": wrapEntryBuffer,
+ "GtkEntryCompletion": wrapEntryCompletion,
+ "GtkEventBox": wrapEventBox,
+ "GtkExpander": wrapExpander,
+ "GtkFrame": wrapFrame,
+ "GtkFileChooser": wrapFileChooser,
+ "GtkFileChooserButton": wrapFileChooserButton,
+ "GtkFileChooserDialog": wrapFileChooserDialog,
+ "GtkFileChooserWidget": wrapFileChooserWidget,
+ "GtkGrid": wrapGrid,
+ "GtkIconView": wrapIconView,
+ "GtkImage": wrapImage,
+ "GtkLabel": wrapLabel,
+ "GtkLayout": wrapLayout,
+ "GtkLinkButton": wrapLinkButton,
+ "GtkListStore": wrapListStore,
+ "GtkMenu": wrapMenu,
+ "GtkMenuBar": wrapMenuBar,
+ "GtkMenuButton": wrapMenuButton,
+ "GtkMenuItem": wrapMenuItem,
+ "GtkMenuShell": wrapMenuShell,
+ "GtkMessageDialog": wrapMessageDialog,
+ "GtkNotebook": wrapNotebook,
+ "GtkOffscreenWindow": wrapOffscreenWindow,
+ "GtkOrientable": wrapOrientable,
+ "GtkOverlay": wrapOverlay,
+ "GtkPaned": wrapPaned,
+ "GtkProgressBar": wrapProgressBar,
+ "GtkRadioButton": wrapRadioButton,
+ "GtkRadioMenuItem": wrapRadioMenuItem,
+ "GtkRange": wrapRange,
+ "GtkRecentChooser": wrapRecentChooser,
+ "GtkRecentChooserMenu": wrapRecentChooserMenu,
+ "GtkRecentFilter": wrapRecentFilter,
+ "GtkRecentManager": wrapRecentManager,
+ "GtkScaleButton": wrapScaleButton,
+ "GtkScale": wrapScale,
+ "GtkScrollable": wrapScrollable,
+ "GtkScrollbar": wrapScrollbar,
+ "GtkScrolledWindow": wrapScrolledWindow,
+ "GtkSearchEntry": wrapSearchEntry,
+ "GtkSeparator": wrapSeparator,
+ "GtkSeparatorMenuItem": wrapSeparatorMenuItem,
+ "GtkSeparatorToolItem": wrapSeparatorToolItem,
+ "GtkSpinButton": wrapSpinButton,
+ "GtkSpinner": wrapSpinner,
+ "GtkStatusbar": wrapStatusbar,
+ "GtkSwitch": wrapSwitch,
+ "GtkTextView": wrapTextView,
+ "GtkTextBuffer": wrapTextBuffer,
+ "GtkTextTag": wrapTextTag,
+ "GtkTextTagTable": wrapTextTagTable,
+ "GtkToggleButton": wrapToggleButton,
+ "GtkToolbar": wrapToolbar,
+ "GtkToolButton": wrapToolButton,
+ "GtkToolItem": wrapToolItem,
+ "GtkTreeModel": wrapTreeModel,
+ "GtkTreeModelFilter": wrapTreeModelFilter,
+ "GtkTreeSelection": wrapTreeSelection,
+ "GtkTreeStore": wrapTreeStore,
+ "GtkTreeView": wrapTreeView,
+ "GtkTreeViewColumn": wrapTreeViewColumn,
+ "GtkViewport": wrapViewport,
+ "GtkVolumeButton": wrapVolumeButton,
+ "GtkWidget": wrapWidget,
+ "GtkWindow": wrapWindow,
+}
+
+// cast takes a native GObject and casts it to the appropriate Go struct.
+//TODO change all wrapFns to return an IObject
+func cast(c *C.GObject) (glib.IObject, error) {
+ var (
+ className = goString(C.object_get_class_name(c))
+ obj = glib.Take(unsafe.Pointer(c))
+ )
+
+ fn, ok := WrapMap[className]
+ if !ok {
+ return nil, errors.New("unrecognized class name '" + className + "'")
+ }
+
+ rf := reflect.ValueOf(fn)
+ if rf.Type().Kind() != reflect.Func {
+ return nil, errors.New("wraper is not a function")
+ }
+
+ v := reflect.ValueOf(obj)
+ rv := rf.Call([]reflect.Value{v})
+
+ if len(rv) != 1 {
+ return nil, errors.New("wrapper did not return")
+ }
+
+ if k := rv[0].Kind(); k != reflect.Ptr {
+ return nil, fmt.Errorf("wrong return type %s", k)
+ }
+
+ ret, ok := rv[0].Interface().(glib.IObject)
+ if !ok {
+ return nil, errors.New("did not return an IObject")
+ }
+
+ return ret, nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk.go.h b/vendor/github.com/gotk3/gotk3/gtk/gtk.go.h
new file mode 100644
index 0000000..675e144
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk.go.h
@@ -0,0 +1,911 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#pragma once
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+static GtkAboutDialog *
+toGtkAboutDialog(void *p)
+{
+ return (GTK_ABOUT_DIALOG(p));
+}
+
+static GtkAppChooser *
+toGtkAppChooser(void *p)
+{
+ return (GTK_APP_CHOOSER(p));
+}
+
+static GtkAppChooserButton *
+toGtkAppChooserButton(void *p)
+{
+ return (GTK_APP_CHOOSER_BUTTON(p));
+}
+
+static GtkAppChooserDialog *
+toGtkAppChooserDialog(void *p)
+{
+ return (GTK_APP_CHOOSER_DIALOG(p));
+}
+
+static GtkAppChooserWidget *
+toGtkAppChooserWidget(void *p)
+{
+ return (GTK_APP_CHOOSER_WIDGET(p));
+}
+
+static GtkApplication *
+toGtkApplication(void *p)
+{
+ return (GTK_APPLICATION(p));
+}
+
+static GtkApplicationWindow *
+toGtkApplicationWindow(void *p)
+{
+ return (GTK_APPLICATION_WINDOW(p));
+}
+
+static GtkAssistant *
+toGtkAssistant(void *p)
+{
+ return (GTK_ASSISTANT(p));
+}
+
+static GtkCalendar *
+toGtkCalendar(void *p)
+{
+ return (GTK_CALENDAR(p));
+}
+
+static GtkColorChooserDialog *
+toGtkColorChooserDialog(void *p)
+{
+ return (GTK_COLOR_CHOOSER_DIALOG(p));
+}
+
+static GtkDrawingArea *
+toGtkDrawingArea(void *p)
+{
+ return (GTK_DRAWING_AREA(p));
+}
+
+static GtkCellRendererSpinner *
+toGtkCellRendererSpinner(void *p)
+{
+ return (GTK_CELL_RENDERER_SPINNER(p));
+}
+
+static GtkEventBox *
+toGtkEventBox(void *p)
+{
+ return (GTK_EVENT_BOX(p));
+}
+
+static GtkGrid *
+toGtkGrid(void *p)
+{
+ return (GTK_GRID(p));
+}
+
+static GtkWidget *
+toGtkWidget(void *p)
+{
+ return (GTK_WIDGET(p));
+}
+
+static GtkContainer *
+toGtkContainer(void *p)
+{
+ return (GTK_CONTAINER(p));
+}
+
+static GtkOverlay *
+toGtkOverlay(void *p)
+{
+ return (GTK_OVERLAY(p));
+}
+
+static GtkPageSetup *
+toGtkPageSetup(void *p)
+{
+ return (GTK_PAGE_SETUP(p));
+}
+
+static GtkPaned *
+toGtkPaned(void *p)
+{
+ return (GTK_PANED(p));
+}
+
+static GtkPrintContext *
+toGtkPrintContext(void *p)
+{
+ return (GTK_PRINT_CONTEXT(p));
+}
+
+static GtkPrintOperation *
+toGtkPrintOperation(void *p)
+{
+ return (GTK_PRINT_OPERATION(p));
+}
+
+static GtkPrintOperationPreview *
+toGtkPrintOperationPreview(void *p)
+{
+ return (GTK_PRINT_OPERATION_PREVIEW(p));
+}
+
+static GtkPrintSettings *
+toGtkPrintSettings(void *p)
+{
+ return (GTK_PRINT_SETTINGS(p));
+}
+
+static GtkProgressBar *
+toGtkProgressBar(void *p)
+{
+ return (GTK_PROGRESS_BAR(p));
+}
+
+static GtkLevelBar *
+toGtkLevelBar(void *p)
+{
+ return (GTK_LEVEL_BAR(p));
+}
+
+static GtkBin *
+toGtkBin(void *p)
+{
+ return (GTK_BIN(p));
+}
+
+static GtkWindow *
+toGtkWindow(void *p)
+{
+ return (GTK_WINDOW(p));
+}
+
+static GtkBox *
+toGtkBox(void *p)
+{
+ return (GTK_BOX(p));
+}
+
+static GtkStatusbar *
+toGtkStatusbar(void *p)
+{
+ return (GTK_STATUSBAR(p));
+}
+
+static GtkLabel *
+toGtkLabel(void *p)
+{
+ return (GTK_LABEL(p));
+}
+
+static GtkNotebook *
+toGtkNotebook(void *p)
+{
+ return (GTK_NOTEBOOK(p));
+}
+
+static GtkEntry *
+toGtkEntry(void *p)
+{
+ return (GTK_ENTRY(p));
+}
+
+static GtkEntryBuffer *
+toGtkEntryBuffer(void *p)
+{
+ return (GTK_ENTRY_BUFFER(p));
+}
+
+static GtkEntryCompletion *
+toGtkEntryCompletion(void *p)
+{
+ return (GTK_ENTRY_COMPLETION(p));
+}
+
+static GtkAdjustment *
+toGtkAdjustment(void *p)
+{
+ return (GTK_ADJUSTMENT(p));
+}
+
+static GtkAccelGroup *
+toGtkAccelGroup(void *p)
+{
+ return (GTK_ACCEL_GROUP(p));
+}
+
+static GtkAccelMap *
+toGtkAccelMap(void *p)
+{
+ return (GTK_ACCEL_MAP(p));
+}
+
+static GtkTextTag *
+toGtkTextTag(void *p)
+{
+ return (GTK_TEXT_TAG(p));
+}
+
+static GtkIconView *
+toGtkIconView(void *p)
+{
+ return (GTK_ICON_VIEW(p));
+}
+
+static GtkImage *
+toGtkImage(void *p)
+{
+ return (GTK_IMAGE(p));
+}
+
+static GtkButton *
+toGtkButton(void *p)
+{
+ return (GTK_BUTTON(p));
+}
+
+static GtkScaleButton *
+toGtkScaleButton(void *p)
+{
+ return (GTK_SCALE_BUTTON(p));
+}
+
+static GtkColorButton *
+toGtkColorButton(void *p)
+{
+ return (GTK_COLOR_BUTTON(p));
+}
+
+static GtkViewport *
+toGtkViewport(void *p)
+{
+ return (GTK_VIEWPORT(p));
+}
+
+static GtkVolumeButton *
+toGtkVolumeButton(void *p)
+{
+ return (GTK_VOLUME_BUTTON(p));
+}
+
+static GtkScrollable *
+toGtkScrollable(void *p)
+{
+ return (GTK_SCROLLABLE(p));
+}
+
+static GtkScrolledWindow *
+toGtkScrolledWindow(void *p)
+{
+ return (GTK_SCROLLED_WINDOW(p));
+}
+
+static GtkMenuItem *
+toGtkMenuItem(void *p)
+{
+ return (GTK_MENU_ITEM(p));
+}
+
+static GtkMenu *
+toGtkMenu(void *p)
+{
+ return (GTK_MENU(p));
+}
+
+static GtkMenuShell *
+toGtkMenuShell(void *p)
+{
+ return (GTK_MENU_SHELL(p));
+}
+
+static GtkMenuBar *
+toGtkMenuBar(void *p)
+{
+ return (GTK_MENU_BAR(p));
+}
+
+static GtkSizeGroup *
+toGtkSizeGroup(void *p)
+{
+ return (GTK_SIZE_GROUP(p));
+}
+
+static GtkSpinButton *
+toGtkSpinButton(void *p)
+{
+ return (GTK_SPIN_BUTTON(p));
+}
+
+static GtkSpinner *
+toGtkSpinner(void *p)
+{
+ return (GTK_SPINNER(p));
+}
+
+static GtkComboBox *
+toGtkComboBox(void *p)
+{
+ return (GTK_COMBO_BOX(p));
+}
+
+static GtkComboBoxText *
+toGtkComboBoxText(void *p)
+{
+ return (GTK_COMBO_BOX_TEXT(p));
+}
+
+static GtkLinkButton *
+toGtkLinkButton(void *p)
+{
+ return (GTK_LINK_BUTTON(p));
+}
+
+static GtkLayout *
+toGtkLayout(void *p)
+{
+ return (GTK_LAYOUT(p));
+}
+
+static GtkListStore *
+toGtkListStore(void *p)
+{
+ return (GTK_LIST_STORE(p));
+}
+
+static GtkSwitch *
+toGtkSwitch(void *p)
+{
+ return (GTK_SWITCH(p));
+}
+
+static GtkTextView *
+toGtkTextView(void *p)
+{
+ return (GTK_TEXT_VIEW(p));
+}
+
+static GtkTextTagTable *
+toGtkTextTagTable(void *p)
+{
+ return (GTK_TEXT_TAG_TABLE(p));
+}
+
+static GtkTextBuffer *
+toGtkTextBuffer(void *p)
+{
+ return (GTK_TEXT_BUFFER(p));
+}
+
+static GtkTreeModel *
+toGtkTreeModel(void *p)
+{
+ return (GTK_TREE_MODEL(p));
+}
+
+static GtkTreeModelFilter *
+toGtkTreeModelFilter(void *p)
+{
+ return (GTK_TREE_MODEL_FILTER(p));
+}
+
+static GtkCellRenderer *
+toGtkCellRenderer(void *p)
+{
+ return (GTK_CELL_RENDERER(p));
+}
+
+static GtkCellRendererPixbuf *
+toGtkCellRendererPixbuf(void *p)
+{
+ return (GTK_CELL_RENDERER_PIXBUF(p));
+}
+
+static GtkCellRendererText *
+toGtkCellRendererText(void *p)
+{
+ return (GTK_CELL_RENDERER_TEXT(p));
+}
+
+static GtkCellRendererToggle *
+toGtkCellRendererToggle(void *p)
+{
+ return (GTK_CELL_RENDERER_TOGGLE(p));
+}
+
+static GtkCellLayout *
+toGtkCellLayout(void *p)
+{
+ return (GTK_CELL_LAYOUT(p));
+}
+
+static GtkOrientable *
+toGtkOrientable(void *p)
+{
+ return (GTK_ORIENTABLE(p));
+}
+
+static GtkTreeStore *
+toGtkTreeStore (void *p)
+{
+ return (GTK_TREE_STORE(p));
+}
+
+static GtkTreeView *
+toGtkTreeView(void *p)
+{
+ return (GTK_TREE_VIEW(p));
+}
+
+static GtkTreeViewColumn *
+toGtkTreeViewColumn(void *p)
+{
+ return (GTK_TREE_VIEW_COLUMN(p));
+}
+
+static GtkTreeSelection *
+toGtkTreeSelection(void *p)
+{
+ return (GTK_TREE_SELECTION(p));
+}
+
+static GtkTreeSortable *
+toGtkTreeSortable(void *p)
+{
+ return (GTK_TREE_SORTABLE(p));
+}
+
+static GtkClipboard *
+toGtkClipboard(void *p)
+{
+ return (GTK_CLIPBOARD(p));
+}
+
+static GtkDialog *
+toGtkDialog(void *p)
+{
+ return (GTK_DIALOG(p));
+}
+
+static GtkMessageDialog *
+toGtkMessageDialog(void *p)
+{
+ return (GTK_MESSAGE_DIALOG(p));
+}
+
+static GtkBuilder *
+toGtkBuilder(void *p)
+{
+ return (GTK_BUILDER(p));
+}
+
+static GtkSeparatorMenuItem *
+toGtkSeparatorMenuItem(void *p)
+{
+ return (GTK_SEPARATOR_MENU_ITEM(p));
+}
+
+static GtkCheckButton *
+toGtkCheckButton(void *p)
+{
+ return (GTK_CHECK_BUTTON(p));
+}
+
+static GtkToggleButton *
+toGtkToggleButton(void *p)
+{
+ return (GTK_TOGGLE_BUTTON(p));
+}
+
+static GtkFontButton *
+toGtkFontButton(void *p)
+{
+ return (GTK_FONT_BUTTON(p));
+}
+
+static GtkFrame *
+toGtkFrame(void *p)
+{
+ return (GTK_FRAME(p));
+}
+
+static GtkAspectFrame *
+toGtkAspectFrame(void *p)
+{
+ return (GTK_ASPECT_FRAME(p));
+}
+
+static GtkSeparator *
+toGtkSeparator(void *p)
+{
+ return (GTK_SEPARATOR(p));
+}
+
+static GtkScale*
+toGtkScale(void *p)
+{
+ return (GTK_SCALE(p));
+}
+
+static GtkScrollbar *
+toGtkScrollbar(void *p)
+{
+ return (GTK_SCROLLBAR(p));
+}
+
+static GtkRange *
+toGtkRange(void *p)
+{
+ return (GTK_RANGE(p));
+}
+
+static GtkSearchEntry *
+toGtkSearchEntry(void *p)
+{
+ return (GTK_SEARCH_ENTRY(p));
+}
+
+static GtkOffscreenWindow *
+toGtkOffscreenWindow(void *p)
+{
+ return (GTK_OFFSCREEN_WINDOW(p));
+}
+
+static GtkExpander *
+toGtkExpander(void *p)
+{
+ return (GTK_EXPANDER(p));
+}
+
+static GtkFileChooser *
+toGtkFileChooser(void *p)
+{
+ return (GTK_FILE_CHOOSER(p));
+}
+
+static GtkFileChooserButton *
+toGtkFileChooserButton(void *p)
+{
+ return (GTK_FILE_CHOOSER_BUTTON(p));
+}
+
+static GtkFileChooserDialog *
+toGtkFileChooserDialog(void *p)
+{
+ return (GTK_FILE_CHOOSER_DIALOG(p));
+}
+
+static GtkFileChooserWidget *
+toGtkFileChooserWidget(void *p)
+{
+ return (GTK_FILE_CHOOSER_WIDGET(p));
+}
+
+static GtkFileFilter *
+toGtkFileFilter(void *p)
+{
+ return (GTK_FILE_FILTER(p));
+}
+
+static GtkMenuButton *
+toGtkMenuButton(void *p)
+{
+ return (GTK_MENU_BUTTON(p));
+}
+
+static GtkRadioButton *
+toGtkRadioButton(void *p)
+{
+ return (GTK_RADIO_BUTTON(p));
+}
+
+static GtkRecentChooser *
+toGtkRecentChooser(void *p)
+{
+ return (GTK_RECENT_CHOOSER(p));
+}
+
+static GtkRecentChooserMenu *
+toGtkRecentChooserMenu(void *p)
+{
+ return (GTK_RECENT_CHOOSER_MENU(p));
+}
+
+static GtkColorChooser *
+toGtkColorChooser(void *p)
+{
+ return (GTK_COLOR_CHOOSER(p));
+}
+
+static GtkFontChooser *
+toGtkFontChooser(void *p)
+{
+ return (GTK_FONT_CHOOSER(p));
+}
+
+static GtkRecentFilter *
+toGtkRecentFilter(void *p)
+{
+ return (GTK_RECENT_FILTER(p));
+}
+
+static GtkRecentManager *
+toGtkRecentManager(void *p)
+{
+ return (GTK_RECENT_MANAGER(p));
+}
+
+static GtkCheckMenuItem *
+toGtkCheckMenuItem(void *p)
+{
+ return (GTK_CHECK_MENU_ITEM(p));
+}
+
+static GtkRadioMenuItem *
+toGtkRadioMenuItem(void *p)
+{
+ return (GTK_RADIO_MENU_ITEM(p));
+}
+
+static GtkToolItem *
+toGtkToolItem(void *p)
+{
+ return (GTK_TOOL_ITEM(p));
+}
+
+static GtkToolbar *
+toGtkToolbar(void *p)
+{
+ return (GTK_TOOLBAR(p));
+}
+
+static GtkTooltip *
+toGtkTooltip(void *p)
+{
+ return (GTK_TOOLTIP(p));
+}
+
+static GtkEditable *
+toGtkEditable(void *p)
+{
+ return (GTK_EDITABLE(p));
+}
+
+static GtkToolButton *
+toGtkToolButton(void *p)
+{
+ return (GTK_TOOL_BUTTON(p));
+}
+
+static GtkSeparatorToolItem *
+toGtkSeparatorToolItem(void *p)
+{
+ return (GTK_SEPARATOR_TOOL_ITEM(p));
+}
+
+static GtkCssProvider *
+toGtkCssProvider(void *p)
+{
+ return (GTK_CSS_PROVIDER(p));
+}
+
+static GtkStyleContext *
+toGtkStyleContext(void *p)
+{
+ return (GTK_STYLE_CONTEXT(p));
+}
+
+static GtkStyleProvider *
+toGtkStyleProvider(void *p)
+{
+ return (GTK_STYLE_PROVIDER(p));
+}
+
+static GtkInfoBar *
+toGtkInfoBar(void *p)
+{
+ return (GTK_INFO_BAR(p));
+}
+
+static GMenuModel *
+toGMenuModel(void *p)
+{
+ return (G_MENU_MODEL(p));
+}
+
+static GActionGroup *
+toGActionGroup(void *p)
+{
+ return (G_ACTION_GROUP(p));
+}
+
+static GdkPixbuf *
+toGdkPixbuf(void *p)
+{
+ return (GDK_PIXBUF(p));
+}
+
+static GType *
+alloc_types(int n) {
+ return ((GType *)g_new0(GType, n));
+}
+
+static void
+set_type(GType *types, int n, GType t)
+{
+ types[n] = t;
+}
+
+static GtkTreeViewColumn *
+_gtk_tree_view_column_new_with_attributes_one(const gchar *title,
+ GtkCellRenderer *renderer, const gchar *attribute, gint column)
+{
+ GtkTreeViewColumn *tvc;
+
+ tvc = gtk_tree_view_column_new_with_attributes(title, renderer,
+ attribute, column, NULL);
+ return (tvc);
+}
+
+static void
+_gtk_list_store_set(GtkListStore *list_store, GtkTreeIter *iter, gint column,
+ void* value)
+{
+ gtk_list_store_set(list_store, iter, column, value, -1);
+}
+
+static void
+_gtk_tree_store_set(GtkTreeStore *store, GtkTreeIter *iter, gint column,
+ void* value)
+{
+ gtk_tree_store_set(store, iter, column, value, -1);
+}
+
+extern gboolean substring_match_equal_func(GtkTreeModel *model,
+ gint column,
+ gchar *key,
+ GtkTreeIter *iter,
+ gpointer data);
+
+static GtkWidget *
+_gtk_message_dialog_new(GtkWindow *parent, GtkDialogFlags flags,
+ GtkMessageType type, GtkButtonsType buttons, char *msg)
+{
+ GtkWidget *w;
+
+ w = gtk_message_dialog_new(parent, flags, type, buttons, "%s", msg);
+ return (w);
+}
+
+static GtkWidget *
+_gtk_message_dialog_new_with_markup(GtkWindow *parent, GtkDialogFlags flags,
+ GtkMessageType type, GtkButtonsType buttons, char *msg)
+{
+ GtkWidget *w;
+
+ w = gtk_message_dialog_new_with_markup(parent, flags, type, buttons,
+ "%s", msg);
+ return (w);
+}
+
+static void
+_gtk_message_dialog_format_secondary_text(GtkMessageDialog *message_dialog,
+ const gchar *msg)
+{
+ gtk_message_dialog_format_secondary_text(message_dialog, "%s", msg);
+}
+
+static void
+_gtk_message_dialog_format_secondary_markup(GtkMessageDialog *message_dialog,
+ const gchar *msg)
+{
+ gtk_message_dialog_format_secondary_markup(message_dialog, "%s", msg);
+}
+
+static const gchar *
+object_get_class_name(GObject *object)
+{
+ return G_OBJECT_CLASS_NAME(G_OBJECT_GET_CLASS(object));
+}
+
+static GtkWidget *
+gtk_file_chooser_dialog_new_1(
+ const gchar *title,
+ GtkWindow *parent,
+ GtkFileChooserAction action,
+ const gchar *first_button_text, int first_button_id
+) {
+ return gtk_file_chooser_dialog_new(
+ title, parent, action,
+ first_button_text, first_button_id,
+ NULL);
+}
+
+static GtkWidget *
+gtk_file_chooser_dialog_new_2(
+ const gchar *title,
+ GtkWindow *parent,
+ GtkFileChooserAction action,
+ const gchar *first_button_text, int first_button_id,
+ const gchar *second_button_text, int second_button_id
+) {
+ return gtk_file_chooser_dialog_new(
+ title, parent, action,
+ first_button_text, first_button_id,
+ second_button_text, second_button_id,
+ NULL);
+}
+
+static void _gtk_widget_hide_on_delete(GtkWidget* w) {
+ g_signal_connect(GTK_WIDGET(w), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), NULL);
+}
+
+static inline gchar** make_strings(int count) {
+ return (gchar**)malloc(sizeof(gchar*) * count);
+}
+
+static inline void destroy_strings(gchar** strings) {
+ free(strings);
+}
+
+static inline gchar* get_string(gchar** strings, int n) {
+ return strings[n];
+}
+
+static inline void set_string(gchar** strings, int n, gchar* str) {
+ strings[n] = str;
+}
+
+static inline gchar** next_gcharptr(gchar** s) { return (s+1); }
+
+extern void goBuilderConnect (GtkBuilder *builder,
+ GObject *object,
+ gchar *signal_name,
+ gchar *handler_name,
+ GObject *connect_object,
+ GConnectFlags flags,
+ gpointer user_data);
+
+static inline void _gtk_builder_connect_signals_full(GtkBuilder *builder) {
+ gtk_builder_connect_signals_full(builder, (GtkBuilderConnectFunc)(goBuilderConnect), NULL);
+}
+
+extern void goPrintSettings (gchar *key,
+ gchar *value,
+ gpointer user_data);
+
+static inline void _gtk_print_settings_foreach(GtkPrintSettings *ps, gpointer user_data) {
+ gtk_print_settings_foreach(ps, (GtkPrintSettingsFunc)(goPrintSettings), user_data);
+}
+
+extern void goPageSetupDone (GtkPageSetup *setup,
+ gpointer data);
+
+static inline void _gtk_print_run_page_setup_dialog_async(GtkWindow *parent, GtkPageSetup *setup,
+ GtkPrintSettings *settings, gpointer data) {
+ gtk_print_run_page_setup_dialog_async(parent, setup, settings,
+ (GtkPageSetupDoneFunc)(goPageSetupDone), data);
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_10.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_10.go
new file mode 100644
index 0000000..0a5fc68
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_10.go
@@ -0,0 +1,244 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrapers for symbols deprecated beginning with GTK 3.10,
+// and should only be included in a build targeted intended to target GTK
+// 3.8 or earlier. To target an earlier build build, use the build tag
+// gtk_MAJOR_MINOR. For example, to target GTK 3.8, run
+// 'go build -tags gtk_3_8'.
+// +build gtk_3_6 gtk_3_8
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+// ButtonNewFromStock is a wrapper around gtk_button_new_from_stock().
+func ButtonNewFromStock(stock Stock) (*Button, error) {
+ cstr := C.CString(string(stock))
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_button_new_from_stock((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetUseStock is a wrapper around gtk_button_set_use_stock().
+func (v *Button) SetUseStock(useStock bool) {
+ C.gtk_button_set_use_stock(v.native(), gbool(useStock))
+}
+
+// GetUseStock is a wrapper around gtk_button_get_use_stock().
+func (v *Button) GetUseStock() bool {
+ c := C.gtk_button_get_use_stock(v.native())
+ return gobool(c)
+}
+
+// GetIconStock is a wrapper around gtk_entry_get_icon_stock().
+func (v *Entry) GetIconStock(iconPos EntryIconPosition) (string, error) {
+ c := C.gtk_entry_get_icon_stock(v.native(),
+ C.GtkEntryIconPosition(iconPos))
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return C.GoString((*C.char)(c)), nil
+}
+
+// SetIconFromStock is a wrapper around gtk_entry_set_icon_from_stock().
+func (v *Entry) SetIconFromStock(iconPos EntryIconPosition, stockID string) {
+ cstr := C.CString(stockID)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_entry_set_icon_from_stock(v.native(),
+ C.GtkEntryIconPosition(iconPos), (*C.gchar)(cstr))
+}
+
+// ImageNewFromStock is a wrapper around gtk_image_new_from_stock().
+func ImageNewFromStock(stock Stock, size IconSize) (*Image, error) {
+ cstr := C.CString(string(stock))
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_image_new_from_stock((*C.gchar)(cstr), C.GtkIconSize(size))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapImage(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetFromStock is a wrapper around gtk_image_set_from_stock().
+func (v *Image) SetFromStock(stock Stock, size IconSize) {
+ cstr := C.CString(string(stock))
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_image_set_from_stock(v.native(), (*C.gchar)(cstr),
+ C.GtkIconSize(size))
+}
+
+// StatusIconNewFromStock is a wrapper around gtk_status_icon_new_from_stock().
+// Deprecated since 3.10, use StatusIconNewFromIconName (gtk_status_icon_new_from_icon_name) instead.
+func StatusIconNewFromStock(stockId string) (*StatusIcon, error) {
+ cstr := C.CString(stockId)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_status_icon_new_from_file((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapStatusIcon(obj), nil
+}
+
+// SetFromStock is a wrapper around gtk_status_icon_set_from_stock()
+// Deprecated since 3.10, use SetFromIconName (gtk_status_icon_set_from_icon_name) instead.
+func (v *StatusIcon) SetFromStock(stockID string) {
+ cstr := C.CString(stockID)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_status_icon_set_from_stock(v.native(), (*C.gchar)(cstr))
+}
+
+// GetStock is a wrapper around gtk_status_icon_get_stock()
+// Deprecated since 3.10, use GetIconName (gtk_status_icon_get_icon_name) instead
+func (v *StatusIcon) GetStock() string {
+ c := C.gtk_status_icon_get_stock(v.native())
+ if c == nil {
+ return ""
+ }
+ return C.GoString((*C.char)(c))
+}
+
+// Stock is a special type that does not have an equivalent type in
+// GTK. It is the type used as a parameter anytime an identifier for
+// stock icons are needed. A Stock must be type converted to string when
+// function parameters may take a Stock, but when other string values are
+// valid as well.
+type Stock string
+
+const (
+ STOCK_ABOUT Stock = C.GTK_STOCK_ABOUT
+ STOCK_ADD Stock = C.GTK_STOCK_ADD
+ STOCK_APPLY Stock = C.GTK_STOCK_APPLY
+ STOCK_BOLD Stock = C.GTK_STOCK_BOLD
+ STOCK_CANCEL Stock = C.GTK_STOCK_CANCEL
+ STOCK_CAPS_LOCK_WARNING Stock = C.GTK_STOCK_CAPS_LOCK_WARNING
+ STOCK_CDROM Stock = C.GTK_STOCK_CDROM
+ STOCK_CLEAR Stock = C.GTK_STOCK_CLEAR
+ STOCK_CLOSE Stock = C.GTK_STOCK_CLOSE
+ STOCK_COLOR_PICKER Stock = C.GTK_STOCK_COLOR_PICKER
+ STOCK_CONNECT Stock = C.GTK_STOCK_CONNECT
+ STOCK_CONVERT Stock = C.GTK_STOCK_CONVERT
+ STOCK_COPY Stock = C.GTK_STOCK_COPY
+ STOCK_CUT Stock = C.GTK_STOCK_CUT
+ STOCK_DELETE Stock = C.GTK_STOCK_DELETE
+ STOCK_DIALOG_AUTHENTICATION Stock = C.GTK_STOCK_DIALOG_AUTHENTICATION
+ STOCK_DIALOG_INFO Stock = C.GTK_STOCK_DIALOG_INFO
+ STOCK_DIALOG_WARNING Stock = C.GTK_STOCK_DIALOG_WARNING
+ STOCK_DIALOG_ERROR Stock = C.GTK_STOCK_DIALOG_ERROR
+ STOCK_DIALOG_QUESTION Stock = C.GTK_STOCK_DIALOG_QUESTION
+ STOCK_DIRECTORY Stock = C.GTK_STOCK_DIRECTORY
+ STOCK_DISCARD Stock = C.GTK_STOCK_DISCARD
+ STOCK_DISCONNECT Stock = C.GTK_STOCK_DISCONNECT
+ STOCK_DND Stock = C.GTK_STOCK_DND
+ STOCK_DND_MULTIPLE Stock = C.GTK_STOCK_DND_MULTIPLE
+ STOCK_EDIT Stock = C.GTK_STOCK_EDIT
+ STOCK_EXECUTE Stock = C.GTK_STOCK_EXECUTE
+ STOCK_FILE Stock = C.GTK_STOCK_FILE
+ STOCK_FIND Stock = C.GTK_STOCK_FIND
+ STOCK_FIND_AND_REPLACE Stock = C.GTK_STOCK_FIND_AND_REPLACE
+ STOCK_FLOPPY Stock = C.GTK_STOCK_FLOPPY
+ STOCK_FULLSCREEN Stock = C.GTK_STOCK_FULLSCREEN
+ STOCK_GOTO_BOTTOM Stock = C.GTK_STOCK_GOTO_BOTTOM
+ STOCK_GOTO_FIRST Stock = C.GTK_STOCK_GOTO_FIRST
+ STOCK_GOTO_LAST Stock = C.GTK_STOCK_GOTO_LAST
+ STOCK_GOTO_TOP Stock = C.GTK_STOCK_GOTO_TOP
+ STOCK_GO_BACK Stock = C.GTK_STOCK_GO_BACK
+ STOCK_GO_DOWN Stock = C.GTK_STOCK_GO_DOWN
+ STOCK_GO_FORWARD Stock = C.GTK_STOCK_GO_FORWARD
+ STOCK_GO_UP Stock = C.GTK_STOCK_GO_UP
+ STOCK_HARDDISK Stock = C.GTK_STOCK_HARDDISK
+ STOCK_HELP Stock = C.GTK_STOCK_HELP
+ STOCK_HOME Stock = C.GTK_STOCK_HOME
+ STOCK_INDEX Stock = C.GTK_STOCK_INDEX
+ STOCK_INDENT Stock = C.GTK_STOCK_INDENT
+ STOCK_INFO Stock = C.GTK_STOCK_INFO
+ STOCK_ITALIC Stock = C.GTK_STOCK_ITALIC
+ STOCK_JUMP_TO Stock = C.GTK_STOCK_JUMP_TO
+ STOCK_JUSTIFY_CENTER Stock = C.GTK_STOCK_JUSTIFY_CENTER
+ STOCK_JUSTIFY_FILL Stock = C.GTK_STOCK_JUSTIFY_FILL
+ STOCK_JUSTIFY_LEFT Stock = C.GTK_STOCK_JUSTIFY_LEFT
+ STOCK_JUSTIFY_RIGHT Stock = C.GTK_STOCK_JUSTIFY_RIGHT
+ STOCK_LEAVE_FULLSCREEN Stock = C.GTK_STOCK_LEAVE_FULLSCREEN
+ STOCK_MISSING_IMAGE Stock = C.GTK_STOCK_MISSING_IMAGE
+ STOCK_MEDIA_FORWARD Stock = C.GTK_STOCK_MEDIA_FORWARD
+ STOCK_MEDIA_NEXT Stock = C.GTK_STOCK_MEDIA_NEXT
+ STOCK_MEDIA_PAUSE Stock = C.GTK_STOCK_MEDIA_PAUSE
+ STOCK_MEDIA_PLAY Stock = C.GTK_STOCK_MEDIA_PLAY
+ STOCK_MEDIA_PREVIOUS Stock = C.GTK_STOCK_MEDIA_PREVIOUS
+ STOCK_MEDIA_RECORD Stock = C.GTK_STOCK_MEDIA_RECORD
+ STOCK_MEDIA_REWIND Stock = C.GTK_STOCK_MEDIA_REWIND
+ STOCK_MEDIA_STOP Stock = C.GTK_STOCK_MEDIA_STOP
+ STOCK_NETWORK Stock = C.GTK_STOCK_NETWORK
+ STOCK_NEW Stock = C.GTK_STOCK_NEW
+ STOCK_NO Stock = C.GTK_STOCK_NO
+ STOCK_OK Stock = C.GTK_STOCK_OK
+ STOCK_OPEN Stock = C.GTK_STOCK_OPEN
+ STOCK_ORIENTATION_PORTRAIT Stock = C.GTK_STOCK_ORIENTATION_PORTRAIT
+ STOCK_ORIENTATION_LANDSCAPE Stock = C.GTK_STOCK_ORIENTATION_LANDSCAPE
+ STOCK_ORIENTATION_REVERSE_LANDSCAPE Stock = C.GTK_STOCK_ORIENTATION_REVERSE_LANDSCAPE
+ STOCK_ORIENTATION_REVERSE_PORTRAIT Stock = C.GTK_STOCK_ORIENTATION_REVERSE_PORTRAIT
+ STOCK_PAGE_SETUP Stock = C.GTK_STOCK_PAGE_SETUP
+ STOCK_PASTE Stock = C.GTK_STOCK_PASTE
+ STOCK_PREFERENCES Stock = C.GTK_STOCK_PREFERENCES
+ STOCK_PRINT Stock = C.GTK_STOCK_PRINT
+ STOCK_PRINT_ERROR Stock = C.GTK_STOCK_PRINT_ERROR
+ STOCK_PRINT_PAUSED Stock = C.GTK_STOCK_PRINT_PAUSED
+ STOCK_PRINT_PREVIEW Stock = C.GTK_STOCK_PRINT_PREVIEW
+ STOCK_PRINT_REPORT Stock = C.GTK_STOCK_PRINT_REPORT
+ STOCK_PRINT_WARNING Stock = C.GTK_STOCK_PRINT_WARNING
+ STOCK_PROPERTIES Stock = C.GTK_STOCK_PROPERTIES
+ STOCK_QUIT Stock = C.GTK_STOCK_QUIT
+ STOCK_REDO Stock = C.GTK_STOCK_REDO
+ STOCK_REFRESH Stock = C.GTK_STOCK_REFRESH
+ STOCK_REMOVE Stock = C.GTK_STOCK_REMOVE
+ STOCK_REVERT_TO_SAVED Stock = C.GTK_STOCK_REVERT_TO_SAVED
+ STOCK_SAVE Stock = C.GTK_STOCK_SAVE
+ STOCK_SAVE_AS Stock = C.GTK_STOCK_SAVE_AS
+ STOCK_SELECT_ALL Stock = C.GTK_STOCK_SELECT_ALL
+ STOCK_SELECT_COLOR Stock = C.GTK_STOCK_SELECT_COLOR
+ STOCK_SELECT_FONT Stock = C.GTK_STOCK_SELECT_FONT
+ STOCK_SORT_ASCENDING Stock = C.GTK_STOCK_SORT_ASCENDING
+ STOCK_SORT_DESCENDING Stock = C.GTK_STOCK_SORT_DESCENDING
+ STOCK_SPELL_CHECK Stock = C.GTK_STOCK_SPELL_CHECK
+ STOCK_STOP Stock = C.GTK_STOCK_STOP
+ STOCK_STRIKETHROUGH Stock = C.GTK_STOCK_STRIKETHROUGH
+ STOCK_UNDELETE Stock = C.GTK_STOCK_UNDELETE
+ STOCK_UNDERLINE Stock = C.GTK_STOCK_UNDERLINE
+ STOCK_UNDO Stock = C.GTK_STOCK_UNDO
+ STOCK_UNINDENT Stock = C.GTK_STOCK_UNINDENT
+ STOCK_YES Stock = C.GTK_STOCK_YES
+ STOCK_ZOOM_100 Stock = C.GTK_STOCK_ZOOM_100
+ STOCK_ZOOM_FIT Stock = C.GTK_STOCK_ZOOM_FIT
+ STOCK_ZOOM_IN Stock = C.GTK_STOCK_ZOOM_IN
+ STOCK_ZOOM_OUT Stock = C.GTK_STOCK_ZOOM_OUT
+)
+
+// ReshowWithInitialSize is a wrapper around
+// gtk_window_reshow_with_initial_size().
+func (v *Window) ReshowWithInitialSize() {
+ C.gtk_window_reshow_with_initial_size(v.native())
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_12.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_12.go
new file mode 100644
index 0000000..204b04b
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_12.go
@@ -0,0 +1,89 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrapers for symbols deprecated beginning with GTK 3.12,
+// and should only be included in a build targeted intended to target GTK
+// 3.10 or earlier. To target an earlier build build, use the build tag
+// gtk_MAJOR_MINOR. For example, to target GTK 3.8, run
+// 'go build -tags gtk_3_8'.
+// +build gtk_3_6 gtk_3_8 gtk_3_10
+
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkDialog
+ */
+
+// GetActionArea() is a wrapper around gtk_dialog_get_action_area().
+func (v *Dialog) GetActionArea() (*Widget, error) {
+ c := C.gtk_dialog_get_action_area(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkMessageDialog
+ */
+
+// GetImage is a wrapper around gtk_message_dialog_get_image().
+func (v *MessageDialog) GetImage() (*Widget, error) {
+ c := C.gtk_message_dialog_get_image(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetImage is a wrapper around gtk_message_dialog_set_image().
+func (v *MessageDialog) SetImage(image IWidget) {
+ C.gtk_message_dialog_set_image(v.native(), image.toWidget())
+}
+
+/*
+ * GtkWidget
+ */
+
+// GetMarginLeft is a wrapper around gtk_widget_get_margin_left().
+func (v *Widget) GetMarginLeft() int {
+ c := C.gtk_widget_get_margin_left(v.native())
+ return int(c)
+}
+
+// SetMarginLeft is a wrapper around gtk_widget_set_margin_left().
+func (v *Widget) SetMarginLeft(margin int) {
+ C.gtk_widget_set_margin_left(v.native(), C.gint(margin))
+}
+
+// GetMarginRight is a wrapper around gtk_widget_get_margin_right().
+func (v *Widget) GetMarginRight() int {
+ c := C.gtk_widget_get_margin_right(v.native())
+ return int(c)
+}
+
+// SetMarginRight is a wrapper around gtk_widget_set_margin_right().
+func (v *Widget) SetMarginRight(margin int) {
+ C.gtk_widget_set_margin_right(v.native(), C.gint(margin))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_14.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_14.go
new file mode 100644
index 0000000..f30f203
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_14.go
@@ -0,0 +1,467 @@
+// +build gtk_3_6 gtk_3_8 gtk_3_10 gtk_3_12
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+// #include "gtk_deprecated_since_3_14.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_alignment_get_type()), marshalAlignment},
+ {glib.Type(C.gtk_arrow_get_type()), marshalArrow},
+ {glib.Type(C.gtk_misc_get_type()), marshalMisc},
+ {glib.Type(C.gtk_status_icon_get_type()), marshalStatusIcon},
+ }
+ glib.RegisterGValueMarshalers(tm)
+
+ //Contribute to casting
+ for k, v := range map[string]WrapFn{
+ "GtkAlignment": wrapAlignment,
+ "GtkArrow": wrapArrow,
+ "GtkMisc": wrapMisc,
+ "GtkStatusIcon": wrapStatusIcon,
+ } {
+ WrapMap[k] = v
+ }
+}
+
+/*
+ * deprecated since version 3.14 and should not be used in newly-written code
+ */
+
+// ResizeGripIsVisible is a wrapper around
+// gtk_window_resize_grip_is_visible().
+func (v *Window) ResizeGripIsVisible() bool {
+ c := C.gtk_window_resize_grip_is_visible(v.native())
+ return gobool(c)
+}
+
+// SetHasResizeGrip is a wrapper around gtk_window_set_has_resize_grip().
+func (v *Window) SetHasResizeGrip(setting bool) {
+ C.gtk_window_set_has_resize_grip(v.native(), gbool(setting))
+}
+
+// GetHasResizeGrip is a wrapper around gtk_window_get_has_resize_grip().
+func (v *Window) GetHasResizeGrip() bool {
+ c := C.gtk_window_get_has_resize_grip(v.native())
+ return gobool(c)
+}
+
+// Reparent() is a wrapper around gtk_widget_reparent().
+func (v *Widget) Reparent(newParent IWidget) {
+ C.gtk_widget_reparent(v.native(), newParent.toWidget())
+}
+
+// GetPadding is a wrapper around gtk_alignment_get_padding().
+func (v *Alignment) GetPadding() (top, bottom, left, right uint) {
+ var ctop, cbottom, cleft, cright C.guint
+ C.gtk_alignment_get_padding(v.native(), &ctop, &cbottom, &cleft,
+ &cright)
+ return uint(ctop), uint(cbottom), uint(cleft), uint(cright)
+}
+
+// SetPadding is a wrapper around gtk_alignment_set_padding().
+func (v *Alignment) SetPadding(top, bottom, left, right uint) {
+ C.gtk_alignment_set_padding(v.native(), C.guint(top), C.guint(bottom),
+ C.guint(left), C.guint(right))
+}
+
+// AlignmentNew is a wrapper around gtk_alignment_new().
+func AlignmentNew(xalign, yalign, xscale, yscale float32) (*Alignment, error) {
+ c := C.gtk_alignment_new(C.gfloat(xalign), C.gfloat(yalign), C.gfloat(xscale),
+ C.gfloat(yscale))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAlignment(obj), nil
+}
+
+// Set is a wrapper around gtk_alignment_set().
+func (v *Alignment) Set(xalign, yalign, xscale, yscale float32) {
+ C.gtk_alignment_set(v.native(), C.gfloat(xalign), C.gfloat(yalign),
+ C.gfloat(xscale), C.gfloat(yscale))
+}
+
+/*
+ * GtkArrow
+ */
+
+// Arrow is a representation of GTK's GtkArrow.
+type Arrow struct {
+ Misc
+}
+
+// ArrowNew is a wrapper around gtk_arrow_new().
+func ArrowNew(arrowType ArrowType, shadowType ShadowType) (*Arrow, error) {
+ c := C.gtk_arrow_new(C.GtkArrowType(arrowType),
+ C.GtkShadowType(shadowType))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapArrow(obj), nil
+}
+
+// Set is a wrapper around gtk_arrow_set().
+func (v *Arrow) Set(arrowType ArrowType, shadowType ShadowType) {
+ C.gtk_arrow_set(v.native(), C.GtkArrowType(arrowType), C.GtkShadowType(shadowType))
+}
+
+// SetAlignment() is a wrapper around gtk_button_set_alignment().
+func (v *Button) SetAlignment(xalign, yalign float32) {
+ C.gtk_button_set_alignment(v.native(), (C.gfloat)(xalign),
+ (C.gfloat)(yalign))
+}
+
+// GetAlignment() is a wrapper around gtk_button_get_alignment().
+func (v *Button) GetAlignment() (xalign, yalign float32) {
+ var x, y C.gfloat
+ C.gtk_button_get_alignment(v.native(), &x, &y)
+ return float32(x), float32(y)
+}
+
+// SetReallocateRedraws is a wrapper around
+// gtk_container_set_reallocate_redraws().
+func (v *Container) SetReallocateRedraws(needsRedraws bool) {
+ C.gtk_container_set_reallocate_redraws(v.native(), gbool(needsRedraws))
+}
+
+// GetAlignment is a wrapper around gtk_misc_get_alignment().
+func (v *Misc) GetAlignment() (xAlign, yAlign float32) {
+ var x, y C.gfloat
+ C.gtk_misc_get_alignment(v.native(), &x, &y)
+ return float32(x), float32(y)
+}
+
+// SetAlignment is a wrapper around gtk_misc_set_alignment().
+func (v *Misc) SetAlignment(xAlign, yAlign float32) {
+ C.gtk_misc_set_alignment(v.native(), C.gfloat(xAlign), C.gfloat(yAlign))
+}
+
+// GetPadding is a wrapper around gtk_misc_get_padding().
+func (v *Misc) GetPadding() (xpad, ypad int) {
+ var x, y C.gint
+ C.gtk_misc_get_padding(v.native(), &x, &y)
+ return int(x), int(y)
+}
+
+// SetPadding is a wrapper around gtk_misc_set_padding().
+func (v *Misc) SetPadding(xPad, yPad int) {
+ C.gtk_misc_set_padding(v.native(), C.gint(xPad), C.gint(yPad))
+}
+
+// SetDoubleBuffered is a wrapper around gtk_widget_set_double_buffered().
+func (v *Widget) SetDoubleBuffered(doubleBuffered bool) {
+ C.gtk_widget_set_double_buffered(v.native(), gbool(doubleBuffered))
+}
+
+// GetDoubleBuffered is a wrapper around gtk_widget_get_double_buffered().
+func (v *Widget) GetDoubleBuffered() bool {
+ c := C.gtk_widget_get_double_buffered(v.native())
+ return gobool(c)
+}
+
+/*
+ * GtkArrow
+ * deprecated since version 3.14
+ */
+// native returns a pointer to the underlying GtkButton.
+func (v *Arrow) native() *C.GtkArrow {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkArrow(p)
+}
+
+func marshalArrow(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapArrow(obj), nil
+}
+
+func wrapArrow(obj *glib.Object) *Arrow {
+ return &Arrow{Misc{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+/*
+ * GtkAlignment
+ * deprecated since version 3.14
+ */
+
+type Alignment struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkAlignment.
+func (v *Alignment) native() *C.GtkAlignment {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkAlignment(p)
+}
+
+func marshalAlignment(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapAlignment(obj), nil
+}
+
+func wrapAlignment(obj *glib.Object) *Alignment {
+ return &Alignment{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+/*
+ * GtkStatusIcon
+ * deprecated since version 3.14
+ */
+
+// StatusIcon is a representation of GTK's GtkStatusIcon.
+// Deprecated since 3.14 in favor of notifications
+// (no replacement, see https://stackoverflow.com/questions/41917903/gtk-3-statusicon-replacement)
+type StatusIcon struct {
+ *glib.Object
+}
+
+func marshalStatusIcon(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapStatusIcon(obj), nil
+}
+
+func wrapStatusIcon(obj *glib.Object) *StatusIcon {
+ return &StatusIcon{obj}
+}
+
+func (v *StatusIcon) native() *C.GtkStatusIcon {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkStatusIcon(p)
+}
+
+// TODO: GtkStatusIcon * gtk_status_icon_new_from_gicon (GIcon *icon);
+// TODO: void gtk_status_icon_set_from_gicon (GtkStatusIcon *status_icon, GIcon *icon);
+
+// TODO: GIcon * gtk_status_icon_get_gicon (GtkStatusIcon *status_icon);
+
+// TODO: void gtk_status_icon_set_screen (GtkStatusIcon *status_icon, GdkScreen *screen);
+// TODO: GdkScreen * gtk_status_icon_get_screen (GtkStatusIcon *status_icon);
+
+// TODO: GdkPixbuf * gtk_status_icon_get_pixbuf (GtkStatusIcon *status_icon);
+
+// TODO: void gtk_status_icon_position_menu (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data);
+// TODO: gboolean gtk_status_icon_get_geometry (GtkStatusIcon *status_icon, GdkScreen **screen, GdkRectangle *area, GtkOrientation *orientation);
+
+// StatusIconNew is a wrapper around gtk_status_icon_new()
+func StatusIconNew() (*StatusIcon, error) {
+ c := C.gtk_status_icon_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapStatusIcon(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// StatusIconNewFromFile is a wrapper around gtk_status_icon_new_from_file()
+func StatusIconNewFromFile(filename string) (*StatusIcon, error) {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_status_icon_new_from_file((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapStatusIcon(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// StatusIconNewFromIconName is a wrapper around gtk_status_icon_new_from_icon_name()
+func StatusIconNewFromIconName(iconName string) (*StatusIcon, error) {
+ cstr := C.CString(iconName)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_status_icon_new_from_icon_name((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapStatusIcon(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// StatusIconNewFromPixbuf is a wrapper around gtk_status_icon_new_from_pixbuf().
+func StatusIconNewFromPixbuf(pixbuf *gdk.Pixbuf) (*StatusIcon, error) {
+ c := C.gtk_status_icon_new_from_pixbuf(C.toGdkPixbuf(unsafe.Pointer(pixbuf.Native())))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapStatusIcon(obj), nil
+}
+
+// SetFromFile is a wrapper around gtk_status_icon_set_from_file()
+func (v *StatusIcon) SetFromFile(filename string) {
+ cstr := C.CString(filename)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_status_icon_set_from_file(v.native(), (*C.gchar)(cstr))
+}
+
+// SetFromIconName is a wrapper around gtk_status_icon_set_from_icon_name()
+func (v *StatusIcon) SetFromIconName(iconName string) {
+ cstr := C.CString(iconName)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_status_icon_set_from_icon_name(v.native(), (*C.gchar)(cstr))
+}
+
+// SetFromPixbuf is a wrapper around gtk_status_icon_set_from_pixbuf()
+func (v *StatusIcon) SetFromPixbuf(pixbuf *gdk.Pixbuf) {
+ C.gtk_status_icon_set_from_pixbuf(v.native(), C.toGdkPixbuf(unsafe.Pointer(pixbuf.Native())))
+}
+
+// GetStorageType is a wrapper around gtk_status_icon_get_storage_type()
+func (v *StatusIcon) GetStorageType() ImageType {
+ return (ImageType)(C.gtk_status_icon_get_storage_type(v.native()))
+}
+
+// SetTooltipText is a wrapper around gtk_status_icon_set_tooltip_text()
+func (v *StatusIcon) SetTooltipText(text string) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_status_icon_set_tooltip_text(v.native(), (*C.gchar)(cstr))
+}
+
+// GetTooltipText is a wrapper around gtk_status_icon_get_tooltip_text()
+func (v *StatusIcon) GetTooltipText() string {
+ c := C.gtk_status_icon_get_tooltip_text(v.native())
+ if c == nil {
+ return ""
+ }
+ return C.GoString((*C.char)(c))
+}
+
+// SetTooltipMarkup is a wrapper around gtk_status_icon_set_tooltip_markup()
+func (v *StatusIcon) SetTooltipMarkup(markup string) {
+ cstr := C.CString(markup)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_status_icon_set_tooltip_markup(v.native(), (*C.gchar)(cstr))
+}
+
+// GetTooltipMarkup is a wrapper around gtk_status_icon_get_tooltip_markup()
+func (v *StatusIcon) GetTooltipMarkup() string {
+ c := C.gtk_status_icon_get_tooltip_markup(v.native())
+ if c == nil {
+ return ""
+ }
+ return C.GoString((*C.char)(c))
+}
+
+// SetHasTooltip is a wrapper around gtk_status_icon_set_has_tooltip()
+func (v *StatusIcon) SetHasTooltip(hasTooltip bool) {
+ C.gtk_status_icon_set_has_tooltip(v.native(), gbool(hasTooltip))
+}
+
+// GetTitle is a wrapper around gtk_status_icon_get_title()
+func (v *StatusIcon) GetTitle() string {
+ c := C.gtk_status_icon_get_title(v.native())
+ if c == nil {
+ return ""
+ }
+ return C.GoString((*C.char)(c))
+}
+
+// SetName is a wrapper around gtk_status_icon_set_name()
+func (v *StatusIcon) SetName(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_status_icon_set_name(v.native(), (*C.gchar)(cstr))
+}
+
+// SetVisible is a wrapper around gtk_status_icon_set_visible()
+func (v *StatusIcon) SetVisible(visible bool) {
+ C.gtk_status_icon_set_visible(v.native(), gbool(visible))
+}
+
+// GetVisible is a wrapper around gtk_status_icon_get_visible()
+func (v *StatusIcon) GetVisible() bool {
+ return gobool(C.gtk_status_icon_get_visible(v.native()))
+}
+
+// IsEmbedded is a wrapper around gtk_status_icon_is_embedded()
+func (v *StatusIcon) IsEmbedded() bool {
+ return gobool(C.gtk_status_icon_is_embedded(v.native()))
+}
+
+// GetX11WindowID is a wrapper around gtk_status_icon_get_x11_window_id()
+func (v *StatusIcon) GetX11WindowID() uint32 {
+ return uint32(C.gtk_status_icon_get_x11_window_id(v.native()))
+}
+
+// GetHasTooltip is a wrapper around gtk_status_icon_get_has_tooltip()
+func (v *StatusIcon) GetHasTooltip() bool {
+ return gobool(C.gtk_status_icon_get_has_tooltip(v.native()))
+}
+
+// SetTitle is a wrapper around gtk_status_icon_set_title()
+func (v *StatusIcon) SetTitle(title string) {
+ cstr := C.CString(title)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_status_icon_set_title(v.native(), (*C.gchar)(cstr))
+}
+
+// GetIconName is a wrapper around gtk_status_icon_get_icon_name()
+func (v *StatusIcon) GetIconName() string {
+ c := C.gtk_status_icon_get_icon_name(v.native())
+ if c == nil {
+ return ""
+ }
+ return C.GoString((*C.char)(c))
+}
+
+// GetSize is a wrapper around gtk_status_icon_get_size()
+func (v *StatusIcon) GetSize() int {
+ return int(C.gtk_status_icon_get_size(v.native()))
+}
+
+// PopupAtStatusIcon() is a wrapper around gtk_menu_popup() specific to usage with GtkStatusIcon.
+// gomenu_popup() is defined in menu.go.h, this is a workaround to pass gtk_status_icon_position_menu as the GtkMenuPositionFunc.
+func (v *Menu) PopupAtStatusIcon(statusIcon *StatusIcon, button uint, activateTime uint32) {
+ C.gotk_menu_popup_at_status_icon(v.native(), statusIcon.native(), C.guint(button), C.guint32(activateTime))
+}
+
+/*
+ * GtkMisc
+ */
+
+// Misc is a representation of GTK's GtkMisc.
+type Misc struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkMisc.
+func (v *Misc) native() *C.GtkMisc {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkMisc(p)
+}
+
+func marshalMisc(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapMisc(obj), nil
+}
+
+func wrapMisc(obj *glib.Object) *Misc {
+ return &Misc{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+/*
+ * End deprecated since version 3.14
+ */
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_14.go.h b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_14.go.h
new file mode 100644
index 0000000..18a1855
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_14.go.h
@@ -0,0 +1,46 @@
+
+/*
+ * deprecated since version 3.14
+ */
+
+// Wrapper for gtk_menu_popup to allow calling gtk_status_icon_position_menu as callback from go code
+// Used in func (v *Menu) PopupAtStatusIcon
+static void
+gotk_menu_popup_at_status_icon(GtkMenu *menu, GtkStatusIcon *status_icon, guint button, guint32 activate_time)
+{
+ gtk_menu_popup(menu, NULL, NULL, gtk_status_icon_position_menu, status_icon, button, activate_time);
+}
+
+static GtkAlignment *
+toGtkAlignment(void *p)
+{
+ return (GTK_ALIGNMENT(p));
+}
+
+static GtkArrow *
+toGtkArrow(void *p)
+{
+ return (GTK_ARROW(p));
+}
+
+static GtkMisc *
+toGtkMisc(void *p)
+{
+ return (GTK_MISC(p));
+}
+
+static GtkStatusIcon *
+toGtkStatusIcon(void *p)
+{
+ return (GTK_STATUS_ICON(p));
+}
+
+static GdkPixbuf *
+toGdkPixbuf(void *p)
+{
+ return (GDK_PIXBUF(p));
+}
+
+/*
+ * End deprecated since version 3.14
+ */
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_16.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_16.go
new file mode 100644
index 0000000..1f2e9d4
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_16.go
@@ -0,0 +1,48 @@
+//+build gtk_3_6 gtk_3_8 gtk_3_10 gtk_3_12 gtk_3_14
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include <stdlib.h>
+import "C"
+
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+)
+
+// OverrideColor is a wrapper around gtk_widget_override_color().
+func (v *Widget) OverrideColor(state StateFlags, color *gdk.RGBA) {
+ var cColor *C.GdkRGBA
+ if color != nil {
+ cColor = (*C.GdkRGBA)(unsafe.Pointer(color.Native()))
+ }
+ C.gtk_widget_override_color(v.native(), C.GtkStateFlags(state), cColor)
+}
+
+func (v *Widget) OverrideBackgroundColor(state StateFlags, color *gdk.RGBA) {
+ var cColor *C.GdkRGBA
+ if color != nil {
+ cColor = (*C.GdkRGBA)(unsafe.Pointer(color.Native()))
+ }
+ C.gtk_widget_override_background_color(v.native(), C.GtkStateFlags(state), cColor)
+}
+
+func (v *Button) SetColor(color string) {
+ rgba := C.GdkRGBA{}
+ C.gdk_rgba_parse(&rgba, (*C.gchar)(C.CString(color)))
+ C.gtk_widget_override_background_color(v.toWidget(), C.GTK_STATE_FLAG_NORMAL, &rgba)
+}
+
+// OverrideFont is a wrapper around gtk_widget_override_font().
+func (v *Widget) OverrideFont(description string) {
+ cstr := C.CString(description)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.pango_font_description_from_string(cstr)
+ C.gtk_widget_override_font(v.native(), c)
+}
+
+func (v *Label) SetFont(font string) {
+ v.OverrideFont(font)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_20.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_20.go
new file mode 100644
index 0000000..a63c206
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_20.go
@@ -0,0 +1,34 @@
+//+build gtk_3_6 gtk_3_8 gtk_3_10 gtk_3_12 gtk_3_14 gtk_3_16 gtk_3_18
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include <stdlib.h>
+import "C"
+
+// GetFocusOnClick() is a wrapper around gtk_button_get_focus_on_click().
+func (v *Button) GetFocusOnClick() bool {
+ c := C.gtk_button_get_focus_on_click(v.native())
+ return gobool(c)
+}
+
+// BeginsTag is a wrapper around gtk_text_iter_begins_tag().
+func (v *TextIter) BeginsTag(v1 *TextTag) bool {
+ return gobool(C.gtk_text_iter_begins_tag(v.native(), v1.native()))
+}
+
+// ResizeToGeometry is a wrapper around gtk_window_resize_to_geometry().
+func (v *Window) ResizeToGeometry(width, height int) {
+ C.gtk_window_resize_to_geometry(v.native(), C.gint(width), C.gint(height))
+}
+
+// SetDefaultGeometry is a wrapper around gtk_window_set_default_geometry().
+func (v *Window) SetDefaultGeometry(width, height int) {
+ C.gtk_window_set_default_geometry(v.native(), C.gint(width),
+ C.gint(height))
+}
+
+// SetFocusOnClick() is a wrapper around gtk_button_set_focus_on_click().
+func (v *Button) SetFocusOnClick(focusOnClick bool) {
+ C.gtk_button_set_focus_on_click(v.native(), gbool(focusOnClick))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_22.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_22.go
new file mode 100644
index 0000000..b155cb4
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_22.go
@@ -0,0 +1,57 @@
+//+build gtk_3_6 gtk_3_8 gtk_3_10 gtk_3_12 gtk_3_14 gtk_3_16 gtk_3_18 gtk_3_20
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include <stdlib.h>
+import "C"
+
+import (
+ "unsafe"
+)
+
+// PopupAtMouse() is a wrapper for gtk_menu_popup(), without the option for a custom positioning function.
+func (v *Menu) PopupAtMouseCursor(parentMenuShell IMenu, parentMenuItem IMenuItem, button int, activateTime uint32) {
+ wshell := nullableWidget(parentMenuShell)
+ witem := nullableWidget(parentMenuItem)
+
+ C.gtk_menu_popup(v.native(),
+ wshell,
+ witem,
+ nil,
+ nil,
+ C.guint(button),
+ C.guint32(activateTime))
+}
+
+func (v *SizeGroup) GetIgnoreHidden() bool {
+ c := C.gtk_size_group_get_ignore_hidden(v.native())
+ return gobool(c)
+}
+
+// SetWMClass is a wrapper around gtk_window_set_wmclass().
+func (v *Window) SetWMClass(name, class string) {
+ cName := C.CString(name)
+ defer C.free(unsafe.Pointer(cName))
+ cClass := C.CString(class)
+ defer C.free(unsafe.Pointer(cClass))
+ C.gtk_window_set_wmclass(v.native(), (*C.gchar)(cName), (*C.gchar)(cClass))
+}
+
+func (v *SizeGroup) SetIgnoreHidden(ignoreHidden bool) {
+ C.gtk_size_group_set_ignore_hidden(v.native(), gbool(ignoreHidden))
+}
+
+// GetFontName is a wrapper around gtk_font_button_get_font_name().
+func (v *FontButton) GetFontName() string {
+ c := C.gtk_font_button_get_font_name(v.native())
+ return goString(c)
+}
+
+// SetFontName is a wrapper around gtk_font_button_set_font_name().
+func (v *FontButton) SetFontName(fontname string) bool {
+ cstr := C.CString(fontname)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_font_button_set_font_name(v.native(), (*C.gchar)(cstr))
+ return gobool(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_24.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_24.go
new file mode 100644
index 0000000..ed144a7
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_24.go
@@ -0,0 +1,46 @@
+//+build gtk_3_6 gtk_3_8 gtk_3_10 gtk_3_12 gtk_3_14 gtk_3_16 gtk_3_18 gtk_3_20 gtk_3_22
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include <stdlib.h>
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+// GetFocusChain is a wrapper around gtk_container_get_focus_chain().
+func (v *Container) GetFocusChain() ([]*Widget, bool) {
+ var cwlist *C.GList
+ c := C.gtk_container_get_focus_chain(v.native(), &cwlist)
+
+ var widgets []*Widget
+ wlist := glib.WrapList(uintptr(unsafe.Pointer(cwlist)))
+ for ; wlist.Data() != nil; wlist = wlist.Next() {
+ widgets = append(widgets, wrapWidget(glib.Take(wlist.Data().(unsafe.Pointer))))
+ }
+ return widgets, gobool(c)
+}
+
+// SetFocusChain is a wrapper around gtk_container_set_focus_chain().
+func (v *Container) SetFocusChain(focusableWidgets []IWidget) {
+ var list *glib.List
+ for _, w := range focusableWidgets {
+ data := uintptr(unsafe.Pointer(w.toWidget()))
+ list = list.Append(data)
+ }
+ glist := (*C.GList)(unsafe.Pointer(list))
+ C.gtk_container_set_focus_chain(v.native(), glist)
+}
+
+// CssProviderGetDefault is a wrapper around gtk_css_provider_get_default().
+func CssProviderGetDefault() (*CssProvider, error) {
+ c := C.gtk_css_provider_get_default()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapCssProvider(obj), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_8.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_8.go
new file mode 100644
index 0000000..223ddf0
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_deprecated_since_3_8.go
@@ -0,0 +1,41 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrapers for symbols deprecated beginning with GTK 3.8,
+// and should only be included in a build targeted intended to target GTK
+// 3.6 or earlier. To target an earlier build build, use the build tag
+// gtk_MAJOR_MINOR. For example, to target GTK 3.6, run
+// 'go build -tags gtk_3_6'.
+// +build gtk_3_6
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+import "C"
+
+// SetOpacity is a wrapper around gtk_window_set_opacity()
+// Deprecated since 3.8, replaced by SetOpacity on Widget (gtk_widget_set_opacity)
+func (v *Window) SetOpacity(opacity float64) {
+ C.gtk_window_set_opacity(v.native(), C.gdouble(opacity))
+}
+
+// GetOpacity is a wrapper around gtk_window_get_opacity()
+// Deprecated since 3.8, replaced by GetOpacity on Widget (gtk_widget_get_opacity)
+func (v *Window) GetOpacity() float64 {
+ c := C.gtk_window_get_opacity(v.native())
+ return float64(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_export.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_export.go
new file mode 100644
index 0000000..985aa32
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_export.go
@@ -0,0 +1,104 @@
+package gtk
+
+/*
+ #include <gtk/gtk.h>
+*/
+import "C"
+import (
+ "strings"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+//export substring_match_equal_func
+func substring_match_equal_func(model *C.GtkTreeModel,
+ column C.gint,
+ key *C.gchar,
+ iter *C.GtkTreeIter,
+ data C.gpointer) C.gboolean {
+
+ goModel := &TreeModel{glib.Take(unsafe.Pointer(model))}
+ goIter := &TreeIter{(C.GtkTreeIter)(*iter)}
+
+ value, err := goModel.GetValue(goIter, int(column))
+ if err != nil {
+ return gbool(true)
+ }
+
+ str, _ := value.GetString()
+ if str == "" {
+ return gbool(true)
+ }
+
+ subStr := C.GoString((*C.char)(key))
+ res := strings.Contains(str, subStr)
+ return gbool(!res)
+}
+
+//export goBuilderConnect
+func goBuilderConnect(builder *C.GtkBuilder,
+ object *C.GObject,
+ signal_name *C.gchar,
+ handler_name *C.gchar,
+ connect_object *C.GObject,
+ flags C.GConnectFlags,
+ user_data C.gpointer) {
+
+ builderSignals.Lock()
+ signals, ok := builderSignals.m[builder]
+ builderSignals.Unlock()
+
+ if !ok {
+ panic("no signal mapping defined for this GtkBuilder")
+ }
+
+ h := C.GoString((*C.char)(handler_name))
+ s := C.GoString((*C.char)(signal_name))
+
+ handler, ok := signals[h]
+ if !ok {
+ return
+ }
+
+ if object == nil {
+ panic("unexpected nil object from builder")
+ }
+
+ //TODO: figure out a better way to get a glib.Object from a *C.GObject
+ gobj := glib.Object{glib.ToGObject(unsafe.Pointer(object))}
+ gobj.Connect(s, handler)
+}
+
+//export goPageSetupDone
+func goPageSetupDone(setup *C.GtkPageSetup,
+ data C.gpointer) {
+
+ id := int(uintptr(data))
+
+ pageSetupDoneCallbackRegistry.Lock()
+ r := pageSetupDoneCallbackRegistry.m[id]
+ delete(pageSetupDoneCallbackRegistry.m, id)
+ pageSetupDoneCallbackRegistry.Unlock()
+
+ obj := glib.Take(unsafe.Pointer(setup))
+ r.fn(wrapPageSetup(obj), r.data)
+
+}
+
+//export goPrintSettings
+func goPrintSettings(key *C.gchar,
+ value *C.gchar,
+ userData C.gpointer) {
+
+ id := int(uintptr(userData))
+
+ printSettingsCallbackRegistry.Lock()
+ r := printSettingsCallbackRegistry.m[id]
+ // TODO: figure out a way to determine when we can clean up
+ //delete(printSettingsCallbackRegistry.m, id)
+ printSettingsCallbackRegistry.Unlock()
+
+ r.fn(C.GoString((*C.char)(key)), C.GoString((*C.char)(value)), r.userData)
+
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_export_since_3_10.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_export_since_3_10.go
new file mode 100644
index 0000000..51f604f
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_export_since_3_10.go
@@ -0,0 +1,24 @@
+// +build !gtk_3_6,!gtk_3_8
+
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+//export goListBoxFilterFuncs
+func goListBoxFilterFuncs(row *C.GtkListBoxRow, userData C.gpointer) C.gboolean {
+ id := int(uintptr(userData))
+
+ listBoxFilterFuncRegistry.Lock()
+ r := listBoxFilterFuncRegistry.m[id]
+ // TODO: figure out a way to determine when we can clean up
+ //delete(printSettingsCallbackRegistry.m, id)
+ listBoxFilterFuncRegistry.Unlock()
+
+ return gbool(r.fn(wrapListBoxRow(glib.Take(unsafe.Pointer(row))), r.userData))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_10.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_10.go
new file mode 100644
index 0000000..35ffb63
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_10.go
@@ -0,0 +1,734 @@
+// Same copyright and license as the rest of the files in this project
+// This file contains accelerator related functions and structures
+
+// +build !gtk_3_6,!gtk_3_8
+// not use this: go build -tags gtk_3_8'. Otherwise, if no build tags are used, GTK 3.10
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+// #include "gtk_since_3_10.go.h"
+import "C"
+import (
+ "sync"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Enums
+ {glib.Type(C.gtk_revealer_transition_type_get_type()), marshalRevealerTransitionType},
+ {glib.Type(C.gtk_stack_transition_type_get_type()), marshalStackTransitionType},
+
+ // Objects/Interfaces
+ {glib.Type(C.gtk_header_bar_get_type()), marshalHeaderBar},
+ {glib.Type(C.gtk_list_box_get_type()), marshalListBox},
+ {glib.Type(C.gtk_list_box_row_get_type()), marshalListBoxRow},
+ {glib.Type(C.gtk_revealer_get_type()), marshalRevealer},
+ {glib.Type(C.gtk_search_bar_get_type()), marshalSearchBar},
+ {glib.Type(C.gtk_stack_get_type()), marshalStack},
+ {glib.Type(C.gtk_stack_switcher_get_type()), marshalStackSwitcher},
+ }
+ glib.RegisterGValueMarshalers(tm)
+
+ //Contribute to casting
+ for k, v := range map[string]WrapFn{
+ "GtkHeaderBar": wrapHeaderBar,
+ "GtkListBox": wrapListBox,
+ "GtkListBoxRow": wrapListBoxRow,
+ "GtkRevealer": wrapRevealer,
+ "GtkSearchBar": wrapSearchBar,
+ "GtkStack": wrapStack,
+ } {
+ WrapMap[k] = v
+ }
+}
+
+/*
+ * Constants
+ */
+
+const (
+ ALIGN_BASELINE Align = C.GTK_ALIGN_BASELINE
+)
+
+// RevealerTransitionType is a representation of GTK's GtkRevealerTransitionType.
+type RevealerTransitionType int
+
+const (
+ REVEALER_TRANSITION_TYPE_NONE RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_NONE
+ REVEALER_TRANSITION_TYPE_CROSSFADE RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_CROSSFADE
+ REVEALER_TRANSITION_TYPE_SLIDE_RIGHT RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT
+ REVEALER_TRANSITION_TYPE_SLIDE_LEFT RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT
+ REVEALER_TRANSITION_TYPE_SLIDE_UP RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP
+ REVEALER_TRANSITION_TYPE_SLIDE_DOWN RevealerTransitionType = C.GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN
+)
+
+func marshalRevealerTransitionType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return RevealerTransitionType(c), nil
+}
+
+// StackTransitionType is a representation of GTK's GtkStackTransitionType.
+type StackTransitionType int
+
+const (
+ STACK_TRANSITION_TYPE_NONE StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_NONE
+ STACK_TRANSITION_TYPE_CROSSFADE StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_CROSSFADE
+ STACK_TRANSITION_TYPE_SLIDE_RIGHT StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT
+ STACK_TRANSITION_TYPE_SLIDE_LEFT StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT
+ STACK_TRANSITION_TYPE_SLIDE_UP StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_UP
+ STACK_TRANSITION_TYPE_SLIDE_DOWN StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_DOWN
+ STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT
+ STACK_TRANSITION_TYPE_SLIDE_UP_DOWN StackTransitionType = C.GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN
+)
+
+func marshalStackTransitionType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return StackTransitionType(c), nil
+}
+
+/*
+ * GtkButton
+ */
+
+// ButtonNewFromIconName is a wrapper around gtk_button_new_from_icon_name().
+func ButtonNewFromIconName(iconName string, size IconSize) (*Button, error) {
+ cstr := C.CString(iconName)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_button_new_from_icon_name((*C.gchar)(cstr),
+ C.GtkIconSize(size))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapButton(glib.Take(unsafe.Pointer(c))), nil
+}
+
+/*
+ * GtkGrid
+ */
+
+// RemoveRow() is a wrapper around gtk_grid_remove_row().
+func (v *Grid) RemoveRow(position int) {
+ C.gtk_grid_remove_row(v.native(), C.gint(position))
+}
+
+// RemoveColumn() is a wrapper around gtk_grid_remove_column().
+func (v *Grid) RemoveColumn(position int) {
+ C.gtk_grid_remove_column(v.native(), C.gint(position))
+}
+
+/*
+ * GtkHeaderBar
+ */
+
+type HeaderBar struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkHeaderBar.
+func (v *HeaderBar) native() *C.GtkHeaderBar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkHeaderBar(p)
+}
+
+func marshalHeaderBar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapHeaderBar(obj), nil
+}
+
+func wrapHeaderBar(obj *glib.Object) *HeaderBar {
+ return &HeaderBar{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// HeaderBarNew is a wrapper around gtk_header_bar_new().
+func HeaderBarNew() (*HeaderBar, error) {
+ c := C.gtk_header_bar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapHeaderBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetTitle is a wrapper around gtk_header_bar_set_title().
+func (v *HeaderBar) SetTitle(title string) {
+ cstr := C.CString(title)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_header_bar_set_title(v.native(), (*C.gchar)(cstr))
+}
+
+// GetTitle is a wrapper around gtk_header_bar_get_title().
+func (v *HeaderBar) GetTitle() string {
+ cstr := C.gtk_header_bar_get_title(v.native())
+ return C.GoString((*C.char)(cstr))
+}
+
+// SetSubtitle is a wrapper around gtk_header_bar_set_subtitle().
+func (v *HeaderBar) SetSubtitle(subtitle string) {
+ cstr := C.CString(subtitle)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_header_bar_set_subtitle(v.native(), (*C.gchar)(cstr))
+}
+
+// GetSubtitle is a wrapper around gtk_header_bar_get_subtitle().
+func (v *HeaderBar) GetSubtitle() string {
+ cstr := C.gtk_header_bar_get_subtitle(v.native())
+ return C.GoString((*C.char)(cstr))
+}
+
+// SetCustomTitle is a wrapper around gtk_header_bar_set_custom_title().
+func (v *HeaderBar) SetCustomTitle(titleWidget IWidget) {
+ C.gtk_header_bar_set_custom_title(v.native(), titleWidget.toWidget())
+}
+
+// GetCustomTitle is a wrapper around gtk_header_bar_get_custom_title().
+func (v *HeaderBar) GetCustomTitle() (*Widget, error) {
+ c := C.gtk_header_bar_get_custom_title(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// PackStart is a wrapper around gtk_header_bar_pack_start().
+func (v *HeaderBar) PackStart(child IWidget) {
+ C.gtk_header_bar_pack_start(v.native(), child.toWidget())
+}
+
+// PackEnd is a wrapper around gtk_header_bar_pack_end().
+func (v *HeaderBar) PackEnd(child IWidget) {
+ C.gtk_header_bar_pack_end(v.native(), child.toWidget())
+}
+
+// SetShowCloseButton is a wrapper around gtk_header_bar_set_show_close_button().
+func (v *HeaderBar) SetShowCloseButton(setting bool) {
+ C.gtk_header_bar_set_show_close_button(v.native(), gbool(setting))
+}
+
+// GetShowCloseButton is a wrapper around gtk_header_bar_get_show_close_button().
+func (v *HeaderBar) GetShowCloseButton() bool {
+ c := C.gtk_header_bar_get_show_close_button(v.native())
+ return gobool(c)
+}
+
+/*
+ * GtkLabel
+ */
+
+// GetLines() is a wrapper around gtk_label_get_lines().
+func (v *Label) GetLines() int {
+ c := C.gtk_label_get_lines(v.native())
+ return int(c)
+}
+
+// SetLines() is a wrapper around gtk_label_set_lines().
+func (v *Label) SetLines(lines int) {
+ C.gtk_label_set_lines(v.native(), C.gint(lines))
+}
+
+/*
+ * GtkListBox
+ */
+
+// ListBox is a representation of GTK's GtkListBox.
+type ListBox struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkListBox.
+func (v *ListBox) native() *C.GtkListBox {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkListBox(p)
+}
+
+func marshalListBox(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapListBox(obj), nil
+}
+
+func wrapListBox(obj *glib.Object) *ListBox {
+ return &ListBox{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// ListBoxNew is a wrapper around gtk_list_box_new().
+func ListBoxNew() (*ListBox, error) {
+ c := C.gtk_list_box_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapListBox(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// Prepend is a wrapper around gtk_list_box_prepend().
+func (v *ListBox) Prepend(child IWidget) {
+ C.gtk_list_box_prepend(v.native(), child.toWidget())
+}
+
+// Insert is a wrapper around gtk_list_box_insert().
+func (v *ListBox) Insert(child IWidget, position int) {
+ C.gtk_list_box_insert(v.native(), child.toWidget(), C.gint(position))
+}
+
+// SelectRow is a wrapper around gtk_list_box_select_row().
+func (v *ListBox) SelectRow(row *ListBoxRow) {
+ C.gtk_list_box_select_row(v.native(), row.native())
+}
+
+// GetSelectedRow is a wrapper around gtk_list_box_get_selected_row().
+func (v *ListBox) GetSelectedRow() *ListBoxRow {
+ c := C.gtk_list_box_get_selected_row(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapListBoxRow(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetSelectionMode is a wrapper around gtk_list_box_set_selection_mode().
+func (v *ListBox) SetSelectionMode(mode SelectionMode) {
+ C.gtk_list_box_set_selection_mode(v.native(), C.GtkSelectionMode(mode))
+}
+
+// GetSelectionMode is a wrapper around gtk_list_box_get_selection_mode()
+func (v *ListBox) GetSelectionMode() SelectionMode {
+ c := C.gtk_list_box_get_selection_mode(v.native())
+ return SelectionMode(c)
+}
+
+// SetActivateOnSingleClick is a wrapper around gtk_list_box_set_activate_on_single_click().
+func (v *ListBox) SetActivateOnSingleClick(single bool) {
+ C.gtk_list_box_set_activate_on_single_click(v.native(), gbool(single))
+}
+
+// GetActivateOnSingleClick is a wrapper around gtk_list_box_get_activate_on_single_click().
+func (v *ListBox) GetActivateOnSingleClick() bool {
+ c := C.gtk_list_box_get_activate_on_single_click(v.native())
+ return gobool(c)
+}
+
+// GetAdjustment is a wrapper around gtk_list_box_get_adjustment().
+func (v *ListBox) GetAdjustment() *Adjustment {
+ c := C.gtk_list_box_get_adjustment(v.native())
+ obj := glib.Take(unsafe.Pointer(c))
+ return &Adjustment{glib.InitiallyUnowned{obj}}
+}
+
+// SetAdjustment is a wrapper around gtk_list_box_set_adjustment().
+func (v *ListBox) SetAdjustment(adjustment *Adjustment) {
+ C.gtk_list_box_set_adjustment(v.native(), adjustment.native())
+}
+
+// SetPlaceholder is a wrapper around gtk_list_box_set_placeholder().
+func (v *ListBox) SetPlaceholder(placeholder IWidget) {
+ C.gtk_list_box_set_placeholder(v.native(), placeholder.toWidget())
+}
+
+// GetRowAtIndex is a wrapper around gtk_list_box_get_row_at_index().
+func (v *ListBox) GetRowAtIndex(index int) *ListBoxRow {
+ c := C.gtk_list_box_get_row_at_index(v.native(), C.gint(index))
+ if c == nil {
+ return nil
+ }
+ return wrapListBoxRow(glib.Take(unsafe.Pointer(c)))
+}
+
+// GetRowAtY is a wrapper around gtk_list_box_get_row_at_y().
+func (v *ListBox) GetRowAtY(y int) *ListBoxRow {
+ c := C.gtk_list_box_get_row_at_y(v.native(), C.gint(y))
+ if c == nil {
+ return nil
+ }
+ return wrapListBoxRow(glib.Take(unsafe.Pointer(c)))
+}
+
+// InvalidateFilter is a wrapper around gtk_list_box_invalidate_filter().
+func (v *ListBox) InvalidateFilter() {
+ C.gtk_list_box_invalidate_filter(v.native())
+}
+
+// InvalidateHeaders is a wrapper around gtk_list_box_invalidate_headers().
+func (v *ListBox) InvalidateHeaders() {
+ C.gtk_list_box_invalidate_headers(v.native())
+}
+
+// InvalidateSort is a wrapper around gtk_list_box_invalidate_sort().
+func (v *ListBox) InvalidateSort() {
+ C.gtk_list_box_invalidate_sort(v.native())
+}
+
+type ListBoxFilterFunc func(row *ListBoxRow, userData uintptr) bool
+
+type listBoxFilterFuncData struct {
+ fn ListBoxFilterFunc
+ userData uintptr
+}
+
+var (
+ listBoxFilterFuncRegistry = struct {
+ sync.RWMutex
+ next int
+ m map[int]listBoxFilterFuncData
+ }{
+ next: 1,
+ m: make(map[int]listBoxFilterFuncData),
+ }
+)
+
+func (v *ListBox) SetFilterFunc(fn ListBoxFilterFunc, userData uintptr) {
+ listBoxFilterFuncRegistry.Lock()
+ id := listBoxFilterFuncRegistry.next
+ listBoxFilterFuncRegistry.next++
+ listBoxFilterFuncRegistry.m[id] = listBoxFilterFuncData{fn: fn, userData: userData}
+ listBoxFilterFuncRegistry.Unlock()
+
+ C._gtk_list_box_set_filter_func(v.native(), C.gpointer(uintptr(id)))
+}
+
+// TODO: SetHeaderFunc
+// TODO: SetSortFunc
+
+// DragHighlightRow is a wrapper around gtk_list_box_drag_highlight_row()
+func (v *ListBox) DragHighlightRow(row *ListBoxRow) {
+ C.gtk_list_box_drag_highlight_row(v.native(), row.native())
+}
+
+/*
+ * GtkListBoxRow
+ */
+
+// ListBoxRow is a representation of GTK's GtkListBoxRow.
+type ListBoxRow struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkListBoxRow.
+func (v *ListBoxRow) native() *C.GtkListBoxRow {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkListBoxRow(p)
+}
+
+func marshalListBoxRow(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapListBoxRow(obj), nil
+}
+
+func wrapListBoxRow(obj *glib.Object) *ListBoxRow {
+ return &ListBoxRow{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+func ListBoxRowNew() (*ListBoxRow, error) {
+ c := C.gtk_list_box_row_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapListBoxRow(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// Changed is a wrapper around gtk_list_box_row_changed().
+func (v *ListBoxRow) Changed() {
+ C.gtk_list_box_row_changed(v.native())
+}
+
+// GetHeader is a wrapper around gtk_list_box_row_get_header().
+func (v *ListBoxRow) GetHeader() *Widget {
+ c := C.gtk_list_box_row_get_header(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetHeader is a wrapper around gtk_list_box_row_get_header().
+func (v *ListBoxRow) SetHeader(header IWidget) {
+ C.gtk_list_box_row_set_header(v.native(), header.toWidget())
+}
+
+// GetIndex is a wrapper around gtk_list_box_row_get_index()
+func (v *ListBoxRow) GetIndex() int {
+ c := C.gtk_list_box_row_get_index(v.native())
+ return int(c)
+}
+
+/*
+ * GtkRevealer
+ */
+
+// Revealer is a representation of GTK's GtkRevealer
+type Revealer struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkRevealer.
+func (v *Revealer) native() *C.GtkRevealer {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkRevealer(p)
+}
+
+func marshalRevealer(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapRevealer(obj), nil
+}
+
+func wrapRevealer(obj *glib.Object) *Revealer {
+ return &Revealer{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// RevealerNew is a wrapper around gtk_revealer_new()
+func RevealerNew() (*Revealer, error) {
+ c := C.gtk_revealer_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapRevealer(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetRevealChild is a wrapper around gtk_revealer_get_reveal_child().
+func (v *Revealer) GetRevealChild() bool {
+ c := C.gtk_revealer_get_reveal_child(v.native())
+ return gobool(c)
+}
+
+// SetRevealChild is a wrapper around gtk_revealer_set_reveal_child().
+func (v *Revealer) SetRevealChild(revealChild bool) {
+ C.gtk_revealer_set_reveal_child(v.native(), gbool(revealChild))
+}
+
+// GetChildRevealed is a wrapper around gtk_revealer_get_child_revealed().
+func (v *Revealer) GetChildRevealed() bool {
+ c := C.gtk_revealer_get_child_revealed(v.native())
+ return gobool(c)
+}
+
+// GetTransitionDuration is a wrapper around gtk_revealer_get_transition_duration()
+func (v *Revealer) GetTransitionDuration() uint {
+ c := C.gtk_revealer_get_transition_duration(v.native())
+ return uint(c)
+}
+
+// SetTransitionDuration is a wrapper around gtk_revealer_set_transition_duration().
+func (v *Revealer) SetTransitionDuration(duration uint) {
+ C.gtk_revealer_set_transition_duration(v.native(), C.guint(duration))
+}
+
+// GetTransitionType is a wrapper around gtk_revealer_get_transition_type()
+func (v *Revealer) GetTransitionType() RevealerTransitionType {
+ c := C.gtk_revealer_get_transition_type(v.native())
+ return RevealerTransitionType(c)
+}
+
+// SetTransitionType is a wrapper around gtk_revealer_set_transition_type()
+func (v *Revealer) SetTransitionType(transition RevealerTransitionType) {
+ t := C.GtkRevealerTransitionType(transition)
+ C.gtk_revealer_set_transition_type(v.native(), t)
+}
+
+/*
+ * GtkSearchBar
+ */
+
+// SearchBar is a representation of GTK's GtkSearchBar.
+type SearchBar struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkSearchBar.
+func (v *SearchBar) native() *C.GtkSearchBar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSearchBar(p)
+}
+
+func marshalSearchBar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapSearchBar(obj), nil
+}
+
+func wrapSearchBar(obj *glib.Object) *SearchBar {
+ return &SearchBar{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// SearchBarNew is a wrapper around gtk_search_bar_new()
+func SearchBarNew() (*SearchBar, error) {
+ c := C.gtk_search_bar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapSearchBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// ConnectEntry is a wrapper around gtk_search_bar_connect_entry().
+func (v *SearchBar) ConnectEntry(entry IEntry) {
+ C.gtk_search_bar_connect_entry(v.native(), entry.toEntry())
+}
+
+// GetSearchMode is a wrapper around gtk_search_bar_get_search_mode().
+func (v *SearchBar) GetSearchMode() bool {
+ c := C.gtk_search_bar_get_search_mode(v.native())
+ return gobool(c)
+}
+
+// SetSearchMode is a wrapper around gtk_search_bar_set_search_mode().
+func (v *SearchBar) SetSearchMode(searchMode bool) {
+ C.gtk_search_bar_set_search_mode(v.native(), gbool(searchMode))
+}
+
+// GetShowCloseButton is a wrapper arounb gtk_search_bar_get_show_close_button().
+func (v *SearchBar) GetShowCloseButton() bool {
+ c := C.gtk_search_bar_get_show_close_button(v.native())
+ return gobool(c)
+}
+
+// SetShowCloseButton is a wrapper around gtk_search_bar_set_show_close_button()
+func (v *SearchBar) SetShowCloseButton(visible bool) {
+ C.gtk_search_bar_set_show_close_button(v.native(), gbool(visible))
+}
+
+// HandleEvent is a wrapper around gtk_search_bar_handle_event()
+func (v *SearchBar) HandleEvent(event *gdk.Event) {
+ e := (*C.GdkEvent)(unsafe.Pointer(event.Native()))
+ C.gtk_search_bar_handle_event(v.native(), e)
+}
+
+/*
+ * GtkStack
+ */
+
+// Stack is a representation of GTK's GtkStack.
+type Stack struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkStack.
+func (v *Stack) native() *C.GtkStack {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkStack(p)
+}
+
+func marshalStack(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapStack(obj), nil
+}
+
+func wrapStack(obj *glib.Object) *Stack {
+ return &Stack{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// StackNew is a wrapper around gtk_stack_new().
+func StackNew() (*Stack, error) {
+ c := C.gtk_stack_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapStack(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// AddNamed is a wrapper around gtk_stack_add_named().
+func (v *Stack) AddNamed(child IWidget, name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_stack_add_named(v.native(), child.toWidget(), (*C.gchar)(cstr))
+}
+
+// AddTitled is a wrapper around gtk_stack_add_titled().
+func (v *Stack) AddTitled(child IWidget, name, title string) {
+ cName := C.CString(name)
+ defer C.free(unsafe.Pointer(cName))
+ cTitle := C.CString(title)
+ defer C.free(unsafe.Pointer(cTitle))
+ C.gtk_stack_add_titled(v.native(), child.toWidget(), (*C.gchar)(cName),
+ (*C.gchar)(cTitle))
+}
+
+// SetVisibleChild is a wrapper around gtk_stack_set_visible_child().
+func (v *Stack) SetVisibleChild(child IWidget) {
+ C.gtk_stack_set_visible_child(v.native(), child.toWidget())
+}
+
+// GetVisibleChild is a wrapper around gtk_stack_get_visible_child().
+func (v *Stack) GetVisibleChild() *Widget {
+ c := C.gtk_stack_get_visible_child(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetVisibleChildName is a wrapper around gtk_stack_set_visible_child_name().
+func (v *Stack) SetVisibleChildName(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_stack_set_visible_child_name(v.native(), (*C.gchar)(cstr))
+}
+
+// GetVisibleChildName is a wrapper around gtk_stack_get_visible_child_name().
+func (v *Stack) GetVisibleChildName() string {
+ c := C.gtk_stack_get_visible_child_name(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetVisibleChildFull is a wrapper around gtk_stack_set_visible_child_full().
+func (v *Stack) SetVisibleChildFull(name string, transaction StackTransitionType) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_stack_set_visible_child_full(v.native(), (*C.gchar)(cstr),
+ C.GtkStackTransitionType(transaction))
+}
+
+// SetHomogeneous is a wrapper around gtk_stack_set_homogeneous().
+func (v *Stack) SetHomogeneous(homogeneous bool) {
+ C.gtk_stack_set_homogeneous(v.native(), gbool(homogeneous))
+}
+
+// GetHomogeneous is a wrapper around gtk_stack_get_homogeneous().
+func (v *Stack) GetHomogeneous() bool {
+ c := C.gtk_stack_get_homogeneous(v.native())
+ return gobool(c)
+}
+
+// SetTransitionDuration is a wrapper around gtk_stack_set_transition_duration().
+func (v *Stack) SetTransitionDuration(duration uint) {
+ C.gtk_stack_set_transition_duration(v.native(), C.guint(duration))
+}
+
+// GetTransitionDuration is a wrapper around gtk_stack_get_transition_duration().
+func (v *Stack) GetTransitionDuration() uint {
+ c := C.gtk_stack_get_transition_duration(v.native())
+ return uint(c)
+}
+
+// SetTransitionType is a wrapper around gtk_stack_set_transition_type().
+func (v *Stack) SetTransitionType(transition StackTransitionType) {
+ C.gtk_stack_set_transition_type(v.native(), C.GtkStackTransitionType(transition))
+}
+
+// GetTransitionType is a wrapper around gtk_stack_get_transition_type().
+func (v *Stack) GetTransitionType() StackTransitionType {
+ c := C.gtk_stack_get_transition_type(v.native())
+ return StackTransitionType(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_10.go.h b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_10.go.h
new file mode 100644
index 0000000..20eb95a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_10.go.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+static GtkHeaderBar *
+toGtkHeaderBar(void *p)
+{
+ return (GTK_HEADER_BAR(p));
+}
+
+static GtkListBox *
+toGtkListBox(void *p)
+{
+ return (GTK_LIST_BOX(p));
+}
+
+static GtkListBoxRow *
+toGtkListBoxRow(void *p)
+{
+ return (GTK_LIST_BOX_ROW(p));
+}
+
+static GtkRevealer *
+toGtkRevealer(void *p)
+{
+ return (GTK_REVEALER(p));
+}
+
+static GtkSearchBar *
+toGtkSearchBar(void *p)
+{
+ return (GTK_SEARCH_BAR(p));
+}
+
+static GtkStack *
+toGtkStack(void *p)
+{
+ return (GTK_STACK(p));
+}
+
+static GtkStackSwitcher *
+toGtkStackSwitcher(void *p)
+{
+ return (GTK_STACK_SWITCHER(p));
+}
+
+extern gboolean goListBoxFilterFuncs (GtkListBoxRow *row,
+ gpointer user_data);
+
+static inline void _gtk_list_box_set_filter_func(GtkListBox *box, gpointer user_data) {
+ gtk_list_box_set_filter_func(box, (GtkListBoxFilterFunc)(goListBoxFilterFuncs), user_data, NULL);
+}
+
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_12.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_12.go
new file mode 100644
index 0000000..10a0da4
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_12.go
@@ -0,0 +1,351 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+// not use this: go build -tags gtk_3_8'. Otherwise, if no build tags are used, GTK 3.10
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+// #include "gtk_since_3_12.go.h"
+import "C"
+
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Objects/Interfaces
+ {glib.Type(C.gtk_flow_box_get_type()), marshalFlowBox},
+ {glib.Type(C.gtk_flow_box_child_get_type()), marshalFlowBoxChild},
+ }
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkFlowBox"] = wrapFlowBox
+ WrapMap["GtkFlowBoxChild"] = wrapFlowBoxChild
+}
+
+// GetLocaleDirection() is a wrapper around gtk_get_locale_direction().
+func GetLocaleDirection() TextDirection {
+ c := C.gtk_get_locale_direction()
+ return TextDirection(c)
+}
+
+/*
+ * Dialog
+ */
+
+// GetHeaderBar is a wrapper around gtk_dialog_get_header_bar().
+func (v *Dialog) GetHeaderBar() *Widget {
+ c := C.gtk_dialog_get_header_bar(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c)))
+}
+
+/*
+ * Entry
+ */
+
+// SetMaxWidthChars() is a wrapper around gtk_entry_set_max_width_chars().
+func (v *Entry) SetMaxWidthChars(nChars int) {
+ C.gtk_entry_set_max_width_chars(v.native(), C.gint(nChars))
+}
+
+// GetMaxWidthChars() is a wrapper around gtk_entry_get_max_width_chars().
+func (v *Entry) GetMaxWidthChars() int {
+ c := C.gtk_entry_get_max_width_chars(v.native())
+ return int(c)
+}
+
+/*
+ * HeaderBar
+ */
+
+// GetDecorationLayout is a wrapper around gtk_header_bar_get_decoration_layout().
+func (v *HeaderBar) GetDecorationLayout() string {
+ c := C.gtk_header_bar_get_decoration_layout(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetDecorationLayout is a wrapper around gtk_header_bar_set_decoration_layout().
+func (v *HeaderBar) SetDecorationLayout(layout string) {
+ cstr := C.CString(layout)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_header_bar_set_decoration_layout(v.native(), (*C.gchar)(cstr))
+}
+
+// GetHasSubtitle is a wrapper around gtk_header_bar_get_has_subtitle().
+func (v *HeaderBar) GetHasSubtitle() bool {
+ c := C.gtk_header_bar_get_has_subtitle(v.native())
+ return gobool(c)
+}
+
+// SetHasSubtitle is a wrapper around gtk_header_bar_set_has_subtitle().
+func (v *HeaderBar) SetHasSubtitle(setting bool) {
+ C.gtk_header_bar_set_has_subtitle(v.native(), gbool(setting))
+}
+
+/*
+ * MenuButton
+ */
+
+// SetPopover is a wrapper around gtk_menu_button_set_popover().
+func (v *MenuButton) SetPopover(popover *Popover) {
+ C.gtk_menu_button_set_popover(v.native(), popover.toWidget())
+}
+
+// GetPopover is a wrapper around gtk_menu_button_get_popover().
+func (v *MenuButton) GetPopover() *Popover {
+ c := C.gtk_menu_button_get_popover(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapPopover(glib.Take(unsafe.Pointer(c)))
+}
+
+// GetUsePopover is a wrapper around gtk_menu_button_get_use_popover().
+func (v *MenuButton) GetUsePopover() bool {
+ c := C.gtk_menu_button_get_use_popover(v.native())
+ return gobool(c)
+}
+
+// SetUsePopover is a wrapper around gtk_menu_button_set_use_popover().
+func (v *MenuButton) SetUsePopover(setting bool) {
+ C.gtk_menu_button_set_use_popover(v.native(), gbool(setting))
+}
+
+/*
+ * FlowBox
+ */
+type FlowBox struct {
+ Container
+}
+
+func (fb *FlowBox) native() *C.GtkFlowBox {
+ if fb == nil || fb.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(fb.GObject)
+ return C.toGtkFlowBox(p)
+}
+
+func marshalFlowBox(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFlowBox(obj), nil
+}
+
+func wrapFlowBox(obj *glib.Object) *FlowBox {
+ return &FlowBox{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// FlowBoxNew is a wrapper around gtk_flow_box_new()
+func FlowBoxNew() (*FlowBox, error) {
+ c := C.gtk_flow_box_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapFlowBox(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// Insert is a wrapper around gtk_flow_box_insert()
+func (fb *FlowBox) Insert(widget IWidget, position int) {
+ C.gtk_flow_box_insert(fb.native(), widget.toWidget(), C.gint(position))
+}
+
+// GetChildAtIndex is a wrapper around gtk_flow_box_get_child_at_index()
+func (fb *FlowBox) GetChildAtIndex(idx int) *FlowBoxChild {
+ c := C.gtk_flow_box_get_child_at_index(fb.native(), C.gint(idx))
+ if c == nil {
+ return nil
+ }
+ return wrapFlowBoxChild(glib.Take(unsafe.Pointer(c)))
+}
+
+// TODO 3.22.6 gtk_flow_box_get_child_at_pos()
+
+// SetHAdjustment is a wrapper around gtk_flow_box_set_hadjustment()
+func (fb *FlowBox) SetHAdjustment(adjustment *Adjustment) {
+ C.gtk_flow_box_set_hadjustment(fb.native(), adjustment.native())
+}
+
+// SetVAdjustment is a wrapper around gtk_flow_box_set_vadjustment()
+func (fb *FlowBox) SetVAdjustment(adjustment *Adjustment) {
+ C.gtk_flow_box_set_vadjustment(fb.native(), adjustment.native())
+}
+
+// SetHomogeneous is a wrapper around gtk_flow_box_set_homogeneous()
+func (fb *FlowBox) SetHomogeneous(homogeneous bool) {
+ C.gtk_flow_box_set_homogeneous(fb.native(), gbool(homogeneous))
+}
+
+// GetHomogeneous is a wrapper around gtk_flow_box_get_homogeneous()
+func (fb *FlowBox) GetHomogeneous() bool {
+ c := C.gtk_flow_box_get_homogeneous(fb.native())
+ return gobool(c)
+}
+
+// SetRowSpacing is a wrapper around gtk_flow_box_set_row_spacing()
+func (fb *FlowBox) SetRowSpacing(spacing uint) {
+ C.gtk_flow_box_set_row_spacing(fb.native(), C.guint(spacing))
+}
+
+// GetRowSpacing is a wrapper around gtk_flow_box_get_row_spacing()
+func (fb *FlowBox) GetRowSpacing() uint {
+ c := C.gtk_flow_box_get_row_spacing(fb.native())
+ return uint(c)
+}
+
+// SetColumnSpacing is a wrapper around gtk_flow_box_set_column_spacing()
+func (fb *FlowBox) SetColumnSpacing(spacing uint) {
+ C.gtk_flow_box_set_column_spacing(fb.native(), C.guint(spacing))
+}
+
+// GetColumnSpacing is a wrapper around gtk_flow_box_get_column_spacing()
+func (fb *FlowBox) GetColumnSpacing() uint {
+ c := C.gtk_flow_box_get_column_spacing(fb.native())
+ return uint(c)
+}
+
+// SetMinChildrenPerLine is a wrapper around gtk_flow_box_set_min_children_per_line()
+func (fb *FlowBox) SetMinChildrenPerLine(n_children uint) {
+ C.gtk_flow_box_set_min_children_per_line(fb.native(), C.guint(n_children))
+}
+
+// GetMinChildrenPerLine is a wrapper around gtk_flow_box_get_min_children_per_line()
+func (fb *FlowBox) GetMinChildrenPerLine() uint {
+ c := C.gtk_flow_box_get_min_children_per_line(fb.native())
+ return uint(c)
+}
+
+// SetMaxChildrenPerLine is a wrapper around gtk_flow_box_set_max_children_per_line()
+func (fb *FlowBox) SetMaxChildrenPerLine(n_children uint) {
+ C.gtk_flow_box_set_max_children_per_line(fb.native(), C.guint(n_children))
+}
+
+// GetMaxChildrenPerLine is a wrapper around gtk_flow_box_get_max_children_per_line()
+func (fb *FlowBox) GetMaxChildrenPerLine() uint {
+ c := C.gtk_flow_box_get_max_children_per_line(fb.native())
+ return uint(c)
+}
+
+// SetActivateOnSingleClick is a wrapper around gtk_flow_box_set_activate_on_single_click()
+func (fb *FlowBox) SetActivateOnSingleClick(single bool) {
+ C.gtk_flow_box_set_activate_on_single_click(fb.native(), gbool(single))
+}
+
+// GetActivateOnSingleClick gtk_flow_box_get_activate_on_single_click()
+func (fb *FlowBox) GetActivateOnSingleClick() bool {
+ c := C.gtk_flow_box_get_activate_on_single_click(fb.native())
+ return gobool(c)
+}
+
+// TODO: gtk_flow_box_selected_foreach()
+
+// GetSelectedChildren is a wrapper around gtk_flow_box_get_selected_children()
+func (fb *FlowBox) GetSelectedChildren() (rv []*FlowBoxChild) {
+ c := C.gtk_flow_box_get_selected_children(fb.native())
+ if c == nil {
+ return
+ }
+ list := glib.WrapList(uintptr(unsafe.Pointer(c)))
+ for l := list; l != nil; l = l.Next() {
+ o := wrapFlowBoxChild(glib.Take(l.Data().(unsafe.Pointer)))
+ rv = append(rv, o)
+ }
+ // We got a transfer container, so we must free the list.
+ list.Free()
+
+ return
+}
+
+// SelectChild is a wrapper around gtk_flow_box_select_child()
+func (fb *FlowBox) SelectChild(child *FlowBoxChild) {
+ C.gtk_flow_box_select_child(fb.native(), child.native())
+}
+
+// UnselectChild is a wrapper around gtk_flow_box_unselect_child()
+func (fb *FlowBox) UnselectChild(child *FlowBoxChild) {
+ C.gtk_flow_box_unselect_child(fb.native(), child.native())
+}
+
+// SelectAll is a wrapper around gtk_flow_box_select_all()
+func (fb *FlowBox) SelectAll() {
+ C.gtk_flow_box_select_all(fb.native())
+}
+
+// UnselectAll is a wrapper around gtk_flow_box_unselect_all()
+func (fb *FlowBox) UnselectAll() {
+ C.gtk_flow_box_unselect_all(fb.native())
+}
+
+// SetSelectionMode is a wrapper around gtk_flow_box_set_selection_mode()
+func (fb *FlowBox) SetSelectionMode(mode SelectionMode) {
+ C.gtk_flow_box_set_selection_mode(fb.native(), C.GtkSelectionMode(mode))
+}
+
+// GetSelectionMode is a wrapper around gtk_flow_box_get_selection_mode()
+func (fb *FlowBox) GetSelectionMode() SelectionMode {
+ c := C.gtk_flow_box_get_selection_mode(fb.native())
+ return SelectionMode(c)
+}
+
+// TODO gtk_flow_box_set_filter_func()
+// TODO gtk_flow_box_invalidate_filter()
+// TODO gtk_flow_box_set_sort_func()
+// TODO gtk_flow_box_invalidate_sort()
+// TODO 3.18 gtk_flow_box_bind_model()
+
+/*
+ * FlowBoxChild
+ */
+type FlowBoxChild struct {
+ Bin
+}
+
+func (fbc *FlowBoxChild) native() *C.GtkFlowBoxChild {
+ if fbc == nil || fbc.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(fbc.GObject)
+ return C.toGtkFlowBoxChild(p)
+}
+
+func marshalFlowBoxChild(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFlowBoxChild(obj), nil
+}
+
+func wrapFlowBoxChild(obj *glib.Object) *FlowBoxChild {
+ return &FlowBoxChild{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// FlowBoxChildNew is a wrapper around gtk_flow_box_child_new()
+func FlowBoxChildNew() (*FlowBoxChild, error) {
+ c := C.gtk_flow_box_child_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapFlowBoxChild(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetIndex is a wrapper around gtk_flow_box_child_get_index()
+func (fbc *FlowBoxChild) GetIndex() int {
+ c := C.gtk_flow_box_child_get_index(fbc.native())
+ return int(c)
+}
+
+// IsSelected is a wrapper around gtk_flow_box_child_is_selected()
+func (fbc *FlowBoxChild) IsSelected() bool {
+ c := C.gtk_flow_box_child_is_selected(fbc.native())
+ return gobool(c)
+}
+
+// Changed is a wrapper around gtk_flow_box_child_changed()
+func (fbc *FlowBoxChild) Changed() {
+ C.gtk_flow_box_child_changed(fbc.native())
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_12.go.h b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_12.go.h
new file mode 100644
index 0000000..92992fe
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_12.go.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+static GtkFlowBox *
+toGtkFlowBox(void *p)
+{
+ return (GTK_FLOW_BOX(p));
+}
+
+static GtkFlowBoxChild *
+toGtkFlowBoxChild(void *p)
+{
+ return (GTK_FLOW_BOX_CHILD(p));
+} \ No newline at end of file
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_16.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_16.go
new file mode 100644
index 0000000..b6b88cc
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_16.go
@@ -0,0 +1,126 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12,!gtk_3_14
+
+// See: https://developer.gnome.org/gtk3/3.16/api-index-3-16.html
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk_since_3_16.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+
+ // Objects/Interfaces
+ {glib.Type(C.gtk_stack_sidebar_get_type()), marshalStackSidebar},
+ }
+ glib.RegisterGValueMarshalers(tm)
+
+ //Contribute to casting
+ for k, v := range map[string]WrapFn{
+ "GtkStackSidebar": wrapStackSidebar,
+ } {
+ WrapMap[k] = v
+ }
+}
+
+// SetOverlayScrolling is a wrapper around gtk_scrolled_window_set_overlay_scrolling().
+func (v *ScrolledWindow) SetOverlayScrolling(scrolling bool) {
+ C.gtk_scrolled_window_set_overlay_scrolling(v.native(), gbool(scrolling))
+}
+
+// GetOverlayScrolling is a wrapper around gtk_scrolled_window_get_overlay_scrolling().
+func (v *ScrolledWindow) GetOverlayScrolling() bool {
+ return gobool(C.gtk_scrolled_window_get_overlay_scrolling(v.native()))
+}
+
+// SetWideHandle is a wrapper around gtk_paned_set_wide_handle().
+func (v *Paned) SetWideHandle(wide bool) {
+ C.gtk_paned_set_wide_handle(v.native(), gbool(wide))
+}
+
+// GetWideHandle is a wrapper around gtk_paned_get_wide_handle().
+func (v *Paned) GetWideHandle() bool {
+ return gobool(C.gtk_paned_get_wide_handle(v.native()))
+}
+
+// GetXAlign is a wrapper around gtk_label_get_xalign().
+func (v *Label) GetXAlign() float64 {
+ c := C.gtk_label_get_xalign(v.native())
+ return float64(c)
+}
+
+// GetYAlign is a wrapper around gtk_label_get_yalign().
+func (v *Label) GetYAlign() float64 {
+ c := C.gtk_label_get_yalign(v.native())
+ return float64(c)
+}
+
+// SetXAlign is a wrapper around gtk_label_set_xalign().
+func (v *Label) SetXAlign(n float64) {
+ C.gtk_label_set_xalign(v.native(), C.gfloat(n))
+}
+
+// SetYAlign is a wrapper around gtk_label_set_yalign().
+func (v *Label) SetYAlign(n float64) {
+ C.gtk_label_set_yalign(v.native(), C.gfloat(n))
+}
+
+/*
+ * GtkStackSidebar
+ */
+
+// StackSidebar is a representation of GTK's GtkStackSidebar.
+type StackSidebar struct {
+ Bin
+}
+
+// native returns a pointer to the underlying GtkStack.
+func (v *StackSidebar) native() *C.GtkStackSidebar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkStackSidebar(p)
+}
+
+func marshalStackSidebar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapStackSidebar(obj), nil
+}
+
+func wrapStackSidebar(obj *glib.Object) *StackSidebar {
+ return &StackSidebar{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// StackSidebarNew is a wrapper around gtk_stack_sidebar_new().
+func StackSidebarNew() (*StackSidebar, error) {
+ c := C.gtk_stack_sidebar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapStackSidebar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func (v *StackSidebar) SetStack(stack *Stack) {
+ C.gtk_stack_sidebar_set_stack(v.native(), stack.native())
+}
+
+func (v *StackSidebar) GetStack() *Stack {
+ c := C.gtk_stack_sidebar_get_stack(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapStack(glib.Take(unsafe.Pointer(c)))
+}
+
+// GrabFocusWithoutSelecting is a wrapper for gtk_entry_grab_focus_without_selecting()
+func (v *Entry) GrabFocusWithoutSelecting() {
+ C.gtk_entry_grab_focus_without_selecting(v.native())
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_16.go.h b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_16.go.h
new file mode 100644
index 0000000..c2e0222
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_16.go.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+static GtkStackSidebar *
+toGtkStackSidebar(void *p)
+{
+ return (GTK_STACK_SIDEBAR(p));
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_18.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_18.go
new file mode 100644
index 0000000..1f67e90
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_18.go
@@ -0,0 +1,29 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12,!gtk_3_14,!gtk_3_16,gtk_3_18
+
+// See: https://developer.gnome.org/gtk3/3.18/api-index-3-18.html
+
+// For gtk_overlay_reorder_overlay():
+// See: https://git.gnome.org/browse/gtk+/tree/gtk/gtkoverlay.h?h=gtk-3-18
+
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+
+// ReorderOverlay() is a wrapper around gtk_overlay_reorder_overlay().
+func (v *Overlay) ReorderOverlay(child IWidget, position int) {
+ C.gtk_overlay_reorder_overlay(v.native(), child.toWidget(), C.gint(position))
+}
+
+// GetOverlayPassThrough() is a wrapper around
+// gtk_overlay_get_overlay_pass_through().
+func (v *Overlay) GetOverlayPassThrough(widget IWidget) bool {
+ c := C.gtk_overlay_get_overlay_pass_through(v.native(), widget.toWidget())
+ return gobool(c)
+}
+
+// SetOverlayPassThrough() is a wrapper around
+// gtk_overlay_set_overlay_pass_through().
+func (v *Overlay) SetOverlayPassThrough(widget IWidget, passThrough bool) {
+ C.gtk_overlay_set_overlay_pass_through(v.native(), widget.toWidget(), gbool(passThrough))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_20.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_20.go
new file mode 100644
index 0000000..797191c
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_20.go
@@ -0,0 +1,207 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12,!gtk_3_14,!gtk_3_16,!gtk_3_18
+
+// See: https://developer.gnome.org/gtk3/3.20/api-index-3-20.html
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk_since_3_20.go.h"
+import "C"
+
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkNativeDialog
+ */
+
+// NativeDialog is a representation of GTK's GtkNativeDialog.
+type NativeDialog struct {
+ glib.InitiallyUnowned
+}
+
+// native returns a pointer to the underlying GObject as a GtkNativeDialog.
+func (v *NativeDialog) native() *C.GtkNativeDialog {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkNativeDialog(p)
+}
+
+func wrapNativeDialog(obj *glib.Object) *NativeDialog {
+ return &NativeDialog{glib.InitiallyUnowned{obj}}
+}
+
+// Run() is a wrapper around gtk_native_dialog_run().
+func (v *NativeDialog) Run() int {
+ c := C.gtk_native_dialog_run(v.native())
+ return int(c)
+}
+
+// Destroy() is a wrapper around gtk_native_dialog_destroy().
+func (v *NativeDialog) Destroy() {
+ C.gtk_native_dialog_destroy(v.native())
+}
+
+// SetModal is a wrapper around gtk_native_dialog_set_modal().
+func (v *NativeDialog) SetModal(modal bool) {
+ C.gtk_native_dialog_set_modal(v.native(), gbool(modal))
+}
+
+// GetModal() is a wrapper around gtk_native_dialog_get_modal().
+func (v *NativeDialog) GetModal() bool {
+ c := C.gtk_native_dialog_get_modal(v.native())
+ return gobool(c)
+}
+
+// SetTitle is a wrapper around gtk_native_dialog_set_title().
+func (v *NativeDialog) SetTitle(title string) {
+ cstr := C.CString(title)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_native_dialog_set_title(v.native(), (*C.char)(cstr))
+}
+
+// GetTitle() is a wrapper around gtk_native_dialog_get_title().
+func (v *NativeDialog) GetTitle() (string, error) {
+ return stringReturn((*C.gchar)(C.gtk_native_dialog_get_title(v.native())))
+}
+
+// SetTransientFor() is a wrapper around gtk_native_dialog_set_transient_for().
+func (v *NativeDialog) SetTransientFor(parent IWindow) {
+ var pw *C.GtkWindow = nil
+ if parent != nil {
+ pw = parent.toWindow()
+ }
+ C.gtk_native_dialog_set_transient_for(v.native(), pw)
+}
+
+// GetTransientFor() is a wrapper around gtk_native_dialog_get_transient_for().
+func (v *NativeDialog) GetTransientFor() (*Window, error) {
+ c := C.gtk_native_dialog_get_transient_for(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWindow(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetVisible() is a wrapper around gtk_native_dialog_get_visible().
+func (v *NativeDialog) GetVisible() bool {
+ c := C.gtk_native_dialog_get_visible(v.native())
+ return gobool(c)
+}
+
+// Show() is a wrapper around gtk_native_dialog_show().
+func (v *NativeDialog) Show() {
+ C.gtk_native_dialog_show(v.native())
+}
+
+// Hide() is a wrapper around gtk_native_dialog_hide().
+func (v *NativeDialog) Hide() {
+ C.gtk_native_dialog_hide(v.native())
+}
+
+/*
+ * GtkFileChooserNative
+ */
+
+// FileChooserNativeDialog is a representation of GTK's GtkFileChooserNative.
+type FileChooserNativeDialog struct {
+ NativeDialog
+
+ // Interfaces
+ FileChooser
+}
+
+// native returns a pointer to the underlying GObject as a GtkNativeDialog.
+func (v *FileChooserNativeDialog) native() *C.GtkFileChooserNative {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkFileChooserNative(p)
+}
+
+func wrapFileChooserNativeDialog(obj *glib.Object) *FileChooserNativeDialog {
+ fc := wrapFileChooser(obj)
+ return &FileChooserNativeDialog{NativeDialog{glib.InitiallyUnowned{obj}}, *fc}
+}
+
+// FileChooserNativeDialogNew is a wrapper around gtk_file_chooser_native_new().
+func FileChooserNativeDialogNew(
+ title string,
+ parent *Window,
+ action FileChooserAction,
+ accept_label string,
+ cancel_label string) (*FileChooserNativeDialog, error) {
+ c_title := C.CString(title)
+ defer C.free(unsafe.Pointer(c_title))
+ c_accept_label := C.CString(accept_label)
+ defer C.free(unsafe.Pointer(c_accept_label))
+ c_cancel_label := C.CString(cancel_label)
+ defer C.free(unsafe.Pointer(c_cancel_label))
+ c := C.gtk_file_chooser_native_new(
+ (*C.gchar)(c_title), parent.native(), C.GtkFileChooserAction(action),
+ (*C.gchar)(c_accept_label), (*C.gchar)(c_cancel_label))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapFileChooserNativeDialog(obj), nil
+}
+
+/*
+ * FileChooserNative
+ */
+func OpenFileChooserNative(title string, parent_window *Window) *string {
+ c_title := C.CString(title)
+
+ var native *C.GtkFileChooserNative
+
+ native = C.gtk_file_chooser_native_new((*C.gchar)(c_title),
+ parent_window.native(),
+ C.GtkFileChooserAction(FILE_CHOOSER_ACTION_OPEN),
+ (*C.gchar)(C.CString("_Open")),
+ (*C.gchar)(C.CString("_Cancel")))
+
+ p := unsafe.Pointer(unsafe.Pointer(native))
+ dlg := C.toGtkNativeDialog(p)
+ res := C.gtk_native_dialog_run(dlg)
+
+ if res == C.GTK_RESPONSE_ACCEPT {
+ c := C.gtk_file_chooser_get_filename(C.toGtkFileChooser(p))
+ s := goString(c)
+ defer C.g_free((C.gpointer)(c))
+
+ return &s
+ }
+
+ return nil
+}
+
+// SetAcceptLabel is a wrapper around gtk_file_chooser_native_set_accept_label().
+func (v *FileChooserNativeDialog) SetAcceptLabel(accept_label string) {
+ cstr := C.CString(accept_label)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_file_chooser_native_set_accept_label(v.native(), (*C.char)(cstr))
+}
+
+// GetAcceptLabel() is a wrapper around gtk_file_chooser_native_get_accept_label().
+func (v *FileChooserNativeDialog) GetAcceptLabel() (string, error) {
+ return stringReturn((*C.gchar)(C.gtk_file_chooser_native_get_accept_label(v.native())))
+}
+
+// SetCancelLabel is a wrapper around gtk_file_chooser_native_set_cancel_label().
+func (v *FileChooserNativeDialog) SetCancelLabel(cancel_label string) {
+ cstr := C.CString(cancel_label)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_file_chooser_native_set_cancel_label(v.native(), (*C.char)(cstr))
+}
+
+// GetCancelLabel() is a wrapper around gtk_file_chooser_native_get_cancel_label().
+func (v *FileChooserNativeDialog) GetCancelLabel() (string, error) {
+ return stringReturn((*C.gchar)(C.gtk_file_chooser_native_get_cancel_label(v.native())))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_20.go.h b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_20.go.h
new file mode 100644
index 0000000..fc903dc
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_20.go.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#pragma once
+
+#include <stdlib.h>
+
+static GtkFileChooser *
+toGtkFileChooser(void *p)
+{
+ return (GTK_FILE_CHOOSER(p));
+}
+
+static GtkFileChooserNative *
+toGtkFileChooserNative(void *p)
+{
+ return (GTK_FILE_CHOOSER_NATIVE(p));
+}
+
+static GtkNativeDialog *
+toGtkNativeDialog(void *p)
+{
+ return (GTK_NATIVE_DIALOG(p));
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_8.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_8.go
new file mode 100644
index 0000000..21ffa40
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_since_3_8.go
@@ -0,0 +1,36 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrapers for symbols included since GTK 3.8, and
+// and should not be included in a build intended to target any older GTK
+// versions. To target an older build, such as 3.8, use
+// 'go build -tags gtk_3_8'. Otherwise, if no build tags are used, GTK 3.18
+// is assumed and this file is built.
+// +build !gtk_3_6
+
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+
+/*
+ * Constants
+ */
+
+const (
+ STATE_FLAG_DIR_LTR StateFlags = C.GTK_STATE_FLAG_DIR_LTR
+ STATE_FLAG_DIR_RTL StateFlags = C.GTK_STATE_FLAG_DIR_RTL
+)
diff --git a/vendor/github.com/gotk3/gotk3/gtk/gtk_test.go b/vendor/github.com/gotk3/gotk3/gtk/gtk_test.go
new file mode 100644
index 0000000..bde4d0e
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/gtk_test.go
@@ -0,0 +1,739 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package gtk
+
+import (
+ "fmt"
+ "log"
+ "testing"
+ "time"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ Init(nil)
+}
+
+// TestBoolConvs tests the conversion between Go bools and gboolean
+// types.
+func TestBoolConvs(t *testing.T) {
+ if err := testBoolConvs(); err != nil {
+ t.Error(err)
+ }
+}
+
+// TestBox tests creating and adding widgets to a Box
+func TestBox(t *testing.T) {
+ vbox, err := BoxNew(ORIENTATION_VERTICAL, 0)
+ if err != nil {
+ t.Error("Unable to create box")
+ }
+
+ vbox.Set("homogeneous", true)
+ if vbox.GetHomogeneous() != true {
+ t.Error("Could not set or get Box homogeneous property")
+ }
+
+ vbox.SetHomogeneous(false)
+ if vbox.GetHomogeneous() != false {
+ t.Error("Could not set or get Box homogeneous property")
+ }
+
+ vbox.Set("spacing", 1)
+ if vbox.GetSpacing() != 1 {
+ t.Error("Could not set or get Box spacing")
+ }
+
+ vbox.SetSpacing(2)
+ if vbox.GetSpacing() != 2 {
+ t.Error("Could not set or get Box spacing")
+ }
+
+ // add a child to start and end
+ start, err := LabelNew("Start")
+ if err != nil {
+ t.Error("Unable to create label")
+ }
+
+ end, err := LabelNew("End")
+ if err != nil {
+ t.Error("Unable to create label")
+ }
+
+ vbox.PackStart(start, true, true, 3)
+ vbox.PackEnd(end, true, true, 3)
+}
+func TestTextBuffer_WhenSetText_ExpectGetTextReturnsSame(t *testing.T) {
+ buffer, err := TextBufferNew(nil)
+ if err != nil {
+ t.Error("Unable to create text buffer")
+ }
+ expected := "Hello, World!"
+ buffer.SetText(expected)
+
+ start, end := buffer.GetBounds()
+
+ actual, err := buffer.GetText(start, end, true)
+ if err != nil {
+ t.Error("Unable to get text from buffer")
+ }
+
+ if actual != expected {
+ t.Errorf("Expected '%s'; Got '%s'", expected, actual)
+ }
+}
+
+func testTextViewEditable(set bool) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ exp := set
+ tv.SetEditable(exp)
+ act := tv.GetEditable()
+ if exp != act {
+ return fmt.Errorf("Expected GetEditable(): %v; Got: %v", exp, act)
+ }
+ return nil
+}
+
+func TestTextView_WhenSetEditableFalse_ExpectGetEditableReturnsFalse(t *testing.T) {
+ if err := testTextViewEditable(false); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetEditableTrue_ExpectGetEditableReturnsTrue(t *testing.T) {
+ if err := testTextViewEditable(true); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewWrapMode(set WrapMode) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ exp := set
+ tv.SetWrapMode(set)
+ act := tv.GetWrapMode()
+ if act != exp {
+ return fmt.Errorf("Expected GetWrapMode(): %v; Got: %v", exp, act)
+ }
+ return nil
+}
+
+func TestTextView_WhenSetWrapModeNone_ExpectGetWrapModeReturnsNone(t *testing.T) {
+ if err := testTextViewWrapMode(WRAP_NONE); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetWrapModeWord_ExpectGetWrapModeReturnsWord(t *testing.T) {
+ if err := testTextViewWrapMode(WRAP_WORD); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewCursorVisible(set bool) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ exp := set
+ tv.SetCursorVisible(set)
+ act := tv.GetCursorVisible()
+ if act != exp {
+ return fmt.Errorf("Expected GetCursorVisible(): %v; Got: %v", exp, act)
+ }
+ return nil
+}
+
+func TestTextView_WhenSetCursorVisibleFalse_ExpectGetCursorVisibleReturnsFalse(t *testing.T) {
+ if err := testTextViewCursorVisible(false); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetCursorVisibleTrue_ExpectGetCursorVisibleReturnsTrue(t *testing.T) {
+ if err := testTextViewCursorVisible(true); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewOverwrite(set bool) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ exp := set
+ tv.SetOverwrite(set)
+ act := tv.GetOverwrite()
+ if act != exp {
+ return fmt.Errorf("Expected GetOverwrite(): %v; Got: %v", exp, act)
+ }
+ return nil
+}
+
+func TestTextView_WhenSetOverwriteFalse_ExpectGetOverwriteReturnsFalse(t *testing.T) {
+ if err := testTextViewOverwrite(false); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetOverwriteTrue_ExpectGetOverwriteReturnsTrue(t *testing.T) {
+ if err := testTextViewOverwrite(true); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewJustification(justify Justification) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ exp := justify
+ tv.SetJustification(justify)
+ act := tv.GetJustification()
+ if act != exp {
+ return fmt.Errorf("Expected GetJustification(): %v; Got: %v", exp, act)
+ }
+ return nil
+}
+
+func TestTextView_WhenSetJustificationLeft_ExpectGetJustificationReturnsLeft(t *testing.T) {
+ if err := testTextViewJustification(JUSTIFY_LEFT); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetJustificationRight_ExpectGetJustificationReturnsRight(t *testing.T) {
+ if err := testTextViewJustification(JUSTIFY_RIGHT); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewAcceptsTab(set bool) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ exp := set
+ tv.SetAcceptsTab(set)
+ if act := tv.GetAcceptsTab(); act != exp {
+ return fmt.Errorf("Expected GetAcceptsTab(): %v; Got: %v", exp, act)
+ }
+ return nil
+}
+
+func TestTextView_WhenSetAcceptsTabFalse_ExpectGetAcceptsTabReturnsFalse(t *testing.T) {
+ if err := testTextViewAcceptsTab(false); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetAcceptsTabTrue_ExpectGetAcceptsTabReturnsTrue(t *testing.T) {
+ if err := testTextViewAcceptsTab(true); err != nil {
+ t.Error(err)
+ }
+}
+
+func testIntProperty(val int, set func(int), get func() int) error {
+ set(val)
+ if exp, act := val, get(); act != exp {
+ return fmt.Errorf("Expected: %d; got: %d", exp, act)
+ }
+ return nil
+}
+
+func testTextViewPixelsAboveLines(px int) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+ return testIntProperty(px, (*tv).SetPixelsAboveLines, (*tv).GetPixelsAboveLines)
+}
+
+func TestTextView_WhenSetPixelsAboveLines10_ExpectGetPixelsAboveLinesReturns10(t *testing.T) {
+ if err := testTextViewPixelsAboveLines(10); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetPixelsAboveLines11_ExpectGetPixelsAboveLinesReturns11(t *testing.T) {
+ if err := testTextViewPixelsAboveLines(11); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewPixelsBelowLines(px int) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+ return testIntProperty(px, (*tv).SetPixelsBelowLines, (*tv).GetPixelsBelowLines)
+}
+
+func TestTextView_WhenSetPixelsBelowLines10_ExpectGetPixelsAboveLinesReturns10(t *testing.T) {
+ if err := testTextViewPixelsBelowLines(10); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetPixelsBelowLines11_ExpectGetPixelsBelowLinesReturns11(t *testing.T) {
+ if err := testTextViewPixelsBelowLines(11); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewPixelsInsideWrap(px int) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ return testIntProperty(px, (*tv).SetPixelsInsideWrap, (*tv).GetPixelsInsideWrap)
+}
+
+func TestTextView_WhenSetPixelsInsideWrap10_ExpectGetPixelsInsideWrapReturns11(t *testing.T) {
+ if err := testTextViewPixelsInsideWrap(10); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetPixelsInsideWrap11_ExpectGetPixelsInsideWrapReturns11(t *testing.T) {
+ if err := testTextViewPixelsInsideWrap(11); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewLeftMargin(margin int) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ return testIntProperty(margin, (*tv).SetLeftMargin, (*tv).GetLeftMargin)
+}
+
+func TestTextView_WhenSetLeftMargin11_ExpectGetLeftMarginReturns11(t *testing.T) {
+ if err := testTextViewLeftMargin(11); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetLeftMargin10_ExpectGetLeftMarginReturns10(t *testing.T) {
+ if err := testTextViewLeftMargin(10); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewRightMargin(margin int) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ return testIntProperty(margin, (*tv).SetRightMargin, (*tv).GetRightMargin)
+}
+
+func TestTextView_WhenSetRightMargin10_ExpectGetRightMarginReturns10(t *testing.T) {
+ if err := testTextViewRightMargin(10); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetRightMargin11_ExpectGetRightMarginReturns11(t *testing.T) {
+ if err := testTextViewRightMargin(11); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewIndent(indent int) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ return testIntProperty(indent, (*tv).SetIndent, (*tv).GetIndent)
+}
+
+func TestTextView_WhenSetIndent10_ExpectGetIndentReturns10(t *testing.T) {
+ if err := testTextViewIndent(10); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetIndent11_ExpectGetIndentReturns11(t *testing.T) {
+ if err := testTextViewIndent(11); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewInputHints(hint InputHints) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ tv.SetInputHints(hint)
+ if exp, act := hint, tv.GetInputHints(); act != exp {
+ return fmt.Errorf("Expected %v; Got %v", exp, act)
+ }
+ return nil
+}
+
+func TestTextView_WhenSetInputHintsNone_ExpectGetInputHintsReturnsNone(t *testing.T) {
+ if err := testTextViewInputHints(INPUT_HINT_NONE); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetInputHintsSpellCheck_ExpectGetInputHintsReturnsSpellCheck(t *testing.T) {
+ if err := testTextViewInputHints(INPUT_HINT_SPELLCHECK); err != nil {
+ t.Error(err)
+ }
+}
+
+func testTextViewInputPurpose(purpose InputPurpose) error {
+ tv, err := TextViewNew()
+ if err != nil {
+ return err
+ }
+
+ tv.SetInputPurpose(purpose)
+ if exp, act := purpose, tv.GetInputPurpose(); act != exp {
+ return fmt.Errorf("Expected %v; Got %v", exp, act)
+ }
+ return nil
+}
+
+func TestTextView_WhenSetInputPurposeURL_ExpectGetInputPurposeReturnsURL(t *testing.T) {
+ if err := testTextViewInputPurpose(INPUT_PURPOSE_URL); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTextView_WhenSetInputPurposeALPHA_ExpectGetInputPurposeReturnsALPHA(t *testing.T) {
+ if err := testTextViewInputPurpose(INPUT_PURPOSE_ALPHA); err != nil {
+ t.Error(err)
+ }
+}
+
+func testCellRendererToggleSetRadio(set bool) error {
+ renderer, err := CellRendererToggleNew()
+ if err != nil {
+ return err
+ }
+
+ renderer.SetRadio(set)
+ if exp, act := set, renderer.GetRadio(); act != exp {
+ return fmt.Errorf("Expected GetRadio(): %v; Got: %v", exp, act)
+ }
+ return nil
+}
+
+func TestCellRendererToggle_WhenSetRadioFalse_ExpectGetRadioReturnsFalse(t *testing.T) {
+ if err := testCellRendererToggleSetRadio(false); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestCellRendererToggle_WhenSetRadioTrue_ExpectGetRadioReturnsTrue(t *testing.T) {
+ if err := testCellRendererToggleSetRadio(true); err != nil {
+ t.Error(err)
+ }
+}
+
+func testCellRendererToggleSetActive(set bool) error {
+ renderer, err := CellRendererToggleNew()
+ if err != nil {
+ return err
+ }
+
+ renderer.SetActive(set)
+ if exp, act := set, renderer.GetActive(); act != exp {
+ return fmt.Errorf("Expected GetActive(): %v; Got: %v", exp, act)
+ }
+ return nil
+}
+
+func TestCellRendererToggle_WhenSetActiveFalse_ExpectGetActiveReturnsFalse(t *testing.T) {
+ if err := testCellRendererToggleSetActive(false); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestCellRendererToggle_WhenSetActiveTrue_ExpectGetActiveReturnsTrue(t *testing.T) {
+ if err := testCellRendererToggleSetActive(true); err != nil {
+ t.Error(err)
+ }
+}
+
+func testCellRendererToggleSetActivatable(set bool) error {
+ renderer, err := CellRendererToggleNew()
+ if err != nil {
+ return err
+ }
+
+ renderer.SetActivatable(set)
+ if exp, act := set, renderer.GetActivatable(); act != exp {
+ return fmt.Errorf("Expected GetActivatable(): %v; Got: %v", exp, act)
+ }
+ return nil
+}
+
+func TestCellRendererToggle_WhenSetActivatableFalse_ExpectGetActivatableReturnsFalse(t *testing.T) {
+ if err := testCellRendererToggleSetActivatable(false); err != nil {
+ t.Error(err)
+ }
+}
+
+func TestCellRendererToggle_WhenSetActivatableTrue_ExpectGetActivatableReturnsTrue(t *testing.T) {
+ if err := testCellRendererToggleSetActivatable(true); err != nil {
+ t.Error(err)
+ }
+}
+
+func setupListStore() *ListStore {
+ ls, err := ListStoreNew(glib.TYPE_STRING)
+ if err != nil {
+ log.Fatal("Unexpected err:", err)
+ }
+ return ls
+}
+
+func getLastIter(ls *ListStore) (*TreeIter, bool) {
+ iter, listIsntEmpty := ls.GetIterFirst()
+ if !listIsntEmpty {
+ return iter, listIsntEmpty
+ }
+
+ for {
+ temp := *iter
+ last := &temp
+ if !ls.IterNext(iter) {
+ return last, true
+ }
+ }
+
+ panic("Shouldn't get here")
+}
+
+// TestListStoreRemoveLastInvalidIterator tests that when a ListStore stores
+// one item and it is removed, the iterator becomes invalid.
+func TestListStoreRemoveLastInvalidIterator(t *testing.T) {
+ ls := setupListStore()
+
+ iter := ls.Append()
+
+ if iterValid := ls.Remove(iter); iterValid {
+ t.Fatal("Remove() returned true (iter valid); expected false (iter invalid)")
+ }
+}
+
+func TestListStoreInsertBefore(t *testing.T) {
+ ls := setupListStore()
+
+ // Given 1 iter is already in the liststore
+ initialIter := ls.Append()
+
+ // When another iter is inserted before it
+ newIter := ls.InsertBefore(initialIter)
+
+ // Expect the newly-inserted iter is first iter in list
+ firstIter, listIsntEmpty := ls.GetIterFirst()
+ if !listIsntEmpty {
+ t.Fatal("Unexpected: liststore is empty")
+ }
+
+ if *firstIter != *newIter {
+ t.Fatal("Expected the new iter added to front of list")
+ }
+}
+
+// When 'sibling' parameter is nil, the new iter should be appended to the liststore
+func TestListStoreInsertBefore_WhenNilSibling(t *testing.T) {
+ ls := setupListStore()
+
+ // Given 2 iters in liststore
+ ls.Append()
+ ls.Append()
+
+ // When 'sibling' parameter of InsertBefore() is nil...
+ newIter := ls.InsertBefore(nil)
+
+ // Then expect newly-inserted iter is the first iter in list
+ lastIter, listIsntEmpty := getLastIter(ls)
+ if !listIsntEmpty {
+ t.Fatal("Unexpected: liststore is empty")
+ }
+
+ if *lastIter != *newIter {
+ t.Fatal("Expected the new iter added to end of list")
+ }
+}
+
+func TestListStoreInsertAfter(t *testing.T) {
+ ls := setupListStore()
+
+ // Given 1 iter in liststore
+ sibling := ls.Append()
+
+ // When InsertAfter(sibling)
+ newIter := ls.InsertAfter(sibling)
+
+ // Then expect newly-inserted iter is the last iter in list
+ lastIter, listIsntEmpty := getLastIter(ls)
+ if !listIsntEmpty {
+ t.Fatal("Unexpected: liststore is empty")
+ }
+
+ if *lastIter != *newIter {
+ t.Fatal("Expected the new iter added to end of list")
+ }
+}
+
+// When 'sibling' parameter is nil, the new iter should be prepended to the liststore
+func TestListStoreInsertAfter_WhenNilSibling(t *testing.T) {
+ ls := setupListStore()
+
+ // Given 2 iters in liststore
+ ls.Append()
+ ls.Append()
+
+ // When InsertAfter(nil)
+ newIter := ls.InsertAfter(nil)
+
+ // Then expect newly-inserted iter is the first iter in the list
+ first, listIsntEmpty := ls.GetIterFirst()
+ if !listIsntEmpty {
+ t.Fatal("Unexpected: liststore is empty")
+ }
+
+ if *first != *newIter {
+ t.Fatal("Expected the new iter was prepended to liststore")
+ }
+}
+
+func TestBuilder(t *testing.T) {
+ builder, err := BuilderNew()
+ if err != nil {
+ t.Error("Unable to create builder")
+ }
+
+ str := `
+<interface>
+ <object class="GtkDialog" id="dialog1">
+ <child internal-child="vbox">
+ <object class="GtkBox" id="vbox1">
+ <property name="border-width">10</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="hbuttonbox1">
+ <property name="border-width">20</property>
+ <child>
+ <object class="GtkButton" id="ok_button">
+ <property name="label">gtk-ok</property>
+ <property name="use-stock">TRUE</property>
+ <signal name="clicked" handler="ok_button_clicked"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+`
+
+ err = builder.AddFromString(str)
+ if err != nil {
+ t.Error("Unable to add from string")
+ }
+
+ widget, err := builder.GetObject("ok_button")
+ if err != nil {
+ t.Error("Unable to get widget from string")
+ }
+
+ button, ok := widget.(*Button)
+ if !ok {
+ t.Error("Unable to cast to gtk.Button")
+ }
+
+ l, err := button.GetLabel()
+ if err != nil {
+ t.Error("Unable to get button label")
+ }
+
+ if l != "gtk-ok" {
+ t.Errorf("Label has the wrong value: %q", l)
+ }
+
+ done := make(chan bool)
+
+ builder.ConnectSignals(map[string]interface{}{
+ "ok_button_clicked": func() {
+ done <- true
+ },
+ })
+
+ go button.Emit("clicked")
+
+ select {
+ case <-done:
+ case <-time.After(1 * time.Second):
+ t.Error("Failed to call callback")
+ }
+}
+
+func TestTextTagEvent(t *testing.T) {
+ textTag, err := TextTagNew("mytexttag")
+ if err != nil {
+ t.Error("could not create text tag")
+ }
+
+ evk := gdk.EventKeyNew()
+
+ var iter TextIter
+ ok := textTag.Event(textTag.Object, evk.Event, &iter)
+
+ if ok {
+ t.Error("event should not have been handled")
+ }
+
+ textTag.Connect("event", func() bool {
+ return true
+ })
+
+ ok = textTag.Event(textTag.Object, evk.Event, &iter)
+
+ if !ok {
+ t.Error("event should have been handled")
+ }
+
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/icon_view.go b/vendor/github.com/gotk3/gotk3/gtk/icon_view.go
new file mode 100644
index 0000000..5b4f41f
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/icon_view.go
@@ -0,0 +1,468 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "runtime"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkIconView
+ */
+
+// IconView is a representation of GTK's GtkIconView.
+type IconView struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkIconView.
+func (v *IconView) native() *C.GtkIconView {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkIconView(p)
+}
+
+func marshalIconView(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapIconView(obj), nil
+}
+
+func wrapIconView(obj *glib.Object) *IconView {
+ return &IconView{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// IconViewNew is a wrapper around gtk_icon_view_new().
+func IconViewNew() (*IconView, error) {
+ c := C.gtk_icon_view_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return wrapIconView(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// IconViewNewWithModel is a wrapper around gtk_icon_view_new_with_model().
+func IconViewNewWithModel(model ITreeModel) (*IconView, error) {
+ c := C.gtk_icon_view_new_with_model(model.toTreeModel())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapIconView(obj), nil
+}
+
+// SetModel is a wrapper around gtk_icon_view_set_model().
+func (v *IconView) SetModel(model ITreeModel) {
+ C.gtk_icon_view_set_model(v.native(), model.toTreeModel())
+}
+
+// GetModel is a wrapper around gtk_icon_view_get_model().
+func (v *IconView) GetModel() (*TreeModel, error) {
+ c := C.gtk_icon_view_get_model(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTreeModel(obj), nil
+}
+
+// SetTextColumn is a wrapper around gtk_icon_view_set_text_column().
+func (v *IconView) SetTextColumn(column int) {
+ C.gtk_icon_view_set_text_column(v.native(), C.gint(column))
+}
+
+// GetTextColumn is a wrapper around gtk_icon_view_get_text_column().
+func (v *IconView) GetTextColumn() int {
+ return int(C.gtk_icon_view_get_text_column(v.native()))
+}
+
+// SetMarkupColumn is a wrapper around gtk_icon_view_set_markup_column().
+func (v *IconView) SetMarkupColumn(column int) {
+ C.gtk_icon_view_set_markup_column(v.native(), C.gint(column))
+}
+
+// GetMarkupColumn is a wrapper around gtk_icon_view_get_markup_column().
+func (v *IconView) GetMarkupColumn() int {
+ return int(C.gtk_icon_view_get_markup_column(v.native()))
+}
+
+// SetPixbufColumn is a wrapper around gtk_icon_view_set_pixbuf_column().
+func (v *IconView) SetPixbufColumn(column int) {
+ C.gtk_icon_view_set_pixbuf_column(v.native(), C.gint(column))
+}
+
+// GetPixbufColumn is a wrapper around gtk_icon_view_get_pixbuf_column().
+func (v *IconView) GetPixbufColumn() int {
+ return int(C.gtk_icon_view_get_pixbuf_column(v.native()))
+}
+
+// GetPathAtPos is a wrapper around gtk_icon_view_get_path_at_pos().
+func (v *IconView) GetPathAtPos(x, y int) *TreePath {
+ var (
+ cpath *C.GtkTreePath
+ path *TreePath
+ )
+
+ cpath = C.gtk_icon_view_get_path_at_pos(v.native(), C.gint(x), C.gint(y))
+
+ if cpath != nil {
+ path = &TreePath{cpath}
+ runtime.SetFinalizer(path, (*TreePath).free)
+ }
+
+ return path
+}
+
+// GetItemAtPos is a wrapper around gtk_icon_view_get_item_at_pos().
+func (v *IconView) GetItemAtPos(x, y int) (*TreePath, *CellRenderer) {
+ var (
+ cpath *C.GtkTreePath
+ ccell *C.GtkCellRenderer
+ path *TreePath
+ cell *CellRenderer
+ )
+
+ C.gtk_icon_view_get_item_at_pos(v.native(), C.gint(x), C.gint(y), &cpath, &ccell)
+
+ if cpath != nil {
+ path = &TreePath{cpath}
+ runtime.SetFinalizer(path, (*TreePath).free)
+ }
+
+ if ccell != nil {
+ cell = wrapCellRenderer(glib.Take(unsafe.Pointer(ccell)))
+ }
+
+ return path, cell
+}
+
+// ConvertWidgetToBinWindowCoords is a wrapper around gtk_icon_view_convert_widget_to_bin_window_coords().
+func (v *IconView) ConvertWidgetToBinWindowCoords(x, y int) (int, int) {
+ var bx, by C.gint
+
+ C.gtk_icon_view_convert_widget_to_bin_window_coords(v.native(), C.gint(x), C.gint(y), &bx, &by)
+
+ return int(bx), int(by)
+}
+
+// SetCursor is a wrapper around gtk_icon_view_set_selection_mode().
+func (v *IconView) SetCursor(path *TreePath, cell *CellRenderer, startEditing bool) {
+ C.gtk_icon_view_set_cursor(v.native(), path.native(), cell.native(), gbool(startEditing))
+}
+
+// GetCursor is a wrapper around gtk_icon_view_get_cursor().
+func (v *IconView) GetCursor() (*TreePath, *CellRenderer) {
+ var (
+ cpath *C.GtkTreePath
+ ccell *C.GtkCellRenderer
+ path *TreePath
+ cell *CellRenderer
+ )
+
+ C.gtk_icon_view_get_cursor(v.native(), &cpath, &ccell)
+
+ if cpath != nil {
+ path = &TreePath{cpath}
+ runtime.SetFinalizer(path, (*TreePath).free)
+ }
+
+ if ccell != nil {
+ cell = wrapCellRenderer(glib.Take(unsafe.Pointer(ccell)))
+ }
+
+ return path, cell
+}
+
+// func (v *IconView) SelectedForeach() {}
+
+// SetSelectionMode is a wrapper around gtk_icon_view_set_selection_mode().
+func (v *IconView) SetSelectionMode(mode SelectionMode) {
+ C.gtk_icon_view_set_selection_mode(v.native(), C.GtkSelectionMode(mode))
+}
+
+// GetSelectionMode is a wrapper around gtk_icon_view_get_selection_mode().
+func (v *IconView) GetSelectionMode() SelectionMode {
+ return SelectionMode(C.gtk_icon_view_get_selection_mode(v.native()))
+}
+
+// SetItemOrientation is a wrapper around gtk_icon_view_set_item_orientation().
+func (v *IconView) SetItemOrientation(orientation Orientation) {
+ C.gtk_icon_view_set_item_orientation(v.native(), C.GtkOrientation(orientation))
+}
+
+// GetItemOrientation is a wrapper around gtk_icon_view_get_item_orientation().
+func (v *IconView) GetItemOrientation() Orientation {
+ return Orientation(C.gtk_icon_view_get_item_orientation(v.native()))
+}
+
+// SetColumns is a wrapper around gtk_icon_view_set_columns().
+func (v *IconView) SetColumns(columns int) {
+ C.gtk_icon_view_set_columns(v.native(), C.gint(columns))
+}
+
+// GetColumns is a wrapper around gtk_icon_view_get_columns().
+func (v *IconView) GetColumns() int {
+ return int(C.gtk_icon_view_get_columns(v.native()))
+}
+
+// SetItemWidth is a wrapper around gtk_icon_view_set_item_width().
+func (v *IconView) SetItemWidth(width int) {
+ C.gtk_icon_view_set_item_width(v.native(), C.gint(width))
+}
+
+// GetItemWidth is a wrapper around gtk_icon_view_get_item_width().
+func (v *IconView) GetItemWidth() int {
+ return int(C.gtk_icon_view_get_item_width(v.native()))
+}
+
+// SetSpacing is a wrapper around gtk_icon_view_set_spacing().
+func (v *IconView) SetSpacing(spacing int) {
+ C.gtk_icon_view_set_spacing(v.native(), C.gint(spacing))
+}
+
+// GetSpacing is a wrapper around gtk_icon_view_get_spacing().
+func (v *IconView) GetSpacing() int {
+ return int(C.gtk_icon_view_get_spacing(v.native()))
+}
+
+// SetRowSpacing is a wrapper around gtk_icon_view_set_row_spacing().
+func (v *IconView) SetRowSpacing(rowSpacing int) {
+ C.gtk_icon_view_set_row_spacing(v.native(), C.gint(rowSpacing))
+}
+
+// GetRowSpacing is a wrapper around gtk_icon_view_get_row_spacing().
+func (v *IconView) GetRowSpacing() int {
+ return int(C.gtk_icon_view_get_row_spacing(v.native()))
+}
+
+// SetColumnSpacing is a wrapper around gtk_icon_view_set_column_spacing().
+func (v *IconView) SetColumnSpacing(columnSpacing int) {
+ C.gtk_icon_view_set_column_spacing(v.native(), C.gint(columnSpacing))
+}
+
+// GetColumnSpacing is a wrapper around gtk_icon_view_get_column_spacing().
+func (v *IconView) GetColumnSpacing() int {
+ return int(C.gtk_icon_view_get_column_spacing(v.native()))
+}
+
+// SetMargin is a wrapper around gtk_icon_view_set_margin().
+func (v *IconView) SetMargin(margin int) {
+ C.gtk_icon_view_set_margin(v.native(), C.gint(margin))
+}
+
+// GetMargin is a wrapper around gtk_icon_view_get_margin().
+func (v *IconView) GetMargin() int {
+ return int(C.gtk_icon_view_get_margin(v.native()))
+}
+
+// SetItemPadding is a wrapper around gtk_icon_view_set_item_padding().
+func (v *IconView) SetItemPadding(itemPadding int) {
+ C.gtk_icon_view_set_item_padding(v.native(), C.gint(itemPadding))
+}
+
+// GetItemPadding is a wrapper around gtk_icon_view_get_item_padding().
+func (v *IconView) GetItemPadding() int {
+ return int(C.gtk_icon_view_get_item_padding(v.native()))
+}
+
+// SetActivateOnSingleClick is a wrapper around gtk_icon_view_set_activate_on_single_click().
+func (v *IconView) SetActivateOnSingleClick(single bool) {
+ C.gtk_icon_view_set_activate_on_single_click(v.native(), gbool(single))
+}
+
+// ActivateOnSingleClick is a wrapper around gtk_icon_view_get_activate_on_single_click().
+func (v *IconView) ActivateOnSingleClick() bool {
+ return gobool(C.gtk_icon_view_get_activate_on_single_click(v.native()))
+}
+
+// GetCellRect is a wrapper around gtk_icon_view_get_cell_rect().
+func (v *IconView) GetCellRect(path *TreePath, cell *CellRenderer) *gdk.Rectangle {
+ var crect C.GdkRectangle
+
+ C.gtk_icon_view_get_cell_rect(v.native(), path.native(), cell.native(), &crect)
+
+ return gdk.WrapRectangle(uintptr(unsafe.Pointer(&crect)))
+}
+
+// SelectPath is a wrapper around gtk_icon_view_select_path().
+func (v *IconView) SelectPath(path *TreePath) {
+ C.gtk_icon_view_select_path(v.native(), path.native())
+}
+
+// UnselectPath is a wrapper around gtk_icon_view_unselect_path().
+func (v *IconView) UnselectPath(path *TreePath) {
+ C.gtk_icon_view_unselect_path(v.native(), path.native())
+}
+
+// PathIsSelected is a wrapper around gtk_icon_view_path_is_selected().
+func (v *IconView) PathIsSelected(path *TreePath) bool {
+ return gobool(C.gtk_icon_view_path_is_selected(v.native(), path.native()))
+}
+
+// GetSelectedItems is a wrapper around gtk_icon_view_unselect_path().
+func (v *IconView) GetSelectedItems() *glib.List {
+ clist := C.gtk_icon_view_get_selected_items(v.native())
+ if clist == nil {
+ return nil
+ }
+
+ glist := glib.WrapList(uintptr(unsafe.Pointer(clist)))
+ glist.DataWrapper(func(ptr unsafe.Pointer) interface{} {
+ return &TreePath{(*C.GtkTreePath)(ptr)}
+ })
+ runtime.SetFinalizer(glist, func(glist *glib.List) {
+ glist.FreeFull(func(item interface{}) {
+ path := item.(*TreePath)
+ C.gtk_tree_path_free(path.GtkTreePath)
+ })
+ })
+
+ return glist
+}
+
+// SelectAll is a wrapper around gtk_icon_view_select_all().
+func (v *IconView) SelectAll() {
+ C.gtk_icon_view_select_all(v.native())
+}
+
+// UnselectAll is a wrapper around gtk_icon_view_unselect_all().
+func (v *IconView) UnselectAll() {
+ C.gtk_icon_view_unselect_all(v.native())
+}
+
+// ItemActivated is a wrapper around gtk_icon_view_item_activated().
+func (v *IconView) ItemActivated(path *TreePath) {
+ C.gtk_icon_view_item_activated(v.native(), path.native())
+}
+
+// ScrollToPath is a wrapper around gtk_icon_view_scroll_to_path().
+func (v *IconView) ScrollToPath(path *TreePath, useAlign bool, rowAlign, colAlign float64) {
+ C.gtk_icon_view_scroll_to_path(v.native(), path.native(), gbool(useAlign),
+ C.gfloat(rowAlign), C.gfloat(colAlign))
+}
+
+// GetVisibleRange is a wrapper around gtk_icon_view_get_visible_range().
+func (v *IconView) GetVisibleRange() (*TreePath, *TreePath) {
+ var (
+ cpathStart, cpathEnd *C.GtkTreePath
+ pathStart, pathEnd *TreePath
+ )
+
+ C.gtk_icon_view_get_visible_range(v.native(), &cpathStart, &cpathEnd)
+
+ if cpathStart != nil {
+ pathStart = &TreePath{cpathStart}
+ runtime.SetFinalizer(pathStart, (*TreePath).free)
+ }
+
+ if cpathEnd != nil {
+ pathEnd = &TreePath{cpathEnd}
+ runtime.SetFinalizer(pathEnd, (*TreePath).free)
+ }
+
+ return pathStart, pathEnd
+}
+
+// SetTooltipItem is a wrapper around gtk_icon_view_set_tooltip_item().
+func (v *IconView) SetTooltipItem(tooltip *Tooltip, path *TreePath) {
+ C.gtk_icon_view_set_tooltip_item(v.native(), tooltip.native(), path.native())
+}
+
+// SetTooltipCell is a wrapper around gtk_icon_view_set_tooltip_cell().
+func (v *IconView) SetTooltipCell(tooltip *Tooltip, path *TreePath, cell *CellRenderer) {
+ C.gtk_icon_view_set_tooltip_cell(v.native(), tooltip.native(), path.native(), cell.native())
+}
+
+// GetTooltipContext is a wrapper around gtk_icon_view_get_tooltip_context().
+func (v *IconView) GetTooltipContext(x, y int, keyboardTip bool) (*TreeModel, *TreePath, *TreeIter) {
+ var (
+ cmodel *C.GtkTreeModel
+ cpath *C.GtkTreePath
+ citer *C.GtkTreeIter
+ model *TreeModel
+ path *TreePath
+ iter *TreeIter
+ )
+
+ px := C.gint(x)
+ py := C.gint(y)
+ if !gobool(C.gtk_icon_view_get_tooltip_context(v.native(),
+ &px,
+ &py,
+ gbool(keyboardTip),
+ &cmodel,
+ &cpath,
+ citer,
+ )) {
+ return nil, nil, nil
+ }
+
+ if cmodel != nil {
+ model = wrapTreeModel(glib.Take(unsafe.Pointer(cmodel)))
+ }
+
+ if cpath != nil {
+ path = &TreePath{cpath}
+ runtime.SetFinalizer(path, (*TreePath).free)
+ }
+
+ if citer != nil {
+ iter = &TreeIter{*citer}
+ runtime.SetFinalizer(iter, (*TreeIter).free)
+ }
+
+ return model, path, iter
+}
+
+// SetTooltipColumn is a wrapper around gtk_icon_view_set_tooltip_column().
+func (v *IconView) SetTooltipColumn(column int) {
+ C.gtk_icon_view_set_tooltip_column(v.native(), C.gint(column))
+}
+
+// GetTooltipColumn is a wrapper around gtk_icon_view_get_tooltip_column().
+func (v *IconView) GetTooltipColumn() int {
+ return int(C.gtk_icon_view_get_tooltip_column(v.native()))
+}
+
+// GetItemRow is a wrapper around gtk_icon_view_get_item_row().
+func (v *IconView) GetItemRow(path *TreePath) int {
+ return int(C.gtk_icon_view_get_item_row(v.native(), path.native()))
+}
+
+/*
+func (v *IconView) EnableModelDragSource() {}
+
+func (v *IconView) EnableModelDragDest() {}
+
+func (v *IconView) UnsetModelDragSource() {}
+
+func (v *IconView) UnsetModelDragDest() {}
+*/
+
+// SetReorderable is a wrapper around gtk_icon_view_set_reorderable().
+func (v *IconView) SetReorderable(reorderable bool) {
+ C.gtk_icon_view_set_reorderable(v.native(), gbool(reorderable))
+}
+
+// GetReorderable is a wrapper around gtk_icon_view_get_reorderable().
+func (v *IconView) GetReorderable() bool {
+ return gobool(C.gtk_icon_view_get_reorderable(v.native()))
+}
+
+/*
+func (v *IconView) SetDragDestItem() {}
+
+func (v *IconView) GetDragDestItem() {}
+
+func (v *IconView) GetDestItemAtPos() {}
+
+func (v *IconView) CreateDragIcon() {}
+*/
diff --git a/vendor/github.com/gotk3/gotk3/gtk/info_bar.go b/vendor/github.com/gotk3/gotk3/gtk/info_bar.go
new file mode 100644
index 0000000..ed4c467
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/info_bar.go
@@ -0,0 +1,106 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_info_bar_get_type()), marshalInfoBar},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkInfoBar"] = wrapInfoBar
+}
+
+type InfoBar struct {
+ Box
+}
+
+func (v *InfoBar) native() *C.GtkInfoBar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkInfoBar(p)
+}
+
+func marshalInfoBar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapInfoBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func wrapInfoBar(obj *glib.Object) *InfoBar {
+ return &InfoBar{Box{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+func InfoBarNew() (*InfoBar, error) {
+ c := C.gtk_info_bar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return wrapInfoBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func (v *InfoBar) AddActionWidget(w IWidget, responseId ResponseType) {
+ C.gtk_info_bar_add_action_widget(v.native(), w.toWidget(), C.gint(responseId))
+}
+
+func (v *InfoBar) AddButton(buttonText string, responseId ResponseType) {
+ cstr := C.CString(buttonText)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_info_bar_add_button(v.native(), (*C.gchar)(cstr), C.gint(responseId))
+}
+
+func (v *InfoBar) SetResponseSensitive(responseId ResponseType, setting bool) {
+ C.gtk_info_bar_set_response_sensitive(v.native(), C.gint(responseId), gbool(setting))
+}
+
+func (v *InfoBar) SetDefaultResponse(responseId ResponseType) {
+ C.gtk_info_bar_set_default_response(v.native(), C.gint(responseId))
+}
+
+func (v *InfoBar) SetMessageType(messageType MessageType) {
+ C.gtk_info_bar_set_message_type(v.native(), C.GtkMessageType(messageType))
+}
+
+func (v *InfoBar) GetMessageType() MessageType {
+ messageType := C.gtk_info_bar_get_message_type(v.native())
+ return MessageType(messageType)
+}
+
+func (v *InfoBar) GetActionArea() (*Widget, error) {
+ c := C.gtk_info_bar_get_action_area(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func (v *InfoBar) GetContentArea() (*Box, error) {
+ c := C.gtk_info_bar_get_content_area(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return wrapBox(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func (v *InfoBar) GetShowCloseButton() bool {
+ b := C.gtk_info_bar_get_show_close_button(v.native())
+ return gobool(b)
+}
+
+func (v *InfoBar) SetShowCloseButton(setting bool) {
+ C.gtk_info_bar_set_show_close_button(v.native(), gbool(setting))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/label.go b/vendor/github.com/gotk3/gotk3/gtk/label.go
new file mode 100644
index 0000000..16d418b
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/label.go
@@ -0,0 +1,281 @@
+// Same copyright and license as the rest of the files in this project
+// This file contains style related functions and structures
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/pango"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkLabel
+ */
+
+// Label is a representation of GTK's GtkLabel.
+type Label struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkLabel.
+func (v *Label) native() *C.GtkLabel {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkLabel(p)
+}
+
+func marshalLabel(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapLabel(obj), nil
+}
+
+func wrapLabel(obj *glib.Object) *Label {
+ return &Label{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+func WidgetToLabel(widget *Widget) (interface{}, error) {
+ obj := glib.Take(unsafe.Pointer(widget.GObject))
+ return wrapLabel(obj), nil
+}
+
+// LabelNew is a wrapper around gtk_label_new().
+func LabelNew(str string) (*Label, error) {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_label_new((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapLabel(obj), nil
+}
+
+// SetText is a wrapper around gtk_label_set_text().
+func (v *Label) SetText(str string) {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_label_set_text(v.native(), (*C.gchar)(cstr))
+}
+
+// SetMarkup is a wrapper around gtk_label_set_markup().
+func (v *Label) SetMarkup(str string) {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_label_set_markup(v.native(), (*C.gchar)(cstr))
+}
+
+// SetMarkupWithMnemonic is a wrapper around
+// gtk_label_set_markup_with_mnemonic().
+func (v *Label) SetMarkupWithMnemonic(str string) {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_label_set_markup_with_mnemonic(v.native(), (*C.gchar)(cstr))
+}
+
+// SetPattern is a wrapper around gtk_label_set_pattern().
+func (v *Label) SetPattern(patern string) {
+ cstr := C.CString(patern)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_label_set_pattern(v.native(), (*C.gchar)(cstr))
+}
+
+// SetJustify is a wrapper around gtk_label_set_justify().
+func (v *Label) SetJustify(jtype Justification) {
+ C.gtk_label_set_justify(v.native(), C.GtkJustification(jtype))
+}
+
+// SetEllipsize is a wrapper around gtk_label_set_ellipsize().
+func (v *Label) SetEllipsize(mode pango.EllipsizeMode) {
+ C.gtk_label_set_ellipsize(v.native(), C.PangoEllipsizeMode(mode))
+}
+
+// GetWidthChars is a wrapper around gtk_label_get_width_chars().
+func (v *Label) GetWidthChars() int {
+ c := C.gtk_label_get_width_chars(v.native())
+ return int(c)
+}
+
+// SetWidthChars is a wrapper around gtk_label_set_width_chars().
+func (v *Label) SetWidthChars(nChars int) {
+ C.gtk_label_set_width_chars(v.native(), C.gint(nChars))
+}
+
+// GetMaxWidthChars is a wrapper around gtk_label_get_max_width_chars().
+func (v *Label) GetMaxWidthChars() int {
+ c := C.gtk_label_get_max_width_chars(v.native())
+ return int(c)
+}
+
+// SetMaxWidthChars is a wrapper around gtk_label_set_max_width_chars().
+func (v *Label) SetMaxWidthChars(nChars int) {
+ C.gtk_label_set_max_width_chars(v.native(), C.gint(nChars))
+}
+
+// GetLineWrap is a wrapper around gtk_label_get_line_wrap().
+func (v *Label) GetLineWrap() bool {
+ c := C.gtk_label_get_line_wrap(v.native())
+ return gobool(c)
+}
+
+// SetLineWrap is a wrapper around gtk_label_set_line_wrap().
+func (v *Label) SetLineWrap(wrap bool) {
+ C.gtk_label_set_line_wrap(v.native(), gbool(wrap))
+}
+
+// SetLineWrapMode is a wrapper around gtk_label_set_line_wrap_mode().
+func (v *Label) SetLineWrapMode(wrapMode pango.WrapMode) {
+ C.gtk_label_set_line_wrap_mode(v.native(), C.PangoWrapMode(wrapMode))
+}
+
+// GetSelectable is a wrapper around gtk_label_get_selectable().
+func (v *Label) GetSelectable() bool {
+ c := C.gtk_label_get_selectable(v.native())
+ return gobool(c)
+}
+
+// GetText is a wrapper around gtk_label_get_text().
+func (v *Label) GetText() (string, error) {
+ c := C.gtk_label_get_text(v.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return C.GoString((*C.char)(c)), nil
+}
+
+// GetJustify is a wrapper around gtk_label_get_justify().
+func (v *Label) GetJustify() Justification {
+ c := C.gtk_label_get_justify(v.native())
+ return Justification(c)
+}
+
+// GetEllipsize is a wrapper around gtk_label_get_ellipsize().
+func (v *Label) GetEllipsize() pango.EllipsizeMode {
+ c := C.gtk_label_get_ellipsize(v.native())
+ return pango.EllipsizeMode(c)
+}
+
+// GetCurrentUri is a wrapper around gtk_label_get_current_uri().
+func (v *Label) GetCurrentUri() string {
+ c := C.gtk_label_get_current_uri(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+// GetTrackVisitedLinks is a wrapper around gtk_label_get_track_visited_links().
+func (v *Label) GetTrackVisitedLinks() bool {
+ c := C.gtk_label_get_track_visited_links(v.native())
+ return gobool(c)
+}
+
+// SetTrackVisitedLinks is a wrapper around gtk_label_set_track_visited_links().
+func (v *Label) SetTrackVisitedLinks(trackLinks bool) {
+ C.gtk_label_set_track_visited_links(v.native(), gbool(trackLinks))
+}
+
+// GetAngle is a wrapper around gtk_label_get_angle().
+func (v *Label) GetAngle() float64 {
+ c := C.gtk_label_get_angle(v.native())
+ return float64(c)
+}
+
+// SetAngle is a wrapper around gtk_label_set_angle().
+func (v *Label) SetAngle(angle float64) {
+ C.gtk_label_set_angle(v.native(), C.gdouble(angle))
+}
+
+// GetSelectionBounds is a wrapper around gtk_label_get_selection_bounds().
+func (v *Label) GetSelectionBounds() (start, end int, nonEmpty bool) {
+ var cstart, cend C.gint
+ c := C.gtk_label_get_selection_bounds(v.native(), &cstart, &cend)
+ return int(cstart), int(cend), gobool(c)
+}
+
+// GetSingleLineMode is a wrapper around gtk_label_get_single_line_mode().
+func (v *Label) GetSingleLineMode() bool {
+ c := C.gtk_label_get_single_line_mode(v.native())
+ return gobool(c)
+}
+
+// SetSingleLineMode is a wrapper around gtk_label_set_single_line_mode().
+func (v *Label) SetSingleLineMode(mode bool) {
+ C.gtk_label_set_single_line_mode(v.native(), gbool(mode))
+}
+
+// GetUseMarkup is a wrapper around gtk_label_get_use_markup().
+func (v *Label) GetUseMarkup() bool {
+ c := C.gtk_label_get_use_markup(v.native())
+ return gobool(c)
+}
+
+// SetUseMarkup is a wrapper around gtk_label_set_use_markup().
+func (v *Label) SetUseMarkup(use bool) {
+ C.gtk_label_set_use_markup(v.native(), gbool(use))
+}
+
+// GetUseUnderline is a wrapper around gtk_label_get_use_underline().
+func (v *Label) GetUseUnderline() bool {
+ c := C.gtk_label_get_use_underline(v.native())
+ return gobool(c)
+}
+
+// SetUseUnderline is a wrapper around gtk_label_set_use_underline().
+func (v *Label) SetUseUnderline(use bool) {
+ C.gtk_label_set_use_underline(v.native(), gbool(use))
+}
+
+// LabelNewWithMnemonic is a wrapper around gtk_label_new_with_mnemonic().
+func LabelNewWithMnemonic(str string) (*Label, error) {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_label_new_with_mnemonic((*C.gchar)(cstr))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapLabel(obj), nil
+}
+
+// SelectRegion is a wrapper around gtk_label_select_region().
+func (v *Label) SelectRegion(startOffset, endOffset int) {
+ C.gtk_label_select_region(v.native(), C.gint(startOffset),
+ C.gint(endOffset))
+}
+
+// SetSelectable is a wrapper around gtk_label_set_selectable().
+func (v *Label) SetSelectable(setting bool) {
+ C.gtk_label_set_selectable(v.native(), gbool(setting))
+}
+
+// SetLabel is a wrapper around gtk_label_set_label().
+func (v *Label) SetLabel(str string) {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_label_set_label(v.native(), (*C.gchar)(cstr))
+}
+
+// GetLabel is a wrapper around gtk_label_get_label().
+func (v *Label) GetLabel() string {
+ c := C.gtk_label_get_label(v.native())
+ if c == nil {
+ return ""
+ }
+ return C.GoString((*C.char)(c))
+}
+
+// GetMnemonicKeyval is a wrapper around gtk_label_get_mnemonic_keyval().
+func (v *Label) GetMnemonicKeyval() uint {
+ return uint(C.gtk_label_get_mnemonic_keyval(v.native()))
+}
+
+// SetMnemonicWidget is a wrapper around gtk_label_set_mnemonic_widget().
+func (v *Label) SetMnemonicWidget(widget IWidget) {
+ C.gtk_label_set_mnemonic_widget(v.native(), widget.toWidget())
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/level_bar.go b/vendor/github.com/gotk3/gotk3/gtk/level_bar.go
new file mode 100644
index 0000000..30c1fe2
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/level_bar.go
@@ -0,0 +1,151 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_level_bar_mode_get_type()), marshalLevelBarMode},
+
+ {glib.Type(C.gtk_level_bar_get_type()), marshalLevelBar},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkLevelBar"] = wrapLevelBar
+}
+
+// LevelBarMode is a representation of GTK's GtkLevelBarMode.
+type LevelBarMode int
+
+const (
+ LEVEL_BAR_MODE_CONTINUOUS LevelBarMode = C.GTK_LEVEL_BAR_MODE_CONTINUOUS
+ LEVEL_BAR_MODE_DISCRETE LevelBarMode = C.GTK_LEVEL_BAR_MODE_DISCRETE
+)
+
+func marshalLevelBarMode(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return LevelBarMode(c), nil
+}
+
+/*
+ * GtkLevelBar
+ */
+
+type LevelBar struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkLevelBar.
+func (v *LevelBar) native() *C.GtkLevelBar {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkLevelBar(p)
+}
+
+func marshalLevelBar(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapLevelBar(obj), nil
+}
+
+func wrapLevelBar(obj *glib.Object) *LevelBar {
+ return &LevelBar{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// LevelBarNew() is a wrapper around gtk_level_bar_new().
+func LevelBarNew() (*LevelBar, error) {
+ c := C.gtk_level_bar_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapLevelBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// LevelBarNewForInterval() is a wrapper around gtk_level_bar_new_for_interval().
+func LevelBarNewForInterval(min_value, max_value float64) (*LevelBar, error) {
+ c := C.gtk_level_bar_new_for_interval(C.gdouble(min_value), C.gdouble(max_value))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapLevelBar(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetMode() is a wrapper around gtk_level_bar_set_mode().
+func (v *LevelBar) SetMode(m LevelBarMode) {
+ C.gtk_level_bar_set_mode(v.native(), C.GtkLevelBarMode(m))
+}
+
+// GetMode() is a wrapper around gtk_level_bar_get_mode().
+func (v *LevelBar) GetMode() LevelBarMode {
+ return LevelBarMode(C.gtk_level_bar_get_mode(v.native()))
+}
+
+// SetValue() is a wrapper around gtk_level_bar_set_value().
+func (v *LevelBar) SetValue(value float64) {
+ C.gtk_level_bar_set_value(v.native(), C.gdouble(value))
+}
+
+// GetValue() is a wrapper around gtk_level_bar_get_value().
+func (v *LevelBar) GetValue() float64 {
+ c := C.gtk_level_bar_get_value(v.native())
+ return float64(c)
+}
+
+// SetMinValue() is a wrapper around gtk_level_bar_set_min_value().
+func (v *LevelBar) SetMinValue(value float64) {
+ C.gtk_level_bar_set_min_value(v.native(), C.gdouble(value))
+}
+
+// GetMinValue() is a wrapper around gtk_level_bar_get_min_value().
+func (v *LevelBar) GetMinValue() float64 {
+ c := C.gtk_level_bar_get_min_value(v.native())
+ return float64(c)
+}
+
+// SetMaxValue() is a wrapper around gtk_level_bar_set_max_value().
+func (v *LevelBar) SetMaxValue(value float64) {
+ C.gtk_level_bar_set_max_value(v.native(), C.gdouble(value))
+}
+
+// GetMaxValue() is a wrapper around gtk_level_bar_get_max_value().
+func (v *LevelBar) GetMaxValue() float64 {
+ c := C.gtk_level_bar_get_max_value(v.native())
+ return float64(c)
+}
+
+const (
+ LEVEL_BAR_OFFSET_LOW string = C.GTK_LEVEL_BAR_OFFSET_LOW
+ LEVEL_BAR_OFFSET_HIGH string = C.GTK_LEVEL_BAR_OFFSET_HIGH
+)
+
+// AddOffsetValue() is a wrapper around gtk_level_bar_add_offset_value().
+func (v *LevelBar) AddOffsetValue(name string, value float64) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_level_bar_add_offset_value(v.native(), (*C.gchar)(cstr), C.gdouble(value))
+}
+
+// RemoveOffsetValue() is a wrapper around gtk_level_bar_remove_offset_value().
+func (v *LevelBar) RemoveOffsetValue(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_level_bar_remove_offset_value(v.native(), (*C.gchar)(cstr))
+}
+
+// GetOffsetValue() is a wrapper around gtk_level_bar_get_offset_value().
+func (v *LevelBar) GetOffsetValue(name string) (float64, bool) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ var value C.gdouble
+ c := C.gtk_level_bar_get_offset_value(v.native(), (*C.gchar)(cstr), &value)
+ return float64(value), gobool(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/level_bar_since_3_8.go b/vendor/github.com/gotk3/gotk3/gtk/level_bar_since_3_8.go
new file mode 100644
index 0000000..8df8f29
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/level_bar_since_3_8.go
@@ -0,0 +1,18 @@
+// +build !gtk_3_6
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+
+// SetInverted() is a wrapper around gtk_level_bar_set_inverted().
+func (v *LevelBar) SetInverted(inverted bool) {
+ C.gtk_level_bar_set_inverted(v.native(), gbool(inverted))
+}
+
+// GetInverted() is a wrapper around gtk_level_bar_get_inverted().
+func (v *LevelBar) GetInverted() bool {
+ c := C.gtk_level_bar_get_inverted(v.native())
+ return gobool(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/menu.go b/vendor/github.com/gotk3/gotk3/gtk/menu.go
new file mode 100644
index 0000000..09e1f90
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/menu.go
@@ -0,0 +1,76 @@
+// 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 (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkMenu
+ */
+
+// Menu is a representation of GTK's GtkMenu.
+type Menu struct {
+ MenuShell
+}
+
+// IMenu is an interface type implemented by all structs embedding
+// a Menu. It is meant to be used as an argument type for wrapper
+// functions that wrap around a C GTK function taking a
+// GtkMenu.
+type IMenu interface {
+ toMenu() *C.GtkMenu
+ toWidget() *C.GtkWidget
+}
+
+// native() returns a pointer to the underlying GtkMenu.
+func (v *Menu) native() *C.GtkMenu {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkMenu(p)
+}
+
+func (v *Menu) toMenu() *C.GtkMenu {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func marshalMenu(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapMenu(obj), nil
+}
+
+func wrapMenu(obj *glib.Object) *Menu {
+ return &Menu{MenuShell{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// MenuNew() is a wrapper around gtk_menu_new().
+func MenuNew() (*Menu, error) {
+ c := C.gtk_menu_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapMenu(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// Popdown() is a wrapper around gtk_menu_popdown().
+func (v *Menu) Popdown() {
+ C.gtk_menu_popdown(v.native())
+}
+
+// ReorderChild() is a wrapper around gtk_menu_reorder_child().
+func (v *Menu) ReorderChild(child IWidget, position int) {
+ C.gtk_menu_reorder_child(v.native(), child.toWidget(), C.gint(position))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/menu_before_3_22.go b/vendor/github.com/gotk3/gotk3/gtk/menu_before_3_22.go
new file mode 100644
index 0000000..5f138a0
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/menu_before_3_22.go
@@ -0,0 +1,19 @@
+// +build gtk_3_6 gtk_3_8 gtk_3_10 gtk_3_12 gtk_3_14 gtk_3_16 gtk_3_18 gtk_3_20
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+import "C"
+import "github.com/gotk3/gotk3/gdk"
+
+// PopupAtPointer() is a wrapper for gtk_menu_popup_at_pointer(), on older versions it uses PopupAtMouseCursor
+func (v *Menu) PopupAtPointer(_ *gdk.Event) {
+ C.gtk_menu_popup(v.native(),
+ nil,
+ nil,
+ nil,
+ nil,
+ C.guint(0),
+ C.gtk_get_current_event_time())
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/menu_shell.go b/vendor/github.com/gotk3/gotk3/gtk/menu_shell.go
new file mode 100644
index 0000000..436cda0
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/menu_shell.go
@@ -0,0 +1,96 @@
+// 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 (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkMenuShell
+ */
+
+// MenuShell is a representation of GTK's GtkMenuShell.
+type MenuShell struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkMenuShell.
+func (v *MenuShell) native() *C.GtkMenuShell {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkMenuShell(p)
+}
+
+func marshalMenuShell(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapMenuShell(obj), nil
+}
+
+func wrapMenuShell(obj *glib.Object) *MenuShell {
+ return &MenuShell{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// Append is a wrapper around gtk_menu_shell_append().
+func (v *MenuShell) Append(child IMenuItem) {
+ C.gtk_menu_shell_append(v.native(), child.toWidget())
+}
+
+// Prepend is a wrapper around gtk_menu_shell_prepend().
+func (v *MenuShell) Prepend(child IMenuItem) {
+ C.gtk_menu_shell_prepend(v.native(), child.toWidget())
+}
+
+// Insert is a wrapper around gtk_menu_shell_insert().
+func (v *MenuShell) Insert(child IMenuItem, position int) {
+ C.gtk_menu_shell_insert(v.native(), child.toWidget(), C.gint(position))
+}
+
+// Deactivate is a wrapper around gtk_menu_shell_deactivate().
+func (v *MenuShell) Deactivate() {
+ C.gtk_menu_shell_deactivate(v.native())
+}
+
+// SelectItem is a wrapper around gtk_menu_shell_select_item().
+func (v *MenuShell) SelectItem(child IMenuItem) {
+ C.gtk_menu_shell_select_item(v.native(), child.toWidget())
+}
+
+// SelectFirst is a wrapper around gtk_menu_shell_select_first().
+func (v *MenuShell) SelectFirst(searchSensitive bool) {
+ C.gtk_menu_shell_select_first(v.native(), gbool(searchSensitive))
+}
+
+// Deselect is a wrapper around gtk_menu_shell_deselect().
+func (v *MenuShell) Deselect() {
+ C.gtk_menu_shell_deselect(v.native())
+}
+
+// ActivateItem is a wrapper around gtk_menu_shell_activate_item().
+func (v *MenuShell) ActivateItem(child IMenuItem, forceDeactivate bool) {
+ C.gtk_menu_shell_activate_item(v.native(), child.toWidget(), gbool(forceDeactivate))
+}
+
+// Cancel is a wrapper around gtk_menu_shell_cancel().
+func (v *MenuShell) Cancel() {
+ C.gtk_menu_shell_cancel(v.native())
+}
+
+// SetTakeFocus is a wrapper around gtk_menu_shell_set_take_focus().
+func (v *MenuShell) SetTakeFocus(takeFocus bool) {
+ C.gtk_menu_shell_set_take_focus(v.native(), gbool(takeFocus))
+}
+
+// gboolean gtk_menu_shell_get_take_focus ()
+// GtkWidget * gtk_menu_shell_get_selected_item ()
+// GtkWidget * gtk_menu_shell_get_parent_shell ()
+// void gtk_menu_shell_bind_model ()
diff --git a/vendor/github.com/gotk3/gotk3/gtk/menu_since_3_22.go b/vendor/github.com/gotk3/gotk3/gtk/menu_since_3_22.go
new file mode 100644
index 0000000..85c2e3d
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/menu_since_3_22.go
@@ -0,0 +1,24 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12,!gtk_3_14,!gtk_3_16,!gtk_3_18,!gtk_3_20
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+)
+
+// PopupAtPointer() is a wrapper for gtk_menu_popup_at_pointer(), on older versions it uses PopupAtMouseCursor
+func (v *Menu) PopupAtPointer(triggerEvent *gdk.Event) {
+ e := (*C.GdkEvent)(unsafe.Pointer(triggerEvent.Native()))
+ C.gtk_menu_popup_at_pointer(v.native(), e)
+}
+
+// PopupAtWidget() is a wrapper for gtk_menu_popup_at_widget()
+func (v *Menu) PopupAtWidget(widget IWidget, widgetAnchor gdk.GdkGravity, menuAnchor gdk.GdkGravity, triggerEvent *gdk.Event) {
+ e := (*C.GdkEvent)(unsafe.Pointer(triggerEvent.Native()))
+ C.gtk_menu_popup_at_widget(v.native(), widget.toWidget(), C.GdkGravity(widgetAnchor), C.GdkGravity(menuAnchor), e)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/popover_since_3_12.go b/vendor/github.com/gotk3/gotk3/gtk/popover_since_3_12.go
new file mode 100644
index 0000000..1438899
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/popover_since_3_12.go
@@ -0,0 +1,82 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrapers for symbols included since GTK 3.12, and
+// and should not be included in a build intended to target any older GTK
+// versions. To target an older build, such as 3.10, use
+// 'go build -tags gtk_3_10'. Otherwise, if no build tags are used, GTK 3.12
+// is assumed and this file is built.
+
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "popover_since_3_12.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_popover_get_type()), marshalPopover},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+ WrapMap["GtkPopover"] = wrapPopover
+}
+
+//TODO(sjon): Implement GtkPopover
+//GtkPopover
+type Popover struct {
+ Bin
+}
+
+func (v *Popover) native() *C.GtkPopover {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkPopover(p)
+}
+
+func marshalPopover(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapPopover(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func wrapPopover(obj *glib.Object) *Popover {
+ return &Popover{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+//gtk_popover_new()
+func PopoverNew(relative IWidget) (*Popover, error) {
+ //Takes relative to widget
+ var c *C.struct__GtkWidget
+ if relative == nil {
+ c = C.gtk_popover_new(nil)
+ } else {
+ c = C.gtk_popover_new(relative.toWidget())
+ }
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapPopover(glib.Take(unsafe.Pointer(c))), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/popover_since_3_12.go.h b/vendor/github.com/gotk3/gotk3/gtk/popover_since_3_12.go.h
new file mode 100644
index 0000000..3cc5564
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/popover_since_3_12.go.h
@@ -0,0 +1,25 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12
+
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+static GtkPopover *
+toGtkPopover(void *p)
+{
+ return (GTK_POPOVER(p));
+} \ No newline at end of file
diff --git a/vendor/github.com/gotk3/gotk3/gtk/popover_since_3_18.go b/vendor/github.com/gotk3/gotk3/gtk/popover_since_3_18.go
new file mode 100644
index 0000000..79a8d04
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/popover_since_3_18.go
@@ -0,0 +1,29 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12,!gtk_3_14,!gtk_3_16,gtk_3_18
+
+// See: https://developer.gnome.org/gtk3/3.18/api-index-3-18.html
+
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+//void
+//gtk_popover_set_default_widget (GtkPopover *popover, GtkWidget *widget);
+func (p *Popover) SetDefaultWidget(widget IWidget) {
+ C.gtk_popover_set_default_widget(p.native(), widget.toWidget())
+}
+
+//GtkWidget *
+//gtk_popover_get_default_widget (GtkPopover *popover);
+func (p *Popover) GetDefaultWidget() *Widget {
+ w := C.gtk_popover_get_default_widget(p.native())
+ if w == nil {
+ return nil
+ }
+ return &Widget{glib.InitiallyUnowned{glib.Take(unsafe.Pointer(w))}}
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/print.go b/vendor/github.com/gotk3/gotk3/gtk/print.go
new file mode 100644
index 0000000..01d169f
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/print.go
@@ -0,0 +1,1600 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "errors"
+ "runtime"
+ "sync"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/cairo"
+ "github.com/gotk3/gotk3/glib"
+ "github.com/gotk3/gotk3/pango"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Enums
+ {glib.Type(C.gtk_page_orientation_get_type()), marshalPageOrientation},
+ {glib.Type(C.gtk_print_error_get_type()), marshalPrintError},
+ {glib.Type(C.gtk_print_operation_action_get_type()), marshalPrintOperationAction},
+ {glib.Type(C.gtk_print_operation_result_get_type()), marshalPrintOperationResult},
+ {glib.Type(C.gtk_print_status_get_type()), marshalPrintStatus},
+ {glib.Type(C.gtk_unit_get_type()), marshalUnit},
+
+ // Objects/Interfaces
+ {glib.Type(C.gtk_number_up_layout_get_type()), marshalNumberUpLayout},
+ {glib.Type(C.gtk_page_orientation_get_type()), marshalPageOrientation},
+ {glib.Type(C.gtk_page_set_get_type()), marshalPageSet},
+ {glib.Type(C.gtk_page_setup_get_type()), marshalPageSetup},
+ {glib.Type(C.gtk_print_context_get_type()), marshalPrintContext},
+ {glib.Type(C.gtk_print_duplex_get_type()), marshalPrintDuplex},
+ {glib.Type(C.gtk_print_operation_get_type()), marshalPrintOperation},
+ {glib.Type(C.gtk_print_operation_preview_get_type()), marshalPrintOperationPreview},
+ {glib.Type(C.gtk_print_pages_get_type()), marshalPrintPages},
+ {glib.Type(C.gtk_print_quality_get_type()), marshalPrintQuality},
+ {glib.Type(C.gtk_print_settings_get_type()), marshalPrintSettings},
+
+ // Boxed
+ {glib.Type(C.gtk_paper_size_get_type()), marshalPaperSize},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkPageSetup"] = wrapPageSetup
+ WrapMap["GtkPrintContext"] = wrapPrintContext
+ WrapMap["GtkPrintOperation"] = wrapPrintOperation
+ WrapMap["GtkPrintOperationPreview"] = wrapPrintOperationPreview
+ WrapMap["GtkPrintSettings"] = wrapPrintSettings
+}
+
+/*
+ * Constants
+ */
+
+// NumberUpLayout is a representation of GTK's GtkNumberUpLayout.
+type NumberUpLayout int
+
+const (
+ NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM NumberUpLayout = C.GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM
+ NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP NumberUpLayout = C.GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP
+ NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM NumberUpLayout = C.GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM
+ NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP NumberUpLayout = C.GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP
+ NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT NumberUpLayout = C.GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT
+ NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_RIGHT_TO_LEFT NumberUpLayout = C.GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_RIGHT_TO_LEFT
+ NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT NumberUpLayout = C.GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT
+ NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_RIGHT_TO_LEFT NumberUpLayout = C.GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_RIGHT_TO_LEFT
+)
+
+func marshalNumberUpLayout(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return NumberUpLayout(c), nil
+}
+
+// PageOrientation is a representation of GTK's GtkPageOrientation.
+type PageOrientation int
+
+const (
+ PAGE_ORIENTATION_PORTRAIT PageOrientation = C.GTK_PAGE_ORIENTATION_PORTRAIT
+ PAGE_ORIENTATION_LANDSCAPE PageOrientation = C.GTK_PAGE_ORIENTATION_LANDSCAPE
+ PAGE_ORIENTATION_REVERSE_PORTRAIT PageOrientation = C.GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT
+ PAGE_ORIENTATION_REVERSE_LANDSCAPE PageOrientation = C.GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE
+)
+
+func marshalPageOrientation(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PageOrientation(c), nil
+}
+
+// PrintDuplex is a representation of GTK's GtkPrintDuplex.
+type PrintDuplex int
+
+const (
+ PRINT_DUPLEX_SIMPLEX PrintDuplex = C.GTK_PRINT_DUPLEX_SIMPLEX
+ PRINT_DUPLEX_HORIZONTAL PrintDuplex = C.GTK_PRINT_DUPLEX_HORIZONTAL
+ PRINT_DUPLEX_VERTICAL PrintDuplex = C.GTK_PRINT_DUPLEX_VERTICAL
+)
+
+func marshalPrintDuplex(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PrintDuplex(c), nil
+}
+
+// PrintPages is a representation of GTK's GtkPrintPages.
+type PrintPages int
+
+const (
+ PRINT_PAGES_ALL PrintPages = C.GTK_PRINT_PAGES_ALL
+ PRINT_PAGES_CURRENT PrintPages = C.GTK_PRINT_PAGES_CURRENT
+ PRINT_PAGES_RANGES PrintPages = C.GTK_PRINT_PAGES_RANGES
+ PRINT_PAGES_SELECTION PrintPages = C.GTK_PRINT_PAGES_SELECTION
+)
+
+func marshalPrintPages(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PrintPages(c), nil
+}
+
+// PageSet is a representation of GTK's GtkPageSet.
+type PageSet int
+
+const (
+ PAGE_SET_ALL PageSet = C.GTK_PAGE_SET_ALL
+ PAGE_SET_EVEN PageSet = C.GTK_PAGE_SET_EVEN
+ PAGE_SET_ODD PageSet = C.GTK_PAGE_SET_ODD
+)
+
+func marshalPageSet(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PageSet(c), nil
+}
+
+// PrintOperationAction is a representation of GTK's GtkPrintError.
+type PrintError int
+
+const (
+ PRINT_ERROR_GENERAL PrintError = C.GTK_PRINT_ERROR_GENERAL
+ PRINT_ERROR_INTERNAL_ERROR PrintError = C.GTK_PRINT_ERROR_INTERNAL_ERROR
+ PRINT_ERROR_NOMEM PrintError = C.GTK_PRINT_ERROR_NOMEM
+ PRINT_ERROR_INVALID_FILE PrintError = C.GTK_PRINT_ERROR_INVALID_FILE
+)
+
+func marshalPrintError(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PrintError(c), nil
+}
+
+// PrintOperationAction is a representation of GTK's GtkPrintOperationAction.
+type PrintOperationAction int
+
+const (
+ PRINT_OPERATION_ACTION_PRINT_DIALOG PrintOperationAction = C.GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG
+ PRINT_OPERATION_ACTION_PRINT PrintOperationAction = C.GTK_PRINT_OPERATION_ACTION_PRINT
+ PRINT_OPERATION_ACTION_PREVIEW PrintOperationAction = C.GTK_PRINT_OPERATION_ACTION_PREVIEW
+ PRINT_OPERATION_ACTION_EXPORT PrintOperationAction = C.GTK_PRINT_OPERATION_ACTION_EXPORT
+)
+
+func marshalPrintOperationAction(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PrintOperationAction(c), nil
+}
+
+// PrintOperationResult is a representation of GTK's GtkPrintOperationResult.
+type PrintOperationResult int
+
+const (
+ PRINT_OPERATION_RESULT_ERROR PrintOperationResult = C.GTK_PRINT_OPERATION_RESULT_ERROR
+ PRINT_OPERATION_RESULT_APPLY PrintOperationResult = C.GTK_PRINT_OPERATION_RESULT_APPLY
+ PRINT_OPERATION_RESULT_CANCEL PrintOperationResult = C.GTK_PRINT_OPERATION_RESULT_CANCEL
+ PRINT_OPERATION_RESULT_IN_PROGRESS PrintOperationResult = C.GTK_PRINT_OPERATION_RESULT_IN_PROGRESS
+)
+
+func marshalPrintOperationResult(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PrintOperationResult(c), nil
+}
+
+// PrintStatus is a representation of GTK's GtkPrintStatus.
+type PrintStatus int
+
+const (
+ PRINT_STATUS_INITIAL PrintStatus = C.GTK_PRINT_STATUS_INITIAL
+ PRINT_STATUS_PREPARING PrintStatus = C.GTK_PRINT_STATUS_PREPARING
+ PRINT_STATUS_GENERATING_DATA PrintStatus = C.GTK_PRINT_STATUS_GENERATING_DATA
+ PRINT_STATUS_SENDING_DATA PrintStatus = C.GTK_PRINT_STATUS_SENDING_DATA
+ PRINT_STATUS_PENDING PrintStatus = C.GTK_PRINT_STATUS_PENDING
+ PRINT_STATUS_PENDING_ISSUE PrintStatus = C.GTK_PRINT_STATUS_PENDING_ISSUE
+ PRINT_STATUS_PRINTING PrintStatus = C.GTK_PRINT_STATUS_PRINTING
+ PRINT_STATUS_FINISHED PrintStatus = C.GTK_PRINT_STATUS_FINISHED
+ PRINT_STATUS_FINISHED_ABORTED PrintStatus = C.GTK_PRINT_STATUS_FINISHED_ABORTED
+)
+
+func marshalPrintStatus(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PrintStatus(c), nil
+}
+
+// PrintQuality is a representation of GTK's GtkPrintQuality.
+type PrintQuality int
+
+const (
+ PRINT_QUALITY_LOW PrintQuality = C.GTK_PRINT_QUALITY_LOW
+ PRINT_QUALITY_NORMAL PrintQuality = C.GTK_PRINT_QUALITY_NORMAL
+ PRINT_QUALITY_HIGH PrintQuality = C.GTK_PRINT_QUALITY_HIGH
+ PRINT_QUALITY_DRAFT PrintQuality = C.GTK_PRINT_QUALITY_DRAFT
+)
+
+func marshalPrintQuality(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return PrintQuality(c), nil
+}
+
+// Unit is a representation of GTK's GtkUnit.
+type Unit int
+
+const (
+ GTK_UNIT_NONE Unit = C.GTK_UNIT_NONE
+ GTK_UNIT_POINTS Unit = C.GTK_UNIT_POINTS
+ GTK_UNIT_INCH Unit = C.GTK_UNIT_INCH
+ GTK_UNIT_MM Unit = C.GTK_UNIT_MM
+)
+
+func marshalUnit(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Unit(c), nil
+}
+
+/*
+ * GtkPageSetup
+ */
+type PageSetup struct {
+ *glib.Object
+}
+
+func (ps *PageSetup) native() *C.GtkPageSetup {
+ if ps == nil || ps.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(ps.GObject)
+ return C.toGtkPageSetup(p)
+}
+
+func marshalPageSetup(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPageSetup(obj), nil
+}
+
+func wrapPageSetup(obj *glib.Object) *PageSetup {
+ return &PageSetup{obj}
+}
+
+// PageSetupNew() is a wrapper around gtk_page_setup_new().
+func PageSetupNew() (*PageSetup, error) {
+ c := C.gtk_page_setup_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPageSetup(obj), nil
+}
+
+// Copy() is a wrapper around gtk_page_setup_copy().
+func (ps *PageSetup) Copy() (*PageSetup, error) {
+ c := C.gtk_page_setup_copy(ps.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPageSetup(obj), nil
+}
+
+// GetOrientation() is a wrapper around gtk_page_setup_get_orientation().
+func (ps *PageSetup) GetOrientation() PageOrientation {
+ c := C.gtk_page_setup_get_orientation(ps.native())
+ return PageOrientation(c)
+}
+
+// SetOrientation() is a wrapper around gtk_page_setup_set_orientation().
+func (ps *PageSetup) SetOrientation(orientation PageOrientation) {
+ C.gtk_page_setup_set_orientation(ps.native(), C.GtkPageOrientation(orientation))
+}
+
+// GetPaperSize() is a wrapper around gtk_page_setup_get_paper_size().
+func (ps *PageSetup) GetPaperSize() *PaperSize {
+ c := C.gtk_page_setup_get_paper_size(ps.native())
+ p := &PaperSize{c}
+ runtime.SetFinalizer(p, (*PaperSize).free)
+ return p
+}
+
+// SetPaperSize() is a wrapper around gtk_page_setup_set_paper_size().
+func (ps *PageSetup) SetPaperSize(size *PaperSize) {
+ C.gtk_page_setup_set_paper_size(ps.native(), size.native())
+}
+
+// GetTopMargin() is a wrapper around gtk_page_setup_get_top_margin().
+func (ps *PageSetup) GetTopMargin(unit Unit) float64 {
+ c := C.gtk_page_setup_get_top_margin(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// SetTopMargin() is a wrapper around gtk_page_setup_set_top_margin().
+func (ps *PageSetup) SetTopMargin(margin float64, unit Unit) {
+ C.gtk_page_setup_set_top_margin(ps.native(), C.gdouble(margin), C.GtkUnit(unit))
+}
+
+// GetBottomMargin() is a wrapper around gtk_page_setup_get_bottom_margin().
+func (ps *PageSetup) GetBottomMargin(unit Unit) float64 {
+ c := C.gtk_page_setup_get_bottom_margin(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// SetBottomMargin() is a wrapper around gtk_page_setup_set_bottom_margin().
+func (ps *PageSetup) SetBottomMargin(margin float64, unit Unit) {
+ C.gtk_page_setup_set_bottom_margin(ps.native(), C.gdouble(margin), C.GtkUnit(unit))
+}
+
+// GetLeftMargin() is a wrapper around gtk_page_setup_get_left_margin().
+func (ps *PageSetup) GetLeftMargin(unit Unit) float64 {
+ c := C.gtk_page_setup_get_left_margin(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// SetLeftMargin() is a wrapper around gtk_page_setup_set_left_margin().
+func (ps *PageSetup) SetLeftMargin(margin float64, unit Unit) {
+ C.gtk_page_setup_set_left_margin(ps.native(), C.gdouble(margin), C.GtkUnit(unit))
+}
+
+// GetRightMargin() is a wrapper around gtk_page_setup_get_right_margin().
+func (ps *PageSetup) GetRightMargin(unit Unit) float64 {
+ c := C.gtk_page_setup_get_right_margin(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// SetRightMargin() is a wrapper around gtk_page_setup_set_right_margin().
+func (ps *PageSetup) SetRightMargin(margin float64, unit Unit) {
+ C.gtk_page_setup_set_right_margin(ps.native(), C.gdouble(margin), C.GtkUnit(unit))
+}
+
+// SetPaperSizeAndDefaultMargins() is a wrapper around gtk_page_setup_set_paper_size_and_default_margins().
+func (ps *PageSetup) SetPaperSizeAndDefaultMargins(size *PaperSize) {
+ C.gtk_page_setup_set_paper_size_and_default_margins(ps.native(), size.native())
+}
+
+// GetPaperWidth() is a wrapper around gtk_page_setup_get_paper_width().
+func (ps *PageSetup) GetPaperWidth(unit Unit) float64 {
+ c := C.gtk_page_setup_get_paper_width(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// GetPaperHeight() is a wrapper around gtk_page_setup_get_paper_height().
+func (ps *PageSetup) GetPaperHeight(unit Unit) float64 {
+ c := C.gtk_page_setup_get_paper_height(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// GetPageWidth() is a wrapper around gtk_page_setup_get_page_width().
+func (ps *PageSetup) GetPageWidth(unit Unit) float64 {
+ c := C.gtk_page_setup_get_page_width(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// GetPageHeight() is a wrapper around gtk_page_setup_get_page_height().
+func (ps *PageSetup) GetPageHeight(unit Unit) float64 {
+ c := C.gtk_page_setup_get_page_height(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// PageSetupNewFromFile() is a wrapper around gtk_page_setup_new_from_file().
+func PageSetupNewFromFile(fileName string) (*PageSetup, error) {
+ cstr := C.CString(fileName)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ c := C.gtk_page_setup_new_from_file((*C.gchar)(cstr), &err)
+ if c == nil {
+ defer C.g_error_free(err)
+ return nil, errors.New(C.GoString((*C.char)(err.message)))
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return &PageSetup{obj}, nil
+
+}
+
+// PageSetupNewFromKeyFile() is a wrapper around gtk_page_setup_new_from_key_file().
+
+// PageSetupLoadFile() is a wrapper around gtk_page_setup_load_file().
+func (ps *PageSetup) PageSetupLoadFile(name string) error {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ res := C.gtk_page_setup_load_file(ps.native(), cstr, &err)
+ if !gobool(res) {
+ defer C.g_error_free(err)
+ return errors.New(C.GoString((*C.char)(err.message)))
+ }
+ return nil
+}
+
+// PageSetupLoadKeyFile() is a wrapper around gtk_page_setup_load_key_file().
+
+// PageSetupToFile() is a wrapper around gtk_page_setup_to_file().
+func (ps *PageSetup) PageSetupToFile(name string) error {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ res := C.gtk_page_setup_to_file(ps.native(), cstr, &err)
+ if !gobool(res) {
+ defer C.g_error_free(err)
+ return errors.New(C.GoString((*C.char)(err.message)))
+ }
+ return nil
+}
+
+// PageSetupToKeyFile() is a wrapper around gtk_page_setup_to_key_file().
+
+/*
+ * GtkPaperSize
+ */
+
+// PaperSize is a representation of GTK's GtkPaperSize
+type PaperSize struct {
+ GtkPaperSize *C.GtkPaperSize
+}
+
+// native returns a pointer to the underlying GtkPaperSize.
+func (ps *PaperSize) native() *C.GtkPaperSize {
+ if ps == nil {
+ return nil
+ }
+ return ps.GtkPaperSize
+}
+
+func marshalPaperSize(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return &PaperSize{(*C.GtkPaperSize)(unsafe.Pointer(c))}, nil
+}
+
+const (
+ UNIT_PIXEL int = C.GTK_UNIT_PIXEL
+ PAPER_NAME_A3 string = C.GTK_PAPER_NAME_A3
+ PAPER_NAME_A4 string = C.GTK_PAPER_NAME_A4
+ PAPER_NAME_A5 string = C.GTK_PAPER_NAME_A5
+ PAPER_NAME_B5 string = C.GTK_PAPER_NAME_B5
+ PAPER_NAME_LETTER string = C.GTK_PAPER_NAME_LETTER
+ PAPER_NAME_EXECUTIVE string = C.GTK_PAPER_NAME_EXECUTIVE
+ PAPER_NAME_LEGAL string = C.GTK_PAPER_NAME_LEGAL
+)
+
+// PaperSizeNew() is a wrapper around gtk_paper_size_new().
+func PaperSizeNew(name string) (*PaperSize, error) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ var gName *C.gchar
+
+ if name == "" {
+ gName = nil
+ } else {
+ gName = (*C.gchar)(cstr)
+ }
+
+ c := C.gtk_paper_size_new(gName)
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ t := &PaperSize{c}
+ runtime.SetFinalizer(t, (*PaperSize).free)
+ return t, nil
+}
+
+// PaperSizeNewFromPPD() is a wrapper around gtk_paper_size_new_from_ppd().
+func PaperSizeNewFromPPD(name, displayName string, width, height float64) (*PaperSize, error) {
+ cName := C.CString(name)
+ defer C.free(unsafe.Pointer(cName))
+ cDisplayName := C.CString(displayName)
+ defer C.free(unsafe.Pointer(cDisplayName))
+ c := C.gtk_paper_size_new_from_ppd((*C.gchar)(cName), (*C.gchar)(cDisplayName),
+ C.gdouble(width), C.gdouble(height))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ t := &PaperSize{c}
+ runtime.SetFinalizer(t, (*PaperSize).free)
+ return t, nil
+}
+
+// PaperSizeNewCustom() is a wrapper around gtk_paper_size_new_custom().
+func PaperSizeNewCustom(name, displayName string, width, height float64, unit Unit) (*PaperSize, error) {
+ cName := C.CString(name)
+ defer C.free(unsafe.Pointer(cName))
+ cDisplayName := C.CString(displayName)
+ defer C.free(unsafe.Pointer(cDisplayName))
+ c := C.gtk_paper_size_new_custom((*C.gchar)(cName), (*C.gchar)(cDisplayName),
+ C.gdouble(width), C.gdouble(height), C.GtkUnit(unit))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ t := &PaperSize{c}
+ runtime.SetFinalizer(t, (*PaperSize).free)
+ return t, nil
+}
+
+// Copy() is a wrapper around gtk_paper_size_copy().
+func (ps *PaperSize) Copy() (*PaperSize, error) {
+ c := C.gtk_paper_size_copy(ps.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ t := &PaperSize{c}
+ runtime.SetFinalizer(t, (*PaperSize).free)
+ return t, nil
+}
+
+// free() is a wrapper around gtk_paper_size_free().
+func (ps *PaperSize) free() {
+ C.gtk_paper_size_free(ps.native())
+}
+
+// IsEqual() is a wrapper around gtk_paper_size_is_equal().
+func (ps *PaperSize) IsEqual(other *PaperSize) bool {
+ c := C.gtk_paper_size_is_equal(ps.native(), other.native())
+ return gobool(c)
+}
+
+// PaperSizeGetPaperSizes() is a wrapper around gtk_paper_size_get_paper_sizes().
+func PaperSizeGetPaperSizes(includeCustom bool) *glib.List {
+ clist := C.gtk_paper_size_get_paper_sizes(gbool(includeCustom))
+ if clist == nil {
+ return nil
+ }
+
+ glist := glib.WrapList(uintptr(unsafe.Pointer(clist)))
+ glist.DataWrapper(func(ptr unsafe.Pointer) interface{} {
+ return &PaperSize{(*C.GtkPaperSize)(ptr)}
+ })
+
+ runtime.SetFinalizer(glist, func(glist *glib.List) {
+ glist.FreeFull(func(item interface{}) {
+ ps := item.(*PaperSize)
+ C.gtk_paper_size_free(ps.GtkPaperSize)
+ })
+ })
+
+ return glist
+}
+
+// GetName() is a wrapper around gtk_paper_size_get_name().
+func (ps *PaperSize) GetName() string {
+ c := C.gtk_paper_size_get_name(ps.native())
+ return C.GoString((*C.char)(c))
+}
+
+// GetDisplayName() is a wrapper around gtk_paper_size_get_display_name().
+func (ps *PaperSize) GetDisplayName() string {
+ c := C.gtk_paper_size_get_display_name(ps.native())
+ return C.GoString((*C.char)(c))
+}
+
+// GetPPDName() is a wrapper around gtk_paper_size_get_ppd_name().
+func (ps *PaperSize) GetPPDName() (string, error) {
+ c := C.gtk_paper_size_get_ppd_name(ps.native())
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return C.GoString((*C.char)(c)), nil
+}
+
+// GetWidth() is a wrapper around gtk_paper_size_get_width().
+func (ps *PaperSize) GetWidth(unit Unit) float64 {
+ c := C.gtk_paper_size_get_width(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// GetHeight() is a wrapper around gtk_paper_size_get_height().
+func (ps *PaperSize) GetHeight(unit Unit) float64 {
+ c := C.gtk_paper_size_get_width(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// IsCustom() is a wrapper around gtk_paper_size_is_custom().
+func (ps *PaperSize) IsCustom() bool {
+ c := C.gtk_paper_size_is_custom(ps.native())
+ return gobool(c)
+}
+
+// SetSize() is a wrapper around gtk_paper_size_set_size().
+func (ps *PaperSize) SetSize(width, height float64, unit Unit) {
+ C.gtk_paper_size_set_size(ps.native(), C.gdouble(width), C.gdouble(height), C.GtkUnit(unit))
+}
+
+// GetDefaultTopMargin() is a wrapper around gtk_paper_size_get_default_top_margin().
+func (ps *PaperSize) GetDefaultTopMargin(unit Unit) float64 {
+ c := C.gtk_paper_size_get_default_top_margin(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// GetDefaultBottomMargin() is a wrapper around gtk_paper_size_get_default_bottom_margin().
+func (ps *PaperSize) GetDefaultBottomMargin(unit Unit) float64 {
+ c := C.gtk_paper_size_get_default_bottom_margin(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// GetDefaultLeftMargin() is a wrapper around gtk_paper_size_get_default_left_margin().
+func (ps *PaperSize) GetDefaultLeftMargin(unit Unit) float64 {
+ c := C.gtk_paper_size_get_default_left_margin(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// GetDefaultRightMargin() is a wrapper around gtk_paper_size_get_default_right_margin().
+func (ps *PaperSize) GetDefaultRightMargin(unit Unit) float64 {
+ c := C.gtk_paper_size_get_default_right_margin(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// PaperSizeGetDefault() is a wrapper around gtk_paper_size_get_default().
+func PaperSizeGetDefaultRightMargin(unit Unit) string {
+ c := C.gtk_paper_size_get_default()
+ return C.GoString((*C.char)(c))
+}
+
+// PaperSizeNewFromKeyFile() is a wrapper around gtk_paper_size_new_from_key_file().
+// PaperSizeToKeyFile() is a wrapper around gtk_paper_size_to_key_file().
+
+/*
+ * GtkPrintContext
+ */
+
+// PrintContext is a representation of GTK's GtkPrintContext.
+type PrintContext struct {
+ *glib.Object
+}
+
+// native() returns a pointer to the underlying GtkPrintContext.
+func (pc *PrintContext) native() *C.GtkPrintContext {
+ if pc == nil || pc.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(pc.GObject)
+ return C.toGtkPrintContext(p)
+}
+
+func marshalPrintContext(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPrintContext(obj), nil
+}
+
+func wrapPrintContext(obj *glib.Object) *PrintContext {
+ return &PrintContext{obj}
+}
+
+// GetCairoContext() is a wrapper around gtk_print_context_get_cairo_context().
+func (pc *PrintContext) GetCairoContext() *cairo.Context {
+ c := C.gtk_print_context_get_cairo_context(pc.native())
+ return cairo.WrapContext(uintptr(unsafe.Pointer(c)))
+}
+
+// SetCairoContext() is a wrapper around gtk_print_context_set_cairo_context().
+func (pc *PrintContext) SetCairoContext(cr *cairo.Context, dpiX, dpiY float64) {
+ C.gtk_print_context_set_cairo_context(pc.native(),
+ (*C.cairo_t)(unsafe.Pointer(cr.Native())),
+ C.double(dpiX), C.double(dpiY))
+}
+
+// GetPageSetup() is a wrapper around gtk_print_context_get_page_setup().
+func (pc *PrintContext) GetPageSetup() *PageSetup {
+ c := C.gtk_print_context_get_page_setup(pc.native())
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPageSetup(obj)
+}
+
+// GetWidth() is a wrapper around gtk_print_context_get_width().
+func (pc *PrintContext) GetWidth() float64 {
+ c := C.gtk_print_context_get_width(pc.native())
+ return float64(c)
+}
+
+// GetHeight() is a wrapper around gtk_print_context_get_height().
+func (pc *PrintContext) GetHeight() float64 {
+ c := C.gtk_print_context_get_height(pc.native())
+ return float64(c)
+}
+
+// GetDpiX() is a wrapper around gtk_print_context_get_dpi_x().
+func (pc *PrintContext) GetDpiX() float64 {
+ c := C.gtk_print_context_get_dpi_x(pc.native())
+ return float64(c)
+}
+
+// GetDpiY() is a wrapper around gtk_print_context_get_dpi_y().
+func (pc *PrintContext) GetDpiY() float64 {
+ c := C.gtk_print_context_get_dpi_y(pc.native())
+ return float64(c)
+}
+
+// GetPangoFontMap() is a wrapper around gtk_print_context_get_pango_fontmap().
+func (pc *PrintContext) GetPangoFontMap() *pango.FontMap {
+ c := C.gtk_print_context_get_pango_fontmap(pc.native())
+ return pango.WrapFontMap(uintptr(unsafe.Pointer(c)))
+}
+
+// CreatePangoContext() is a wrapper around gtk_print_context_create_pango_context().
+func (pc *PrintContext) CreatePangoContext() *pango.Context {
+ c := C.gtk_print_context_create_pango_context(pc.native())
+ return pango.WrapContext(uintptr(unsafe.Pointer(c)))
+}
+
+// CreatePangoLayout() is a wrapper around gtk_print_context_create_pango_layout().
+func (pc *PrintContext) CreatePangoLayout() *pango.Layout {
+ c := C.gtk_print_context_create_pango_layout(pc.native())
+ return pango.WrapLayout(uintptr(unsafe.Pointer(c)))
+}
+
+// GetHardMargins() is a wrapper around gtk_print_context_get_hard_margins().
+func (pc *PrintContext) GetHardMargins() (float64, float64, float64, float64, error) {
+ var top, bottom, left, right C.gdouble
+ c := C.gtk_print_context_get_hard_margins(pc.native(), &top, &bottom, &left, &right)
+ if gobool(c) == false {
+ return 0.0, 0.0, 0.0, 0.0, errors.New("unable to retrieve hard margins")
+ }
+ return float64(top), float64(bottom), float64(left), float64(right), nil
+}
+
+/*
+ * GtkPrintOperation
+ */
+type PrintOperation struct {
+ *glib.Object
+
+ // Interfaces
+ PrintOperationPreview
+}
+
+func (po *PrintOperation) native() *C.GtkPrintOperation {
+ if po == nil || po.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(po.GObject)
+ return C.toGtkPrintOperation(p)
+}
+
+func (v *PrintOperation) toPrintOperationPreview() *C.GtkPrintOperationPreview {
+ if v == nil {
+ return nil
+ }
+ return C.toGtkPrintOperationPreview(unsafe.Pointer(v.GObject))
+}
+
+func marshalPrintOperation(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPrintOperation(obj), nil
+}
+
+func wrapPrintOperation(obj *glib.Object) *PrintOperation {
+ pop := wrapPrintOperationPreview(obj)
+ return &PrintOperation{obj, *pop}
+}
+
+// PrintOperationNew() is a wrapper around gtk_print_operation_new().
+func PrintOperationNew() (*PrintOperation, error) {
+ c := C.gtk_print_operation_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPrintOperation(obj), nil
+}
+
+// SetAllowAsync() is a wrapper around gtk_print_operation_set_allow_async().
+func (po *PrintOperation) PrintOperationSetAllowAsync(allowSync bool) {
+ C.gtk_print_operation_set_allow_async(po.native(), gbool(allowSync))
+}
+
+// GetError() is a wrapper around gtk_print_operation_get_error().
+func (po *PrintOperation) PrintOperationGetError() error {
+ var err *C.GError = nil
+ C.gtk_print_operation_get_error(po.native(), &err)
+ defer C.g_error_free(err)
+ return errors.New(C.GoString((*C.char)(err.message)))
+}
+
+// SetDefaultPageSetup() is a wrapper around gtk_print_operation_set_default_page_setup().
+func (po *PrintOperation) SetDefaultPageSetup(ps *PageSetup) {
+ C.gtk_print_operation_set_default_page_setup(po.native(), ps.native())
+}
+
+// GetDefaultPageSetup() is a wrapper around gtk_print_operation_get_default_page_setup().
+func (po *PrintOperation) GetDefaultPageSetup() (*PageSetup, error) {
+ c := C.gtk_print_operation_get_default_page_setup(po.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPageSetup(obj), nil
+}
+
+// SetPrintSettings() is a wrapper around gtk_print_operation_set_print_settings().
+func (po *PrintOperation) SetPrintSettings(ps *PrintSettings) {
+ C.gtk_print_operation_set_print_settings(po.native(), ps.native())
+}
+
+// GetPrintSettings() is a wrapper around gtk_print_operation_get_print_settings().
+func (po *PrintOperation) GetPrintSettings(ps *PageSetup) (*PrintSettings, error) {
+ c := C.gtk_print_operation_get_print_settings(po.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPrintSettings(obj), nil
+}
+
+// SetJobName() is a wrapper around gtk_print_operation_set_job_name().
+func (po *PrintOperation) SetJobName(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_operation_set_job_name(po.native(), (*C.gchar)(cstr))
+}
+
+// SetNPages() is a wrapper around gtk_print_operation_set_n_pages().
+func (po *PrintOperation) SetNPages(pages int) {
+ C.gtk_print_operation_set_n_pages(po.native(), C.gint(pages))
+}
+
+// GetNPagesToPrint() is a wrapper around gtk_print_operation_get_n_pages_to_print().
+func (po *PrintOperation) GetNPagesToPrint() int {
+ c := C.gtk_print_operation_get_n_pages_to_print(po.native())
+ return int(c)
+}
+
+// SetCurrentPage() is a wrapper around gtk_print_operation_set_current_page().
+func (po *PrintOperation) SetCurrentPage(page int) {
+ C.gtk_print_operation_set_current_page(po.native(), C.gint(page))
+}
+
+// SetUseFullPage() is a wrapper around gtk_print_operation_set_use_full_page().
+func (po *PrintOperation) SetUseFullPage(full bool) {
+ C.gtk_print_operation_set_use_full_page(po.native(), gbool(full))
+}
+
+// SetUnit() is a wrapper around gtk_print_operation_set_unit().
+func (po *PrintOperation) SetUnit(unit Unit) {
+ C.gtk_print_operation_set_unit(po.native(), C.GtkUnit(unit))
+}
+
+// SetExportFilename() is a wrapper around gtk_print_operation_set_export_filename().
+func (po *PrintOperation) SetExportFilename(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_operation_set_export_filename(po.native(), (*C.gchar)(cstr))
+}
+
+// SetShowProgress() is a wrapper around gtk_print_operation_set_show_progress().
+func (po *PrintOperation) SetShowProgress(show bool) {
+ C.gtk_print_operation_set_show_progress(po.native(), gbool(show))
+}
+
+// SetTrackPrintStatus() is a wrapper around gtk_print_operation_set_track_print_status().
+func (po *PrintOperation) SetTrackPrintStatus(progress bool) {
+ C.gtk_print_operation_set_track_print_status(po.native(), gbool(progress))
+}
+
+// SetCustomTabLabel() is a wrapper around gtk_print_operation_set_custom_tab_label().
+func (po *PrintOperation) SetCustomTabLabel(label string) {
+ cstr := C.CString(label)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_operation_set_custom_tab_label(po.native(), (*C.gchar)(cstr))
+}
+
+// Run() is a wrapper around gtk_print_operation_run().
+func (po *PrintOperation) Run(action PrintOperationAction, parent *Window) (PrintOperationResult, error) {
+ var err *C.GError = nil
+ c := C.gtk_print_operation_run(po.native(), C.GtkPrintOperationAction(action), parent.native(), &err)
+ res := PrintOperationResult(c)
+ if res == PRINT_OPERATION_RESULT_ERROR {
+ defer C.g_error_free(err)
+ return res, errors.New(C.GoString((*C.char)(err.message)))
+ }
+ return res, nil
+}
+
+// Cancel() is a wrapper around gtk_print_operation_cancel().
+func (po *PrintOperation) Cancel() {
+ C.gtk_print_operation_cancel(po.native())
+}
+
+// DrawPageFinish() is a wrapper around gtk_print_operation_draw_page_finish().
+func (po *PrintOperation) DrawPageFinish() {
+ C.gtk_print_operation_draw_page_finish(po.native())
+}
+
+// SetDeferDrawing() is a wrapper around gtk_print_operation_set_defer_drawing().
+func (po *PrintOperation) SetDeferDrawing() {
+ C.gtk_print_operation_set_defer_drawing(po.native())
+}
+
+// GetStatus() is a wrapper around gtk_print_operation_get_status().
+func (po *PrintOperation) GetStatus() PrintStatus {
+ c := C.gtk_print_operation_get_status(po.native())
+ return PrintStatus(c)
+}
+
+// GetStatusString() is a wrapper around gtk_print_operation_get_status_string().
+func (po *PrintOperation) GetStatusString() string {
+ c := C.gtk_print_operation_get_status_string(po.native())
+ return C.GoString((*C.char)(c))
+}
+
+// IsFinished() is a wrapper around gtk_print_operation_is_finished().
+func (po *PrintOperation) IsFinished() bool {
+ c := C.gtk_print_operation_is_finished(po.native())
+ return gobool(c)
+}
+
+// SetSupportSelection() is a wrapper around gtk_print_operation_set_support_selection().
+func (po *PrintOperation) SetSupportSelection(selection bool) {
+ C.gtk_print_operation_set_support_selection(po.native(), gbool(selection))
+}
+
+// GetSupportSelection() is a wrapper around gtk_print_operation_get_support_selection().
+func (po *PrintOperation) GetSupportSelection() bool {
+ c := C.gtk_print_operation_get_support_selection(po.native())
+ return gobool(c)
+}
+
+// SetHasSelection() is a wrapper around gtk_print_operation_set_has_selection().
+func (po *PrintOperation) SetHasSelection(selection bool) {
+ C.gtk_print_operation_set_has_selection(po.native(), gbool(selection))
+}
+
+// GetHasSelection() is a wrapper around gtk_print_operation_get_has_selection().
+func (po *PrintOperation) GetHasSelection() bool {
+ c := C.gtk_print_operation_get_has_selection(po.native())
+ return gobool(c)
+}
+
+// SetEmbedPageSetup() is a wrapper around gtk_print_operation_set_embed_page_setup().
+func (po *PrintOperation) SetEmbedPageSetup(embed bool) {
+ C.gtk_print_operation_set_embed_page_setup(po.native(), gbool(embed))
+}
+
+// GetEmbedPageSetup() is a wrapper around gtk_print_operation_get_embed_page_setup().
+func (po *PrintOperation) GetEmbedPageSetup() bool {
+ c := C.gtk_print_operation_get_embed_page_setup(po.native())
+ return gobool(c)
+}
+
+// PrintRunPageSetupDialog() is a wrapper around gtk_print_run_page_setup_dialog().
+func PrintRunPageSetupDialog(parent *Window, pageSetup *PageSetup, settings *PrintSettings) *PageSetup {
+ c := C.gtk_print_run_page_setup_dialog(parent.native(), pageSetup.native(), settings.native())
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPageSetup(obj)
+}
+
+type PageSetupDoneCallback func(setup *PageSetup, userData uintptr)
+
+type pageSetupDoneCallbackData struct {
+ fn PageSetupDoneCallback
+ data uintptr
+}
+
+var (
+ pageSetupDoneCallbackRegistry = struct {
+ sync.RWMutex
+ next int
+ m map[int]pageSetupDoneCallbackData
+ }{
+ next: 1,
+ m: make(map[int]pageSetupDoneCallbackData),
+ }
+)
+
+// PrintRunPageSetupDialogAsync() is a wrapper around gtk_print_run_page_setup_dialog_async().
+func PrintRunPageSetupDialogAsync(parent *Window, setup *PageSetup,
+ settings *PrintSettings, cb PageSetupDoneCallback, data uintptr) {
+
+ pageSetupDoneCallbackRegistry.Lock()
+ id := pageSetupDoneCallbackRegistry.next
+ pageSetupDoneCallbackRegistry.next++
+ pageSetupDoneCallbackRegistry.m[id] =
+ pageSetupDoneCallbackData{fn: cb, data: data}
+ pageSetupDoneCallbackRegistry.Unlock()
+
+ C._gtk_print_run_page_setup_dialog_async(parent.native(), setup.native(),
+ settings.native(), C.gpointer(uintptr(id)))
+}
+
+/*
+ * GtkPrintOperationPreview
+ */
+
+// PrintOperationPreview is a representation of GTK's GtkPrintOperationPreview GInterface.
+type PrintOperationPreview struct {
+ *glib.Object
+}
+
+// IPrintOperationPreview is an interface type implemented by all structs
+// embedding a PrintOperationPreview. It is meant to be used as an argument type
+// for wrapper functions that wrap around a C GTK function taking a
+// GtkPrintOperationPreview.
+type IPrintOperationPreview interface {
+ toPrintOperationPreview() *C.GtkPrintOperationPreview
+}
+
+// native() returns a pointer to the underlying GObject as a GtkPrintOperationPreview.
+func (v *PrintOperationPreview) native() *C.GtkPrintOperationPreview {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkPrintOperationPreview(p)
+}
+
+func marshalPrintOperationPreview(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPrintOperationPreview(obj), nil
+}
+
+func wrapPrintOperationPreview(obj *glib.Object) *PrintOperationPreview {
+ return &PrintOperationPreview{obj}
+}
+
+func (v *PrintOperationPreview) toPrintOperationPreview() *C.GtkPrintOperationPreview {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+// RenderPage()() is a wrapper around gtk_print_operation_preview_render_page().
+func (pop *PrintOperationPreview) RenderPage(page int) {
+ C.gtk_print_operation_preview_render_page(pop.native(), C.gint(page))
+}
+
+// EndPreview()() is a wrapper around gtk_print_operation_preview_end_preview().
+func (pop *PrintOperationPreview) EndPreview() {
+ C.gtk_print_operation_preview_end_preview(pop.native())
+}
+
+// IsSelected()() is a wrapper around gtk_print_operation_preview_is_selected().
+func (pop *PrintOperationPreview) IsSelected(page int) bool {
+ c := C.gtk_print_operation_preview_is_selected(pop.native(), C.gint(page))
+ return gobool(c)
+}
+
+/*
+ * GtkPrintSettings
+ */
+
+type PrintSettings struct {
+ *glib.Object
+}
+
+func (ps *PrintSettings) native() *C.GtkPrintSettings {
+ if ps == nil || ps.GObject == nil {
+ return nil
+ }
+
+ p := unsafe.Pointer(ps.GObject)
+ return C.toGtkPrintSettings(p)
+}
+
+func marshalPrintSettings(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapPrintSettings(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func wrapPrintSettings(obj *glib.Object) *PrintSettings {
+ return &PrintSettings{obj}
+}
+
+const (
+ PRINT_SETTINGS_PRINTER string = C.GTK_PRINT_SETTINGS_PRINTER
+ PRINT_SETTINGS_ORIENTATION string = C.GTK_PRINT_SETTINGS_ORIENTATION
+ PRINT_SETTINGS_PAPER_FORMAT string = C.GTK_PRINT_SETTINGS_PAPER_FORMAT
+ PRINT_SETTINGS_PAPER_WIDTH string = C.GTK_PRINT_SETTINGS_PAPER_WIDTH
+ PRINT_SETTINGS_PAPER_HEIGHT string = C.GTK_PRINT_SETTINGS_PAPER_HEIGHT
+ PRINT_SETTINGS_USE_COLOR string = C.GTK_PRINT_SETTINGS_USE_COLOR
+ PRINT_SETTINGS_COLLATE string = C.GTK_PRINT_SETTINGS_COLLATE
+ PRINT_SETTINGS_REVERSE string = C.GTK_PRINT_SETTINGS_REVERSE
+ PRINT_SETTINGS_DUPLEX string = C.GTK_PRINT_SETTINGS_DUPLEX
+ PRINT_SETTINGS_QUALITY string = C.GTK_PRINT_SETTINGS_QUALITY
+ PRINT_SETTINGS_N_COPIES string = C.GTK_PRINT_SETTINGS_N_COPIES
+ PRINT_SETTINGS_NUMBER_UP string = C.GTK_PRINT_SETTINGS_NUMBER_UP
+ PRINT_SETTINGS_NUMBER_UP_LAYOUT string = C.GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT
+ PRINT_SETTINGS_RESOLUTION string = C.GTK_PRINT_SETTINGS_RESOLUTION
+ PRINT_SETTINGS_RESOLUTION_X string = C.GTK_PRINT_SETTINGS_RESOLUTION_X
+ PRINT_SETTINGS_RESOLUTION_Y string = C.GTK_PRINT_SETTINGS_RESOLUTION_Y
+ PRINT_SETTINGS_PRINTER_LPI string = C.GTK_PRINT_SETTINGS_PRINTER_LPI
+ PRINT_SETTINGS_SCALE string = C.GTK_PRINT_SETTINGS_SCALE
+ PRINT_SETTINGS_PRINT_PAGES string = C.GTK_PRINT_SETTINGS_PRINT_PAGES
+ PRINT_SETTINGS_PAGE_RANGES string = C.GTK_PRINT_SETTINGS_PAGE_RANGES
+ PRINT_SETTINGS_PAGE_SET string = C.GTK_PRINT_SETTINGS_PAGE_SET
+ PRINT_SETTINGS_DEFAULT_SOURCE string = C.GTK_PRINT_SETTINGS_DEFAULT_SOURCE
+ PRINT_SETTINGS_MEDIA_TYPE string = C.GTK_PRINT_SETTINGS_MEDIA_TYPE
+ PRINT_SETTINGS_DITHER string = C.GTK_PRINT_SETTINGS_DITHER
+ PRINT_SETTINGS_FINISHINGS string = C.GTK_PRINT_SETTINGS_FINISHINGS
+ PRINT_SETTINGS_OUTPUT_BIN string = C.GTK_PRINT_SETTINGS_OUTPUT_BIN
+ PRINT_SETTINGS_OUTPUT_DIR string = C.GTK_PRINT_SETTINGS_OUTPUT_DIR
+ PRINT_SETTINGS_OUTPUT_BASENAME string = C.GTK_PRINT_SETTINGS_OUTPUT_BASENAME
+ PRINT_SETTINGS_OUTPUT_FILE_FORMAT string = C.GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT
+ PRINT_SETTINGS_OUTPUT_URI string = C.GTK_PRINT_SETTINGS_OUTPUT_URI
+ PRINT_SETTINGS_WIN32_DRIVER_EXTRA string = C.GTK_PRINT_SETTINGS_WIN32_DRIVER_EXTRA
+ PRINT_SETTINGS_WIN32_DRIVER_VERSION string = C.GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION
+)
+
+// PrintSettingsNew() is a wrapper around gtk_print_settings_new().
+func PrintSettingsNew() (*PrintSettings, error) {
+ c := C.gtk_print_settings_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPrintSettings(obj), nil
+}
+
+// Copy() is a wrapper around gtk_print_settings_copy().
+func (ps *PrintSettings) Copy() (*PrintSettings, error) {
+ c := C.gtk_print_settings_copy(ps.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPrintSettings(obj), nil
+}
+
+// HasKey() is a wrapper around gtk_print_settings_has_key().
+func (ps *PrintSettings) HasKey(key string) bool {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_print_settings_has_key(ps.native(), (*C.gchar)(cstr))
+ return gobool(c)
+}
+
+// Get() is a wrapper around gtk_print_settings_get().
+func (ps *PrintSettings) Get(key string) string {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_print_settings_get(ps.native(), (*C.gchar)(cstr))
+ return C.GoString((*C.char)(c))
+}
+
+// Set() is a wrapper around gtk_print_settings_set().
+// TODO: Since value can't be nil, we can't unset values here.
+func (ps *PrintSettings) Set(key, value string) {
+ cKey := C.CString(key)
+ defer C.free(unsafe.Pointer(cKey))
+ cValue := C.CString(value)
+ defer C.free(unsafe.Pointer(cValue))
+ C.gtk_print_settings_set(ps.native(), (*C.gchar)(cKey), (*C.gchar)(cValue))
+}
+
+// Unset() is a wrapper around gtk_print_settings_unset().
+func (ps *PrintSettings) Unset(key string) {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_unset(ps.native(), (*C.gchar)(cstr))
+}
+
+type PrintSettingsCallback func(key, value string, userData uintptr)
+
+type printSettingsCallbackData struct {
+ fn PrintSettingsCallback
+ userData uintptr
+}
+
+var (
+ printSettingsCallbackRegistry = struct {
+ sync.RWMutex
+ next int
+ m map[int]printSettingsCallbackData
+ }{
+ next: 1,
+ m: make(map[int]printSettingsCallbackData),
+ }
+)
+
+// Foreach() is a wrapper around gtk_print_settings_foreach().
+func (ps *PrintSettings) ForEach(cb PrintSettingsCallback, userData uintptr) {
+ printSettingsCallbackRegistry.Lock()
+ id := printSettingsCallbackRegistry.next
+ printSettingsCallbackRegistry.next++
+ printSettingsCallbackRegistry.m[id] =
+ printSettingsCallbackData{fn: cb, userData: userData}
+ printSettingsCallbackRegistry.Unlock()
+
+ C._gtk_print_settings_foreach(ps.native(), C.gpointer(uintptr(id)))
+}
+
+// GetBool() is a wrapper around gtk_print_settings_get_bool().
+func (ps *PrintSettings) GetBool(key string) bool {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_print_settings_get_bool(ps.native(), (*C.gchar)(cstr))
+ return gobool(c)
+}
+
+// SetBool() is a wrapper around gtk_print_settings_set_bool().
+func (ps *PrintSettings) SetBool(key string, value bool) {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_bool(ps.native(), (*C.gchar)(cstr), gbool(value))
+}
+
+// GetDouble() is a wrapper around gtk_print_settings_get_double().
+func (ps *PrintSettings) GetDouble(key string) float64 {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_print_settings_get_double(ps.native(), (*C.gchar)(cstr))
+ return float64(c)
+}
+
+// GetDoubleWithDefault() is a wrapper around gtk_print_settings_get_double_with_default().
+func (ps *PrintSettings) GetDoubleWithDefault(key string, def float64) float64 {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_print_settings_get_double_with_default(ps.native(),
+ (*C.gchar)(cstr), C.gdouble(def))
+ return float64(c)
+}
+
+// SetDouble() is a wrapper around gtk_print_settings_set_double().
+func (ps *PrintSettings) SetDouble(key string, value float64) {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_double(ps.native(), (*C.gchar)(cstr), C.gdouble(value))
+}
+
+// GetLength() is a wrapper around gtk_print_settings_get_length().
+func (ps *PrintSettings) GetLength(key string, unit Unit) float64 {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_print_settings_get_length(ps.native(), (*C.gchar)(cstr), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// SetLength() is a wrapper around gtk_print_settings_set_length().
+func (ps *PrintSettings) SetLength(key string, value float64, unit Unit) {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_length(ps.native(), (*C.gchar)(cstr), C.gdouble(value), C.GtkUnit(unit))
+}
+
+// GetInt() is a wrapper around gtk_print_settings_get_int().
+func (ps *PrintSettings) GetInt(key string) int {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_print_settings_get_int(ps.native(), (*C.gchar)(cstr))
+ return int(c)
+}
+
+// GetIntWithDefault() is a wrapper around gtk_print_settings_get_int_with_default().
+func (ps *PrintSettings) GetIntWithDefault(key string, def int) int {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_print_settings_get_int_with_default(ps.native(), (*C.gchar)(cstr), C.gint(def))
+ return int(c)
+}
+
+// SetInt() is a wrapper around gtk_print_settings_set_int().
+func (ps *PrintSettings) SetInt(key string, value int) {
+ cstr := C.CString(key)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_int(ps.native(), (*C.gchar)(cstr), C.gint(value))
+}
+
+// GetPrinter() is a wrapper around gtk_print_settings_get_printer().
+func (ps *PrintSettings) GetPrinter() string {
+ c := C.gtk_print_settings_get_printer(ps.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetPrinter() is a wrapper around gtk_print_settings_set_printer().
+func (ps *PrintSettings) SetPrinter(printer string) {
+ cstr := C.CString(printer)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_printer(ps.native(), (*C.gchar)(cstr))
+}
+
+// GetOrientation() is a wrapper around gtk_print_settings_get_orientation().
+func (ps *PrintSettings) GetOrientation() PageOrientation {
+ c := C.gtk_print_settings_get_orientation(ps.native())
+ return PageOrientation(c)
+}
+
+// SetOrientation() is a wrapper around gtk_print_settings_set_orientation().
+func (ps *PrintSettings) SetOrientation(orientation PageOrientation) {
+ C.gtk_print_settings_set_orientation(ps.native(), C.GtkPageOrientation(orientation))
+}
+
+// GetPaperSize() is a wrapper around gtk_print_settings_get_paper_size().
+func (ps *PrintSettings) GetPaperSize() (*PaperSize, error) {
+ c := C.gtk_print_settings_get_paper_size(ps.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ p := &PaperSize{c}
+ runtime.SetFinalizer(p, (*PaperSize).free)
+ return p, nil
+}
+
+// SetPaperSize() is a wrapper around gtk_print_settings_set_paper_size().
+func (ps *PrintSettings) SetPaperSize(size *PaperSize) {
+ C.gtk_print_settings_set_paper_size(ps.native(), size.native())
+}
+
+// GetPaperWidth() is a wrapper around gtk_print_settings_get_paper_width().
+func (ps *PrintSettings) GetPaperWidth(unit Unit) float64 {
+ c := C.gtk_print_settings_get_paper_width(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// SetPaperWidth() is a wrapper around gtk_print_settings_set_paper_width().
+func (ps *PrintSettings) SetPaperWidth(width float64, unit Unit) {
+ C.gtk_print_settings_set_paper_width(ps.native(), C.gdouble(width), C.GtkUnit(unit))
+}
+
+// GetPaperHeight() is a wrapper around gtk_print_settings_get_paper_height().
+func (ps *PrintSettings) GetPaperHeight(unit Unit) float64 {
+ c := C.gtk_print_settings_get_paper_height(ps.native(), C.GtkUnit(unit))
+ return float64(c)
+}
+
+// SetPaperHeight() is a wrapper around gtk_print_settings_set_paper_height().
+func (ps *PrintSettings) SetPaperHeight(width float64, unit Unit) {
+ C.gtk_print_settings_set_paper_height(ps.native(), C.gdouble(width), C.GtkUnit(unit))
+}
+
+// GetUseColor() is a wrapper around gtk_print_settings_get_use_color().
+func (ps *PrintSettings) GetUseColor() bool {
+ c := C.gtk_print_settings_get_use_color(ps.native())
+ return gobool(c)
+}
+
+// SetUseColor() is a wrapper around gtk_print_settings_set_use_color().
+func (ps *PrintSettings) SetUseColor(color bool) {
+ C.gtk_print_settings_set_use_color(ps.native(), gbool(color))
+}
+
+// GetCollate() is a wrapper around gtk_print_settings_get_collate().
+func (ps *PrintSettings) GetCollate() bool {
+ c := C.gtk_print_settings_get_collate(ps.native())
+ return gobool(c)
+}
+
+// SetCollate() is a wrapper around gtk_print_settings_set_collate().
+func (ps *PrintSettings) SetCollate(collate bool) {
+ C.gtk_print_settings_set_collate(ps.native(), gbool(collate))
+}
+
+// GetReverse() is a wrapper around gtk_print_settings_get_reverse().
+func (ps *PrintSettings) GetReverse() bool {
+ c := C.gtk_print_settings_get_reverse(ps.native())
+ return gobool(c)
+}
+
+// SetReverse() is a wrapper around gtk_print_settings_set_reverse().
+func (ps *PrintSettings) SetReverse(reverse bool) {
+ C.gtk_print_settings_set_reverse(ps.native(), gbool(reverse))
+}
+
+// GetDuplex() is a wrapper around gtk_print_settings_get_duplex().
+func (ps *PrintSettings) GetDuplex() PrintDuplex {
+ c := C.gtk_print_settings_get_duplex(ps.native())
+ return PrintDuplex(c)
+}
+
+// SetDuplex() is a wrapper around gtk_print_settings_set_duplex().
+func (ps *PrintSettings) SetDuplex(duplex PrintDuplex) {
+ C.gtk_print_settings_set_duplex(ps.native(), C.GtkPrintDuplex(duplex))
+}
+
+// GetQuality() is a wrapper around gtk_print_settings_get_quality().
+func (ps *PrintSettings) GetQuality() PrintQuality {
+ c := C.gtk_print_settings_get_quality(ps.native())
+ return PrintQuality(c)
+}
+
+// SetQuality() is a wrapper around gtk_print_settings_set_quality().
+func (ps *PrintSettings) SetQuality(quality PrintQuality) {
+ C.gtk_print_settings_set_quality(ps.native(), C.GtkPrintQuality(quality))
+}
+
+// GetNCopies() is a wrapper around gtk_print_settings_get_n_copies().
+func (ps *PrintSettings) GetNCopies() int {
+ c := C.gtk_print_settings_get_n_copies(ps.native())
+ return int(c)
+}
+
+// SetNCopies() is a wrapper around gtk_print_settings_set_n_copies().
+func (ps *PrintSettings) SetNCopies(copies int) {
+ C.gtk_print_settings_set_n_copies(ps.native(), C.gint(copies))
+}
+
+// GetNmberUp() is a wrapper around gtk_print_settings_get_number_up().
+func (ps *PrintSettings) GetNmberUp() int {
+ c := C.gtk_print_settings_get_number_up(ps.native())
+ return int(c)
+}
+
+// SetNumberUp() is a wrapper around gtk_print_settings_set_number_up().
+func (ps *PrintSettings) SetNumberUp(numberUp int) {
+ C.gtk_print_settings_set_number_up(ps.native(), C.gint(numberUp))
+}
+
+// GetNumberUpLayout() is a wrapper around gtk_print_settings_get_number_up_layout().
+func (ps *PrintSettings) GetNumberUpLayout() NumberUpLayout {
+ c := C.gtk_print_settings_get_number_up_layout(ps.native())
+ return NumberUpLayout(c)
+}
+
+// SetNumberUpLayout() is a wrapper around gtk_print_settings_set_number_up_layout().
+func (ps *PrintSettings) SetNumberUpLayout(numberUpLayout NumberUpLayout) {
+ C.gtk_print_settings_set_number_up_layout(ps.native(), C.GtkNumberUpLayout(numberUpLayout))
+}
+
+// GetResolution() is a wrapper around gtk_print_settings_get_resolution().
+func (ps *PrintSettings) GetResolution() int {
+ c := C.gtk_print_settings_get_resolution(ps.native())
+ return int(c)
+}
+
+// SetResolution() is a wrapper around gtk_print_settings_set_resolution().
+func (ps *PrintSettings) SetResolution(resolution int) {
+ C.gtk_print_settings_set_resolution(ps.native(), C.gint(resolution))
+}
+
+// SetResolutionXY() is a wrapper around gtk_print_settings_set_resolution_xy().
+func (ps *PrintSettings) SetResolutionXY(resolutionX, resolutionY int) {
+ C.gtk_print_settings_set_resolution_xy(ps.native(), C.gint(resolutionX), C.gint(resolutionY))
+}
+
+// GetResolutionX() is a wrapper around gtk_print_settings_get_resolution_x().
+func (ps *PrintSettings) GetResolutionX() int {
+ c := C.gtk_print_settings_get_resolution_x(ps.native())
+ return int(c)
+}
+
+// GetResolutionY() is a wrapper around gtk_print_settings_get_resolution_y().
+func (ps *PrintSettings) GetResolutionY() int {
+ c := C.gtk_print_settings_get_resolution_y(ps.native())
+ return int(c)
+}
+
+// GetPrinterLpi() is a wrapper around gtk_print_settings_get_printer_lpi().
+func (ps *PrintSettings) GetPrinterLpi() float64 {
+ c := C.gtk_print_settings_get_printer_lpi(ps.native())
+ return float64(c)
+}
+
+// SetPrinterLpi() is a wrapper around gtk_print_settings_set_printer_lpi().
+func (ps *PrintSettings) SetPrinterLpi(lpi float64) {
+ C.gtk_print_settings_set_printer_lpi(ps.native(), C.gdouble(lpi))
+}
+
+// GetScale() is a wrapper around gtk_print_settings_get_scale().
+func (ps *PrintSettings) GetScale() float64 {
+ c := C.gtk_print_settings_get_scale(ps.native())
+ return float64(c)
+}
+
+// SetScale() is a wrapper around gtk_print_settings_set_scale().
+func (ps *PrintSettings) SetScale(scale float64) {
+ C.gtk_print_settings_set_scale(ps.native(), C.gdouble(scale))
+}
+
+// GetPrintPages() is a wrapper around gtk_print_settings_get_print_pages().
+func (ps *PrintSettings) GetPrintPages() PrintPages {
+ c := C.gtk_print_settings_get_print_pages(ps.native())
+ return PrintPages(c)
+}
+
+// SetPrintPages() is a wrapper around gtk_print_settings_set_print_pages().
+func (ps *PrintSettings) SetPrintPages(pages PrintPages) {
+ C.gtk_print_settings_set_print_pages(ps.native(), C.GtkPrintPages(pages))
+}
+
+// GetPageSet() is a wrapper around gtk_print_settings_get_page_set().
+func (ps *PrintSettings) GetPageSet(pages PrintPages) PageSet {
+ c := C.gtk_print_settings_get_page_set(ps.native())
+ return PageSet(c)
+}
+
+// SetPageSet() is a wrapper around gtk_print_settings_set_page_set().
+func (ps *PrintSettings) SetPageSet(pageSet PageSet) {
+ C.gtk_print_settings_set_page_set(ps.native(), C.GtkPageSet(pageSet))
+}
+
+// GetDefaultSource() is a wrapper around gtk_print_settings_get_default_source().
+func (ps *PrintSettings) GetDefaultSource() string {
+ c := C.gtk_print_settings_get_default_source(ps.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetSefaultSource() is a wrapper around gtk_print_settings_set_default_source().
+func (ps *PrintSettings) SetSefaultSource(defaultSource string) {
+ cstr := C.CString(defaultSource)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_default_source(ps.native(), (*C.gchar)(cstr))
+}
+
+// GetMediaType() is a wrapper around gtk_print_settings_get_media_type().
+func (ps *PrintSettings) GetMediaType() string {
+ c := C.gtk_print_settings_get_media_type(ps.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetMediaType() is a wrapper around gtk_print_settings_set_media_type().
+func (ps *PrintSettings) SetMediaType(mediaType string) {
+ cstr := C.CString(mediaType)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_media_type(ps.native(), (*C.gchar)(cstr))
+}
+
+// GetDither() is a wrapper around gtk_print_settings_get_dither().
+func (ps *PrintSettings) GetDither() string {
+ c := C.gtk_print_settings_get_dither(ps.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetDither() is a wrapper around gtk_print_settings_set_dither().
+func (ps *PrintSettings) SetDither(dither string) {
+ cstr := C.CString(dither)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_dither(ps.native(), (*C.gchar)(cstr))
+}
+
+// GetFinishings() is a wrapper around gtk_print_settings_get_finishings().
+func (ps *PrintSettings) GetFinishings() string {
+ c := C.gtk_print_settings_get_finishings(ps.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetFinishings() is a wrapper around gtk_print_settings_set_finishings().
+func (ps *PrintSettings) SetFinishings(dither string) {
+ cstr := C.CString(dither)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_finishings(ps.native(), (*C.gchar)(cstr))
+}
+
+// GetOutputBin() is a wrapper around gtk_print_settings_get_output_bin().
+func (ps *PrintSettings) GetOutputBin() string {
+ c := C.gtk_print_settings_get_output_bin(ps.native())
+ return C.GoString((*C.char)(c))
+}
+
+// SetOutputBin() is a wrapper around gtk_print_settings_set_output_bin().
+func (ps *PrintSettings) SetOutputBin(bin string) {
+ cstr := C.CString(bin)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_print_settings_set_output_bin(ps.native(), (*C.gchar)(cstr))
+}
+
+// PrintSettingsNewFromFile() is a wrapper around gtk_print_settings_new_from_file().
+func PrintSettingsNewFromFile(name string) (*PrintSettings, error) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ c := C.gtk_print_settings_new_from_file((*C.gchar)(cstr), &err)
+ if c == nil {
+ defer C.g_error_free(err)
+ return nil, errors.New(C.GoString((*C.char)(err.message)))
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapPrintSettings(obj), nil
+}
+
+// PrintSettingsNewFromKeyFile() is a wrapper around gtk_print_settings_new_from_key_file().
+
+// LoadFile() is a wrapper around gtk_print_settings_load_file().
+func (ps *PrintSettings) LoadFile(name string) error {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ c := C.gtk_print_settings_load_file(ps.native(), (*C.gchar)(cstr), &err)
+ if gobool(c) == false {
+ defer C.g_error_free(err)
+ return errors.New(C.GoString((*C.char)(err.message)))
+ }
+ return nil
+}
+
+// LoadKeyFile() is a wrapper around gtk_print_settings_load_key_file().
+
+// ToFile() is a wrapper around gtk_print_settings_to_file().
+func (ps *PrintSettings) ToFile(name string) error {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ c := C.gtk_print_settings_to_file(ps.native(), (*C.gchar)(cstr), &err)
+ if gobool(c) == false {
+ return errors.New(C.GoString((*C.char)(err.message)))
+ }
+ return nil
+}
+
+// ToKeyFile() is a wrapper around gtk_print_settings_to_key_file().
diff --git a/vendor/github.com/gotk3/gotk3/gtk/print_since_3_16.go b/vendor/github.com/gotk3/gotk3/gtk/print_since_3_16.go
new file mode 100644
index 0000000..486026d
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/print_since_3_16.go
@@ -0,0 +1,34 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12,!gtk_3_14
+
+// See: https://developer.gnome.org/gtk3/3.16/api-index-3-16.html
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "runtime"
+ "unsafe"
+)
+
+// PaperSizeNewFromIpp is a wrapper around gtk_paper_size_new_from_ipp().
+func PaperSizeNewFromIPP(name string, width, height float64) (*PaperSize, error) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+
+ c := C.gtk_paper_size_new_from_ipp((*C.gchar)(cstr), C.gdouble(width), C.gdouble(height))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ t := &PaperSize{c}
+ runtime.SetFinalizer(t, (*PaperSize).free)
+ return t, nil
+}
+
+// IsIPP() is a wrapper around gtk_paper_size_is_ipp().
+func (ps *PaperSize) IsIPP() bool {
+ c := C.gtk_paper_size_is_ipp(ps.native())
+ return gobool(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/print_test.go b/vendor/github.com/gotk3/gotk3/gtk/print_test.go
new file mode 100644
index 0000000..ccd9a2c
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/print_test.go
@@ -0,0 +1,55 @@
+package gtk
+
+import (
+ "testing"
+)
+
+func init() {
+ Init(nil)
+}
+
+// TestPageSetup tests creating and manipulating PageSetup
+func TestPageSetup(t *testing.T) {
+ _, err := PageSetupNew()
+ if err != nil {
+ t.Error(err)
+ }
+}
+
+// TestPaperSize tests creating and manipulating PaperSize
+func TestPaperSize(t *testing.T) {
+ _, err := PaperSizeNew(PAPER_NAME_A4)
+ if err != nil {
+ t.Error(err)
+ }
+}
+
+// TestPrintContext tests creating and manipulating PrintContext
+
+// TestPrintOperation tests creating and manipulating PrintOperation
+func TestPrintOperation(t *testing.T) {
+ _, err := PrintOperationNew()
+ if err != nil {
+ t.Error(err)
+ }
+}
+
+// TestPrintOperationPreview tests creating and manipulating PrintOperationPreview
+
+// TestPrintSettings tests creating and manipulating PrintSettings
+func TestPrintSettings(t *testing.T) {
+ settings, err := PrintSettingsNew()
+ if err != nil {
+ t.Error(err)
+ }
+
+ settings.Set("Key1", "String1")
+ settings.SetBool("Key2", true)
+ settings.Set("Key3", "String2")
+ settings.SetInt("Key4", 2)
+
+ settings.ForEach(func(key, value string, ptr uintptr) {
+ }, 0)
+}
+
+// TestPrintContext tests creating and manipulating PrintContext
diff --git a/vendor/github.com/gotk3/gotk3/gtk/settings.go b/vendor/github.com/gotk3/gotk3/gtk/settings.go
new file mode 100644
index 0000000..7025eda
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/settings.go
@@ -0,0 +1,53 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "settings.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_settings_get_type()), marshalSettings},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkSettings"] = wrapSettings
+}
+
+//GtkSettings
+type Settings struct {
+ *glib.Object
+}
+
+func (v *Settings) native() *C.GtkSettings {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkSettings(p)
+}
+
+func marshalSettings(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ return wrapSettings(glib.Take(unsafe.Pointer(c))), nil
+}
+
+func wrapSettings(obj *glib.Object) *Settings {
+ return &Settings{obj}
+}
+
+//Get the global non window specific settings
+func SettingsGetDefault() (*Settings, error) {
+ c := C.gtk_settings_get_default()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return wrapSettings(glib.Take(unsafe.Pointer(c))), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/settings.go.h b/vendor/github.com/gotk3/gotk3/gtk/settings.go.h
new file mode 100644
index 0000000..571b91a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/settings.go.h
@@ -0,0 +1,5 @@
+static GtkSettings *
+toGtkSettings(void *p)
+{
+ return (GTK_SETTINGS(p));
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/shortcutswindow_since_3_22.go b/vendor/github.com/gotk3/gotk3/gtk/shortcutswindow_since_3_22.go
new file mode 100644
index 0000000..ea98302
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/shortcutswindow_since_3_22.go
@@ -0,0 +1,140 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12,!gtk_3_14,!gtk_3_16,!gtk_3_18,!gtk_3_20
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+// #include "shortcutswindow_since_3_22.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ {glib.Type(C.gtk_shortcuts_window_get_type()), marshalShortcutsWindow},
+ {glib.Type(C.gtk_shortcuts_section_get_type()), marshalShortcutsSection},
+ {glib.Type(C.gtk_shortcuts_group_get_type()), marshalShortcutsGroup},
+ {glib.Type(C.gtk_shortcuts_shortcut_get_type()), marshalShortcutsShortcut},
+ }
+
+ glib.RegisterGValueMarshalers(tm)
+
+ WrapMap["GtkShortcutsWindow"] = wrapShortcutsWindow
+ WrapMap["GtkShortcutsSection"] = wrapShortcutsSection
+ WrapMap["GtkShortcutsGroup"] = wrapShortcutsGroup
+ WrapMap["GtkShortcutsShortcut"] = wrapShortcutsShortcut
+}
+
+/*
+ * GtkShortcutsWindow
+ */
+
+// ShortcutsWindow is a representation of GTK's GtkShortcutsWindow.
+type ShortcutsWindow struct {
+ Window
+}
+
+func (v *ShortcutsWindow) native() *C.GtkShortcutsWindow {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkShortcutsWindow(p)
+}
+
+func marshalShortcutsWindow(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapShortcutsWindow(obj), nil
+}
+
+func wrapShortcutsWindow(obj *glib.Object) *ShortcutsWindow {
+ return &ShortcutsWindow{Window{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}}
+}
+
+/*
+ * GtkShortcutsSection
+ */
+
+// ShortcutsWindow is a representation of GTK's GtkShortcutsSection.
+type ShortcutsSection struct {
+ Box
+}
+
+// native returns a pointer to the underlying GtkShortcutsSection.
+func (v *ShortcutsSection) native() *C.GtkShortcutsSection {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkShortcutsSection(p)
+}
+
+func marshalShortcutsSection(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapShortcutsSection(obj), nil
+}
+
+func wrapShortcutsSection(obj *glib.Object) *ShortcutsSection {
+ return &ShortcutsSection{Box{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+/*
+ * GtkShortcutsSection
+ */
+
+// ShortcutsWindow is a representation of GTK's GtkShortcutsGroup.
+type ShortcutsGroup struct {
+ Box
+}
+
+// native returns a pointer to the underlying GtkShortcutsGroup.
+func (v *ShortcutsGroup) native() *C.GtkShortcutsGroup {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkShortcutsGroup(p)
+}
+
+func marshalShortcutsGroup(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapShortcutsGroup(obj), nil
+}
+
+func wrapShortcutsGroup(obj *glib.Object) *ShortcutsGroup {
+ return &ShortcutsGroup{Box{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+/*
+ * GtkShortcutsShortcut
+ */
+
+// ShortcutsWindow is a representation of GTK's GtkShortcutsShortcut.
+type ShortcutsShortcut struct {
+ Box
+}
+
+// native returns a pointer to the underlying GtkShortcutsShortcut.
+func (v *ShortcutsShortcut) native() *C.GtkShortcutsShortcut {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkShortcutsShortcut(p)
+}
+
+func marshalShortcutsShortcut(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapShortcutsShortcut(obj), nil
+}
+
+func wrapShortcutsShortcut(obj *glib.Object) *ShortcutsShortcut {
+ return &ShortcutsShortcut{Box{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/shortcutswindow_since_3_22.go.h b/vendor/github.com/gotk3/gotk3/gtk/shortcutswindow_since_3_22.go.h
new file mode 100644
index 0000000..9a4a1a8
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/shortcutswindow_since_3_22.go.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+ *
+ * This file originated from: http://opensource.conformal.com/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+static GtkShortcutsWindow *
+toGtkShortcutsWindow(void *p)
+{
+ return (GTK_SHORTCUTS_WINDOW(p));
+}
+
+static GtkShortcutsSection *
+toGtkShortcutsSection(void *p)
+{
+ return (GTK_SHORTCUTS_SECTION(p));
+}
+
+static GtkShortcutsGroup *
+toGtkShortcutsGroup(void *p)
+{
+ return (GTK_SHORTCUTS_GROUP(p));
+}
+
+static GtkShortcutsShortcut *
+toGtkShortcutsShortcut(void *p)
+{
+ return (GTK_SHORTCUTS_SHORTCUT(p));
+} \ No newline at end of file
diff --git a/vendor/github.com/gotk3/gotk3/gtk/stack_since_3_12.go b/vendor/github.com/gotk3/gotk3/gtk/stack_since_3_12.go
new file mode 100644
index 0000000..e65604a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/stack_since_3_12.go
@@ -0,0 +1,34 @@
+// Same copyright and license as the rest of the files in this project
+// This file contains accelerator related functions and structures
+
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+// not use this: go build -tags gtk_3_8'. Otherwise, if no build tags are used, GTK 3.10
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+// #include "gtk_since_3_10.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+// GetChildByName is a wrapper around gtk_stack_get_child_by_name().
+func (v *Stack) GetChildByName(name string) *Widget {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.gtk_stack_get_child_by_name(v.native(), (*C.gchar)(cstr))
+ if c == nil {
+ return nil
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c)))
+}
+
+// GetTransitionRunning is a wrapper around gtk_stack_get_transition_running().
+func (v *Stack) GetTransitionRunning() bool {
+ c := C.gtk_stack_get_transition_running(v.native())
+ return gobool(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/stackswitcher_since_3_10.go b/vendor/github.com/gotk3/gotk3/gtk/stackswitcher_since_3_10.go
new file mode 100644
index 0000000..3bc4b33
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/stackswitcher_since_3_10.go
@@ -0,0 +1,77 @@
+// Same copyright and license as the rest of the files in this project
+// This file contains accelerator related functions and structures
+
+// +build !gtk_3_6,!gtk_3_8
+// not use this: go build -tags gtk_3_8'. Otherwise, if no build tags are used, GTK 3.10
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+// #include "gtk_since_3_10.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ //Contribute to casting
+ for k, v := range map[string]WrapFn{
+ "GtkStackSwitcher": wrapStackSwitcher,
+ } {
+ WrapMap[k] = v
+ }
+}
+
+/*
+ * GtkStackSwitcher
+ */
+
+// StackSwitcher is a representation of GTK's GtkStackSwitcher
+type StackSwitcher struct {
+ Box
+}
+
+// native returns a pointer to the underlying GtkStackSwitcher.
+func (v *StackSwitcher) native() *C.GtkStackSwitcher {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkStackSwitcher(p)
+}
+
+func marshalStackSwitcher(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapStackSwitcher(obj), nil
+}
+
+func wrapStackSwitcher(obj *glib.Object) *StackSwitcher {
+ return &StackSwitcher{Box{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// StackSwitcherNew is a wrapper around gtk_stack_switcher_new().
+func StackSwitcherNew() (*StackSwitcher, error) {
+ c := C.gtk_stack_switcher_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapStackSwitcher(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetStack is a wrapper around gtk_stack_switcher_set_stack().
+func (v *StackSwitcher) SetStack(stack *Stack) {
+ C.gtk_stack_switcher_set_stack(v.native(), stack.native())
+}
+
+// GetStack is a wrapper around gtk_stack_switcher_get_stack().
+func (v *StackSwitcher) GetStack() *Stack {
+ c := C.gtk_stack_switcher_get_stack(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapStack(glib.Take(unsafe.Pointer(c)))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/style.go b/vendor/github.com/gotk3/gotk3/gtk/style.go
new file mode 100644
index 0000000..3babc74
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/style.go
@@ -0,0 +1,232 @@
+// Same copyright and license as the rest of the files in this project
+// This file contains style related functions and structures
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+type StyleProviderPriority int
+
+const (
+ STYLE_PROVIDER_PRIORITY_FALLBACK StyleProviderPriority = C.GTK_STYLE_PROVIDER_PRIORITY_FALLBACK
+ STYLE_PROVIDER_PRIORITY_THEME = C.GTK_STYLE_PROVIDER_PRIORITY_THEME
+ STYLE_PROVIDER_PRIORITY_SETTINGS = C.GTK_STYLE_PROVIDER_PRIORITY_SETTINGS
+ STYLE_PROVIDER_PRIORITY_APPLICATION = C.GTK_STYLE_PROVIDER_PRIORITY_APPLICATION
+ STYLE_PROVIDER_PRIORITY_USER = C.GTK_STYLE_PROVIDER_PRIORITY_USER
+)
+
+/*
+ * GtkStyleContext
+ */
+
+// StyleContext is a representation of GTK's GtkStyleContext.
+type StyleContext struct {
+ *glib.Object
+}
+
+// native returns a pointer to the underlying GtkStyleContext.
+func (v *StyleContext) native() *C.GtkStyleContext {
+ if v == nil || v.Object == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkStyleContext(p)
+}
+
+func wrapStyleContext(obj *glib.Object) *StyleContext {
+ return &StyleContext{obj}
+}
+
+func (v *StyleContext) AddClass(class_name string) {
+ cstr := C.CString(class_name)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_style_context_add_class(v.native(), (*C.gchar)(cstr))
+}
+
+func (v *StyleContext) RemoveClass(class_name string) {
+ cstr := C.CString(class_name)
+ defer C.free(unsafe.Pointer(cstr))
+
+ C.gtk_style_context_remove_class(v.native(), (*C.gchar)(cstr))
+}
+
+func fromNativeStyleContext(c *C.GtkStyleContext) (*StyleContext, error) {
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapStyleContext(obj), nil
+}
+
+// GetStyleContext is a wrapper around gtk_widget_get_style_context().
+func (v *Widget) GetStyleContext() (*StyleContext, error) {
+ return fromNativeStyleContext(C.gtk_widget_get_style_context(v.native()))
+}
+
+// GetParent is a wrapper around gtk_style_context_get_parent().
+func (v *StyleContext) GetParent() (*StyleContext, error) {
+ return fromNativeStyleContext(C.gtk_style_context_get_parent(v.native()))
+}
+
+// GetProperty is a wrapper around gtk_style_context_get_property().
+func (v *StyleContext) GetProperty(property string, state StateFlags) (interface{}, error) {
+ cstr := (*C.gchar)(C.CString(property))
+ defer C.free(unsafe.Pointer(cstr))
+
+ var gval C.GValue
+ C.gtk_style_context_get_property(v.native(), cstr, C.GtkStateFlags(state), &gval)
+ val := glib.ValueFromNative(unsafe.Pointer(&gval))
+ return val.GoValue()
+}
+
+// GetStyleProperty is a wrapper around gtk_style_context_get_style_property().
+func (v *StyleContext) GetStyleProperty(property string) (interface{}, error) {
+ cstr := (*C.gchar)(C.CString(property))
+ defer C.free(unsafe.Pointer(cstr))
+
+ var gval C.GValue
+ C.gtk_style_context_get_style_property(v.native(), cstr, &gval)
+ val := glib.ValueFromNative(unsafe.Pointer(&gval))
+ return val.GoValue()
+}
+
+// GetScreen is a wrapper around gtk_style_context_get_screen().
+func (v *StyleContext) GetScreen() (*gdk.Screen, error) {
+ c := C.gtk_style_context_get_screen(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ d := &gdk.Screen{glib.Take(unsafe.Pointer(c))}
+ return d, nil
+}
+
+// GetState is a wrapper around gtk_style_context_get_state().
+func (v *StyleContext) GetState() StateFlags {
+ return StateFlags(C.gtk_style_context_get_state(v.native()))
+}
+
+// GetColor is a wrapper around gtk_style_context_get_color().
+func (v *StyleContext) GetColor(state StateFlags) *gdk.RGBA {
+ gdkColor := gdk.NewRGBA()
+ C.gtk_style_context_get_color(v.native(), C.GtkStateFlags(state), (*C.GdkRGBA)(unsafe.Pointer(gdkColor.Native())))
+ return gdkColor
+}
+
+// LookupColor is a wrapper around gtk_style_context_lookup_color().
+func (v *StyleContext) LookupColor(colorName string) (*gdk.RGBA, bool) {
+ cstr := (*C.gchar)(C.CString(colorName))
+ defer C.free(unsafe.Pointer(cstr))
+ gdkColor := gdk.NewRGBA()
+ ret := C.gtk_style_context_lookup_color(v.native(), cstr, (*C.GdkRGBA)(unsafe.Pointer(gdkColor.Native())))
+ return gdkColor, gobool(ret)
+}
+
+// StyleContextResetWidgets is a wrapper around gtk_style_context_reset_widgets().
+func StyleContextResetWidgets(v *gdk.Screen) {
+ C.gtk_style_context_reset_widgets((*C.GdkScreen)(unsafe.Pointer(v.Native())))
+}
+
+// Restore is a wrapper around gtk_style_context_restore().
+func (v *StyleContext) Restore() {
+ C.gtk_style_context_restore(v.native())
+}
+
+// Save is a wrapper around gtk_style_context_save().
+func (v *StyleContext) Save() {
+ C.gtk_style_context_save(v.native())
+}
+
+// SetParent is a wrapper around gtk_style_context_set_parent().
+func (v *StyleContext) SetParent(p *StyleContext) {
+ C.gtk_style_context_set_parent(v.native(), p.native())
+}
+
+// HasClass is a wrapper around gtk_style_context_has_class().
+func (v *StyleContext) HasClass(className string) bool {
+ cstr := C.CString(className)
+ defer C.free(unsafe.Pointer(cstr))
+
+ return gobool(C.gtk_style_context_has_class(v.native(), (*C.gchar)(cstr)))
+}
+
+// SetScreen is a wrapper around gtk_style_context_set_screen().
+func (v *StyleContext) SetScreen(s *gdk.Screen) {
+ C.gtk_style_context_set_screen(v.native(), (*C.GdkScreen)(unsafe.Pointer(s.Native())))
+}
+
+// SetState is a wrapper around gtk_style_context_set_state().
+func (v *StyleContext) SetState(state StateFlags) {
+ C.gtk_style_context_set_state(v.native(), C.GtkStateFlags(state))
+}
+
+type IStyleProvider interface {
+ toStyleProvider() *C.GtkStyleProvider
+}
+
+// AddProvider is a wrapper around gtk_style_context_add_provider().
+func (v *StyleContext) AddProvider(provider IStyleProvider, prio uint) {
+ C.gtk_style_context_add_provider(v.native(), provider.toStyleProvider(), C.guint(prio))
+}
+
+// AddProviderForScreen is a wrapper around gtk_style_context_add_provider_for_screen().
+func AddProviderForScreen(s *gdk.Screen, provider IStyleProvider, prio uint) {
+ C.gtk_style_context_add_provider_for_screen((*C.GdkScreen)(unsafe.Pointer(s.Native())), provider.toStyleProvider(), C.guint(prio))
+}
+
+// RemoveProvider is a wrapper around gtk_style_context_remove_provider().
+func (v *StyleContext) RemoveProvider(provider IStyleProvider) {
+ C.gtk_style_context_remove_provider(v.native(), provider.toStyleProvider())
+}
+
+// RemoveProviderForScreen is a wrapper around gtk_style_context_remove_provider_for_screen().
+func RemoveProviderForScreen(s *gdk.Screen, provider IStyleProvider) {
+ C.gtk_style_context_remove_provider_for_screen((*C.GdkScreen)(unsafe.Pointer(s.Native())), provider.toStyleProvider())
+}
+
+// GtkStyleContext * gtk_style_context_new ()
+// void gtk_style_context_get ()
+// GtkTextDirection gtk_style_context_get_direction ()
+// GtkJunctionSides gtk_style_context_get_junction_sides ()
+// const GtkWidgetPath * gtk_style_context_get_path ()
+// GdkFrameClock * gtk_style_context_get_frame_clock ()
+// void gtk_style_context_get_style ()
+// void gtk_style_context_get_style_valist ()
+// void gtk_style_context_get_valist ()
+// GtkCssSection * gtk_style_context_get_section ()
+// void gtk_style_context_get_background_color ()
+// void gtk_style_context_get_border_color ()
+// void gtk_style_context_get_border ()
+// void gtk_style_context_get_padding ()
+// void gtk_style_context_get_margin ()
+// const PangoFontDescription * gtk_style_context_get_font ()
+// void gtk_style_context_invalidate ()
+// gboolean gtk_style_context_state_is_running ()
+// GtkIconSet * gtk_style_context_lookup_icon_set ()
+// void gtk_style_context_cancel_animations ()
+// void gtk_style_context_scroll_animations ()
+// void gtk_style_context_notify_state_change ()
+// void gtk_style_context_pop_animatable_region ()
+// void gtk_style_context_push_animatable_region ()
+// void gtk_style_context_set_background ()
+// void gtk_style_context_set_direction ()
+// void gtk_style_context_set_junction_sides ()
+// void gtk_style_context_set_path ()
+// void gtk_style_context_add_region ()
+// void gtk_style_context_remove_region ()
+// gboolean gtk_style_context_has_region ()
+// GList * gtk_style_context_list_regions ()
+// void gtk_style_context_set_frame_clock ()
+// void gtk_style_context_set_scale ()
+// gint gtk_style_context_get_scale ()
+// GList * gtk_style_context_list_classes ()
diff --git a/vendor/github.com/gotk3/gotk3/gtk/text_child_anchor.go b/vendor/github.com/gotk3/gotk3/gtk/text_child_anchor.go
new file mode 100644
index 0000000..1ba3634
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/text_child_anchor.go
@@ -0,0 +1,19 @@
+// Same copyright and license as the rest of the files in this project
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+
+/*
+ * GtkTextChildAnchor
+ */
+
+// TextChildAnchor is a representation of GTK's GtkTextChildAnchor
+type TextChildAnchor C.GtkTextChildAnchor
+
+// native returns a pointer to the underlying GtkTextChildAnchor.
+func (v *TextChildAnchor) native() *C.GtkTextChildAnchor {
+ return (*C.GtkTextChildAnchor)(v)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/text_iter.go b/vendor/github.com/gotk3/gotk3/gtk/text_iter.go
new file mode 100644
index 0000000..178f339
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/text_iter.go
@@ -0,0 +1,403 @@
+// Same copyright and license as the rest of the files in this project
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkTextIter
+ */
+
+// TextIter is a representation of GTK's GtkTextIter
+type TextIter C.GtkTextIter
+
+// native returns a pointer to the underlying GtkTextIter.
+func (v *TextIter) native() *C.GtkTextIter {
+ if v == nil {
+ return nil
+ }
+ return (*C.GtkTextIter)(v)
+}
+
+func marshalTextIter(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return (*TextIter)(unsafe.Pointer(c)), nil
+}
+
+// GetBuffer is a wrapper around gtk_text_iter_get_buffer().
+func (v *TextIter) GetBuffer() *TextBuffer {
+ c := C.gtk_text_iter_get_buffer(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapTextBuffer(glib.Take(unsafe.Pointer(c)))
+}
+
+// GetOffset is a wrapper around gtk_text_iter_get_offset().
+func (v *TextIter) GetOffset() int {
+ return int(C.gtk_text_iter_get_offset(v.native()))
+}
+
+// GetLine is a wrapper around gtk_text_iter_get_line().
+func (v *TextIter) GetLine() int {
+ return int(C.gtk_text_iter_get_line(v.native()))
+}
+
+// GetLineOffset is a wrapper around gtk_text_iter_get_line_offset().
+func (v *TextIter) GetLineOffset() int {
+ return int(C.gtk_text_iter_get_line_offset(v.native()))
+}
+
+// GetLineIndex is a wrapper around gtk_text_iter_get_line_index().
+func (v *TextIter) GetLineIndex() int {
+ return int(C.gtk_text_iter_get_line_index(v.native()))
+}
+
+// GetVisibleLineOffset is a wrapper around gtk_text_iter_get_visible_line_offset().
+func (v *TextIter) GetVisibleLineOffset() int {
+ return int(C.gtk_text_iter_get_visible_line_offset(v.native()))
+}
+
+// GetVisibleLineIndex is a wrapper around gtk_text_iter_get_visible_line_index().
+func (v *TextIter) GetVisibleLineIndex() int {
+ return int(C.gtk_text_iter_get_visible_line_index(v.native()))
+}
+
+// GetChar is a wrapper around gtk_text_iter_get_char().
+func (v *TextIter) GetChar() rune {
+ return rune(C.gtk_text_iter_get_char(v.native()))
+}
+
+// GetSlice is a wrapper around gtk_text_iter_get_slice().
+func (v *TextIter) GetSlice(end *TextIter) string {
+ c := C.gtk_text_iter_get_slice(v.native(), end.native())
+ return C.GoString((*C.char)(c))
+}
+
+// GetText is a wrapper around gtk_text_iter_get_text().
+func (v *TextIter) GetText(end *TextIter) string {
+ c := C.gtk_text_iter_get_text(v.native(), end.native())
+ return C.GoString((*C.char)(c))
+}
+
+// GetVisibleSlice is a wrapper around gtk_text_iter_get_visible_slice().
+func (v *TextIter) GetVisibleSlice(end *TextIter) string {
+ c := C.gtk_text_iter_get_visible_slice(v.native(), end.native())
+ return C.GoString((*C.char)(c))
+}
+
+// GetVisibleText is a wrapper around gtk_text_iter_get_visible_text().
+func (v *TextIter) GetVisibleText(end *TextIter) string {
+ c := C.gtk_text_iter_get_visible_text(v.native(), end.native())
+ return C.GoString((*C.char)(c))
+}
+
+// EndsTag is a wrapper around gtk_text_iter_ends_tag().
+func (v *TextIter) EndsTag(v1 *TextTag) bool {
+ return gobool(C.gtk_text_iter_ends_tag(v.native(), v1.native()))
+}
+
+// TogglesTag is a wrapper around gtk_text_iter_toggles_tag().
+func (v *TextIter) TogglesTag(v1 *TextTag) bool {
+ return gobool(C.gtk_text_iter_toggles_tag(v.native(), v1.native()))
+}
+
+// HasTag is a wrapper around gtk_text_iter_has_tag().
+func (v *TextIter) HasTag(v1 *TextTag) bool {
+ return gobool(C.gtk_text_iter_has_tag(v.native(), v1.native()))
+}
+
+// Editable is a wrapper around gtk_text_iter_editable().
+func (v *TextIter) Editable(v1 bool) bool {
+ return gobool(C.gtk_text_iter_editable(v.native(), gbool(v1)))
+}
+
+// CanInsert is a wrapper around gtk_text_iter_can_insert().
+func (v *TextIter) CanInsert(v1 bool) bool {
+ return gobool(C.gtk_text_iter_can_insert(v.native(), gbool(v1)))
+}
+
+// StartsWord is a wrapper around gtk_text_iter_starts_word().
+func (v *TextIter) StartsWord() bool {
+ return gobool(C.gtk_text_iter_starts_word(v.native()))
+}
+
+// EndsWord is a wrapper around gtk_text_iter_ends_word().
+func (v *TextIter) EndsWord() bool {
+ return gobool(C.gtk_text_iter_ends_word(v.native()))
+}
+
+// InsideWord is a wrapper around gtk_text_iter_inside_word().
+func (v *TextIter) InsideWord() bool {
+ return gobool(C.gtk_text_iter_inside_word(v.native()))
+}
+
+// StartsLine is a wrapper around gtk_text_iter_starts_line().
+func (v *TextIter) StartsLine() bool {
+ return gobool(C.gtk_text_iter_starts_line(v.native()))
+}
+
+// EndsLine is a wrapper around gtk_text_iter_ends_line().
+func (v *TextIter) EndsLine() bool {
+ return gobool(C.gtk_text_iter_ends_line(v.native()))
+}
+
+// StartsSentence is a wrapper around gtk_text_iter_starts_sentence().
+func (v *TextIter) StartsSentence() bool {
+ return gobool(C.gtk_text_iter_starts_sentence(v.native()))
+}
+
+// EndsSentence is a wrapper around gtk_text_iter_ends_sentence().
+func (v *TextIter) EndsSentence() bool {
+ return gobool(C.gtk_text_iter_ends_sentence(v.native()))
+}
+
+// InsideSentence is a wrapper around gtk_text_iter_inside_sentence().
+func (v *TextIter) InsideSentence() bool {
+ return gobool(C.gtk_text_iter_inside_sentence(v.native()))
+}
+
+// IsCursorPosition is a wrapper around gtk_text_iter_is_cursor_position().
+func (v *TextIter) IsCursorPosition() bool {
+ return gobool(C.gtk_text_iter_is_cursor_position(v.native()))
+}
+
+// GetCharsInLine is a wrapper around gtk_text_iter_get_chars_in_line().
+func (v *TextIter) GetCharsInLine() int {
+ return int(C.gtk_text_iter_get_chars_in_line(v.native()))
+}
+
+// GetBytesInLine is a wrapper around gtk_text_iter_get_bytes_in_line().
+func (v *TextIter) GetBytesInLine() int {
+ return int(C.gtk_text_iter_get_bytes_in_line(v.native()))
+}
+
+// IsEnd is a wrapper around gtk_text_iter_is_end().
+func (v *TextIter) IsEnd() bool {
+ return gobool(C.gtk_text_iter_is_end(v.native()))
+}
+
+// IsStart is a wrapper around gtk_text_iter_is_start().
+func (v *TextIter) IsStart() bool {
+ return gobool(C.gtk_text_iter_is_start(v.native()))
+}
+
+// ForwardChar is a wrapper around gtk_text_iter_forward_char().
+func (v *TextIter) ForwardChar() bool {
+ return gobool(C.gtk_text_iter_forward_char(v.native()))
+}
+
+// BackwardChar is a wrapper around gtk_text_iter_backward_char().
+func (v *TextIter) BackwardChar() bool {
+ return gobool(C.gtk_text_iter_backward_char(v.native()))
+}
+
+// ForwardChars is a wrapper around gtk_text_iter_forward_chars().
+func (v *TextIter) ForwardChars(v1 int) bool {
+ return gobool(C.gtk_text_iter_forward_chars(v.native(), C.gint(v1)))
+}
+
+// BackwardChars is a wrapper around gtk_text_iter_backward_chars().
+func (v *TextIter) BackwardChars(v1 int) bool {
+ return gobool(C.gtk_text_iter_backward_chars(v.native(), C.gint(v1)))
+}
+
+// ForwardLine is a wrapper around gtk_text_iter_forward_line().
+func (v *TextIter) ForwardLine() bool {
+ return gobool(C.gtk_text_iter_forward_line(v.native()))
+}
+
+// BackwardLine is a wrapper around gtk_text_iter_backward_line().
+func (v *TextIter) BackwardLine() bool {
+ return gobool(C.gtk_text_iter_backward_line(v.native()))
+}
+
+// ForwardLines is a wrapper around gtk_text_iter_forward_lines().
+func (v *TextIter) ForwardLines(v1 int) bool {
+ return gobool(C.gtk_text_iter_forward_lines(v.native(), C.gint(v1)))
+}
+
+// BackwardLines is a wrapper around gtk_text_iter_backward_lines().
+func (v *TextIter) BackwardLines(v1 int) bool {
+ return gobool(C.gtk_text_iter_backward_lines(v.native(), C.gint(v1)))
+}
+
+// ForwardWordEnds is a wrapper around gtk_text_iter_forward_word_ends().
+func (v *TextIter) ForwardWordEnds(v1 int) bool {
+ return gobool(C.gtk_text_iter_forward_word_ends(v.native(), C.gint(v1)))
+}
+
+// ForwardWordEnd is a wrapper around gtk_text_iter_forward_word_end().
+func (v *TextIter) ForwardWordEnd() bool {
+ return gobool(C.gtk_text_iter_forward_word_end(v.native()))
+}
+
+// ForwardCursorPosition is a wrapper around gtk_text_iter_forward_cursor_position().
+func (v *TextIter) ForwardCursorPosition() bool {
+ return gobool(C.gtk_text_iter_forward_cursor_position(v.native()))
+}
+
+// BackwardCursorPosition is a wrapper around gtk_text_iter_backward_cursor_position().
+func (v *TextIter) BackwardCursorPosition() bool {
+ return gobool(C.gtk_text_iter_backward_cursor_position(v.native()))
+}
+
+// ForwardCursorPositions is a wrapper around gtk_text_iter_forward_cursor_positions().
+func (v *TextIter) ForwardCursorPositions(v1 int) bool {
+ return gobool(C.gtk_text_iter_forward_cursor_positions(v.native(), C.gint(v1)))
+}
+
+// BackwardCursorPositions is a wrapper around gtk_text_iter_backward_cursor_positions().
+func (v *TextIter) BackwardCursorPositions(v1 int) bool {
+ return gobool(C.gtk_text_iter_backward_cursor_positions(v.native(), C.gint(v1)))
+}
+
+// ForwardSentenceEnds is a wrapper around gtk_text_iter_forward_sentence_ends().
+func (v *TextIter) ForwardSentenceEnds(v1 int) bool {
+ return gobool(C.gtk_text_iter_forward_sentence_ends(v.native(), C.gint(v1)))
+}
+
+// ForwardSentenceEnd is a wrapper around gtk_text_iter_forward_sentence_end().
+func (v *TextIter) ForwardSentenceEnd() bool {
+ return gobool(C.gtk_text_iter_forward_sentence_end(v.native()))
+}
+
+// ForwardVisibleWordEnds is a wrapper around gtk_text_iter_forward_word_ends().
+func (v *TextIter) ForwardVisibleWordEnds(v1 int) bool {
+ return gobool(C.gtk_text_iter_forward_word_ends(v.native(), C.gint(v1)))
+}
+
+// ForwardVisibleWordEnd is a wrapper around gtk_text_iter_forward_visible_word_end().
+func (v *TextIter) ForwardVisibleWordEnd() bool {
+ return gobool(C.gtk_text_iter_forward_visible_word_end(v.native()))
+}
+
+// ForwardVisibleCursorPosition is a wrapper around gtk_text_iter_forward_visible_cursor_position().
+func (v *TextIter) ForwardVisibleCursorPosition() bool {
+ return gobool(C.gtk_text_iter_forward_visible_cursor_position(v.native()))
+}
+
+// BackwardVisibleCursorPosition is a wrapper around gtk_text_iter_backward_visible_cursor_position().
+func (v *TextIter) BackwardVisibleCursorPosition() bool {
+ return gobool(C.gtk_text_iter_backward_visible_cursor_position(v.native()))
+}
+
+// ForwardVisibleCursorPositions is a wrapper around gtk_text_iter_forward_visible_cursor_positions().
+func (v *TextIter) ForwardVisibleCursorPositions(v1 int) bool {
+ return gobool(C.gtk_text_iter_forward_visible_cursor_positions(v.native(), C.gint(v1)))
+}
+
+// BackwardVisibleCursorPositions is a wrapper around gtk_text_iter_backward_visible_cursor_positions().
+func (v *TextIter) BackwardVisibleCursorPositions(v1 int) bool {
+ return gobool(C.gtk_text_iter_backward_visible_cursor_positions(v.native(), C.gint(v1)))
+}
+
+// ForwardVisibleLine is a wrapper around gtk_text_iter_forward_visible_line().
+func (v *TextIter) ForwardVisibleLine() bool {
+ return gobool(C.gtk_text_iter_forward_visible_line(v.native()))
+}
+
+// BackwardVisibleLine is a wrapper around gtk_text_iter_backward_visible_line().
+func (v *TextIter) BackwardVisibleLine() bool {
+ return gobool(C.gtk_text_iter_backward_visible_line(v.native()))
+}
+
+// ForwardVisibleLines is a wrapper around gtk_text_iter_forward_visible_lines().
+func (v *TextIter) ForwardVisibleLines(v1 int) bool {
+ return gobool(C.gtk_text_iter_forward_visible_lines(v.native(), C.gint(v1)))
+}
+
+// BackwardVisibleLines is a wrapper around gtk_text_iter_backward_visible_lines().
+func (v *TextIter) BackwardVisibleLines(v1 int) bool {
+ return gobool(C.gtk_text_iter_backward_visible_lines(v.native(), C.gint(v1)))
+}
+
+// SetOffset is a wrapper around gtk_text_iter_set_offset().
+func (v *TextIter) SetOffset(v1 int) {
+ C.gtk_text_iter_set_offset(v.native(), C.gint(v1))
+}
+
+// SetLine is a wrapper around gtk_text_iter_set_line().
+func (v *TextIter) SetLine(v1 int) {
+ C.gtk_text_iter_set_line(v.native(), C.gint(v1))
+}
+
+// SetLineOffset is a wrapper around gtk_text_iter_set_line_offset().
+func (v *TextIter) SetLineOffset(v1 int) {
+ C.gtk_text_iter_set_line_offset(v.native(), C.gint(v1))
+}
+
+// SetLineIndex is a wrapper around gtk_text_iter_set_line_index().
+func (v *TextIter) SetLineIndex(v1 int) {
+ C.gtk_text_iter_set_line_index(v.native(), C.gint(v1))
+}
+
+// SetVisibleLineOffset is a wrapper around gtk_text_iter_set_visible_line_offset().
+func (v *TextIter) SetVisibleLineOffset(v1 int) {
+ C.gtk_text_iter_set_visible_line_offset(v.native(), C.gint(v1))
+}
+
+// SetVisibleLineIndex is a wrapper around gtk_text_iter_set_visible_line_index().
+func (v *TextIter) SetVisibleLineIndex(v1 int) {
+ C.gtk_text_iter_set_visible_line_index(v.native(), C.gint(v1))
+}
+
+// ForwardToEnd is a wrapper around gtk_text_iter_forward_to_end().
+func (v *TextIter) ForwardToEnd() {
+ C.gtk_text_iter_forward_to_end(v.native())
+}
+
+// ForwardToLineEnd is a wrapper around gtk_text_iter_forward_to_line_end().
+func (v *TextIter) ForwardToLineEnd() bool {
+ return gobool(C.gtk_text_iter_forward_to_line_end(v.native()))
+}
+
+// ForwardToTagToggle is a wrapper around gtk_text_iter_forward_to_tag_toggle().
+func (v *TextIter) ForwardToTagToggle(v1 *TextTag) bool {
+ return gobool(C.gtk_text_iter_forward_to_tag_toggle(v.native(), v1.native()))
+}
+
+// BackwardToTagToggle is a wrapper around gtk_text_iter_backward_to_tag_toggle().
+func (v *TextIter) BackwardToTagToggle(v1 *TextTag) bool {
+ return gobool(C.gtk_text_iter_backward_to_tag_toggle(v.native(), v1.native()))
+}
+
+// Equal is a wrapper around gtk_text_iter_equal().
+func (v *TextIter) Equal(v1 *TextIter) bool {
+ return gobool(C.gtk_text_iter_equal(v.native(), v1.native()))
+}
+
+// Compare is a wrapper around gtk_text_iter_compare().
+func (v *TextIter) Compare(v1 *TextIter) int {
+ return int(C.gtk_text_iter_compare(v.native(), v1.native()))
+}
+
+// InRange is a wrapper around gtk_text_iter_in_range().
+func (v *TextIter) InRange(v1 *TextIter, v2 *TextIter) bool {
+ return gobool(C.gtk_text_iter_in_range(v.native(), v1.native(), v2.native()))
+}
+
+// void gtk_text_iter_order ()
+// gboolean (*GtkTextCharPredicate) ()
+// gboolean gtk_text_iter_forward_find_char ()
+// gboolean gtk_text_iter_backward_find_char ()
+// gboolean gtk_text_iter_forward_search ()
+// gboolean gtk_text_iter_backward_search ()
+// gboolean gtk_text_iter_get_attributes ()
+// GtkTextIter * gtk_text_iter_copy ()
+// void gtk_text_iter_assign ()
+// void gtk_text_iter_free ()
+// GdkPixbuf * gtk_text_iter_get_pixbuf ()
+// GSList * gtk_text_iter_get_marks ()
+// GSList * gtk_text_iter_get_toggled_tags ()
+// GtkTextChildAnchor * gtk_text_iter_get_child_anchor ()
+// GSList * gtk_text_iter_get_tags ()
+// PangoLanguage * gtk_text_iter_get_language ()
diff --git a/vendor/github.com/gotk3/gotk3/gtk/text_mark.go b/vendor/github.com/gotk3/gotk3/gtk/text_mark.go
new file mode 100644
index 0000000..1a41934
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/text_mark.go
@@ -0,0 +1,29 @@
+// Same copyright and license as the rest of the files in this project
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+
+import "unsafe"
+
+/*
+ * GtkTextMark
+ */
+
+// TextMark is a representation of GTK's GtkTextMark
+type TextMark C.GtkTextMark
+
+// native returns a pointer to the underlying GtkTextMark.
+func (v *TextMark) native() *C.GtkTextMark {
+ if v == nil {
+ return nil
+ }
+ return (*C.GtkTextMark)(v)
+}
+
+func marshalTextMark(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ return (*TextMark)(unsafe.Pointer(c)), nil
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/text_view.go b/vendor/github.com/gotk3/gotk3/gtk/text_view.go
new file mode 100644
index 0000000..979c3d7
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/text_view.go
@@ -0,0 +1,423 @@
+// Same copyright and license as the rest of the files in this project
+
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+// TextWindowType is a representation of GTK's GtkTextWindowType.
+type TextWindowType int
+
+const (
+ TEXT_WINDOW_WIDGET TextWindowType = C.GTK_TEXT_WINDOW_WIDGET
+ TEXT_WINDOW_TEXT TextWindowType = C.GTK_TEXT_WINDOW_TEXT
+ TEXT_WINDOW_LEFT TextWindowType = C.GTK_TEXT_WINDOW_LEFT
+ TEXT_WINDOW_RIGHT TextWindowType = C.GTK_TEXT_WINDOW_RIGHT
+ TEXT_WINDOW_TOP TextWindowType = C.GTK_TEXT_WINDOW_TOP
+ TEXT_WINDOW_BOTTOM TextWindowType = C.GTK_TEXT_WINDOW_BOTTOM
+)
+
+/*
+ * GtkTextView
+ */
+
+// TextView is a representation of GTK's GtkTextView
+type TextView struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkTextView.
+func (v *TextView) native() *C.GtkTextView {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTextView(p)
+}
+
+func marshalTextView(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTextView(obj), nil
+}
+
+func wrapTextView(obj *glib.Object) *TextView {
+ return &TextView{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+// TextViewNew is a wrapper around gtk_text_view_new().
+func TextViewNew() (*TextView, error) {
+ c := C.gtk_text_view_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapTextView(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// TextViewNewWithBuffer is a wrapper around gtk_text_view_new_with_buffer().
+func TextViewNewWithBuffer(buf *TextBuffer) (*TextView, error) {
+ cbuf := buf.native()
+ c := C.gtk_text_view_new_with_buffer(cbuf)
+ return wrapTextView(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetBuffer is a wrapper around gtk_text_view_get_buffer().
+func (v *TextView) GetBuffer() (*TextBuffer, error) {
+ c := C.gtk_text_view_get_buffer(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapTextBuffer(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetBuffer is a wrapper around gtk_text_view_set_buffer().
+func (v *TextView) SetBuffer(buffer *TextBuffer) {
+ C.gtk_text_view_set_buffer(v.native(), buffer.native())
+}
+
+// SetEditable is a wrapper around gtk_text_view_set_editable().
+func (v *TextView) SetEditable(editable bool) {
+ C.gtk_text_view_set_editable(v.native(), gbool(editable))
+}
+
+// GetEditable is a wrapper around gtk_text_view_get_editable().
+func (v *TextView) GetEditable() bool {
+ c := C.gtk_text_view_get_editable(v.native())
+ return gobool(c)
+}
+
+// SetWrapMode is a wrapper around gtk_text_view_set_wrap_mode().
+func (v *TextView) SetWrapMode(wrapMode WrapMode) {
+ C.gtk_text_view_set_wrap_mode(v.native(), C.GtkWrapMode(wrapMode))
+}
+
+// GetWrapMode is a wrapper around gtk_text_view_get_wrap_mode().
+func (v *TextView) GetWrapMode() WrapMode {
+ return WrapMode(C.gtk_text_view_get_wrap_mode(v.native()))
+}
+
+// SetCursorVisible is a wrapper around gtk_text_view_set_cursor_visible().
+func (v *TextView) SetCursorVisible(visible bool) {
+ C.gtk_text_view_set_cursor_visible(v.native(), gbool(visible))
+}
+
+// GetCursorVisible is a wrapper around gtk_text_view_get_cursor_visible().
+func (v *TextView) GetCursorVisible() bool {
+ c := C.gtk_text_view_get_cursor_visible(v.native())
+ return gobool(c)
+}
+
+// SetOverwrite is a wrapper around gtk_text_view_set_overwrite().
+func (v *TextView) SetOverwrite(overwrite bool) {
+ C.gtk_text_view_set_overwrite(v.native(), gbool(overwrite))
+}
+
+// GetOverwrite is a wrapper around gtk_text_view_get_overwrite().
+func (v *TextView) GetOverwrite() bool {
+ c := C.gtk_text_view_get_overwrite(v.native())
+ return gobool(c)
+}
+
+// SetJustification is a wrapper around gtk_text_view_set_justification().
+func (v *TextView) SetJustification(justify Justification) {
+ C.gtk_text_view_set_justification(v.native(), C.GtkJustification(justify))
+}
+
+// GetJustification is a wrapper around gtk_text_view_get_justification().
+func (v *TextView) GetJustification() Justification {
+ c := C.gtk_text_view_get_justification(v.native())
+ return Justification(c)
+}
+
+// SetAcceptsTab is a wrapper around gtk_text_view_set_accepts_tab().
+func (v *TextView) SetAcceptsTab(acceptsTab bool) {
+ C.gtk_text_view_set_accepts_tab(v.native(), gbool(acceptsTab))
+}
+
+// GetAcceptsTab is a wrapper around gtk_text_view_get_accepts_tab().
+func (v *TextView) GetAcceptsTab() bool {
+ c := C.gtk_text_view_get_accepts_tab(v.native())
+ return gobool(c)
+}
+
+// SetPixelsAboveLines is a wrapper around gtk_text_view_set_pixels_above_lines().
+func (v *TextView) SetPixelsAboveLines(px int) {
+ C.gtk_text_view_set_pixels_above_lines(v.native(), C.gint(px))
+}
+
+// GetPixelsAboveLines is a wrapper around gtk_text_view_get_pixels_above_lines().
+func (v *TextView) GetPixelsAboveLines() int {
+ c := C.gtk_text_view_get_pixels_above_lines(v.native())
+ return int(c)
+}
+
+// SetPixelsBelowLines is a wrapper around gtk_text_view_set_pixels_below_lines().
+func (v *TextView) SetPixelsBelowLines(px int) {
+ C.gtk_text_view_set_pixels_below_lines(v.native(), C.gint(px))
+}
+
+// GetPixelsBelowLines is a wrapper around gtk_text_view_get_pixels_below_lines().
+func (v *TextView) GetPixelsBelowLines() int {
+ c := C.gtk_text_view_get_pixels_below_lines(v.native())
+ return int(c)
+}
+
+// SetPixelsInsideWrap is a wrapper around gtk_text_view_set_pixels_inside_wrap().
+func (v *TextView) SetPixelsInsideWrap(px int) {
+ C.gtk_text_view_set_pixels_inside_wrap(v.native(), C.gint(px))
+}
+
+// GetPixelsInsideWrap is a wrapper around gtk_text_view_get_pixels_inside_wrap().
+func (v *TextView) GetPixelsInsideWrap() int {
+ c := C.gtk_text_view_get_pixels_inside_wrap(v.native())
+ return int(c)
+}
+
+// SetLeftMargin is a wrapper around gtk_text_view_set_left_margin().
+func (v *TextView) SetLeftMargin(margin int) {
+ C.gtk_text_view_set_left_margin(v.native(), C.gint(margin))
+}
+
+// GetLeftMargin is a wrapper around gtk_text_view_get_left_margin().
+func (v *TextView) GetLeftMargin() int {
+ c := C.gtk_text_view_get_left_margin(v.native())
+ return int(c)
+}
+
+// SetRightMargin is a wrapper around gtk_text_view_set_right_margin().
+func (v *TextView) SetRightMargin(margin int) {
+ C.gtk_text_view_set_right_margin(v.native(), C.gint(margin))
+}
+
+// GetRightMargin is a wrapper around gtk_text_view_get_right_margin().
+func (v *TextView) GetRightMargin() int {
+ c := C.gtk_text_view_get_right_margin(v.native())
+ return int(c)
+}
+
+// SetIndent is a wrapper around gtk_text_view_set_indent().
+func (v *TextView) SetIndent(indent int) {
+ C.gtk_text_view_set_indent(v.native(), C.gint(indent))
+}
+
+// GetIndent is a wrapper around gtk_text_view_get_indent().
+func (v *TextView) GetIndent() int {
+ c := C.gtk_text_view_get_indent(v.native())
+ return int(c)
+}
+
+// SetInputHints is a wrapper around gtk_text_view_set_input_hints().
+func (v *TextView) SetInputHints(hints InputHints) {
+ C.gtk_text_view_set_input_hints(v.native(), C.GtkInputHints(hints))
+}
+
+// GetInputHints is a wrapper around gtk_text_view_get_input_hints().
+func (v *TextView) GetInputHints() InputHints {
+ c := C.gtk_text_view_get_input_hints(v.native())
+ return InputHints(c)
+}
+
+// SetInputPurpose is a wrapper around gtk_text_view_set_input_purpose().
+func (v *TextView) SetInputPurpose(purpose InputPurpose) {
+ C.gtk_text_view_set_input_purpose(v.native(),
+ C.GtkInputPurpose(purpose))
+}
+
+// GetInputPurpose is a wrapper around gtk_text_view_get_input_purpose().
+func (v *TextView) GetInputPurpose() InputPurpose {
+ c := C.gtk_text_view_get_input_purpose(v.native())
+ return InputPurpose(c)
+}
+
+// ScrollToMark is a wrapper around gtk_text_view_scroll_to_mark().
+func (v *TextView) ScrollToMark(mark *TextMark, within_margin float64, use_align bool, xalign, yalign float64) {
+ C.gtk_text_view_scroll_to_mark(v.native(), mark.native(), C.gdouble(within_margin), gbool(use_align), C.gdouble(xalign), C.gdouble(yalign))
+}
+
+// ScrollToIter is a wrapper around gtk_text_view_scroll_to_iter().
+func (v *TextView) ScrollToIter(iter *TextIter, within_margin float64, use_align bool, xalign, yalign float64) bool {
+ return gobool(C.gtk_text_view_scroll_to_iter(v.native(), iter.native(), C.gdouble(within_margin), gbool(use_align), C.gdouble(xalign), C.gdouble(yalign)))
+}
+
+// ScrollMarkOnscreen is a wrapper around gtk_text_view_scroll_mark_onscreen().
+func (v *TextView) ScrollMarkOnscreen(mark *TextMark) {
+ C.gtk_text_view_scroll_mark_onscreen(v.native(), mark.native())
+}
+
+// MoveMarkOnscreen is a wrapper around gtk_text_view_move_mark_onscreen().
+func (v *TextView) MoveMarkOnscreen(mark *TextMark) bool {
+ return gobool(C.gtk_text_view_move_mark_onscreen(v.native(), mark.native()))
+}
+
+// PlaceCursorOnscreen is a wrapper around gtk_text_view_place_cursor_onscreen().
+func (v *TextView) PlaceCursorOnscreen() bool {
+ return gobool(C.gtk_text_view_place_cursor_onscreen(v.native()))
+}
+
+// GetVisibleRect is a wrapper around gtk_text_view_get_visible_rect().
+func (v *TextView) GetVisibleRect() *gdk.Rectangle {
+ var rect C.GdkRectangle
+ C.gtk_text_view_get_visible_rect(v.native(), &rect)
+ return gdk.WrapRectangle(uintptr(unsafe.Pointer(&rect)))
+}
+
+// GetIterLocation is a wrapper around gtk_text_view_get_iter_location().
+func (v *TextView) GetIterLocation(iter *TextIter) *gdk.Rectangle {
+ var rect C.GdkRectangle
+ C.gtk_text_view_get_iter_location(v.native(), iter.native(), &rect)
+ return gdk.WrapRectangle(uintptr(unsafe.Pointer(&rect)))
+}
+
+// GetCursorLocations is a wrapper around gtk_text_view_get_cursor_locations().
+func (v *TextView) GetCursorLocations(iter *TextIter) (strong, weak *gdk.Rectangle) {
+ var strongRect, weakRect C.GdkRectangle
+ C.gtk_text_view_get_cursor_locations(v.native(), iter.native(), &strongRect, &weakRect)
+ return gdk.WrapRectangle(uintptr(unsafe.Pointer(&strongRect))), gdk.WrapRectangle(uintptr(unsafe.Pointer(&weakRect)))
+}
+
+// GetLineAtY is a wrapper around gtk_text_view_get_line_at_y().
+func (v *TextView) GetLineAtY(y int) (*TextIter, int) {
+ var iter TextIter
+ var line_top C.gint
+ iiter := (C.GtkTextIter)(iter)
+ C.gtk_text_view_get_line_at_y(v.native(), &iiter, C.gint(y), &line_top)
+ return &iter, int(line_top)
+}
+
+// GetLineYrange is a wrapper around gtk_text_view_get_line_yrange().
+func (v *TextView) GetLineYrange(iter *TextIter) (y, height int) {
+ var yx, heightx C.gint
+ C.gtk_text_view_get_line_yrange(v.native(), iter.native(), &yx, &heightx)
+ return int(yx), int(heightx)
+}
+
+// GetIterAtLocation is a wrapper around gtk_text_view_get_iter_at_location().
+func (v *TextView) GetIterAtLocation(x, y int) *TextIter {
+ var iter C.GtkTextIter
+ C.gtk_text_view_get_iter_at_location(v.native(), &iter, C.gint(x), C.gint(y))
+ return (*TextIter)(&iter)
+}
+
+// GetIterAtPosition is a wrapper around gtk_text_view_get_iter_at_position().
+func (v *TextView) GetIterAtPosition(x, y int) (*TextIter, int) {
+ var iter C.GtkTextIter
+ var trailing C.gint
+ C.gtk_text_view_get_iter_at_position(v.native(), &iter, &trailing, C.gint(x), C.gint(y))
+ return (*TextIter)(&iter), int(trailing)
+}
+
+// BufferToWindowCoords is a wrapper around gtk_text_view_buffer_to_window_coords().
+func (v *TextView) BufferToWindowCoords(win TextWindowType, buffer_x, buffer_y int) (window_x, window_y int) {
+ var wx, wy C.gint
+ C.gtk_text_view_buffer_to_window_coords(v.native(), C.GtkTextWindowType(win), C.gint(buffer_x), C.gint(buffer_y), &wx, &wy)
+ return int(wx), int(wy)
+}
+
+// WindowToBufferCoords is a wrapper around gtk_text_view_window_to_buffer_coords().
+func (v *TextView) WindowToBufferCoords(win TextWindowType, window_x, window_y int) (buffer_x, buffer_y int) {
+ var bx, by C.gint
+ C.gtk_text_view_window_to_buffer_coords(v.native(), C.GtkTextWindowType(win), C.gint(window_x), C.gint(window_y), &bx, &by)
+ return int(bx), int(by)
+}
+
+// GetWindow is a wrapper around gtk_text_view_get_window().
+func (v *TextView) GetWindow(win TextWindowType) *gdk.Window {
+ c := C.gtk_text_view_get_window(v.native(), C.GtkTextWindowType(win))
+ if c == nil {
+ return nil
+ }
+ return &gdk.Window{glib.Take(unsafe.Pointer(c))}
+}
+
+// GetWindowType is a wrapper around gtk_text_view_get_window_type().
+func (v *TextView) GetWindowType(w *gdk.Window) TextWindowType {
+ return TextWindowType(C.gtk_text_view_get_window_type(v.native(), (*C.GdkWindow)(unsafe.Pointer(w.Native()))))
+}
+
+// SetBorderWindowSize is a wrapper around gtk_text_view_set_border_window_size().
+func (v *TextView) SetBorderWindowSize(tp TextWindowType, size int) {
+ C.gtk_text_view_set_border_window_size(v.native(), C.GtkTextWindowType(tp), C.gint(size))
+}
+
+// GetBorderWindowSize is a wrapper around gtk_text_view_get_border_window_size().
+func (v *TextView) GetBorderWindowSize(tp TextWindowType) int {
+ return int(C.gtk_text_view_get_border_window_size(v.native(), C.GtkTextWindowType(tp)))
+}
+
+// ForwardDisplayLine is a wrapper around gtk_text_view_forward_display_line().
+func (v *TextView) ForwardDisplayLine(iter *TextIter) bool {
+ return gobool(C.gtk_text_view_forward_display_line(v.native(), iter.native()))
+}
+
+// BackwardDisplayLine is a wrapper around gtk_text_view_backward_display_line().
+func (v *TextView) BackwardDisplayLine(iter *TextIter) bool {
+ return gobool(C.gtk_text_view_backward_display_line(v.native(), iter.native()))
+}
+
+// ForwardDisplayLineEnd is a wrapper around gtk_text_view_forward_display_line_end().
+func (v *TextView) ForwardDisplayLineEnd(iter *TextIter) bool {
+ return gobool(C.gtk_text_view_forward_display_line_end(v.native(), iter.native()))
+}
+
+// BackwardDisplayLineStart is a wrapper around gtk_text_view_backward_display_line_start().
+func (v *TextView) BackwardDisplayLineStart(iter *TextIter) bool {
+ return gobool(C.gtk_text_view_backward_display_line_start(v.native(), iter.native()))
+}
+
+// StartsDisplayLine is a wrapper around gtk_text_view_starts_display_line().
+func (v *TextView) StartsDisplayLine(iter *TextIter) bool {
+ return gobool(C.gtk_text_view_starts_display_line(v.native(), iter.native()))
+}
+
+// MoveVisually is a wrapper around gtk_text_view_move_visually().
+func (v *TextView) MoveVisually(iter *TextIter, count int) bool {
+ return gobool(C.gtk_text_view_move_visually(v.native(), iter.native(), C.gint(count)))
+}
+
+// AddChildInWindow is a wrapper around gtk_text_view_add_child_in_window().
+func (v *TextView) AddChildInWindow(child IWidget, tp TextWindowType, xpos, ypos int) {
+ C.gtk_text_view_add_child_in_window(v.native(), child.toWidget(), C.GtkTextWindowType(tp), C.gint(xpos), C.gint(ypos))
+}
+
+// MoveChild is a wrapper around gtk_text_view_move_child().
+func (v *TextView) MoveChild(child IWidget, xpos, ypos int) {
+ C.gtk_text_view_move_child(v.native(), child.toWidget(), C.gint(xpos), C.gint(ypos))
+}
+
+// ImContextFilterKeypress is a wrapper around gtk_text_view_im_context_filter_keypress().
+func (v *TextView) ImContextFilterKeypress(event *gdk.EventKey) bool {
+ return gobool(C.gtk_text_view_im_context_filter_keypress(v.native(), (*C.GdkEventKey)(unsafe.Pointer(event.Native()))))
+}
+
+// ResetImContext is a wrapper around gtk_text_view_reset_im_context().
+func (v *TextView) ResetImContext() {
+ C.gtk_text_view_reset_im_context(v.native())
+}
+
+// AddChildAtAnchor is a wrapper around gtk_text_view_add_child_at_anchor().
+func (v *TextView) AddChildAtAnchor(child IWidget, anchor *TextChildAnchor) {
+ C.gtk_text_view_add_child_at_anchor(v.native(), child.toWidget(), anchor.native())
+}
+
+// GtkAdjustment * gtk_text_view_get_hadjustment () -- DEPRECATED
+// GtkAdjustment * gtk_text_view_get_vadjustment () -- DEPRECATED
+// void gtk_text_view_add_child_at_anchor ()
+// GtkTextChildAnchor * gtk_text_child_anchor_new ()
+// GList * gtk_text_child_anchor_get_widgets ()
+// gboolean gtk_text_child_anchor_get_deleted ()
+// void gtk_text_view_set_top_margin () -- SINCE 3.18
+// gint gtk_text_view_get_top_margin () -- SINCE 3.18
+// void gtk_text_view_set_bottom_margin () -- SINCE 3.18
+// gint gtk_text_view_get_bottom_margin () -- SINCE 3.18
+// void gtk_text_view_set_tabs () -- PangoTabArray
+// PangoTabArray * gtk_text_view_get_tabs () -- PangoTabArray
+// GtkTextAttributes * gtk_text_view_get_default_attributes () -- GtkTextAttributes
+// void gtk_text_view_set_monospace () -- SINCE 3.16
+// gboolean gtk_text_view_get_monospace () -- SINCE 3.16
diff --git a/vendor/github.com/gotk3/gotk3/gtk/tooltip.go b/vendor/github.com/gotk3/gotk3/gtk/tooltip.go
new file mode 100644
index 0000000..c713ea5
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/tooltip.go
@@ -0,0 +1,79 @@
+package gtk
+
+// #include <gtk/gtk.h>
+// #include "gtk.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkTooltip
+ */
+
+type Tooltip struct {
+ Widget
+}
+
+// native returns a pointer to the underlying GtkIconView.
+func (t *Tooltip) native() *C.GtkTooltip {
+ if t == nil || t.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(t.GObject)
+ return C.toGtkTooltip(p)
+}
+
+func marshalTooltip(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTooltip(obj), nil
+}
+
+func wrapTooltip(obj *glib.Object) *Tooltip {
+ return &Tooltip{Widget{glib.InitiallyUnowned{obj}}}
+}
+
+// SetMarkup is a wrapper around gtk_tooltip_set_markup().
+func (t *Tooltip) SetMarkup(str string) {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tooltip_set_markup(t.native(), (*C.gchar)(cstr))
+}
+
+// SetText is a wrapper around gtk_tooltip_set_text().
+func (t *Tooltip) SetText(str string) {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tooltip_set_text(t.native(), (*C.gchar)(cstr))
+}
+
+// SetIcon is a wrapper around gtk_tooltip_set_icon().
+func (t *Tooltip) SetIcon(pixbuf *gdk.Pixbuf) {
+ C.gtk_tooltip_set_icon(t.native(),
+ (*C.GdkPixbuf)(unsafe.Pointer(pixbuf.Native())))
+}
+
+// SetIconFromIconName is a wrapper around gtk_tooltip_set_icon_from_icon_name().
+func (t *Tooltip) SetIconFromIconName(iconName string, size IconSize) {
+ cstr := C.CString(iconName)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tooltip_set_icon_from_icon_name(t.native(),
+ (*C.gchar)(cstr),
+ C.GtkIconSize(size))
+}
+
+// func (t *Tooltip) SetIconFromGIcon() { }
+
+// SetCustom is a wrapper around gtk_tooltip_set_custom().
+func (t *Tooltip) SetCustom(w *Widget) {
+ C.gtk_tooltip_set_custom(t.native(), w.native())
+}
+
+// SetTipArea is a wrapper around gtk_tooltip_set_tip_area().
+func (t *Tooltip) SetTipArea(rect gdk.Rectangle) {
+ C.gtk_tooltip_set_tip_area(t.native(), nativeGdkRectangle(rect))
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/tree_view.go b/vendor/github.com/gotk3/gotk3/gtk/tree_view.go
new file mode 100644
index 0000000..5aec6e1
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/tree_view.go
@@ -0,0 +1,458 @@
+// 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 (
+ "runtime"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkTreeView
+ */
+
+// TreeView is a representation of GTK's GtkTreeView.
+type TreeView struct {
+ Container
+}
+
+// native returns a pointer to the underlying GtkTreeView.
+func (v *TreeView) native() *C.GtkTreeView {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTreeView(p)
+}
+
+func marshalTreeView(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTreeView(obj), nil
+}
+
+func wrapTreeView(obj *glib.Object) *TreeView {
+ return &TreeView{Container{Widget{glib.InitiallyUnowned{obj}}}}
+}
+
+func setupTreeView(c unsafe.Pointer) (*TreeView, error) {
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return wrapTreeView(glib.Take(c)), nil
+}
+
+// TreeViewNew is a wrapper around gtk_tree_view_new().
+func TreeViewNew() (*TreeView, error) {
+ return setupTreeView(unsafe.Pointer(C.gtk_tree_view_new()))
+}
+
+// TreeViewNewWithModel is a wrapper around gtk_tree_view_new_with_model().
+func TreeViewNewWithModel(model ITreeModel) (*TreeView, error) {
+ return setupTreeView(unsafe.Pointer(C.gtk_tree_view_new_with_model(model.toTreeModel())))
+}
+
+// GetModel is a wrapper around gtk_tree_view_get_model().
+func (v *TreeView) GetModel() (*TreeModel, error) {
+ c := C.gtk_tree_view_get_model(v.native())
+ if c == nil {
+ return nil, nil
+ }
+ return wrapTreeModel(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetModel is a wrapper around gtk_tree_view_set_model().
+func (v *TreeView) SetModel(model ITreeModel) {
+ if model == nil {
+ C.gtk_tree_view_set_model(v.native(), nil)
+ } else {
+ C.gtk_tree_view_set_model(v.native(), model.toTreeModel())
+ }
+}
+
+// GetSelection is a wrapper around gtk_tree_view_get_selection().
+func (v *TreeView) GetSelection() (*TreeSelection, error) {
+ c := C.gtk_tree_view_get_selection(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapTreeSelection(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// AppendColumn is a wrapper around gtk_tree_view_append_column().
+func (v *TreeView) AppendColumn(column *TreeViewColumn) int {
+ c := C.gtk_tree_view_append_column(v.native(), column.native())
+ return int(c)
+}
+
+// GetPathAtPos is a wrapper around gtk_tree_view_get_path_at_pos().
+func (v *TreeView) GetPathAtPos(x, y int, path *TreePath, column *TreeViewColumn, cellX, cellY *int) bool {
+ var ctp **C.GtkTreePath
+ if path != nil {
+ ctp = (**C.GtkTreePath)(unsafe.Pointer(&path.GtkTreePath))
+ } else {
+ ctp = nil
+ }
+
+ var pctvcol **C.GtkTreeViewColumn
+ if column != nil {
+ ctvcol := column.native()
+ pctvcol = &ctvcol
+ } else {
+ pctvcol = nil
+ }
+
+ return 0 != C.gtk_tree_view_get_path_at_pos(
+ v.native(),
+ (C.gint)(x),
+ (C.gint)(y),
+ ctp,
+ pctvcol,
+ (*C.gint)(unsafe.Pointer(cellX)),
+ (*C.gint)(unsafe.Pointer(cellY)))
+}
+
+// GetLevelIndentation is a wrapper around gtk_tree_view_get_level_indentation().
+func (v *TreeView) GetLevelIndentation() int {
+ return int(C.gtk_tree_view_get_level_indentation(v.native()))
+}
+
+// GetShowExpanders is a wrapper around gtk_tree_view_get_show_expanders().
+func (v *TreeView) GetShowExpanders() bool {
+ return gobool(C.gtk_tree_view_get_show_expanders(v.native()))
+}
+
+// SetLevelIndentation is a wrapper around gtk_tree_view_set_level_indentation().
+func (v *TreeView) SetLevelIndentation(indent int) {
+ C.gtk_tree_view_set_level_indentation(v.native(), C.gint(indent))
+}
+
+// SetShowExpanders is a wrapper around gtk_tree_view_set_show_expanders().
+func (v *TreeView) SetShowExpanders(show bool) {
+ C.gtk_tree_view_set_show_expanders(v.native(), gbool(show))
+}
+
+// GetHeadersVisible is a wrapper around gtk_tree_view_get_headers_visible().
+func (v *TreeView) GetHeadersVisible() bool {
+ return gobool(C.gtk_tree_view_get_headers_visible(v.native()))
+}
+
+// SetHeadersVisible is a wrapper around gtk_tree_view_set_headers_visible().
+func (v *TreeView) SetHeadersVisible(show bool) {
+ C.gtk_tree_view_set_headers_visible(v.native(), gbool(show))
+}
+
+// ColumnsAutosize is a wrapper around gtk_tree_view_columns_autosize().
+func (v *TreeView) ColumnsAutosize() {
+ C.gtk_tree_view_columns_autosize(v.native())
+}
+
+// GetHeadersClickable is a wrapper around gtk_tree_view_get_headers_clickable().
+func (v *TreeView) GetHeadersClickable() bool {
+ return gobool(C.gtk_tree_view_get_headers_clickable(v.native()))
+}
+
+// SetHeadersClickable is a wrapper around gtk_tree_view_set_headers_clickable().
+func (v *TreeView) SetHeadersClickable(show bool) {
+ C.gtk_tree_view_set_headers_clickable(v.native(), gbool(show))
+}
+
+// GetActivateOnSingleClick is a wrapper around gtk_tree_view_get_activate_on_single_click().
+func (v *TreeView) GetActivateOnSingleClick() bool {
+ return gobool(C.gtk_tree_view_get_activate_on_single_click(v.native()))
+}
+
+// SetActivateOnSingleClick is a wrapper around gtk_tree_view_set_activate_on_single_click().
+func (v *TreeView) SetActivateOnSingleClick(show bool) {
+ C.gtk_tree_view_set_activate_on_single_click(v.native(), gbool(show))
+}
+
+// RemoveColumn is a wrapper around gtk_tree_view_remove_column().
+func (v *TreeView) RemoveColumn(column *TreeViewColumn) int {
+ return int(C.gtk_tree_view_remove_column(v.native(), column.native()))
+}
+
+// InsertColumn is a wrapper around gtk_tree_view_insert_column().
+func (v *TreeView) InsertColumn(column *TreeViewColumn, pos int) int {
+ return int(C.gtk_tree_view_insert_column(v.native(), column.native(), C.gint(pos)))
+}
+
+// GetNColumns is a wrapper around gtk_tree_view_get_n_columns().
+func (v *TreeView) GetNColumns() uint {
+ return uint(C.gtk_tree_view_get_n_columns(v.native()))
+}
+
+// GetColumn is a wrapper around gtk_tree_view_get_column().
+func (v *TreeView) GetColumn(n int) *TreeViewColumn {
+ c := C.gtk_tree_view_get_column(v.native(), C.gint(n))
+ if c == nil {
+ return nil
+ }
+ return wrapTreeViewColumn(glib.Take(unsafe.Pointer(c)))
+}
+
+// MoveColumnAfter is a wrapper around gtk_tree_view_move_column_after().
+func (v *TreeView) MoveColumnAfter(column *TreeViewColumn, baseColumn *TreeViewColumn) {
+ C.gtk_tree_view_move_column_after(v.native(), column.native(), baseColumn.native())
+}
+
+// SetExpanderColumn is a wrapper around gtk_tree_view_set_expander_column().
+func (v *TreeView) SetExpanderColumn(column *TreeViewColumn) {
+ C.gtk_tree_view_set_expander_column(v.native(), column.native())
+}
+
+// GetExpanderColumn is a wrapper around gtk_tree_view_get_expander_column().
+func (v *TreeView) GetExpanderColumn() *TreeViewColumn {
+ c := C.gtk_tree_view_get_expander_column(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapTreeViewColumn(glib.Take(unsafe.Pointer(c)))
+}
+
+// ScrollToPoint is a wrapper around gtk_tree_view_scroll_to_point().
+func (v *TreeView) ScrollToPoint(treeX, treeY int) {
+ C.gtk_tree_view_scroll_to_point(v.native(), C.gint(treeX), C.gint(treeY))
+}
+
+// SetCursor is a wrapper around gtk_tree_view_set_cursor().
+func (v *TreeView) SetCursor(path *TreePath, focusColumn *TreeViewColumn, startEditing bool) {
+ C.gtk_tree_view_set_cursor(v.native(), path.native(), focusColumn.native(), gbool(startEditing))
+}
+
+// SetCursorOnCell is a wrapper around gtk_tree_view_set_cursor_on_cell().
+func (v *TreeView) SetCursorOnCell(path *TreePath, focusColumn *TreeViewColumn, focusCell *CellRenderer, startEditing bool) {
+ C.gtk_tree_view_set_cursor_on_cell(v.native(), path.native(), focusColumn.native(), focusCell.native(), gbool(startEditing))
+}
+
+// GetCursor is a wrapper around gtk_tree_view_get_cursor().
+func (v *TreeView) GetCursor() (p *TreePath, c *TreeViewColumn) {
+ var path *C.GtkTreePath
+ var col *C.GtkTreeViewColumn
+
+ C.gtk_tree_view_get_cursor(v.native(), &path, &col)
+
+ if path != nil {
+ p = &TreePath{path}
+ runtime.SetFinalizer(p, (*TreePath).free)
+ }
+
+ if col != nil {
+ c = wrapTreeViewColumn(glib.Take(unsafe.Pointer(col)))
+ }
+
+ return
+}
+
+// RowActivated is a wrapper around gtk_tree_view_row_activated().
+func (v *TreeView) RowActivated(path *TreePath, column *TreeViewColumn) {
+ C.gtk_tree_view_row_activated(v.native(), path.native(), column.native())
+}
+
+// ExpandAll is a wrapper around gtk_tree_view_expand_all().
+func (v *TreeView) ExpandAll() {
+ C.gtk_tree_view_expand_all(v.native())
+}
+
+// CollapseAll is a wrapper around gtk_tree_view_collapse_all().
+func (v *TreeView) CollapseAll() {
+ C.gtk_tree_view_collapse_all(v.native())
+}
+
+// ExpandToPath is a wrapper around gtk_tree_view_expand_to_path().
+func (v *TreeView) ExpandToPath(path *TreePath) {
+ C.gtk_tree_view_expand_to_path(v.native(), path.native())
+}
+
+// ExpandRow is a wrapper around gtk_tree_view_expand_row().
+func (v *TreeView) ExpandRow(path *TreePath, openAll bool) bool {
+ return gobool(C.gtk_tree_view_expand_row(v.native(), path.native(), gbool(openAll)))
+}
+
+// CollapseRow is a wrapper around gtk_tree_view_collapse_row().
+func (v *TreeView) CollapseRow(path *TreePath) bool {
+ return gobool(C.gtk_tree_view_collapse_row(v.native(), path.native()))
+}
+
+// RowExpanded is a wrapper around gtk_tree_view_row_expanded().
+func (v *TreeView) RowExpanded(path *TreePath) bool {
+ return gobool(C.gtk_tree_view_row_expanded(v.native(), path.native()))
+}
+
+// SetReorderable is a wrapper around gtk_tree_view_set_reorderable().
+func (v *TreeView) SetReorderable(b bool) {
+ C.gtk_tree_view_set_reorderable(v.native(), gbool(b))
+}
+
+// GetReorderable is a wrapper around gtk_tree_view_get_reorderable().
+func (v *TreeView) GetReorderable() bool {
+ return gobool(C.gtk_tree_view_get_reorderable(v.native()))
+}
+
+// GetBinWindow is a wrapper around gtk_tree_view_get_bin_window().
+func (v *TreeView) GetBinWindow() *gdk.Window {
+ c := C.gtk_tree_view_get_bin_window(v.native())
+ if c == nil {
+ return nil
+ }
+
+ w := &gdk.Window{glib.Take(unsafe.Pointer(c))}
+ return w
+}
+
+// SetEnableSearch is a wrapper around gtk_tree_view_set_enable_search().
+func (v *TreeView) SetEnableSearch(b bool) {
+ C.gtk_tree_view_set_enable_search(v.native(), gbool(b))
+}
+
+// GetEnableSearch is a wrapper around gtk_tree_view_get_enable_search().
+func (v *TreeView) GetEnableSearch() bool {
+ return gobool(C.gtk_tree_view_get_enable_search(v.native()))
+}
+
+// SetSearchColumn is a wrapper around gtk_tree_view_set_search_column().
+func (v *TreeView) SetSearchColumn(c int) {
+ C.gtk_tree_view_set_search_column(v.native(), C.gint(c))
+}
+
+// GetSearchColumn is a wrapper around gtk_tree_view_get_search_column().
+func (v *TreeView) GetSearchColumn() int {
+ return int(C.gtk_tree_view_get_search_column(v.native()))
+}
+
+// GetSearchEntry is a wrapper around gtk_tree_view_get_search_entry().
+func (v *TreeView) GetSearchEntry() *Entry {
+ c := C.gtk_tree_view_get_search_entry(v.native())
+ if c == nil {
+ return nil
+ }
+ return wrapEntry(glib.Take(unsafe.Pointer(c)))
+}
+
+// SetSearchEntry is a wrapper around gtk_tree_view_set_search_entry().
+func (v *TreeView) SetSearchEntry(e *Entry) {
+ C.gtk_tree_view_set_search_entry(v.native(), e.native())
+}
+
+// SetSearchEqualSubstringMatch sets TreeView to search by substring match.
+func (v *TreeView) SetSearchEqualSubstringMatch() {
+ C.gtk_tree_view_set_search_equal_func(
+ v.native(),
+ (C.GtkTreeViewSearchEqualFunc)(unsafe.Pointer(C.substring_match_equal_func)),
+ nil,
+ nil)
+}
+
+// SetFixedHeightMode is a wrapper around gtk_tree_view_set_fixed_height_mode().
+func (v *TreeView) SetFixedHeightMode(b bool) {
+ C.gtk_tree_view_set_fixed_height_mode(v.native(), gbool(b))
+}
+
+// GetFixedHeightMode is a wrapper around gtk_tree_view_get_fixed_height_mode().
+func (v *TreeView) GetFixedHeightMode() bool {
+ return gobool(C.gtk_tree_view_get_fixed_height_mode(v.native()))
+}
+
+// SetHoverSelection is a wrapper around gtk_tree_view_set_hover_selection().
+func (v *TreeView) SetHoverSelection(b bool) {
+ C.gtk_tree_view_set_hover_selection(v.native(), gbool(b))
+}
+
+// GetHoverSelection is a wrapper around gtk_tree_view_get_hover_selection().
+func (v *TreeView) GetHoverSelection() bool {
+ return gobool(C.gtk_tree_view_get_hover_selection(v.native()))
+}
+
+// SetHoverExpand is a wrapper around gtk_tree_view_set_hover_expand().
+func (v *TreeView) SetHoverExpand(b bool) {
+ C.gtk_tree_view_set_hover_expand(v.native(), gbool(b))
+}
+
+// GetHoverExpand is a wrapper around gtk_tree_view_get_hover_expand().
+func (v *TreeView) GetHoverExpand() bool {
+ return gobool(C.gtk_tree_view_get_hover_expand(v.native()))
+}
+
+// SetRubberBanding is a wrapper around gtk_tree_view_set_rubber_banding().
+func (v *TreeView) SetRubberBanding(b bool) {
+ C.gtk_tree_view_set_rubber_banding(v.native(), gbool(b))
+}
+
+// GetRubberBanding is a wrapper around gtk_tree_view_get_rubber_banding().
+func (v *TreeView) GetRubberBanding() bool {
+ return gobool(C.gtk_tree_view_get_rubber_banding(v.native()))
+}
+
+// IsRubberBandingActive is a wrapper around gtk_tree_view_is_rubber_banding_active().
+func (v *TreeView) IsRubberBandingActive() bool {
+ return gobool(C.gtk_tree_view_is_rubber_banding_active(v.native()))
+}
+
+// SetEnableTreeLines is a wrapper around gtk_tree_view_set_enable_tree_lines().
+func (v *TreeView) SetEnableTreeLines(b bool) {
+ C.gtk_tree_view_set_enable_tree_lines(v.native(), gbool(b))
+}
+
+// GetEnableTreeLines is a wrapper around gtk_tree_view_get_enable_tree_lines().
+func (v *TreeView) GetEnableTreeLines() bool {
+ return gobool(C.gtk_tree_view_get_enable_tree_lines(v.native()))
+}
+
+// GetTooltipColumn is a wrapper around gtk_tree_view_get_tooltip_column().
+func (v *TreeView) GetTooltipColumn() int {
+ return int(C.gtk_tree_view_get_tooltip_column(v.native()))
+}
+
+// SetTooltipColumn is a wrapper around gtk_tree_view_set_tooltip_column().
+func (v *TreeView) SetTooltipColumn(c int) {
+ C.gtk_tree_view_set_tooltip_column(v.native(), C.gint(c))
+}
+
+// void gtk_tree_view_set_tooltip_row ()
+// void gtk_tree_view_set_tooltip_cell ()
+// gboolean gtk_tree_view_get_tooltip_context ()
+// void gtk_tree_view_set_grid_lines ()
+// GtkTreeViewGridLines gtk_tree_view_get_grid_lines ()
+// void (*GtkTreeDestroyCountFunc) ()
+// void gtk_tree_view_set_destroy_count_func ()
+// gboolean (*GtkTreeViewRowSeparatorFunc) ()
+// GtkTreeViewRowSeparatorFunc gtk_tree_view_get_row_separator_func ()
+// void gtk_tree_view_set_row_separator_func ()
+// void (*GtkTreeViewSearchPositionFunc) ()
+// GtkTreeViewSearchPositionFunc gtk_tree_view_get_search_position_func ()
+// void gtk_tree_view_set_search_position_func ()
+// void gtk_tree_view_set_search_equal_func ()
+// GtkTreeViewSearchEqualFunc gtk_tree_view_get_search_equal_func ()
+// void gtk_tree_view_map_expanded_rows ()
+// GList * gtk_tree_view_get_columns ()
+// gint gtk_tree_view_insert_column_with_attributes ()
+// gint gtk_tree_view_insert_column_with_data_func ()
+// void gtk_tree_view_set_column_drag_function ()
+// void gtk_tree_view_scroll_to_cell ()
+// gboolean gtk_tree_view_is_blank_at_pos ()
+// void gtk_tree_view_get_cell_area ()
+// void gtk_tree_view_get_background_area ()
+// void gtk_tree_view_get_visible_rect ()
+// gboolean gtk_tree_view_get_visible_range ()
+// void gtk_tree_view_convert_bin_window_to_tree_coords ()
+// void gtk_tree_view_convert_bin_window_to_widget_coords ()
+// void gtk_tree_view_convert_tree_to_bin_window_coords ()
+// void gtk_tree_view_convert_tree_to_widget_coords ()
+// void gtk_tree_view_convert_widget_to_bin_window_coords ()
+// void gtk_tree_view_convert_widget_to_tree_coords ()
+// void gtk_tree_view_enable_model_drag_dest ()
+// void gtk_tree_view_enable_model_drag_source ()
+// void gtk_tree_view_unset_rows_drag_source ()
+// void gtk_tree_view_unset_rows_drag_dest ()
+// void gtk_tree_view_set_drag_dest_row ()
+// void gtk_tree_view_get_drag_dest_row ()
+// gboolean gtk_tree_view_get_dest_row_at_pos ()
+// cairo_surface_t * gtk_tree_view_create_row_drag_icon ()
diff --git a/vendor/github.com/gotk3/gotk3/gtk/tree_view_column.go b/vendor/github.com/gotk3/gotk3/gtk/tree_view_column.go
new file mode 100644
index 0000000..34c8b98
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/tree_view_column.go
@@ -0,0 +1,291 @@
+// 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 (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkTreeViewColumn
+ */
+
+// TreeViewColumns is a representation of GTK's GtkTreeViewColumn.
+type TreeViewColumn struct {
+ glib.InitiallyUnowned
+}
+
+// native returns a pointer to the underlying GtkTreeViewColumn.
+func (v *TreeViewColumn) native() *C.GtkTreeViewColumn {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkTreeViewColumn(p)
+}
+
+func marshalTreeViewColumn(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapTreeViewColumn(obj), nil
+}
+
+func wrapTreeViewColumn(obj *glib.Object) *TreeViewColumn {
+ return &TreeViewColumn{glib.InitiallyUnowned{obj}}
+}
+
+// TreeViewColumnNew() is a wrapper around gtk_tree_view_column_new().
+func TreeViewColumnNew() (*TreeViewColumn, error) {
+ c := C.gtk_tree_view_column_new()
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapTreeViewColumn(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// TreeViewColumnNewWithAttribute() is a wrapper around
+// gtk_tree_view_column_new_with_attributes() that only sets one
+// attribute for one column.
+func TreeViewColumnNewWithAttribute(title string, renderer ICellRenderer, attribute string, column int) (*TreeViewColumn, error) {
+ t_cstr := C.CString(title)
+ defer C.free(unsafe.Pointer(t_cstr))
+ a_cstr := C.CString(attribute)
+ defer C.free(unsafe.Pointer(a_cstr))
+ c := C._gtk_tree_view_column_new_with_attributes_one((*C.gchar)(t_cstr),
+ renderer.toCellRenderer(), (*C.gchar)(a_cstr), C.gint(column))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapTreeViewColumn(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// AddAttribute() is a wrapper around gtk_tree_view_column_add_attribute().
+func (v *TreeViewColumn) AddAttribute(renderer ICellRenderer, attribute string, column int) {
+ cstr := C.CString(attribute)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tree_view_column_add_attribute(v.native(),
+ renderer.toCellRenderer(), (*C.gchar)(cstr), C.gint(column))
+}
+
+// SetExpand() is a wrapper around gtk_tree_view_column_set_expand().
+func (v *TreeViewColumn) SetExpand(expand bool) {
+ C.gtk_tree_view_column_set_expand(v.native(), gbool(expand))
+}
+
+// GetExpand() is a wrapper around gtk_tree_view_column_get_expand().
+func (v *TreeViewColumn) GetExpand() bool {
+ c := C.gtk_tree_view_column_get_expand(v.native())
+ return gobool(c)
+}
+
+// SetMinWidth() is a wrapper around gtk_tree_view_column_set_min_width().
+func (v *TreeViewColumn) SetMinWidth(minWidth int) {
+ C.gtk_tree_view_column_set_min_width(v.native(), C.gint(minWidth))
+}
+
+// GetMinWidth() is a wrapper around gtk_tree_view_column_get_min_width().
+func (v *TreeViewColumn) GetMinWidth() int {
+ c := C.gtk_tree_view_column_get_min_width(v.native())
+ return int(c)
+}
+
+// PackStart() is a wrapper around gtk_tree_view_column_pack_start().
+func (v *TreeViewColumn) PackStart(cell ICellRenderer, expand bool) {
+ C.gtk_tree_view_column_pack_start(v.native(), cell.toCellRenderer(), gbool(expand))
+}
+
+// PackEnd() is a wrapper around gtk_tree_view_column_pack_end().
+func (v *TreeViewColumn) PackEnd(cell ICellRenderer, expand bool) {
+ C.gtk_tree_view_column_pack_end(v.native(), cell.toCellRenderer(), gbool(expand))
+}
+
+// Clear() is a wrapper around gtk_tree_view_column_clear().
+func (v *TreeViewColumn) Clear() {
+ C.gtk_tree_view_column_clear(v.native())
+}
+
+// ClearAttributes() is a wrapper around gtk_tree_view_column_clear_attributes().
+func (v *TreeViewColumn) ClearAttributes(cell *CellRenderer) {
+ C.gtk_tree_view_column_clear_attributes(v.native(), cell.native())
+}
+
+// SetSpacing() is a wrapper around gtk_tree_view_column_set_spacing().
+func (v *TreeViewColumn) SetSpacing(spacing int) {
+ C.gtk_tree_view_column_set_spacing(v.native(), C.gint(spacing))
+}
+
+// GetSpacing() is a wrapper around gtk_tree_view_column_get_spacing().
+func (v *TreeViewColumn) GetSpacing() int {
+ return int(C.gtk_tree_view_column_get_spacing(v.native()))
+}
+
+// SetVisible() is a wrapper around gtk_tree_view_column_set_visible().
+func (v *TreeViewColumn) SetVisible(visible bool) {
+ C.gtk_tree_view_column_set_visible(v.native(), gbool(visible))
+}
+
+// GetVisible() is a wrapper around gtk_tree_view_column_get_visible().
+func (v *TreeViewColumn) GetVisible() bool {
+ return gobool(C.gtk_tree_view_column_get_visible(v.native()))
+}
+
+// SetResizable() is a wrapper around gtk_tree_view_column_set_resizable().
+func (v *TreeViewColumn) SetResizable(resizable bool) {
+ C.gtk_tree_view_column_set_resizable(v.native(), gbool(resizable))
+}
+
+// GetResizable() is a wrapper around gtk_tree_view_column_get_resizable().
+func (v *TreeViewColumn) GetResizable() bool {
+ return gobool(C.gtk_tree_view_column_get_resizable(v.native()))
+}
+
+// GetWidth() is a wrapper around gtk_tree_view_column_get_width().
+func (v *TreeViewColumn) GetWidth() int {
+ return int(C.gtk_tree_view_column_get_width(v.native()))
+}
+
+// SetFixedWidth() is a wrapper around gtk_tree_view_column_set_fixed_width().
+func (v *TreeViewColumn) SetFixedWidth(w int) {
+ C.gtk_tree_view_column_set_fixed_width(v.native(), C.gint(w))
+}
+
+// GetFixedWidth() is a wrapper around gtk_tree_view_column_get_fixed_width().
+func (v *TreeViewColumn) GetFixedWidth() int {
+ return int(C.gtk_tree_view_column_get_fixed_width(v.native()))
+}
+
+// SetMaxWidth() is a wrapper around gtk_tree_view_column_set_max_width().
+func (v *TreeViewColumn) SetMaxWidth(w int) {
+ C.gtk_tree_view_column_set_max_width(v.native(), C.gint(w))
+}
+
+// GetMaxWidth() is a wrapper around gtk_tree_view_column_get_max_width().
+func (v *TreeViewColumn) GetMaxWidth() int {
+ return int(C.gtk_tree_view_column_get_max_width(v.native()))
+}
+
+// Clicked() is a wrapper around gtk_tree_view_column_clicked().
+func (v *TreeViewColumn) Clicked() {
+ C.gtk_tree_view_column_clicked(v.native())
+}
+
+// SetTitle() is a wrapper around gtk_tree_view_column_set_title().
+func (v *TreeViewColumn) SetTitle(t string) {
+ cstr := (*C.gchar)(C.CString(t))
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_tree_view_column_set_title(v.native(), cstr)
+}
+
+// GetTitle() is a wrapper around gtk_tree_view_column_get_title().
+func (v *TreeViewColumn) GetTitle() string {
+ return C.GoString((*C.char)(C.gtk_tree_view_column_get_title(v.native())))
+}
+
+// SetClickable() is a wrapper around gtk_tree_view_column_set_clickable().
+func (v *TreeViewColumn) SetClickable(clickable bool) {
+ C.gtk_tree_view_column_set_clickable(v.native(), gbool(clickable))
+}
+
+// GetClickable() is a wrapper around gtk_tree_view_column_get_clickable().
+func (v *TreeViewColumn) GetClickable() bool {
+ return gobool(C.gtk_tree_view_column_get_clickable(v.native()))
+}
+
+// SetReorderable() is a wrapper around gtk_tree_view_column_set_reorderable().
+func (v *TreeViewColumn) SetReorderable(reorderable bool) {
+ C.gtk_tree_view_column_set_reorderable(v.native(), gbool(reorderable))
+}
+
+// GetReorderable() is a wrapper around gtk_tree_view_column_get_reorderable().
+func (v *TreeViewColumn) GetReorderable() bool {
+ return gobool(C.gtk_tree_view_column_get_reorderable(v.native()))
+}
+
+// SetSortIndicator() is a wrapper around gtk_tree_view_column_set_sort_indicator().
+func (v *TreeViewColumn) SetSortIndicator(reorderable bool) {
+ C.gtk_tree_view_column_set_sort_indicator(v.native(), gbool(reorderable))
+}
+
+// GetSortIndicator() is a wrapper around gtk_tree_view_column_get_sort_indicator().
+func (v *TreeViewColumn) GetSortIndicator() bool {
+ return gobool(C.gtk_tree_view_column_get_sort_indicator(v.native()))
+}
+
+// SetSortColumnID() is a wrapper around gtk_tree_view_column_set_sort_column_id().
+func (v *TreeViewColumn) SetSortColumnID(w int) {
+ C.gtk_tree_view_column_set_sort_column_id(v.native(), C.gint(w))
+}
+
+// GetSortColumnID() is a wrapper around gtk_tree_view_column_get_sort_column_id().
+func (v *TreeViewColumn) GetSortColumnID() int {
+ return int(C.gtk_tree_view_column_get_sort_column_id(v.native()))
+}
+
+// CellIsVisible() is a wrapper around gtk_tree_view_column_cell_is_visible().
+func (v *TreeViewColumn) CellIsVisible() bool {
+ return gobool(C.gtk_tree_view_column_cell_is_visible(v.native()))
+}
+
+// FocusCell() is a wrapper around gtk_tree_view_column_focus_cell().
+func (v *TreeViewColumn) FocusCell(cell *CellRenderer) {
+ C.gtk_tree_view_column_focus_cell(v.native(), cell.native())
+}
+
+// QueueResize() is a wrapper around gtk_tree_view_column_queue_resize().
+func (v *TreeViewColumn) QueueResize() {
+ C.gtk_tree_view_column_queue_resize(v.native())
+}
+
+// GetXOffset() is a wrapper around gtk_tree_view_column_get_x_offset().
+func (v *TreeViewColumn) GetXOffset() int {
+ return int(C.gtk_tree_view_column_get_x_offset(v.native()))
+}
+
+// GtkTreeViewColumn * gtk_tree_view_column_new_with_area ()
+// void gtk_tree_view_column_set_attributes ()
+// void gtk_tree_view_column_set_cell_data_func ()
+
+type TreeViewColumnSizing int
+
+const (
+ TREE_VIEW_COLUMN_GROW_ONLY TreeViewColumnSizing = C.GTK_TREE_VIEW_COLUMN_GROW_ONLY
+ TREE_VIEW_COLUMN_AUTOSIZE = C.GTK_TREE_VIEW_COLUMN_AUTOSIZE
+ TREE_VIEW_COLUMN_FIXED = C.GTK_TREE_VIEW_COLUMN_FIXED
+)
+
+// void gtk_tree_view_column_set_sizing ()
+func (v *TreeViewColumn) SetSizing(sizing TreeViewColumnSizing) {
+ C.gtk_tree_view_column_set_sizing(v.native(), C.GtkTreeViewColumnSizing(sizing))
+}
+
+// GtkTreeViewColumnSizing gtk_tree_view_column_get_sizing ()
+func (v *TreeViewColumn) GetSizing() TreeViewColumnSizing {
+ return TreeViewColumnSizing(C.gtk_tree_view_column_get_sizing(v.native()))
+}
+
+// void gtk_tree_view_column_set_widget ()
+// GtkWidget * gtk_tree_view_column_get_widget ()
+// GtkWidget * gtk_tree_view_column_get_button ()
+// void gtk_tree_view_column_set_alignment ()
+// gfloat gtk_tree_view_column_get_alignment ()
+
+// void gtk_tree_view_column_set_sort_order ()
+func (v *TreeViewColumn) SetSortOrder(order SortType) {
+ C.gtk_tree_view_column_set_sort_order(v.native(), C.GtkSortType(order))
+}
+
+// GtkSortType gtk_tree_view_column_get_sort_order ()
+func (v *TreeViewColumn) GetSortOrder() SortType {
+ return SortType(C.gtk_tree_view_column_get_sort_order(v.native()))
+}
+
+// void gtk_tree_view_column_cell_set_cell_data ()
+// void gtk_tree_view_column_cell_get_size ()
+// gboolean gtk_tree_view_column_cell_get_position ()
+// GtkWidget * gtk_tree_view_column_get_tree_view ()
diff --git a/vendor/github.com/gotk3/gotk3/gtk/version.go b/vendor/github.com/gotk3/gotk3/gtk/version.go
new file mode 100644
index 0000000..0c20162
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/version.go
@@ -0,0 +1,29 @@
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+import "errors"
+
+func CheckVersion(major, minor, micro uint) error {
+ errChar := C.gtk_check_version(C.guint(major), C.guint(minor), C.guint(micro))
+ if errChar == nil {
+ return nil
+ }
+
+ return errors.New(C.GoString((*C.char)(errChar)))
+}
+
+func GetMajorVersion() uint {
+ v := C.gtk_get_major_version()
+ return uint(v)
+}
+
+func GetMinorVersion() uint {
+ v := C.gtk_get_minor_version()
+ return uint(v)
+}
+
+func GetMicroVersion() uint {
+ v := C.gtk_get_micro_version()
+ return uint(v)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/version_test.go b/vendor/github.com/gotk3/gotk3/gtk/version_test.go
new file mode 100644
index 0000000..d68387c
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/version_test.go
@@ -0,0 +1,20 @@
+package gtk
+
+import "testing"
+
+func TestCheckVersion(t *testing.T) {
+ err := CheckVersion(GetMajorVersion(), GetMinorVersion(), GetMicroVersion())
+ if err != nil {
+ t.Error(err)
+ }
+
+ err = CheckVersion(GetMajorVersion(), GetMinorVersion(), GetMicroVersion()-1)
+ if err != nil {
+ t.Error(err)
+ }
+
+ err = CheckVersion(GetMajorVersion(), GetMinorVersion(), GetMicroVersion()+1)
+ if err == nil {
+ t.Error("Expected to fail when an more recent version is expected")
+ }
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/widget.go b/vendor/github.com/gotk3/gotk3/gtk/widget.go
new file mode 100644
index 0000000..135886a
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/widget.go
@@ -0,0 +1,637 @@
+// 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"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkWidget
+ */
+
+// 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
+ 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()
+}
+
+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 {
+ return &Widget{glib.InitiallyUnowned{obj}}
+}
+
+// Destroy is a wrapper around gtk_widget_destroy().
+func (v *Widget) Destroy() {
+ C.gtk_widget_destroy(v.native())
+}
+
+func (v *Widget) HideOnDelete() {
+ C._gtk_widget_hide_on_delete(v.native())
+}
+
+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))
+}
+
+// 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
+/*
+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))
+}
+
+// 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)
+}
+
+// SetMapped is a wrapper around gtk_widget_set_mapped().
+func (v *Widget) SetMapped(mapped bool) {
+ C.gtk_widget_set_can_focus(v.native(), gbool(mapped))
+}
+
+// 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())
+}
+
+// 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))
+}
+
+//void gtk_widget_realize(GtkWidget *widget);
+//void gtk_widget_unrealize(GtkWidget *widget);
+//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);
+//GdkFrameClock *gtk_widget_get_frame_clock(GtkWidget *widget);
+//guint gtk_widget_add_tick_callback (GtkWidget *widget,
+// GtkTickCallback callback,
+// gpointer user_data,
+// GDestroyNotify notify);
+//void gtk_widget_remove_tick_callback(GtkWidget *widget, guint id);
+
+// TODO(jrick) GtkAllocation
+/*
+func (v *Widget) SizeAllocate() {
+}
+*/
+
+// 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()))
+}
+
+// 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()))
+}
+
+// TODO(jrick) GdkRectangle
+/*
+func (v *Widget) Intersect() {
+}
+*/
+
+// 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() (*Widget, error) {
+ c := C.gtk_widget_get_parent(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// 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))
+}
+
+// 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)
+}
+
+// TODO(jrick) GdkEventMask
+/*
+func (v *Widget) SetDeviceEvents() {
+}
+*/
+
+// TODO(jrick) GdkEventMask
+/*
+func (v *Widget) GetDeviceEvents() {
+}
+*/
+
+// TODO(jrick) GdkEventMask
+/*
+func (v *Widget) AddDeviceEvents() {
+}
+*/
+
+// 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() (*Widget, error) {
+ c := C.gtk_widget_get_toplevel(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// 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))
+}
+
+// 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))
+}
+
+// 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))
+}
+
+// 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())
+}
+
+// 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))
+}
+
+// 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
+}
+
+// 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)
+}
+
+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())))
+}
+
+// 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
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/widget_since_3_12.go b/vendor/github.com/gotk3/gotk3/gtk/widget_since_3_12.go
new file mode 100644
index 0000000..7d494d1
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/widget_since_3_12.go
@@ -0,0 +1,45 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrapers for symbols included since GTK 3.12, and
+// and should not be included in a build intended to target any older GTK
+// versions. To target an older build, such as 3.10, use
+// 'go build -tags gtk_3_10'. Otherwise, if no build tags are used, GTK 3.12
+// is assumed and this file is built.
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+
+func (v *Widget) SetMarginStart(margin int) {
+ C.gtk_widget_set_margin_start(v.native(), C.gint(margin))
+}
+
+func (v *Widget) GetMarginStart() int {
+ c := C.gtk_widget_get_margin_start(v.native())
+ return int(c)
+}
+
+func (v *Widget) SetMarginEnd(margin int) {
+ C.gtk_widget_set_margin_end(v.native(), C.gint(margin))
+}
+
+func (v *Widget) GetMarginEnd() int {
+ c := C.gtk_widget_get_margin_end(v.native())
+ return int(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/widget_since_3_14.go b/vendor/github.com/gotk3/gotk3/gtk/widget_since_3_14.go
new file mode 100644
index 0000000..c777127
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/widget_since_3_14.go
@@ -0,0 +1,20 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10,!gtk_3_12
+
+// See: https://developer.gnome.org/gtk3/3.14/api-index-3-14.html
+
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+
+// GetClip is a wrapper around gtk_widget_get_clip().
+func (v *Widget) GetClip() *Allocation {
+ var clip Allocation
+ C.gtk_widget_get_clip(v.native(), clip.native())
+ return &clip
+}
+
+// SetClip is a wrapper around gtk_widget_set_clip().
+func (v *Widget) SetClip(clip *Allocation) {
+ C.gtk_widget_set_clip(v.native(), clip.native())
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/widget_since_3_8.go b/vendor/github.com/gotk3/gotk3/gtk/widget_since_3_8.go
new file mode 100644
index 0000000..0f90561
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/widget_since_3_8.go
@@ -0,0 +1,48 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// This file includes wrapers for symbols included since GTK 3.8, and
+// and should not be included in a build intended to target any older GTK
+// versions. To target an older build, such as 3.8, use
+// 'go build -tags gtk_3_8'. Otherwise, if no build tags are used, GTK 3.18
+// is assumed and this file is built.
+// +build !gtk_3_6
+
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+
+/*
+ * GtkWidget
+ */
+
+// IsVisible is a wrapper around gtk_widget_is_visible().
+func (v *Widget) IsVisible() bool {
+ c := C.gtk_widget_is_visible(v.native())
+ return gobool(c)
+}
+
+// SetOpacity is a wrapper around gtk_widget_set_opacity()
+func (v *Widget) SetOpacity(opacity float64) {
+ C.gtk_widget_set_opacity(v.native(), C.double(opacity))
+}
+
+// GetOpacity is a wrapper around gtk_widget_get_opacity()
+func (v *Widget) GetOpacity() float64 {
+ c := C.gtk_widget_get_opacity(v.native())
+ return float64(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/window.go b/vendor/github.com/gotk3/gotk3/gtk/window.go
new file mode 100644
index 0000000..9b49e93
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/window.go
@@ -0,0 +1,614 @@
+// 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"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+)
+
+/*
+ * GtkWindow
+ */
+
+// Window is a representation of GTK's GtkWindow.
+type Window struct {
+ Bin
+}
+
+// IWindow is an interface type implemented by all structs embedding a
+// Window. It is meant to be used as an argument type for wrapper
+// functions that wrap around a C GTK function taking a GtkWindow.
+type IWindow interface {
+ toWindow() *C.GtkWindow
+}
+
+// native returns a pointer to the underlying GtkWindow.
+func (v *Window) native() *C.GtkWindow {
+ if v == nil || v.GObject == nil {
+ return nil
+ }
+ p := unsafe.Pointer(v.GObject)
+ return C.toGtkWindow(p)
+}
+
+func (v *Window) toWindow() *C.GtkWindow {
+ if v == nil {
+ return nil
+ }
+ return v.native()
+}
+
+func marshalWindow(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapWindow(obj), nil
+}
+
+func wrapWindow(obj *glib.Object) *Window {
+ return &Window{Bin{Container{Widget{glib.InitiallyUnowned{obj}}}}}
+}
+
+// WindowNew is a wrapper around gtk_window_new().
+func WindowNew(t WindowType) (*Window, error) {
+ c := C.gtk_window_new(C.GtkWindowType(t))
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWindow(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetTitle is a wrapper around gtk_window_set_title().
+func (v *Window) SetTitle(title string) {
+ cstr := C.CString(title)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_window_set_title(v.native(), (*C.gchar)(cstr))
+}
+
+// SetResizable is a wrapper around gtk_window_set_resizable().
+func (v *Window) SetResizable(resizable bool) {
+ C.gtk_window_set_resizable(v.native(), gbool(resizable))
+}
+
+// GetResizable is a wrapper around gtk_window_get_resizable().
+func (v *Window) GetResizable() bool {
+ c := C.gtk_window_get_resizable(v.native())
+ return gobool(c)
+}
+
+// ActivateFocus is a wrapper around gtk_window_activate_focus().
+func (v *Window) ActivateFocus() bool {
+ c := C.gtk_window_activate_focus(v.native())
+ return gobool(c)
+}
+
+// ActivateDefault is a wrapper around gtk_window_activate_default().
+func (v *Window) ActivateDefault() bool {
+ c := C.gtk_window_activate_default(v.native())
+ return gobool(c)
+}
+
+// SetModal is a wrapper around gtk_window_set_modal().
+func (v *Window) SetModal(modal bool) {
+ C.gtk_window_set_modal(v.native(), gbool(modal))
+}
+
+// SetDefaultSize is a wrapper around gtk_window_set_default_size().
+func (v *Window) SetDefaultSize(width, height int) {
+ C.gtk_window_set_default_size(v.native(), C.gint(width), C.gint(height))
+}
+
+// SetIcon is a wrapper around gtk_window_set_icon().
+func (v *Window) SetIcon(icon *gdk.Pixbuf) {
+ iconPtr := (*C.GdkPixbuf)(unsafe.Pointer(icon.Native()))
+ C.gtk_window_set_icon(v.native(), iconPtr)
+}
+
+// WindowSetDefaultIcon is a wrapper around gtk_window_set_default_icon().
+func WindowSetDefaultIcon(icon *gdk.Pixbuf) {
+ iconPtr := (*C.GdkPixbuf)(unsafe.Pointer(icon.Native()))
+ C.gtk_window_set_default_icon(iconPtr)
+}
+
+// TODO(jrick) GdkGeometry GdkWindowHints.
+/*
+func (v *Window) SetGeometryHints() {
+}
+*/
+
+// SetGravity is a wrapper around gtk_window_set_gravity().
+func (v *Window) SetGravity(gravity gdk.GdkGravity) {
+ C.gtk_window_set_gravity(v.native(), C.GdkGravity(gravity))
+}
+
+// TODO(jrick) GdkGravity.
+/*
+func (v *Window) GetGravity() {
+}
+*/
+
+// SetPosition is a wrapper around gtk_window_set_position().
+func (v *Window) SetPosition(position WindowPosition) {
+ C.gtk_window_set_position(v.native(), C.GtkWindowPosition(position))
+}
+
+// SetTransientFor is a wrapper around gtk_window_set_transient_for().
+func (v *Window) SetTransientFor(parent IWindow) {
+ var pw *C.GtkWindow = nil
+ if parent != nil {
+ pw = parent.toWindow()
+ }
+ C.gtk_window_set_transient_for(v.native(), pw)
+}
+
+// SetDestroyWithParent is a wrapper around
+// gtk_window_set_destroy_with_parent().
+func (v *Window) SetDestroyWithParent(setting bool) {
+ C.gtk_window_set_destroy_with_parent(v.native(), gbool(setting))
+}
+
+// SetHideTitlebarWhenMaximized is a wrapper around
+// gtk_window_set_hide_titlebar_when_maximized().
+func (v *Window) SetHideTitlebarWhenMaximized(setting bool) {
+ C.gtk_window_set_hide_titlebar_when_maximized(v.native(),
+ gbool(setting))
+}
+
+// IsActive is a wrapper around gtk_window_is_active().
+func (v *Window) IsActive() bool {
+ c := C.gtk_window_is_active(v.native())
+ return gobool(c)
+}
+
+// HasToplevelFocus is a wrapper around gtk_window_has_toplevel_focus().
+func (v *Window) HasToplevelFocus() bool {
+ c := C.gtk_window_has_toplevel_focus(v.native())
+ return gobool(c)
+}
+
+// GetFocus is a wrapper around gtk_window_get_focus().
+func (v *Window) GetFocus() (*Widget, error) {
+ c := C.gtk_window_get_focus(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetFocus is a wrapper around gtk_window_set_focus().
+func (v *Window) SetFocus(w *Widget) {
+ C.gtk_window_set_focus(v.native(), w.native())
+}
+
+// GetDefaultWidget is a wrapper around gtk_window_get_default_widget().
+func (v *Window) GetDefaultWidget() *Widget {
+ c := C.gtk_window_get_default_widget(v.native())
+ if c == nil {
+ return nil
+ }
+ obj := glib.Take(unsafe.Pointer(c))
+ return wrapWidget(obj)
+}
+
+// SetDefault is a wrapper around gtk_window_set_default().
+func (v *Window) SetDefault(widget IWidget) {
+ C.gtk_window_set_default(v.native(), widget.toWidget())
+}
+
+// Present is a wrapper around gtk_window_present().
+func (v *Window) Present() {
+ C.gtk_window_present(v.native())
+}
+
+// PresentWithTime is a wrapper around gtk_window_present_with_time().
+func (v *Window) PresentWithTime(ts uint32) {
+ C.gtk_window_present_with_time(v.native(), C.guint32(ts))
+}
+
+// Iconify is a wrapper around gtk_window_iconify().
+func (v *Window) Iconify() {
+ C.gtk_window_iconify(v.native())
+}
+
+// Deiconify is a wrapper around gtk_window_deiconify().
+func (v *Window) Deiconify() {
+ C.gtk_window_deiconify(v.native())
+}
+
+// Stick is a wrapper around gtk_window_stick().
+func (v *Window) Stick() {
+ C.gtk_window_stick(v.native())
+}
+
+// Unstick is a wrapper around gtk_window_unstick().
+func (v *Window) Unstick() {
+ C.gtk_window_unstick(v.native())
+}
+
+// Maximize is a wrapper around gtk_window_maximize().
+func (v *Window) Maximize() {
+ C.gtk_window_maximize(v.native())
+}
+
+// Unmaximize is a wrapper around gtk_window_unmaximize().
+func (v *Window) Unmaximize() {
+ C.gtk_window_unmaximize(v.native())
+}
+
+// Fullscreen is a wrapper around gtk_window_fullscreen().
+func (v *Window) Fullscreen() {
+ C.gtk_window_fullscreen(v.native())
+}
+
+// Unfullscreen is a wrapper around gtk_window_unfullscreen().
+func (v *Window) Unfullscreen() {
+ C.gtk_window_unfullscreen(v.native())
+}
+
+// SetKeepAbove is a wrapper around gtk_window_set_keep_above().
+func (v *Window) SetKeepAbove(setting bool) {
+ C.gtk_window_set_keep_above(v.native(), gbool(setting))
+}
+
+// SetKeepBelow is a wrapper around gtk_window_set_keep_below().
+func (v *Window) SetKeepBelow(setting bool) {
+ C.gtk_window_set_keep_below(v.native(), gbool(setting))
+}
+
+// SetDecorated is a wrapper around gtk_window_set_decorated().
+func (v *Window) SetDecorated(setting bool) {
+ C.gtk_window_set_decorated(v.native(), gbool(setting))
+}
+
+// SetDeletable is a wrapper around gtk_window_set_deletable().
+func (v *Window) SetDeletable(setting bool) {
+ C.gtk_window_set_deletable(v.native(), gbool(setting))
+}
+
+// SetTypeHint is a wrapper around gtk_window_set_type_hint().
+func (v *Window) SetTypeHint(typeHint gdk.WindowTypeHint) {
+ C.gtk_window_set_type_hint(v.native(), C.GdkWindowTypeHint(typeHint))
+}
+
+// SetSkipTaskbarHint is a wrapper around gtk_window_set_skip_taskbar_hint().
+func (v *Window) SetSkipTaskbarHint(setting bool) {
+ C.gtk_window_set_skip_taskbar_hint(v.native(), gbool(setting))
+}
+
+// SetSkipPagerHint is a wrapper around gtk_window_set_skip_pager_hint().
+func (v *Window) SetSkipPagerHint(setting bool) {
+ C.gtk_window_set_skip_pager_hint(v.native(), gbool(setting))
+}
+
+// SetUrgencyHint is a wrapper around gtk_window_set_urgency_hint().
+func (v *Window) SetUrgencyHint(setting bool) {
+ C.gtk_window_set_urgency_hint(v.native(), gbool(setting))
+}
+
+// SetAcceptFocus is a wrapper around gtk_window_set_accept_focus().
+func (v *Window) SetAcceptFocus(setting bool) {
+ C.gtk_window_set_accept_focus(v.native(), gbool(setting))
+}
+
+// SetFocusOnMap is a wrapper around gtk_window_set_focus_on_map().
+func (v *Window) SetFocusOnMap(setting bool) {
+ C.gtk_window_set_focus_on_map(v.native(), gbool(setting))
+}
+
+// SetStartupID is a wrapper around gtk_window_set_startup_id().
+func (v *Window) SetStartupID(sid string) {
+ cstr := (*C.gchar)(C.CString(sid))
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_window_set_startup_id(v.native(), cstr)
+}
+
+// SetRole is a wrapper around gtk_window_set_role().
+func (v *Window) SetRole(s string) {
+ cstr := (*C.gchar)(C.CString(s))
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_window_set_role(v.native(), cstr)
+}
+
+// GetDecorated is a wrapper around gtk_window_get_decorated().
+func (v *Window) GetDecorated() bool {
+ c := C.gtk_window_get_decorated(v.native())
+ return gobool(c)
+}
+
+// GetDeletable is a wrapper around gtk_window_get_deletable().
+func (v *Window) GetDeletable() bool {
+ c := C.gtk_window_get_deletable(v.native())
+ return gobool(c)
+}
+
+// WindowGetDefaultIconName is a wrapper around gtk_window_get_default_icon_name().
+func WindowGetDefaultIconName() (string, error) {
+ return stringReturn(C.gtk_window_get_default_icon_name())
+}
+
+// GetDefaultSize is a wrapper around gtk_window_get_default_size().
+func (v *Window) GetDefaultSize() (width, height int) {
+ var w, h C.gint
+ C.gtk_window_get_default_size(v.native(), &w, &h)
+ return int(w), int(h)
+}
+
+// GetDestroyWithParent is a wrapper around
+// gtk_window_get_destroy_with_parent().
+func (v *Window) GetDestroyWithParent() bool {
+ c := C.gtk_window_get_destroy_with_parent(v.native())
+ return gobool(c)
+}
+
+// GetHideTitlebarWhenMaximized is a wrapper around
+// gtk_window_get_hide_titlebar_when_maximized().
+func (v *Window) GetHideTitlebarWhenMaximized() bool {
+ c := C.gtk_window_get_hide_titlebar_when_maximized(v.native())
+ return gobool(c)
+}
+
+// GetIcon is a wrapper around gtk_window_get_icon().
+func (v *Window) GetIcon() (*gdk.Pixbuf, error) {
+ c := C.gtk_window_get_icon(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ p := &gdk.Pixbuf{glib.Take(unsafe.Pointer(c))}
+ return p, nil
+}
+
+// GetIconName is a wrapper around gtk_window_get_icon_name().
+func (v *Window) GetIconName() (string, error) {
+ return stringReturn(C.gtk_window_get_icon_name(v.native()))
+}
+
+// GetModal is a wrapper around gtk_window_get_modal().
+func (v *Window) GetModal() bool {
+ c := C.gtk_window_get_modal(v.native())
+ return gobool(c)
+}
+
+// GetPosition is a wrapper around gtk_window_get_position().
+func (v *Window) GetPosition() (root_x, root_y int) {
+ var x, y C.gint
+ C.gtk_window_get_position(v.native(), &x, &y)
+ return int(x), int(y)
+}
+
+func stringReturn(c *C.gchar) (string, error) {
+ if c == nil {
+ return "", nilPtrErr
+ }
+ return C.GoString((*C.char)(c)), nil
+}
+
+// GetRole is a wrapper around gtk_window_get_role().
+func (v *Window) GetRole() (string, error) {
+ return stringReturn(C.gtk_window_get_role(v.native()))
+}
+
+// GetSize is a wrapper around gtk_window_get_size().
+func (v *Window) GetSize() (width, height int) {
+ var w, h C.gint
+ C.gtk_window_get_size(v.native(), &w, &h)
+ return int(w), int(h)
+}
+
+// GetTitle is a wrapper around gtk_window_get_title().
+func (v *Window) GetTitle() (string, error) {
+ return stringReturn(C.gtk_window_get_title(v.native()))
+}
+
+// GetTransientFor is a wrapper around gtk_window_get_transient_for().
+func (v *Window) GetTransientFor() (*Window, error) {
+ c := C.gtk_window_get_transient_for(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWindow(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetAttachedTo is a wrapper around gtk_window_get_attached_to().
+func (v *Window) GetAttachedTo() (*Widget, error) {
+ c := C.gtk_window_get_attached_to(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+ return wrapWidget(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// GetTypeHint is a wrapper around gtk_window_get_type_hint().
+func (v *Window) GetTypeHint() gdk.WindowTypeHint {
+ c := C.gtk_window_get_type_hint(v.native())
+ return gdk.WindowTypeHint(c)
+}
+
+// GetSkipTaskbarHint is a wrapper around gtk_window_get_skip_taskbar_hint().
+func (v *Window) GetSkipTaskbarHint() bool {
+ c := C.gtk_window_get_skip_taskbar_hint(v.native())
+ return gobool(c)
+}
+
+// GetSkipPagerHint is a wrapper around gtk_window_get_skip_pager_hint().
+func (v *Window) GetSkipPagerHint() bool {
+ c := C.gtk_window_get_skip_taskbar_hint(v.native())
+ return gobool(c)
+}
+
+// GetUrgencyHint is a wrapper around gtk_window_get_urgency_hint().
+func (v *Window) GetUrgencyHint() bool {
+ c := C.gtk_window_get_urgency_hint(v.native())
+ return gobool(c)
+}
+
+// GetAcceptFocus is a wrapper around gtk_window_get_accept_focus().
+func (v *Window) GetAcceptFocus() bool {
+ c := C.gtk_window_get_accept_focus(v.native())
+ return gobool(c)
+}
+
+// GetFocusOnMap is a wrapper around gtk_window_get_focus_on_map().
+func (v *Window) GetFocusOnMap() bool {
+ c := C.gtk_window_get_focus_on_map(v.native())
+ return gobool(c)
+}
+
+// HasGroup is a wrapper around gtk_window_has_group().
+func (v *Window) HasGroup() bool {
+ c := C.gtk_window_has_group(v.native())
+ return gobool(c)
+}
+
+// Move is a wrapper around gtk_window_move().
+func (v *Window) Move(x, y int) {
+ C.gtk_window_move(v.native(), C.gint(x), C.gint(y))
+}
+
+// Resize is a wrapper around gtk_window_resize().
+func (v *Window) Resize(width, height int) {
+ C.gtk_window_resize(v.native(), C.gint(width), C.gint(height))
+}
+
+// WindowSetDefaultIconFromFile is a wrapper around gtk_window_set_default_icon_from_file().
+func WindowSetDefaultIconFromFile(file string) error {
+ cstr := C.CString(file)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ res := C.gtk_window_set_default_icon_from_file((*C.gchar)(cstr), &err)
+ if res == 0 {
+ defer C.g_error_free(err)
+ return errors.New(C.GoString((*C.char)(err.message)))
+ }
+ return nil
+}
+
+// WindowSetDefaultIconName is a wrapper around gtk_window_set_default_icon_name().
+func WindowSetDefaultIconName(s string) {
+ cstr := (*C.gchar)(C.CString(s))
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_window_set_default_icon_name(cstr)
+}
+
+// SetIconFromFile is a wrapper around gtk_window_set_icon_from_file().
+func (v *Window) SetIconFromFile(file string) error {
+ cstr := C.CString(file)
+ defer C.free(unsafe.Pointer(cstr))
+ var err *C.GError = nil
+ res := C.gtk_window_set_icon_from_file(v.native(), (*C.gchar)(cstr), &err)
+ if res == 0 {
+ defer C.g_error_free(err)
+ return errors.New(C.GoString((*C.char)(err.message)))
+ }
+ return nil
+}
+
+// SetIconName is a wrapper around gtk_window_set_icon_name().
+func (v *Window) SetIconName(name string) {
+ cstr := C.CString(name)
+ defer C.free(unsafe.Pointer(cstr))
+ C.gtk_window_set_icon_name(v.native(), (*C.gchar)(cstr))
+}
+
+// SetAutoStartupNotification is a wrapper around
+// gtk_window_set_auto_startup_notification().
+// This doesn't seem write. Might need to rethink?
+/*
+func (v *Window) SetAutoStartupNotification(setting bool) {
+ C.gtk_window_set_auto_startup_notification(gbool(setting))
+}
+*/
+
+// GetMnemonicsVisible is a wrapper around
+// gtk_window_get_mnemonics_visible().
+func (v *Window) GetMnemonicsVisible() bool {
+ c := C.gtk_window_get_mnemonics_visible(v.native())
+ return gobool(c)
+}
+
+// SetMnemonicsVisible is a wrapper around
+// gtk_window_get_mnemonics_visible().
+func (v *Window) SetMnemonicsVisible(setting bool) {
+ C.gtk_window_set_mnemonics_visible(v.native(), gbool(setting))
+}
+
+// GetFocusVisible is a wrapper around gtk_window_get_focus_visible().
+func (v *Window) GetFocusVisible() bool {
+ c := C.gtk_window_get_focus_visible(v.native())
+ return gobool(c)
+}
+
+// SetFocusVisible is a wrapper around gtk_window_set_focus_visible().
+func (v *Window) SetFocusVisible(setting bool) {
+ C.gtk_window_set_focus_visible(v.native(), gbool(setting))
+}
+
+// GetApplication is a wrapper around gtk_window_get_application().
+func (v *Window) GetApplication() (*Application, error) {
+ c := C.gtk_window_get_application(v.native())
+ if c == nil {
+ return nil, nilPtrErr
+ }
+
+ return wrapApplication(glib.Take(unsafe.Pointer(c))), nil
+}
+
+// SetApplication is a wrapper around gtk_window_set_application().
+func (v *Window) SetApplication(a *Application) {
+ C.gtk_window_set_application(v.native(), a.native())
+}
+
+// ActivateKey is a wrapper around gtk_window_activate_key().
+func (v *Window) ActivateKey(event *gdk.EventKey) bool {
+ c := C.gtk_window_activate_key(v.native(), (*C.GdkEventKey)(unsafe.Pointer(event.Native())))
+ return gobool(c)
+}
+
+// AddMnemonic is a wrapper around gtk_window_add_mnemonic().
+func (v *Window) AddMnemonic(keyval uint, target *Widget) {
+ C.gtk_window_add_mnemonic(v.native(), C.guint(keyval), target.native())
+}
+
+// RemoveMnemonic is a wrapper around gtk_window_remove_mnemonic().
+func (v *Window) RemoveMnemonic(keyval uint, target *Widget) {
+ C.gtk_window_remove_mnemonic(v.native(), C.guint(keyval), target.native())
+}
+
+// ActivateMnemonic is a wrapper around gtk_window_mnemonic_activate().
+func (v *Window) ActivateMnemonic(keyval uint, mods gdk.ModifierType) bool {
+ c := C.gtk_window_mnemonic_activate(v.native(), C.guint(keyval), C.GdkModifierType(mods))
+ return gobool(c)
+}
+
+// GetMnemonicModifier is a wrapper around gtk_window_get_mnemonic_modifier().
+func (v *Window) GetMnemonicModifier() gdk.ModifierType {
+ c := C.gtk_window_get_mnemonic_modifier(v.native())
+ return gdk.ModifierType(c)
+}
+
+// SetMnemonicModifier is a wrapper around gtk_window_set_mnemonic_modifier().
+func (v *Window) SetMnemonicModifier(mods gdk.ModifierType) {
+ C.gtk_window_set_mnemonic_modifier(v.native(), C.GdkModifierType(mods))
+}
+
+// TODO gtk_window_begin_move_drag().
+// TODO gtk_window_begin_resize_drag().
+// TODO gtk_window_get_default_icon_list().
+// TODO gtk_window_get_group().
+// TODO gtk_window_get_icon_list().
+// TODO gtk_window_get_window_type().
+// TODO gtk_window_list_toplevels().
+// TODO gtk_window_parse_geometry().
+// TODO gtk_window_propagate_key_event().
+// TODO gtk_window_set_attached_to().
+// TODO gtk_window_set_default_icon_list().
+// TODO gtk_window_set_icon_list().
+// TODO gtk_window_set_screen().
+// TODO gtk_window_get_resize_grip_area().
diff --git a/vendor/github.com/gotk3/gotk3/gtk/window_since_3_10.go b/vendor/github.com/gotk3/gotk3/gtk/window_since_3_10.go
new file mode 100644
index 0000000..2717f78
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/window_since_3_10.go
@@ -0,0 +1,26 @@
+// Same copyright and license as the rest of the files in this project
+// This file contains accelerator related functions and structures
+
+// +build !gtk_3_6,!gtk_3_8
+// not use this: go build -tags gtk_3_8'. Otherwise, if no build tags are used, GTK 3.10
+
+package gtk
+
+// #include <stdlib.h>
+// #include <gtk/gtk.h>
+// #include "gtk_since_3_10.go.h"
+import "C"
+
+/*
+ * GtkWindow
+ */
+
+// SetTitlebar is a wrapper around gtk_window_set_titlebar().
+func (v *Window) SetTitlebar(titlebar IWidget) {
+ C.gtk_window_set_titlebar(v.native(), titlebar.toWidget())
+}
+
+// Close is a wrapper around gtk_window_close().
+func (v *Window) Close() {
+ C.gtk_window_close(v.native())
+}
diff --git a/vendor/github.com/gotk3/gotk3/gtk/window_since_3_12.go b/vendor/github.com/gotk3/gotk3/gtk/window_since_3_12.go
new file mode 100644
index 0000000..4c0228c
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/gtk/window_since_3_12.go
@@ -0,0 +1,12 @@
+// +build !gtk_3_6,!gtk_3_8,!gtk_3_10
+
+package gtk
+
+// #include <gtk/gtk.h>
+import "C"
+
+// IsMaximized is a wrapper around gtk_window_is_maximized().
+func (v *Window) IsMaximized() bool {
+ c := C.gtk_window_is_maximized(v.native())
+ return gobool(c)
+}
diff --git a/vendor/github.com/gotk3/gotk3/pango/fontconfig.go.h b/vendor/github.com/gotk3/gotk3/pango/fontconfig.go.h
new file mode 100644
index 0000000..de8b743
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/fontconfig.go.h
@@ -0,0 +1,7 @@
+
+#include <fontconfig/fontconfig.h>
+
+static int addFont(char* font) {
+ FcBool fontAddStatus = FcConfigAppFontAddFile(FcConfigGetCurrent(), font);
+ return fontAddStatus;
+} \ No newline at end of file
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-attributes.go b/vendor/github.com/gotk3/gotk3/pango/pango-attributes.go
new file mode 100644
index 0000000..464b595
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-attributes.go
@@ -0,0 +1,356 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package pango
+
+// #include <pango/pango.h>
+// #include "pango.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Enums
+ {glib.Type(C.pango_attr_type_get_type()), marshalAttrType},
+ {glib.Type(C.pango_underline_get_type()), marshalUnderline},
+ }
+ glib.RegisterGValueMarshalers(tm)
+}
+
+/* PangoColor */
+
+// Color is a representation of PangoColor.
+type Color struct {
+ pangoColor *C.PangoColor
+}
+
+// Native returns a pointer to the underlying PangoColor.
+func (v *Color) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *Color) native() *C.PangoColor {
+ return (*C.PangoColor)(unsafe.Pointer(v.pangoColor))
+}
+
+func (v *Color) Set(red, green, blue uint16) {
+ v.native().red = C.guint16(red)
+ v.native().green = C.guint16(green)
+ v.native().blue = C.guint16(blue)
+}
+
+func (v *Color) Get() (red, green, blue uint16) {
+ return uint16(v.native().red), uint16(v.native().green), uint16(v.native().blue)
+}
+
+//PangoColor *pango_color_copy (const PangoColor *src);
+func (v *Color) Copy(c *Color) *Color {
+ w := new(Color)
+ w.pangoColor = C.pango_color_copy(v.native())
+ return w
+}
+
+//void pango_color_free (PangoColor *color);
+func (v *Color) Free() {
+ C.pango_color_free(v.native())
+}
+
+//gboolean pango_color_parse (PangoColor *color,
+// const char *spec);
+func (v *Color) Parse(spec string) bool {
+ cstr := C.CString(spec)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.pango_color_parse(v.native(), (*C.char)(cstr))
+ return gobool(c)
+}
+
+//gchar *pango_color_to_string(const PangoColor *color);
+func (v *Color) ToString() string {
+ c := C.pango_color_to_string(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+/* --- --- --- Attributes --- --- --- */
+
+// AttrList is a representation of PangoAttrList.
+type AttrList struct {
+ pangoAttrList *C.PangoAttrList
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *AttrList) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *AttrList) native() *C.PangoAttrList {
+ return (*C.PangoAttrList)(unsafe.Pointer(v.pangoAttrList))
+}
+
+// AttrType is a representation of Pango's PangoAttrType.
+type AttrType int
+
+const (
+ ATTR_INVALID AttrType = C.PANGO_ATTR_INVALID /* 0 is an invalid attribute type */
+ ATTR_LANGUAGE AttrType = C.PANGO_ATTR_LANGUAGE /* PangoAttrLanguage */
+ ATTR_FAMILY AttrType = C.PANGO_ATTR_FAMILY /* PangoAttrString */
+ ATTR_STYLE AttrType = C.PANGO_ATTR_STYLE /* PangoAttrInt */
+ ATTR_WEIGHT AttrType = C.PANGO_ATTR_WEIGHT /* PangoAttrInt */
+ ATTR_VARIANT AttrType = C.PANGO_ATTR_VARIANT /* PangoAttrInt */
+ ATTR_STRETCH AttrType = C.PANGO_ATTR_STRETCH /* PangoAttrInt */
+ ATTR_SIZE AttrType = C.PANGO_ATTR_SIZE /* PangoAttrSize */
+ ATTR_FONT_DESC AttrType = C.PANGO_ATTR_FONT_DESC /* PangoAttrFontDesc */
+ ATTR_FOREGROUND AttrType = C.PANGO_ATTR_FOREGROUND /* PangoAttrColor */
+ ATTR_BACKGROUND AttrType = C.PANGO_ATTR_BACKGROUND /* PangoAttrColor */
+ ATTR_UNDERLINE AttrType = C.PANGO_ATTR_UNDERLINE /* PangoAttrInt */
+ ATTR_STRIKETHROUGH AttrType = C.PANGO_ATTR_STRIKETHROUGH /* PangoAttrInt */
+ ATTR_RISE AttrType = C.PANGO_ATTR_RISE /* PangoAttrInt */
+ ATTR_SHAPE AttrType = C.PANGO_ATTR_SHAPE /* PangoAttrShape */
+ ATTR_SCALE AttrType = C.PANGO_ATTR_SCALE /* PangoAttrFloat */
+ ATTR_FALLBACK AttrType = C.PANGO_ATTR_FALLBACK /* PangoAttrInt */
+ ATTR_LETTER_SPACING AttrType = C.PANGO_ATTR_LETTER_SPACING /* PangoAttrInt */
+ ATTR_UNDERLINE_COLOR AttrType = C.PANGO_ATTR_UNDERLINE_COLOR /* PangoAttrColor */
+ ATTR_STRIKETHROUGH_COLOR AttrType = C.PANGO_ATTR_STRIKETHROUGH_COLOR /* PangoAttrColor */
+ ATTR_ABSOLUTE_SIZE AttrType = C.PANGO_ATTR_ABSOLUTE_SIZE /* PangoAttrSize */
+ ATTR_GRAVITY AttrType = C.PANGO_ATTR_GRAVITY /* PangoAttrInt */
+ ATTR_GRAVITY_HINT AttrType = C.PANGO_ATTR_GRAVITY_HINT /* PangoAttrInt */
+
+)
+
+func marshalAttrType(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return AttrType(c), nil
+}
+
+// Underline is a representation of Pango's PangoUnderline.
+type Underline int
+
+const (
+ UNDERLINE_NONE Underline = C.PANGO_UNDERLINE_NONE
+ UNDERLINE_SINGLE Underline = C.PANGO_UNDERLINE_SINGLE
+ UNDERLINE_DOUBLE Underline = C.PANGO_UNDERLINE_DOUBLE
+ UNDERLINE_LOW Underline = C.PANGO_UNDERLINE_LOW
+ UNDERLINE_ERROR Underline = C.PANGO_UNDERLINE_ERROR
+)
+
+func marshalUnderline(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Underline(c), nil
+}
+
+const (
+ ATTR_INDEX_FROM_TEXT_BEGINNING uint = 0
+ ATTR_INDEX_TO_TEXT_END uint = C.G_MAXUINT
+)
+
+// Attribute is a representation of Pango's PangoAttribute.
+type Attribute struct {
+ pangoAttribute *C.PangoAttribute
+ //start_index, end_index uint
+}
+
+// Native returns a pointer to the underlying PangoColor.
+func (v *Attribute) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *Attribute) native() *C.PangoAttribute {
+ return (*C.PangoAttribute)(unsafe.Pointer(v.pangoAttribute))
+}
+
+/*
+//typedef gboolean (*PangoAttrFilterFunc) (PangoAttribute *attribute,
+// gpointer user_data);
+func (v *Attribute) AttrFilterFunc(user_data uintptr) bool {
+ c := C.PangoAttrFilterFunc(Attribute.native(), C.gpointer(user_data))
+ return gobool(c)
+}
+
+//typedef gpointer (*PangoAttrDataCopyFunc) (gconstpointer user_data);
+func AttrDataCopyFunc(user_data uintptr) uintptr {
+ c := C.PangoAttrDataCopyFunc(C.gpointer(user_data))
+ return uintptr(c)
+}
+*/
+
+// AttrClass is a representation of Pango's PangoAttrClass.
+type AttrClass struct {
+ //PangoAttrType type;
+}
+
+// AttrString is a representation of Pango's PangoAttrString.
+type AttrString struct {
+ Attribute
+ //char *value;
+}
+
+// AttrLanguage is a representation of Pango's PangoAttrLanguage.
+type AttrLanguage struct {
+ Attribute
+ //PangoLanguage *value;
+}
+
+// AttrInt is a representation of Pango's PangoAttrInt.
+type AttrInt struct {
+ Attribute
+ //int value;
+}
+
+// AttrFloat is a representation of Pango's PangoAttrFloat.
+type AttrFloat struct {
+ Attribute
+ //double value;
+}
+
+// AttrColor is a representation of Pango's AttrColor.
+type AttrColor struct {
+ Attribute
+ Color
+}
+
+// AttrSize is a representation of Pango's PangoAttrSize.
+type AttrSize struct {
+ Attribute
+ //int size;
+ //guint absolute : 1;
+}
+
+// AttrShape is a representation of Pango's PangoAttrShape.
+type AttrShape struct {
+ Attribute
+ //PangoRectangle ink_rect;
+ //PangoRectangle logical_rect;
+
+ //gpointer data;
+ //PangoAttrDataCopyFunc copy_func;
+ //GDestroyNotify destroy_func;
+}
+
+// AttrFontDesc is a representation of Pango's PangoAttrFontDesc.
+type AttrFontDesc struct {
+ Attribute
+ //PangoFontDescription *desc;
+}
+
+/*
+PangoAttrType pango_attr_type_register (const gchar *name);
+const char * pango_attr_type_get_name (PangoAttrType type) G_GNUC_CONST;
+
+void pango_attribute_init (PangoAttribute *attr,
+ const PangoAttrClass *klass);
+PangoAttribute * pango_attribute_copy (const PangoAttribute *attr);
+void pango_attribute_destroy (PangoAttribute *attr);
+gboolean pango_attribute_equal (const PangoAttribute *attr1,
+ const PangoAttribute *attr2) G_GNUC_PURE;
+
+PangoAttribute *pango_attr_language_new (PangoLanguage *language);
+PangoAttribute *pango_attr_family_new (const char *family);
+PangoAttribute *pango_attr_foreground_new (guint16 red,
+ guint16 green,
+ guint16 blue);
+PangoAttribute *pango_attr_background_new (guint16 red,
+ guint16 green,
+ guint16 blue);
+PangoAttribute *pango_attr_size_new (int size);
+PangoAttribute *pango_attr_size_new_absolute (int size);
+PangoAttribute *pango_attr_style_new (PangoStyle style);
+PangoAttribute *pango_attr_weight_new (PangoWeight weight);
+PangoAttribute *pango_attr_variant_new (PangoVariant variant);
+PangoAttribute *pango_attr_stretch_new (PangoStretch stretch);
+PangoAttribute *pango_attr_font_desc_new (const PangoFontDescription *desc);
+
+PangoAttribute *pango_attr_underline_new (PangoUnderline underline);
+PangoAttribute *pango_attr_underline_color_new (guint16 red,
+ guint16 green,
+ guint16 blue);
+PangoAttribute *pango_attr_strikethrough_new (gboolean strikethrough);
+PangoAttribute *pango_attr_strikethrough_color_new (guint16 red,
+ guint16 green,
+ guint16 blue);
+
+PangoAttribute *pango_attr_rise_new (int rise);
+PangoAttribute *pango_attr_scale_new (double scale_factor);
+PangoAttribute *pango_attr_fallback_new (gboolean enable_fallback);
+PangoAttribute *pango_attr_letter_spacing_new (int letter_spacing);
+
+PangoAttribute *pango_attr_shape_new (const PangoRectangle *ink_rect,
+ const PangoRectangle *logical_rect);
+PangoAttribute *pango_attr_shape_new_with_data (const PangoRectangle *ink_rect,
+ const PangoRectangle *logical_rect,
+ gpointer data,
+ PangoAttrDataCopyFunc copy_func,
+ GDestroyNotify destroy_func);
+
+PangoAttribute *pango_attr_gravity_new (PangoGravity gravity);
+PangoAttribute *pango_attr_gravity_hint_new (PangoGravityHint hint);
+
+GType pango_attr_list_get_type (void) G_GNUC_CONST;
+PangoAttrList * pango_attr_list_new (void);
+PangoAttrList * pango_attr_list_ref (PangoAttrList *list);
+void pango_attr_list_unref (PangoAttrList *list);
+PangoAttrList * pango_attr_list_copy (PangoAttrList *list);
+void pango_attr_list_insert (PangoAttrList *list,
+ PangoAttribute *attr);
+void pango_attr_list_insert_before (PangoAttrList *list,
+ PangoAttribute *attr);
+void pango_attr_list_change (PangoAttrList *list,
+ PangoAttribute *attr);
+void pango_attr_list_splice (PangoAttrList *list,
+ PangoAttrList *other,
+ gint pos,
+ gint len);
+
+PangoAttrList *pango_attr_list_filter (PangoAttrList *list,
+ PangoAttrFilterFunc func,
+ gpointer data);
+
+PangoAttrIterator *pango_attr_list_get_iterator (PangoAttrList *list);
+
+void pango_attr_iterator_range (PangoAttrIterator *iterator,
+ gint *start,
+ gint *end);
+gboolean pango_attr_iterator_next (PangoAttrIterator *iterator);
+PangoAttrIterator *pango_attr_iterator_copy (PangoAttrIterator *iterator);
+void pango_attr_iterator_destroy (PangoAttrIterator *iterator);
+PangoAttribute * pango_attr_iterator_get (PangoAttrIterator *iterator,
+ PangoAttrType type);
+void pango_attr_iterator_get_font (PangoAttrIterator *iterator,
+ PangoFontDescription *desc,
+ PangoLanguage **language,
+ GSList **extra_attrs);
+GSList * pango_attr_iterator_get_attrs (PangoAttrIterator *iterator);
+
+
+gboolean pango_parse_markup (const char *markup_text,
+ int length,
+ gunichar accel_marker,
+ PangoAttrList **attr_list,
+ char **text,
+ gunichar *accel_char,
+ GError **error);
+
+GMarkupParseContext * pango_markup_parser_new (gunichar accel_marker);
+gboolean pango_markup_parser_finish (GMarkupParseContext *context,
+ PangoAttrList **attr_list,
+ char **text,
+ gunichar *accel_char,
+ GError **error);
+*/
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-attributes.go.h b/vendor/github.com/gotk3/gotk3/pango/pango-attributes.go.h
new file mode 100644
index 0000000..d1b2e23
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-attributes.go.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+static PangoColor* toPangoColor(void *p)
+{
+ return ( (PangoColor*) (p) );
+}
+
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-context.go b/vendor/github.com/gotk3/gotk3/pango/pango-context.go
new file mode 100644
index 0000000..41b7e57
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-context.go
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package pango
+
+// #include <pango/pango.h>
+// #include "pango.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Enums
+ // {glib.Type(C.pango_alignment_get_type()), marshalAlignment},
+ // {glib.Type(C.pango_ellipsize_mode_get_type()), marshalEllipsizeMode},
+ // {glib.Type(C.pango_wrap_mode_get_type()), marshalWrapMode},
+
+ // Objects/Interfaces
+ // {glib.Type(C.pango_context_get_type()), marshalContext},
+ }
+ glib.RegisterGValueMarshalers(tm)
+}
+
+// Context is a representation of PangoContext.
+type Context struct {
+ pangoContext *C.PangoContext
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *Context) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *Context) native() *C.PangoContext {
+ return (*C.PangoContext)(unsafe.Pointer(v.pangoContext))
+}
+
+/*
+func marshalContext(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := wrapObject(unsafe.Pointer(c))
+ return wrapContext(obj), nil
+}
+
+func wrapContext(obj *glib.Object) *Context {
+ return &Context{obj}
+}
+*/
+func WrapContext(p uintptr) *Context {
+ context := new(Context)
+ context.pangoContext = (*C.PangoContext)(unsafe.Pointer(p))
+ return context
+}
+
+//PangoContext *pango_context_new (void);
+func ContextNew() *Context {
+ c := C.pango_context_new()
+
+ context := new(Context)
+ context.pangoContext = (*C.PangoContext)(c)
+
+ return context
+}
+
+//void pango_context_changed (PangoContext *context);
+//void pango_context_set_font_map (PangoContext *context,
+// PangoFontMap *font_map);
+//PangoFontMap *pango_context_get_font_map (PangoContext *context);
+//guint pango_context_get_serial (PangoContext *context);
+//void pango_context_list_families (PangoContext *context,
+// PangoFontFamily ***families,
+// int *n_families);
+//PangoFont * pango_context_load_font (PangoContext *context,
+// const PangoFontDescription *desc);
+//PangoFontset *pango_context_load_fontset (PangoContext *context,
+// const PangoFontDescription *desc,
+// PangoLanguage *language);
+//
+//PangoFontMetrics *pango_context_get_metrics (PangoContext *context,
+// const PangoFontDescription *desc,
+// PangoLanguage *language);
+//
+//void pango_context_set_font_description (PangoContext *context,
+// const PangoFontDescription *desc);
+//PangoFontDescription * pango_context_get_font_description (PangoContext *context);
+//PangoLanguage *pango_context_get_language (PangoContext *context);
+//void pango_context_set_language (PangoContext *context,
+// PangoLanguage *language);
+//void pango_context_set_base_dir (PangoContext *context,
+// PangoDirection direction);
+//PangoDirection pango_context_get_base_dir (PangoContext *context);
+//void pango_context_set_base_gravity (PangoContext *context,
+// PangoGravity gravity);
+//PangoGravity pango_context_get_base_gravity (PangoContext *context);
+//PangoGravity pango_context_get_gravity (PangoContext *context);
+//void pango_context_set_gravity_hint (PangoContext *context,
+// PangoGravityHint hint);
+//PangoGravityHint pango_context_get_gravity_hint (PangoContext *context);
+//
+//void pango_context_set_matrix (PangoContext *context,
+// const PangoMatrix *matrix);
+//const PangoMatrix * pango_context_get_matrix (PangoContext *context);
+
+/* Break a string of Unicode characters into segments with
+ * consistent shaping/language engine and bidrectional level.
+ * Returns a #GList of #PangoItem's
+ */
+//GList *pango_itemize (PangoContext *context,
+// const char *text,
+// int start_index,
+// int length,
+// PangoAttrList *attrs,
+// PangoAttrIterator *cached_iter);
+//GList *pango_itemize_with_base_dir (PangoContext *context,
+// PangoDirection base_dir,
+// const char *text,
+// int start_index,
+// int length,
+// PangoAttrList *attrs,
+// PangoAttrIterator *cached_iter);
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-font.go b/vendor/github.com/gotk3/gotk3/pango/pango-font.go
new file mode 100644
index 0000000..ff7ab28
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-font.go
@@ -0,0 +1,710 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package pango
+
+// #include <pango/pango.h>
+// #include "pango.go.h"
+// #include "fontconfig.go.h"
+import "C"
+import (
+ // "github.com/andre-hub/gotk3/glib"
+ // "github.com/andre-hub/gotk3/cairo"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Enums
+ // Objects/Interfaces
+ {glib.Type(C.pango_font_description_get_type()), marshalFontDescription},
+ }
+ glib.RegisterGValueMarshalers(tm)
+}
+
+func AddFont(fontPath string) {
+ C.addFont(C.CString(fontPath))
+}
+
+// FontDescription is a representation of PangoFontDescription.
+type FontDescription struct {
+ pangoFontDescription *C.PangoFontDescription
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *FontDescription) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *FontDescription) native() *C.PangoFontDescription {
+ return (*C.PangoFontDescription)(unsafe.Pointer(v.pangoFontDescription))
+}
+
+// FontMetrics is a representation of PangoFontMetrics.
+type FontMetrics struct {
+ pangoFontMetrics *C.PangoFontMetrics
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *FontMetrics) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *FontMetrics) native() *C.PangoFontMetrics {
+ return (*C.PangoFontMetrics)(unsafe.Pointer(v.pangoFontMetrics))
+}
+
+const (
+ PANGO_SCALE = C.PANGO_SCALE
+)
+
+type Style int
+
+const (
+ STYLE_NORMAL Style = C.PANGO_STYLE_NORMAL
+ STYLE_OBLIQUE Style = C.PANGO_STYLE_OBLIQUE
+ STYLE_ITALIC Style = C.PANGO_STYLE_ITALIC
+)
+
+type Variant int
+
+const (
+ VARIANT_NORMAL Variant = C.PANGO_VARIANT_NORMAL
+ VARIANT_SMALL_CAPS Variant = C.PANGO_VARIANT_SMALL_CAPS
+)
+
+type Weight int
+
+const (
+ WEIGHT_THIN Weight = C.PANGO_WEIGHT_THIN /* 100 */
+ WEIGHT_ULTRALIGHT Weight = C.PANGO_WEIGHT_ULTRALIGHT /* 200 */
+ WEIGHT_LIGHT Weight = C.PANGO_WEIGHT_LIGHT /* 300 */
+ WEIGHT_SEMILIGHT Weight = 350 /* 350 */
+ WEIGHT_BOOK Weight = C.PANGO_WEIGHT_BOOK /* 380 */
+ WEIGHT_NORMAL Weight = C.PANGO_WEIGHT_NORMAL /* 400 */
+ WEIGHT_MEDIUM Weight = C.PANGO_WEIGHT_MEDIUM /* 500 */
+ WEIGHT_SEMIBOLD Weight = C.PANGO_WEIGHT_SEMIBOLD /* 600 */
+ WEIGHT_BOLD Weight = C.PANGO_WEIGHT_BOLD /* 700 */
+ WEIGHT_ULTRABOLD Weight = C.PANGO_WEIGHT_ULTRABOLD /* 800 */
+ WEIGHT_HEAVY Weight = C.PANGO_WEIGHT_HEAVY /* 900 */
+ WEIGHT_ULTRAHEAVY Weight = C.PANGO_WEIGHT_ULTRAHEAVY /* 1000 */
+
+)
+
+type Stretch int
+
+const (
+ STRETCH_ULTRA_CONDENSED Stretch = C.PANGO_STRETCH_ULTRA_CONDENSED
+ STRETCH_EXTRA_CONDENSEDStretch Stretch = C.PANGO_STRETCH_EXTRA_CONDENSED
+ STRETCH_CONDENSEDStretch Stretch = C.PANGO_STRETCH_CONDENSED
+ STRETCH_SEMI_CONDENSEDStretch Stretch = C.PANGO_STRETCH_SEMI_CONDENSED
+ STRETCH_NORMALStretch Stretch = C.PANGO_STRETCH_NORMAL
+ STRETCH_SEMI_EXPANDEDStretch Stretch = C.PANGO_STRETCH_SEMI_EXPANDED
+ STRETCH_EXPANDEDStretch Stretch = C.PANGO_STRETCH_EXPANDED
+ STRETCH_EXTRA_EXPANDEDStretch Stretch = C.PANGO_STRETCH_EXTRA_EXPANDED
+ STRETCH_ULTRA_EXPANDEDStretch Stretch = C.PANGO_STRETCH_ULTRA_EXPANDED
+)
+
+type FontMask int
+
+const (
+ FONT_MASK_FAMILY FontMask = C.PANGO_FONT_MASK_FAMILY /* 1 << 0 */
+ FONT_MASK_STYLEFontMask FontMask = C.PANGO_FONT_MASK_STYLE /* 1 << 1 */
+ FONT_MASK_VARIANTFontMask FontMask = C.PANGO_FONT_MASK_VARIANT /* 1 << 2 */
+ FONT_MASK_WEIGHTFontMask FontMask = C.PANGO_FONT_MASK_WEIGHT /* 1 << 3 */
+ FONT_MASK_STRETCHFontMask FontMask = C.PANGO_FONT_MASK_STRETCH /* 1 << 4 */
+ FONT_MASK_SIZEFontMask FontMask = C.PANGO_FONT_MASK_SIZE /* 1 << 5 */
+ FONT_MASK_GRAVITYFontMask FontMask = C.PANGO_FONT_MASK_GRAVITY /* 1 << 6 */
+)
+
+type Scale float64
+
+const (
+ SCALE_XX_SMALL Scale = /* C.PANGO_SCALE_XX_SMALL */ 0.5787037037037
+ SCALE_X_SMALL Scale = /*C.PANGO_SCALE_X_SMALL */ 0.6444444444444
+ SCALE_SMALL Scale = /*C.PANGO_SCALE_SMALL */ 0.8333333333333
+ SCALE_MEDIUM Scale = /*C.PANGO_SCALE_MEDIUM */ 1.0
+ SCALE_LARGE Scale = /*C.PANGO_SCALE_LARGE */ 1.2
+ SCALE_X_LARGE Scale = /*C.PANGO_SCALE_X_LARGE */ 1.4399999999999
+ SCALE_XX_LARGE Scale = /*C.PANGO_SCALE_XX_LARGE */ 1.728
+)
+
+/*
+ * PangoFontDescription
+ */
+
+func marshalFontDescription(p uintptr) (interface{}, error) {
+ c := C.g_value_get_boxed((*C.GValue)(unsafe.Pointer(p)))
+ c2 := (*C.PangoFontDescription)(unsafe.Pointer(c))
+ return wrapFontDescription(c2), nil
+}
+
+func wrapFontDescription(obj *C.PangoFontDescription) *FontDescription {
+ return &FontDescription{obj}
+}
+
+//PangoFontDescription *pango_font_description_new (void);
+func FontDescriptionNew() *FontDescription {
+ c := C.pango_font_description_new()
+ v := new(FontDescription)
+ v.pangoFontDescription = c
+ return v
+}
+
+//PangoFontDescription *pango_font_description_copy (const PangoFontDescription *desc);
+func (v *FontDescription) Copy() *FontDescription {
+ c := C.pango_font_description_copy(v.native())
+ v2 := new(FontDescription)
+ v2.pangoFontDescription = c
+ return v2
+}
+
+//PangoFontDescription *pango_font_description_copy_static (const PangoFontDescription *desc);
+func (v *FontDescription) CopyStatic() *FontDescription {
+ c := C.pango_font_description_copy_static(v.native())
+ v2 := new(FontDescription)
+ v2.pangoFontDescription = c
+ return v2
+}
+
+//guint pango_font_description_hash (const PangoFontDescription *desc) G_GNUC_PURE;
+func (v *FontDescription) Hash() uint {
+ c := C.pango_font_description_hash(v.native())
+ return uint(c)
+}
+
+//gboolean pango_font_description_equal (const PangoFontDescription *desc1,
+// const PangoFontDescription *desc2) G_GNUC_PURE;
+func (v *FontDescription) Equal(v2 *FontDescription) bool {
+ c := C.pango_font_description_equal(v.native(), v2.native())
+ return gobool(c)
+}
+
+//void pango_font_description_free (PangoFontDescription *desc);
+func (v *FontDescription) Free() {
+ C.pango_font_description_free(v.native())
+}
+
+//void pango_font_descriptions_free (PangoFontDescription **descs,
+// int n_descs);
+//func (v *FontDescription) FontDescriptionsFree(n_descs int) {
+// C.pango_font_descriptions_free(v.native(), C.int(n_descs))
+//}
+
+//void pango_font_description_set_family (PangoFontDescription *desc,
+// const char *family);
+func (v *FontDescription) SetFamily(family string) {
+ cstr := C.CString(family)
+ defer C.free(unsafe.Pointer(cstr))
+ C.pango_font_description_set_family(v.native(), (*C.char)(cstr))
+}
+
+//void pango_font_description_set_family_static (PangoFontDescription *desc,
+// const char *family);
+func (v *FontDescription) SetFamilyStatic(family string) {
+ cstr := C.CString(family)
+ defer C.free(unsafe.Pointer(cstr))
+ C.pango_font_description_set_family_static(v.native(), (*C.char)(cstr))
+}
+
+//const char *pango_font_description_get_family (const PangoFontDescription *desc) G_GNUC_PURE;
+func (v *FontDescription) GetFamily() string {
+ c := C.pango_font_description_get_family(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+//void pango_font_description_set_style (PangoFontDescription *desc,
+// PangoStyle style);
+func (v *FontDescription) SetStyle(style Style) {
+ C.pango_font_description_set_style(v.native(), (C.PangoStyle)(style))
+}
+
+//PangoStyle pango_font_description_get_style (const PangoFontDescription *desc) G_GNUC_PURE;
+func (v *FontDescription) GetStyle() Style {
+ c := C.pango_font_description_get_style(v.native())
+ return Style(c)
+}
+
+//void pango_font_description_set_variant (PangoFontDescription *desc,
+// PangoVariant variant);
+//PangoVariant pango_font_description_get_variant (const PangoFontDescription *desc) G_GNUC_PURE;
+
+//void pango_font_description_set_weight (PangoFontDescription *desc,
+// PangoWeight weight);
+func (v *FontDescription) SetWeight(weight Weight) {
+ C.pango_font_description_set_weight(v.native(), (C.PangoWeight)(weight))
+}
+
+//PangoWeight pango_font_description_get_weight (const PangoFontDescription *desc) G_GNUC_PURE;
+func (v *FontDescription) GetWeight() Weight {
+ c := C.pango_font_description_get_weight(v.native())
+ return Weight(c)
+}
+
+//void pango_font_description_set_stretch (PangoFontDescription *desc,
+// PangoStretch stretch);
+func (v *FontDescription) SetStretch(stretch Stretch) {
+ C.pango_font_description_set_stretch(v.native(), (C.PangoStretch)(stretch))
+}
+
+//PangoStretch pango_font_description_get_stretch (const PangoFontDescription *desc) G_GNUC_PURE;
+func (v *FontDescription) GetStretch() Stretch {
+ c := C.pango_font_description_get_stretch(v.native())
+ return Stretch(c)
+}
+
+//void pango_font_description_set_size (PangoFontDescription *desc,
+// gint size);
+func (v *FontDescription) SetSize(size int) {
+ C.pango_font_description_set_size(v.native(), (C.gint)(size))
+}
+
+//gint pango_font_description_get_size (const PangoFontDescription *desc) G_GNUC_PURE;
+func (v *FontDescription) GetSize() int {
+ c := C.pango_font_description_get_size(v.native())
+ return int(c)
+}
+
+//void pango_font_description_set_absolute_size (PangoFontDescription *desc,
+// double size);
+func (v *FontDescription) SetAbsoluteSize(size float64) {
+ C.pango_font_description_set_absolute_size(v.native(), (C.double)(size))
+}
+
+//gboolean pango_font_description_get_size_is_absolute (const PangoFontDescription *desc) G_GNUC_PURE;
+func (v *FontDescription) GetSizeIsAbsolute() bool {
+ c := C.pango_font_description_get_size_is_absolute(v.native())
+ return gobool(c)
+}
+
+//void pango_font_description_set_gravity (PangoFontDescription *desc,
+// PangoGravity gravity);
+func (v *FontDescription) SetGravity(gravity Gravity) {
+ C.pango_font_description_set_gravity(v.native(), (C.PangoGravity)(gravity))
+}
+
+//PangoGravity pango_font_description_get_gravity (const PangoFontDescription *desc) G_GNUC_PURE;
+func (v *FontDescription) GetGravity() Gravity {
+ c := C.pango_font_description_get_gravity(v.native())
+ return Gravity(c)
+}
+
+//PangoFontMask pango_font_description_get_set_fields (const PangoFontDescription *desc) G_GNUC_PURE;
+func (v *FontDescription) GetSetFields() FontMask {
+ c := C.pango_font_description_get_set_fields(v.native())
+ return FontMask(c)
+}
+
+//void pango_font_description_unset_fields (PangoFontDescription *desc,
+// PangoFontMask to_unset);
+func (v *FontDescription) GetUnsetFields(to_unset FontMask) {
+ C.pango_font_description_unset_fields(v.native(), (C.PangoFontMask)(to_unset))
+}
+
+//void pango_font_description_merge (PangoFontDescription *desc,
+// const PangoFontDescription *desc_to_merge,
+// gboolean replace_existing);
+func (v *FontDescription) Merge(desc_to_merge *FontDescription, replace_existing bool) {
+ C.pango_font_description_merge(v.native(), desc_to_merge.native(), gbool(replace_existing))
+}
+
+//void pango_font_description_merge_static (PangoFontDescription *desc,
+// const PangoFontDescription *desc_to_merge,
+// gboolean replace_existing);
+func (v *FontDescription) MergeStatic(desc_to_merge *FontDescription, replace_existing bool) {
+ C.pango_font_description_merge_static(v.native(), desc_to_merge.native(), gbool(replace_existing))
+}
+
+//gboolean pango_font_description_better_match (const PangoFontDescription *desc,
+// const PangoFontDescription *old_match,
+// const PangoFontDescription *new_match) G_GNUC_PURE;
+func (v *FontDescription) BetterMatch(old_match, new_match *FontDescription) bool {
+ c := C.pango_font_description_better_match(v.native(), old_match.native(), new_match.native())
+ return gobool(c)
+}
+
+//PangoFontDescription *pango_font_description_from_string (const char *str);
+func FontDescriptionFromString(str string) *FontDescription {
+ cstr := C.CString(str)
+ defer C.free(unsafe.Pointer(cstr))
+ c := C.pango_font_description_from_string((*C.char)(cstr))
+ v := new(FontDescription)
+ v.pangoFontDescription = c
+ return v
+}
+
+//char * pango_font_description_to_string (const PangoFontDescription *desc);
+func (v *FontDescription) ToString() string {
+ c := C.pango_font_description_to_string(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+//char * pango_font_description_to_filename (const PangoFontDescription *desc);
+func (v *FontDescription) ToFilename() string {
+ c := C.pango_font_description_to_filename(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+///*
+// * PangoFontMetrics
+// */
+//
+///**
+// * PANGO_TYPE_FONT_METRICS:
+// *
+// * The #GObject type for #PangoFontMetrics.
+// */
+//#define PANGO_TYPE_FONT_METRICS (pango_font_metrics_get_type ())
+//GType pango_font_metrics_get_type (void) G_GNUC_CONST;
+//PangoFontMetrics *pango_font_metrics_ref (PangoFontMetrics *metrics);
+//void pango_font_metrics_unref (PangoFontMetrics *metrics);
+//int pango_font_metrics_get_ascent (PangoFontMetrics *metrics) G_GNUC_PURE;
+//int pango_font_metrics_get_descent (PangoFontMetrics *metrics) G_GNUC_PURE;
+//int pango_font_metrics_get_approximate_char_width (PangoFontMetrics *metrics) G_GNUC_PURE;
+//int pango_font_metrics_get_approximate_digit_width (PangoFontMetrics *metrics) G_GNUC_PURE;
+//int pango_font_metrics_get_underline_position (PangoFontMetrics *metrics) G_GNUC_PURE;
+//int pango_font_metrics_get_underline_thickness (PangoFontMetrics *metrics) G_GNUC_PURE;
+//int pango_font_metrics_get_strikethrough_position (PangoFontMetrics *metrics) G_GNUC_PURE;
+//int pango_font_metrics_get_strikethrough_thickness (PangoFontMetrics *metrics) G_GNUC_PURE;
+//
+//#ifdef PANGO_ENABLE_BACKEND
+//
+//PangoFontMetrics *pango_font_metrics_new (void);
+//
+//struct _PangoFontMetrics
+//{
+// guint ref_count;
+//
+// int ascent;
+// int descent;
+// int approximate_char_width;
+// int approximate_digit_width;
+// int underline_position;
+// int underline_thickness;
+// int strikethrough_position;
+// int strikethrough_thickness;
+//};
+//
+//#endif /* PANGO_ENABLE_BACKEND */
+//
+///*
+// * PangoFontFamily
+// */
+//
+///**
+// * PANGO_TYPE_FONT_FAMILY:
+// *
+// * The #GObject type for #PangoFontFamily.
+// */
+///**
+// * PANGO_FONT_FAMILY:
+// * @object: a #GObject.
+// *
+// * Casts a #GObject to a #PangoFontFamily.
+// */
+///**
+// * PANGO_IS_FONT_FAMILY:
+// * @object: a #GObject.
+// *
+// * Returns: %TRUE if @object is a #PangoFontFamily.
+// */
+//#define PANGO_TYPE_FONT_FAMILY (pango_font_family_get_type ())
+//#define PANGO_FONT_FAMILY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_FONT_FAMILY, PangoFontFamily))
+//#define PANGO_IS_FONT_FAMILY(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_FONT_FAMILY))
+//
+//typedef struct _PangoFontFamily PangoFontFamily;
+//typedef struct _PangoFontFace PangoFontFace;
+//
+//GType pango_font_family_get_type (void) G_GNUC_CONST;
+//
+//void pango_font_family_list_faces (PangoFontFamily *family,
+// PangoFontFace ***faces,
+// int *n_faces);
+//const char *pango_font_family_get_name (PangoFontFamily *family) G_GNUC_PURE;
+//gboolean pango_font_family_is_monospace (PangoFontFamily *family) G_GNUC_PURE;
+//
+//#ifdef PANGO_ENABLE_BACKEND
+//
+//#define PANGO_FONT_FAMILY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_FONT_FAMILY, PangoFontFamilyClass))
+//#define PANGO_IS_FONT_FAMILY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_FONT_FAMILY))
+//#define PANGO_FONT_FAMILY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_FONT_FAMILY, PangoFontFamilyClass))
+//
+//typedef struct _PangoFontFamilyClass PangoFontFamilyClass;
+//
+//
+///**
+// * PangoFontFamily:
+// *
+// * The #PangoFontFamily structure is used to represent a family of related
+// * font faces. The faces in a family share a common design, but differ in
+// * slant, weight, width and other aspects.
+// */
+//struct _PangoFontFamily
+//{
+// GObject parent_instance;
+//};
+//
+//struct _PangoFontFamilyClass
+//{
+// GObjectClass parent_class;
+//
+// /*< public >*/
+//
+// void (*list_faces) (PangoFontFamily *family,
+// PangoFontFace ***faces,
+// int *n_faces);
+// const char * (*get_name) (PangoFontFamily *family);
+// gboolean (*is_monospace) (PangoFontFamily *family);
+//
+// /*< private >*/
+//
+// /* Padding for future expansion */
+// void (*_pango_reserved2) (void);
+// void (*_pango_reserved3) (void);
+// void (*_pango_reserved4) (void);
+//};
+//
+//#endif /* PANGO_ENABLE_BACKEND */
+//
+///*
+// * PangoFontFace
+// */
+//
+///**
+// * PANGO_TYPE_FONT_FACE:
+// *
+// * The #GObject type for #PangoFontFace.
+// */
+///**
+// * PANGO_FONT_FACE:
+// * @object: a #GObject.
+// *
+// * Casts a #GObject to a #PangoFontFace.
+// */
+///**
+// * PANGO_IS_FONT_FACE:
+// * @object: a #GObject.
+// *
+// * Returns: %TRUE if @object is a #PangoFontFace.
+// */
+//#define PANGO_TYPE_FONT_FACE (pango_font_face_get_type ())
+//#define PANGO_FONT_FACE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_FONT_FACE, PangoFontFace))
+//#define PANGO_IS_FONT_FACE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_FONT_FACE))
+//
+//GType pango_font_face_get_type (void) G_GNUC_CONST;
+//
+//PangoFontDescription *pango_font_face_describe (PangoFontFace *face);
+//const char *pango_font_face_get_face_name (PangoFontFace *face) G_GNUC_PURE;
+//void pango_font_face_list_sizes (PangoFontFace *face,
+// int **sizes,
+// int *n_sizes);
+//gboolean pango_font_face_is_synthesized (PangoFontFace *face) G_GNUC_PURE;
+//
+//#ifdef PANGO_ENABLE_BACKEND
+//
+//#define PANGO_FONT_FACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_FONT_FACE, PangoFontFaceClass))
+//#define PANGO_IS_FONT_FACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_FONT_FACE))
+//#define PANGO_FONT_FACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_FONT_FACE, PangoFontFaceClass))
+//
+//typedef struct _PangoFontFaceClass PangoFontFaceClass;
+//
+///**
+// * PangoFontFace:
+// *
+// * The #PangoFontFace structure is used to represent a group of fonts with
+// * the same family, slant, weight, width, but varying sizes.
+// */
+//struct _PangoFontFace
+//{
+// GObject parent_instance;
+//};
+//
+//struct _PangoFontFaceClass
+//{
+// GObjectClass parent_class;
+//
+// /*< public >*/
+//
+// const char * (*get_face_name) (PangoFontFace *face);
+// PangoFontDescription * (*describe) (PangoFontFace *face);
+// void (*list_sizes) (PangoFontFace *face,
+// int **sizes,
+// int *n_sizes);
+// gboolean (*is_synthesized) (PangoFontFace *face);
+//
+// /*< private >*/
+//
+// /* Padding for future expansion */
+// void (*_pango_reserved3) (void);
+// void (*_pango_reserved4) (void);
+//};
+//
+//#endif /* PANGO_ENABLE_BACKEND */
+//
+///*
+// * PangoFont
+// */
+//
+///**
+// * PANGO_TYPE_FONT:
+// *
+// * The #GObject type for #PangoFont.
+// */
+///**
+// * PANGO_FONT:
+// * @object: a #GObject.
+// *
+// * Casts a #GObject to a #PangoFont.
+// */
+///**
+// * PANGO_IS_FONT:
+// * @object: a #GObject.
+// *
+// * Returns: %TRUE if @object is a #PangoFont.
+// */
+//#define PANGO_TYPE_FONT (pango_font_get_type ())
+//#define PANGO_FONT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_FONT, PangoFont))
+//#define PANGO_IS_FONT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_FONT))
+//
+//GType pango_font_get_type (void) G_GNUC_CONST;
+//
+//PangoFontDescription *pango_font_describe (PangoFont *font);
+//PangoFontDescription *pango_font_describe_with_absolute_size (PangoFont *font);
+//PangoCoverage * pango_font_get_coverage (PangoFont *font,
+// PangoLanguage *language);
+//PangoEngineShape * pango_font_find_shaper (PangoFont *font,
+// PangoLanguage *language,
+// guint32 ch);
+//PangoFontMetrics * pango_font_get_metrics (PangoFont *font,
+// PangoLanguage *language);
+//void pango_font_get_glyph_extents (PangoFont *font,
+// PangoGlyph glyph,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+//PangoFontMap *pango_font_get_font_map (PangoFont *font);
+//
+//#ifdef PANGO_ENABLE_BACKEND
+//
+//#define PANGO_FONT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_FONT, PangoFontClass))
+//#define PANGO_IS_FONT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_FONT))
+//#define PANGO_FONT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_FONT, PangoFontClass))
+//
+//typedef struct _PangoFontClass PangoFontClass;
+//
+///**
+// * PangoFont:
+// *
+// * The #PangoFont structure is used to represent
+// * a font in a rendering-system-independent matter.
+// * To create an implementation of a #PangoFont,
+// * the rendering-system specific code should allocate
+// * a larger structure that contains a nested
+// * #PangoFont, fill in the <structfield>klass</structfield> member of
+// * the nested #PangoFont with a pointer to
+// * a appropriate #PangoFontClass, then call
+// * pango_font_init() on the structure.
+// *
+// * The #PangoFont structure contains one member
+// * which the implementation fills in.
+// */
+//struct _PangoFont
+//{
+// GObject parent_instance;
+//};
+//
+//struct _PangoFontClass
+//{
+// GObjectClass parent_class;
+//
+// /*< public >*/
+//
+// PangoFontDescription *(*describe) (PangoFont *font);
+// PangoCoverage * (*get_coverage) (PangoFont *font,
+// PangoLanguage *lang);
+// PangoEngineShape * (*find_shaper) (PangoFont *font,
+// PangoLanguage *lang,
+// guint32 ch);
+// void (*get_glyph_extents) (PangoFont *font,
+// PangoGlyph glyph,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+// PangoFontMetrics * (*get_metrics) (PangoFont *font,
+// PangoLanguage *language);
+// PangoFontMap * (*get_font_map) (PangoFont *font);
+// PangoFontDescription *(*describe_absolute) (PangoFont *font);
+// /*< private >*/
+//
+// /* Padding for future expansion */
+// void (*_pango_reserved1) (void);
+// void (*_pango_reserved2) (void);
+//};
+//
+///* used for very rare and miserable situtations that we cannot even
+// * draw a hexbox
+// */
+//#define PANGO_UNKNOWN_GLYPH_WIDTH 10
+//#define PANGO_UNKNOWN_GLYPH_HEIGHT 14
+//
+//#endif /* PANGO_ENABLE_BACKEND */
+//
+///**
+// * PANGO_GLYPH_EMPTY:
+// *
+// * The %PANGO_GLYPH_EMPTY macro represents a #PangoGlyph value that has a
+// * special meaning, which is a zero-width empty glyph. This is useful for
+// * example in shaper modules, to use as the glyph for various zero-width
+// * Unicode characters (those passing pango_is_zero_width()).
+// */
+///**
+// * PANGO_GLYPH_INVALID_INPUT:
+// *
+// * The %PANGO_GLYPH_INVALID_INPUT macro represents a #PangoGlyph value that has a
+// * special meaning of invalid input. #PangoLayout produces one such glyph
+// * per invalid input UTF-8 byte and such a glyph is rendered as a crossed
+// * box.
+// *
+// * Note that this value is defined such that it has the %PANGO_GLYPH_UNKNOWN_FLAG
+// * on.
+// *
+// * Since: 1.20
+// */
+///**
+// * PANGO_GLYPH_UNKNOWN_FLAG:
+// *
+// * The %PANGO_GLYPH_UNKNOWN_FLAG macro is a flag value that can be added to
+// * a #gunichar value of a valid Unicode character, to produce a #PangoGlyph
+// * value, representing an unknown-character glyph for the respective #gunichar.
+// */
+///**
+// * PANGO_GET_UNKNOWN_GLYPH:
+// * @wc: a Unicode character
+// *
+// * The way this unknown glyphs are rendered is backend specific. For example,
+// * a box with the hexadecimal Unicode code-point of the character written in it
+// * is what is done in the most common backends.
+// *
+// * Returns: a #PangoGlyph value that means no glyph was found for @wc.
+// */
+//#define PANGO_GLYPH_EMPTY ((PangoGlyph)0x0FFFFFFF)
+//#define PANGO_GLYPH_INVALID_INPUT ((PangoGlyph)0xFFFFFFFF)
+//#define PANGO_GLYPH_UNKNOWN_FLAG ((PangoGlyph)0x10000000)
+//#define PANGO_GET_UNKNOWN_GLYPH(wc) ((PangoGlyph)(wc)|PANGO_GLYPH_UNKNOWN_FLAG)
+//
+//
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-glyph-item.go b/vendor/github.com/gotk3/gotk3/pango/pango-glyph-item.go
new file mode 100644
index 0000000..bed9fc2
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-glyph-item.go
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package pango
+
+// #include <pango/pango.h>
+// #include "pango.go.h"
+// #include <stdlib.h>
+import "C"
+import (
+ // "github.com/andre-hub/gotk3/glib"
+ // "github.com/andre-hub/gotk3/cairo"
+ "unsafe"
+)
+
+// GlyphItem is a representation of PangoGlyphItem.
+type GlyphItem struct {
+ pangoGlyphItem *C.PangoGlyphItem
+}
+
+// Native returns a pointer to the underlying PangoGlyphItem.
+func (v *GlyphItem) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *GlyphItem) native() *C.PangoGlyphItem {
+ return (*C.PangoGlyphItem)(unsafe.Pointer(v.pangoGlyphItem))
+}
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-glyph.go b/vendor/github.com/gotk3/gotk3/pango/pango-glyph.go
new file mode 100644
index 0000000..2ea29f7
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-glyph.go
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package pango
+
+// #include <pango/pango.h>
+// #include "pango.go.h"
+// #include <stdlib.h>
+import "C"
+import (
+ // "github.com/andre-hub/gotk3/glib"
+ // "github.com/andre-hub/gotk3/cairo"
+ "unsafe"
+)
+
+// GlyphGeometry is a representation of PangoGlyphGeometry.
+type GlyphGeometry struct {
+ pangoGlyphGeometry *C.PangoGlyphGeometry
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *GlyphGeometry) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *GlyphGeometry) native() *C.PangoGlyphGeometry {
+ return (*C.PangoGlyphGeometry)(unsafe.Pointer(v.pangoGlyphGeometry))
+}
+
+// GlyphVisAttr is a representation of PangoGlyphVisAttr.
+type GlyphVisAttr struct {
+ pangoGlyphVisAttr *C.PangoGlyphGeometry
+}
+
+// Native returns a pointer to the underlying PangoGlyphVisAttr.
+func (v *GlyphVisAttr) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *GlyphVisAttr) native() *C.PangoGlyphVisAttr {
+ return (*C.PangoGlyphVisAttr)(unsafe.Pointer(v.pangoGlyphVisAttr))
+}
+
+// GlyphInfo is a representation of PangoGlyphInfo.
+type GlyphInfo struct {
+ pangoGlyphInfo *C.PangoGlyphInfo
+}
+
+// Native returns a pointer to the underlying PangoGlyphInfo.
+func (v *GlyphInfo) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *GlyphInfo) native() *C.PangoGlyphInfo {
+ return (*C.PangoGlyphInfo)(unsafe.Pointer(v.pangoGlyphInfo))
+}
+
+// GlyphGeometry is a representation of PangoGlyphString.
+type GlyphString struct {
+ pangoGlyphString *C.PangoGlyphString
+}
+
+// Native returns a pointer to the underlying PangoGlyphString.
+func (v *GlyphString) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *GlyphString) native() *C.PangoGlyphString {
+ return (*C.PangoGlyphString)(unsafe.Pointer(v.pangoGlyphString))
+}
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-gravity.go b/vendor/github.com/gotk3/gotk3/pango/pango-gravity.go
new file mode 100644
index 0000000..7bd3800
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-gravity.go
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package pango
+
+// #include <pango/pango.h>
+// #include "pango.go.h"
+import "C"
+
+// "github.com/andre-hub/gotk3/glib"
+// "github.com/andre-hub/gotk3/cairo"
+// "unsafe"
+
+type Gravity int
+
+const (
+ GRAVITY_SOUTH Gravity = C.PANGO_GRAVITY_SOUTH
+ GRAVITY_EAST Gravity = C.PANGO_GRAVITY_EAST
+ GRAVITY_NORTH Gravity = C.PANGO_GRAVITY_NORTH
+ GRAVITY_WEST Gravity = C.PANGO_GRAVITY_WEST
+ GRAVITY_AUTO Gravity = C.PANGO_GRAVITY_AUTO
+)
+
+type GravityHint int
+
+const (
+ GRAVITY_HINT_NATURAL GravityHint = C.PANGO_GRAVITY_HINT_NATURAL
+ GRAVITY_HINT_STRONG GravityHint = C.PANGO_GRAVITY_HINT_STRONG
+ GRAVITY_HINT_LINE GravityHint = C.PANGO_GRAVITY_HINT_LINE
+)
+
+//double pango_gravity_to_rotation (PangoGravity gravity) G_GNUC_CONST;
+func GravityToRotation(gravity Gravity) float64 {
+ c := C.pango_gravity_to_rotation((C.PangoGravity)(gravity))
+ return float64(c)
+}
+
+//PangoGravity pango_gravity_get_for_matrix (const PangoMatrix *matrix) G_GNUC_PURE;
+
+//PangoGravity pango_gravity_get_for_script (PangoScript script,
+// PangoGravity base_gravity,
+// PangoGravityHint hint) G_GNUC_CONST;
+
+//PangoGravity pango_gravity_get_for_script_and_width
+// (PangoScript script,
+// gboolean wide,
+// PangoGravity base_gravity,
+// PangoGravityHint hint) G_GNUC_CONST;
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-layout.go b/vendor/github.com/gotk3/gotk3/pango/pango-layout.go
new file mode 100644
index 0000000..3e3a01b
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-layout.go
@@ -0,0 +1,469 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package pango
+
+// #include <pango/pango.h>
+// #include "pango.go.h"
+import "C"
+import (
+ "unsafe"
+
+ "github.com/gotk3/gotk3/glib"
+)
+
+func init() {
+ tm := []glib.TypeMarshaler{
+ // Enums
+ {glib.Type(C.pango_alignment_get_type()), marshalAlignment},
+ {glib.Type(C.pango_ellipsize_mode_get_type()), marshalEllipsizeMode},
+ {glib.Type(C.pango_wrap_mode_get_type()), marshalWrapMode},
+
+ // Objects/Interfaces
+ // {glib.Type(C.pango_layout_get_type()), marshalLayout},
+ }
+ glib.RegisterGValueMarshalers(tm)
+}
+
+// Layout is a representation of PangoLayout.
+type Layout struct {
+ pangoLayout *C.PangoLayout
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *Layout) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *Layout) native() *C.PangoLayout {
+ return (*C.PangoLayout)(unsafe.Pointer(v.pangoLayout))
+}
+
+func WrapLayout(p uintptr) *Layout {
+ layout := new(Layout)
+ layout.pangoLayout = (*C.PangoLayout)(unsafe.Pointer(p))
+ return layout
+}
+
+// LayoutLine is a representation of PangoLayoutLine.
+type LayoutLine struct {
+ pangoLayoutLine *C.PangoLayout
+}
+
+// Native returns a pointer to the underlying PangoLayoutLine.
+func (v *LayoutLine) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *LayoutLine) native() *C.PangoLayoutLine {
+ return (*C.PangoLayoutLine)(unsafe.Pointer(v.pangoLayoutLine))
+}
+
+/*
+ * Constants
+ */
+
+// Alignment is a representation of Pango's PangoAlignment.
+type Alignment int
+
+const (
+ ALIGN_LEFT Alignment = C.PANGO_ALIGN_LEFT
+ ALIGN_CENTER Alignment = C.PANGO_ALIGN_CENTER
+ ALIGN_RIGHT Alignment = C.PANGO_ALIGN_RIGHT
+)
+
+func marshalAlignment(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return Alignment(c), nil
+}
+
+// WrapMode is a representation of Pango's PangoWrapMode.
+type WrapMode int
+
+const (
+ WRAP_WORD WrapMode = C.PANGO_WRAP_WORD
+ WRAP_CHAR WrapMode = C.PANGO_WRAP_CHAR
+ WRAP_WORD_CHAR WrapMode = C.PANGO_WRAP_WORD_CHAR
+)
+
+func marshalWrapMode(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return WrapMode(c), nil
+}
+
+// EllipsizeMode is a representation of Pango's PangoEllipsizeMode.
+type EllipsizeMode int
+
+const (
+ ELLIPSIZE_NONE EllipsizeMode = C.PANGO_ELLIPSIZE_NONE
+ ELLIPSIZE_START EllipsizeMode = C.PANGO_ELLIPSIZE_START
+ ELLIPSIZE_MIDDLE EllipsizeMode = C.PANGO_ELLIPSIZE_MIDDLE
+ ELLIPSIZE_END EllipsizeMode = C.PANGO_ELLIPSIZE_END
+)
+
+func marshalEllipsizeMode(p uintptr) (interface{}, error) {
+ c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
+ return EllipsizeMode(c), nil
+}
+
+/*
+func marshalLayout(p uintptr) (interface{}, error) {
+ c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
+ obj := wrapObject(unsafe.Pointer(c))
+ return wrapLayout(obj), nil
+}
+
+func wrapLayout(obj *glib.Object) *Layout {
+ return &Layout{obj}
+}
+*/
+
+//PangoLayout *pango_layout_new (PangoContext *context);
+func LayoutNew(context *Context) *Layout {
+ c := C.pango_layout_new(context.native())
+
+ layout := new(Layout)
+ layout.pangoLayout = (*C.PangoLayout)(c)
+ return layout
+}
+
+//PangoLayout *pango_layout_copy (PangoLayout *src);
+func (v *Layout) Copy() *Layout {
+ c := C.pango_layout_copy(v.native())
+
+ layout := new(Layout)
+ layout.pangoLayout = (*C.PangoLayout)(c)
+ return layout
+}
+
+//PangoContext *pango_layout_get_context (PangoLayout *layout);
+func (v *Layout) GetContext() *Context {
+ c := C.pango_layout_get_context(v.native())
+
+ context := new(Context)
+ context.pangoContext = (*C.PangoContext)(c)
+
+ return context
+}
+
+//void pango_layout_set_attributes (PangoLayout *layout,
+// PangoAttrList *attrs);
+func (v *Layout) SetAttributes(attrs *AttrList) {
+ C.pango_layout_set_attributes(v.native(), attrs.native())
+}
+
+//PangoAttrList *pango_layout_get_attributes (PangoLayout *layout);
+func (v *Layout) GetAttributes() *AttrList {
+ c := C.pango_layout_get_attributes(v.native())
+
+ attrList := new(AttrList)
+ attrList.pangoAttrList = (*C.PangoAttrList)(c)
+
+ return attrList
+}
+
+//void pango_layout_set_text (PangoLayout *layout,
+// const char *text,
+// int length);
+func (v *Layout) SetText(text string, length int) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.pango_layout_set_text(v.native(), (*C.char)(cstr), (C.int)(length))
+}
+
+//const char *pango_layout_get_text (PangoLayout *layout);
+func (v *Layout) GetText() string {
+ c := C.pango_layout_get_text(v.native())
+ return C.GoString((*C.char)(c))
+}
+
+//gint pango_layout_get_character_count (PangoLayout *layout);
+func (v *Layout) GetCharacterCount() int {
+ c := C.pango_layout_get_character_count(v.native())
+ return int(c)
+}
+
+//void pango_layout_set_markup (PangoLayout *layout,
+// const char *markup,
+// int length);
+func (v *Layout) SetMarkup(text string, length int) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.pango_layout_set_markup(v.native(), (*C.char)(cstr), (C.int)(length))
+}
+
+//void pango_layout_set_markup_with_accel (PangoLayout *layout,
+// const char *markup,
+// int length,
+// gunichar accel_marker,
+// gunichar *accel_char);
+
+/*
+func (v *Layout)SetMarkupWithAccel (text string, length int, accel_marker, accel_char rune){
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.pango_layout_set_markup_with_accel (v.native(), (*C.char)(cstr), (C.int)(length), (C.gunichar)(accel_marker), (C.gunichar)(accel_char) )
+}
+*/
+
+//void pango_layout_set_font_description (PangoLayout *layout,
+// const PangoFontDescription *desc);
+
+func (v *Layout) SetFontDescription(desc *FontDescription) {
+ C.pango_layout_set_font_description(v.native(), desc.native())
+}
+
+//const PangoFontDescription *pango_layout_get_font_description (PangoLayout *layout);
+
+func (v *Layout) GetFontDescription() *FontDescription {
+ c := C.pango_layout_get_font_description(v.native())
+
+ desc := new(FontDescription)
+ desc.pangoFontDescription = (*C.PangoFontDescription)(c)
+
+ return desc
+}
+
+//void pango_layout_set_width (PangoLayout *layout,
+// int width);
+
+func (v *Layout) SetWidth(width int) {
+ C.pango_layout_set_width(v.native(), C.int(width))
+}
+
+//int pango_layout_get_width (PangoLayout *layout);
+
+func (v *Layout) GetWidth() int {
+ c := C.pango_layout_get_width(v.native())
+ return int(c)
+}
+
+//void pango_layout_set_height (PangoLayout *layout,
+// int height);
+
+func (v *Layout) SetHeight(width int) {
+ C.pango_layout_set_height(v.native(), C.int(width))
+}
+
+//int pango_layout_get_height (PangoLayout *layout);
+
+func (v *Layout) GetHeight() int {
+ c := C.pango_layout_get_height(v.native())
+ return int(c)
+}
+
+//void pango_layout_set_wrap (PangoLayout *layout,
+// PangoWrapMode wrap);
+
+func (v *Layout) SetWrap(wrap WrapMode) {
+ C.pango_layout_set_wrap(v.native(), C.PangoWrapMode(wrap))
+}
+
+//PangoWrapMode pango_layout_get_wrap (PangoLayout *layout);
+
+func (v *Layout) GetWrap() WrapMode {
+ c := C.pango_layout_get_wrap(v.native())
+ return WrapMode(c)
+}
+
+//gboolean pango_layout_is_wrapped (PangoLayout *layout);
+
+func (v *Layout) IsWrapped() bool {
+ c := C.pango_layout_is_wrapped(v.native())
+ return gobool(c)
+}
+
+//void pango_layout_set_indent (PangoLayout *layout,
+// int indent);
+
+func (v *Layout) SetIndent(indent int) {
+ C.pango_layout_set_indent(v.native(), C.int(indent))
+}
+
+//int pango_layout_get_indent (PangoLayout *layout);
+
+func (v *Layout) GetIndent() int {
+ c := C.pango_layout_get_indent(v.native())
+ return int(c)
+}
+
+//void pango_layout_set_spacing (PangoLayout *layout,
+// int spacing);
+//int pango_layout_get_spacing (PangoLayout *layout);
+//void pango_layout_set_justify (PangoLayout *layout,
+// gboolean justify);
+//gboolean pango_layout_get_justify (PangoLayout *layout);
+//void pango_layout_set_auto_dir (PangoLayout *layout,
+// gboolean auto_dir);
+//gboolean pango_layout_get_auto_dir (PangoLayout *layout);
+//void pango_layout_set_alignment (PangoLayout *layout,
+// PangoAlignment alignment);
+//PangoAlignment pango_layout_get_alignment (PangoLayout *layout);
+//
+//void pango_layout_set_tabs (PangoLayout *layout,
+// PangoTabArray *tabs);
+//
+//PangoTabArray* pango_layout_get_tabs (PangoLayout *layout);
+//
+//void pango_layout_set_single_paragraph_mode (PangoLayout *layout,
+// gboolean setting);
+//gboolean pango_layout_get_single_paragraph_mode (PangoLayout *layout);
+//
+//void pango_layout_set_ellipsize (PangoLayout *layout,
+// PangoEllipsizeMode ellipsize);
+//PangoEllipsizeMode pango_layout_get_ellipsize (PangoLayout *layout);
+//gboolean pango_layout_is_ellipsized (PangoLayout *layout);
+//
+//int pango_layout_get_unknown_glyphs_count (PangoLayout *layout);
+//
+//void pango_layout_context_changed (PangoLayout *layout);
+//guint pango_layout_get_serial (PangoLayout *layout);
+//
+//void pango_layout_get_log_attrs (PangoLayout *layout,
+// PangoLogAttr **attrs,
+// gint *n_attrs);
+//
+//const PangoLogAttr *pango_layout_get_log_attrs_readonly (PangoLayout *layout,
+// gint *n_attrs);
+//
+//void pango_layout_index_to_pos (PangoLayout *layout,
+// int index_,
+// PangoRectangle *pos);
+//void pango_layout_index_to_line_x (PangoLayout *layout,
+// int index_,
+// gboolean trailing,
+// int *line,
+// int *x_pos);
+//void pango_layout_get_cursor_pos (PangoLayout *layout,
+// int index_,
+// PangoRectangle *strong_pos,
+// PangoRectangle *weak_pos);
+//void pango_layout_move_cursor_visually (PangoLayout *layout,
+// gboolean strong,
+// int old_index,
+// int old_trailing,
+// int direction,
+// int *new_index,
+// int *new_trailing);
+//gboolean pango_layout_xy_to_index (PangoLayout *layout,
+// int x,
+// int y,
+// int *index_,
+// int *trailing);
+//void pango_layout_get_extents (PangoLayout *layout,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+//void pango_layout_get_pixel_extents (PangoLayout *layout,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+
+//void pango_layout_get_size (PangoLayout *layout,
+// int *width,
+// int *height);
+func (v *Layout) GetSize() (int, int) {
+ var w, h C.int
+ C.pango_layout_get_size(v.native(), &w, &h)
+ return int(w), int(h)
+}
+
+//void pango_layout_get_pixel_size (PangoLayout *layout,
+// int *width,
+// int *height);
+//int pango_layout_get_baseline (PangoLayout *layout);
+//
+//int pango_layout_get_line_count (PangoLayout *layout);
+//PangoLayoutLine *pango_layout_get_line (PangoLayout *layout,
+// int line);
+//PangoLayoutLine *pango_layout_get_line_readonly (PangoLayout *layout,
+// int line);
+//GSList * pango_layout_get_lines (PangoLayout *layout);
+//GSList * pango_layout_get_lines_readonly (PangoLayout *layout);
+//
+//
+//#define PANGO_TYPE_LAYOUT_LINE (pango_layout_line_get_type ())
+//
+//GType pango_layout_line_get_type (void) G_GNUC_CONST;
+//
+//PangoLayoutLine *pango_layout_line_ref (PangoLayoutLine *line);
+//void pango_layout_line_unref (PangoLayoutLine *line);
+//
+//gboolean pango_layout_line_x_to_index (PangoLayoutLine *line,
+// int x_pos,
+// int *index_,
+// int *trailing);
+//void pango_layout_line_index_to_x (PangoLayoutLine *line,
+// int index_,
+// gboolean trailing,
+// int *x_pos);
+//void pango_layout_line_get_x_ranges (PangoLayoutLine *line,
+// int start_index,
+// int end_index,
+// int **ranges,
+// int *n_ranges);
+//void pango_layout_line_get_extents (PangoLayoutLine *line,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+//void pango_layout_line_get_pixel_extents (PangoLayoutLine *layout_line,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+//
+//typedef struct _PangoLayoutIter PangoLayoutIter;
+//
+//#define PANGO_TYPE_LAYOUT_ITER (pango_layout_iter_get_type ())
+//
+//GType pango_layout_iter_get_type (void) G_GNUC_CONST;
+//
+//PangoLayoutIter *pango_layout_get_iter (PangoLayout *layout);
+//PangoLayoutIter *pango_layout_iter_copy (PangoLayoutIter *iter);
+//void pango_layout_iter_free (PangoLayoutIter *iter);
+//
+//int pango_layout_iter_get_index (PangoLayoutIter *iter);
+//PangoLayoutRun *pango_layout_iter_get_run (PangoLayoutIter *iter);
+//PangoLayoutRun *pango_layout_iter_get_run_readonly (PangoLayoutIter *iter);
+//PangoLayoutLine *pango_layout_iter_get_line (PangoLayoutIter *iter);
+//PangoLayoutLine *pango_layout_iter_get_line_readonly (PangoLayoutIter *iter);
+//gboolean pango_layout_iter_at_last_line (PangoLayoutIter *iter);
+//PangoLayout *pango_layout_iter_get_layout (PangoLayoutIter *iter);
+//
+//gboolean pango_layout_iter_next_char (PangoLayoutIter *iter);
+//gboolean pango_layout_iter_next_cluster (PangoLayoutIter *iter);
+//gboolean pango_layout_iter_next_run (PangoLayoutIter *iter);
+//gboolean pango_layout_iter_next_line (PangoLayoutIter *iter);
+//
+//void pango_layout_iter_get_char_extents (PangoLayoutIter *iter,
+// PangoRectangle *logical_rect);
+//void pango_layout_iter_get_cluster_extents (PangoLayoutIter *iter,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+//void pango_layout_iter_get_run_extents (PangoLayoutIter *iter,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+//void pango_layout_iter_get_line_extents (PangoLayoutIter *iter,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+/* All the yranges meet, unlike the logical_rect's (i.e. the yranges
+ * assign between-line spacing to the nearest line)
+ */
+//void pango_layout_iter_get_line_yrange (PangoLayoutIter *iter,
+// int *y0_,
+// int *y1_);
+//void pango_layout_iter_get_layout_extents (PangoLayoutIter *iter,
+// PangoRectangle *ink_rect,
+// PangoRectangle *logical_rect);
+//int pango_layout_iter_get_baseline (PangoLayoutIter *iter);
+//
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-layout.go.h b/vendor/github.com/gotk3/gotk3/pango/pango-layout.go.h
new file mode 100644
index 0000000..0f4e2fd
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-layout.go.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+static PangoLayout* toPangoLayout(void *p)
+{
+ return ( (PangoLayout*) (p) );
+}
+
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango-types.go b/vendor/github.com/gotk3/gotk3/pango/pango-types.go
new file mode 100644
index 0000000..fb08656
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango-types.go
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package pango
+
+// #include <pango/pango.h>
+// #include "pango.go.h"
+// #include <stdlib.h>
+import "C"
+import (
+ "unsafe"
+)
+
+// LogAttr is a representation of PangoLogAttr.
+type LogAttr struct {
+ pangoLogAttr *C.PangoLogAttr
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *LogAttr) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *LogAttr) native() *C.PangoLogAttr {
+ return (*C.PangoLogAttr)(unsafe.Pointer(v.pangoLogAttr))
+}
+
+// EngineLang is a representation of PangoEngineLang.
+type EngineLang struct {
+ pangoEngineLang *C.PangoEngineLang
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *EngineLang) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *EngineLang) native() *C.PangoEngineLang {
+ return (*C.PangoEngineLang)(unsafe.Pointer(v.pangoEngineLang))
+}
+
+// EngineShape is a representation of PangoEngineShape.
+type EngineShape struct {
+ pangoEngineShape *C.PangoEngineShape
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *EngineShape) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *EngineShape) native() *C.PangoEngineShape {
+ return (*C.PangoEngineShape)(unsafe.Pointer(v.pangoEngineShape))
+}
+
+// Font is a representation of PangoFont.
+type Font struct {
+ pangoFont *C.PangoFont
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *Font) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *Font) native() *C.PangoFont {
+ return (*C.PangoFont)(unsafe.Pointer(v.pangoFont))
+}
+
+// FontMap is a representation of PangoFontMap.
+type FontMap struct {
+ pangoFontMap *C.PangoFontMap
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *FontMap) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *FontMap) native() *C.PangoFontMap {
+ return (*C.PangoFontMap)(unsafe.Pointer(v.pangoFontMap))
+}
+
+func wrapFontMap(fontMap *C.PangoFontMap) *FontMap {
+ return &FontMap{fontMap}
+}
+
+func WrapFontMap(p uintptr) *FontMap {
+ fontMap := (*C.PangoFontMap)(unsafe.Pointer(p))
+ return wrapFontMap(fontMap)
+}
+
+// Rectangle is a representation of PangoRectangle.
+type Rectangle struct {
+ pangoRectangle *C.PangoRectangle
+}
+
+// Native returns a pointer to the underlying PangoLayout.
+func (v *Rectangle) Native() uintptr {
+ return uintptr(unsafe.Pointer(v.native()))
+}
+
+func (v *Rectangle) native() *C.PangoRectangle {
+ return (*C.PangoRectangle)(unsafe.Pointer(v.pangoRectangle))
+}
+
+// Glyph is a representation of PangoGlyph
+type Glyph uint32
+
+//void pango_extents_to_pixels (PangoRectangle *inclusive,
+// PangoRectangle *nearest);
+func (inclusive *Rectangle) ExtentsToPixels(nearest *Rectangle) {
+ C.pango_extents_to_pixels(inclusive.native(), nearest.native())
+}
+
+func RectangleNew(x, y, width, height int) *Rectangle {
+ r := new(Rectangle)
+ r.pangoRectangle = C.createPangoRectangle((C.int)(x), (C.int)(y), (C.int)(width), (C.int)(height))
+ return r
+}
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango.go b/vendor/github.com/gotk3/gotk3/pango/pango.go
new file mode 100644
index 0000000..ee39d3d
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango.go
@@ -0,0 +1,55 @@
+// Copyright (c) 2013-2014 Conformal Systems <info@conformal.com>
+//
+// This file originated from: http://opensource.conformal.com/
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+// Go bindings for Pango.
+package pango
+
+// #cgo pkg-config: fontconfig gobject-2.0 pango pangocairo
+// #include <pango/pango.h>
+// #include "pango.go.h"
+import "C"
+
+// "github.com/andre-hub/gotk3/glib"
+// "unsafe"
+
+func init() {
+
+}
+
+/*
+ * Type conversions
+ */
+
+func gbool(b bool) C.gboolean {
+ if b {
+ return C.gboolean(1)
+ }
+ return C.gboolean(0)
+}
+func gobool(b C.gboolean) bool {
+ if b != 0 {
+ return true
+ }
+ return false
+}
+
+/*
+ * Constantes
+ */
+
+const (
+ SCALE int = 1024
+)
diff --git a/vendor/github.com/gotk3/gotk3/pango/pango.go.h b/vendor/github.com/gotk3/gotk3/pango/pango.go.h
new file mode 100644
index 0000000..a5fb61d
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pango.go.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "pango-attributes.go.h"
+#include "pango-layout.go.h"
+
+#include "pangocairo.go.h"
+
+
+static PangoRectangle *
+createPangoRectangle(int x, int y, int width, int height)
+{
+ PangoRectangle *r = (PangoRectangle *)malloc(sizeof(PangoRectangle));
+ r->x = x;
+ r->y = y;
+ r->width = width;
+ r->height = height;
+ return r;
+} \ No newline at end of file
diff --git a/vendor/github.com/gotk3/gotk3/pango/pangocairo.go b/vendor/github.com/gotk3/gotk3/pango/pangocairo.go
new file mode 100644
index 0000000..260e345
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pangocairo.go
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2015- terrak <terrak1975@gmail.com>
+ *
+ * This file originated from: http://www.terrak.net/
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package pango
+
+// #include <pango/pango.h>
+// #include <cairo.h>
+// #include <pango/pangocairo.h>
+// #include "pango.go.h"
+import "C"
+import (
+ // "github.com/gotk3/gotk3/glib"
+ "unsafe"
+
+ "github.com/gotk3/gotk3/cairo"
+)
+
+func init() {
+ // tm := []glib.TypeMarshaler{
+ // // Enums
+ // {glib.Type(C.pango_alignement_get_type()), marshalAlignment},
+ // {glib.Type(C.pango_ellipsize_mode_get_type()), marshalEllipsizeMode},
+ // {glib.Type(C.pango_wrap_mode_get_type()), marshalWrapMode},
+ // }
+ // glib.RegisterGValueMarshalers(tm)
+}
+
+func cairo_context(cr *cairo.Context) *C.cairo_t {
+ return (*C.cairo_t)(cr.GetCContext())
+}
+
+/* Convenience
+ */
+//PangoContext *pango_cairo_create_context (cairo_t *cr);
+func CairoCreateContext(cr *cairo.Context) *Context {
+ c := C.pango_cairo_create_context(cairo_context(cr))
+ context := new(Context)
+ context.pangoContext = (*C.PangoContext)(c)
+ return context
+}
+
+//PangoLayout *pango_cairo_create_layout (cairo_t *cr);
+func CairoCreateLayout(cr *cairo.Context) *Layout {
+ c := C.pango_cairo_create_layout(cairo_context(cr))
+ layout := new(Layout)
+ layout.pangoLayout = (*C.PangoLayout)(c)
+ return layout
+}
+
+//void pango_cairo_update_layout (cairo_t *cr,
+// PangoLayout *layout);
+func CairoUpdateLayout(cr *cairo.Context, v *Layout) {
+ C.pango_cairo_update_layout(cairo_context(cr), v.native())
+}
+
+/*
+ * Rendering
+ */
+//void pango_cairo_show_glyph_string (cairo_t *cr,
+// PangoFont *font,
+// PangoGlyphString *glyphs);
+func CairoShowGlyphString(cr *cairo.Context, font *Font, glyphs *GlyphString) {
+ C.pango_cairo_show_glyph_string(cairo_context(cr), font.native(), glyphs.native())
+}
+
+//void pango_cairo_show_glyph_item (cairo_t *cr,
+// const char *text,
+// PangoGlyphItem *glyph_item);
+func CairoShowGlyphItem(cr *cairo.Context, text string, glyph_item *GlyphItem) {
+ cstr := C.CString(text)
+ defer C.free(unsafe.Pointer(cstr))
+ C.pango_cairo_show_glyph_item(cairo_context(cr), (*C.char)(cstr), glyph_item.native())
+}
+
+//void pango_cairo_show_layout_line (cairo_t *cr,
+// PangoLayoutLine *line);
+func CairoShowLayoutLine(cr *cairo.Context, line *LayoutLine) {
+ C.pango_cairo_show_layout_line(cairo_context(cr), line.native())
+}
+
+//void pango_cairo_show_layout (cairo_t *cr,
+// PangoLayout *layout);
+func CairoShowLayout(cr *cairo.Context, layout *Layout) {
+ C.pango_cairo_show_layout(cairo_context(cr), layout.native())
+}
+
+//void pango_cairo_show_error_underline (cairo_t *cr,
+// double x,
+// double y,
+// double width,
+// double height);
+
+/*
+ * Rendering to a path
+ */
+
+//void pango_cairo_glyph_string_path (cairo_t *cr,
+// PangoFont *font,
+// PangoGlyphString *glyphs);
+func CairoGlyphStringPath(cr *cairo.Context, font *Font, glyphs *GlyphString) {
+ C.pango_cairo_glyph_string_path(cairo_context(cr), font.native(), glyphs.native())
+}
+
+//void pango_cairo_layout_line_path (cairo_t *cr,
+// PangoLayoutLine *line);
+func CairoLayoutLinePath(cr *cairo.Context, line *LayoutLine) {
+ C.pango_cairo_layout_line_path(cairo_context(cr), line.native())
+}
+
+//void pango_cairo_layout_path (cairo_t *cr,
+// PangoLayout *layout);
+func CairoLayoutPath(cr *cairo.Context, layout *Layout) {
+ C.pango_cairo_layout_path(cairo_context(cr), layout.native())
+}
+
+//void pango_cairo_error_underline_path (cairo_t *cr,
+// double x,
+// double y,
+// double width,
+// double height);
+func CairoErrorUnderlinePath(cr *cairo.Context, x, y, width, height float64) {
+ C.pango_cairo_error_underline_path(cairo_context(cr), C.double(x), C.double(y), C.double(width), C.double(height))
+}
diff --git a/vendor/github.com/gotk3/gotk3/pango/pangocairo.go.h b/vendor/github.com/gotk3/gotk3/pango/pangocairo.go.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/vendor/github.com/gotk3/gotk3/pango/pangocairo.go.h
diff --git a/vendor/github.com/jmshal/go-locale/detect_locale_darwin.go b/vendor/github.com/jmshal/go-locale/detect_locale_darwin.go
new file mode 100644
index 0000000..4cce554
--- /dev/null
+++ b/vendor/github.com/jmshal/go-locale/detect_locale_darwin.go
@@ -0,0 +1,9 @@
+package go_locale
+
+func DetectLocale() (string, error) {
+ return getCommandOutput(
+ "defaults",
+ "read",
+ "/Library/Preferences/.GlobalPreferences",
+ "AppleLocale")
+}
diff --git a/vendor/github.com/jmshal/go-locale/detect_locale_linux.go b/vendor/github.com/jmshal/go-locale/detect_locale_linux.go
new file mode 100644
index 0000000..df0c33d
--- /dev/null
+++ b/vendor/github.com/jmshal/go-locale/detect_locale_linux.go
@@ -0,0 +1,31 @@
+package go_locale
+
+import (
+ "strings"
+ "errors"
+)
+
+func DetectLocale() (string, error) {
+ out, err := getCommandOutput("locale")
+ if err != nil {
+ return "", err
+ }
+
+ lines := strings.Split(out, "\n")
+ for _, line := range lines {
+ if line != "" {
+ parts := strings.Split(line, "=")
+ value := strings.Trim(parts[1], `"`)
+
+ if value != "C" && value != "" {
+ encodingIndex := strings.Index(value, ".")
+ if encodingIndex != -1 {
+ value = value[0:encodingIndex]
+ }
+ return value, nil
+ }
+ }
+ }
+
+ return "", errors.New("unable to locale locale")
+}
diff --git a/vendor/github.com/jmshal/go-locale/detect_locale_windows.go b/vendor/github.com/jmshal/go-locale/detect_locale_windows.go
new file mode 100644
index 0000000..849928d
--- /dev/null
+++ b/vendor/github.com/jmshal/go-locale/detect_locale_windows.go
@@ -0,0 +1,29 @@
+package go_locale
+
+import (
+ "strings"
+ "strconv"
+)
+
+func DetectLocale() (string, error) {
+ out, err := getCommandOutput("wmic", "os", "get", "locale")
+ if err != nil {
+ return "", err
+ }
+
+ out = strings.Replace(out, "Locale", "", -1)
+ out = strings.TrimSpace(out)
+
+ id, err := strconv.ParseInt(out, 16, 64)
+ if err != nil {
+ return "", err
+ }
+
+ lcid := LCID()
+ locale, err := lcid.ById(int(id))
+ if err != nil {
+ return "", err
+ }
+
+ return locale, nil
+}
diff --git a/vendor/github.com/jmshal/go-locale/get_command_output.go b/vendor/github.com/jmshal/go-locale/get_command_output.go
new file mode 100644
index 0000000..c4013d2
--- /dev/null
+++ b/vendor/github.com/jmshal/go-locale/get_command_output.go
@@ -0,0 +1,16 @@
+package go_locale
+
+import (
+ "os/exec"
+)
+
+func getCommandOutput(name string, args ...string) (string, error) {
+ cmd := exec.Command(name, args...)
+
+ out, err := cmd.Output()
+ if err != nil {
+ return "", err
+ }
+
+ return string(out), nil
+}
diff --git a/vendor/github.com/jmshal/go-locale/lc_windows.go b/vendor/github.com/jmshal/go-locale/lc_windows.go
new file mode 100644
index 0000000..70c6795
--- /dev/null
+++ b/vendor/github.com/jmshal/go-locale/lc_windows.go
@@ -0,0 +1,241 @@
+package go_locale
+
+import "errors"
+
+type LC struct {
+ index map[string]int
+}
+
+var UNKNOWN_LOCALE error = errors.New("unknown locale")
+var UNKNOWN_ID error = errors.New("unknown id")
+
+var _lc LC
+
+func LCID() LC {
+ return _lc
+}
+
+func (lc *LC) ByLocaleString(localeString string) (int, error) {
+ for lcidLocaleString, lcidId := range lc.index {
+ if localeString == lcidLocaleString {
+ return lcidId, nil
+ }
+ }
+ return 0, UNKNOWN_LOCALE
+}
+
+func (lc *LC) ById(id int) (string, error) {
+ for lcidLocaleString, lcidId := range lc.index {
+ if id == lcidId {
+ return lcidLocaleString, nil
+ }
+ }
+ return "", UNKNOWN_ID
+}
+
+func init() {
+ // Source: https://raw.githubusercontent.com/sindresorhus/lcid/master/lcid.json
+ index := make(map[string]int, 201)
+ index["af_ZA"] = 1078
+ index["am_ET"] = 1118
+ index["ar_AE"] = 14337
+ index["ar_BH"] = 15361
+ index["ar_DZ"] = 5121
+ index["ar_EG"] = 3073
+ index["ar_IQ"] = 2049
+ index["ar_JO"] = 11265
+ index["ar_KW"] = 13313
+ index["ar_LB"] = 12289
+ index["ar_LY"] = 4097
+ index["ar_MA"] = 6145
+ index["ar_OM"] = 8193
+ index["ar_QA"] = 16385
+ index["ar_SA"] = 1025
+ index["ar_SY"] = 10241
+ index["ar_TN"] = 7169
+ index["ar_YE"] = 9217
+ index["arn_CL"] = 1146
+ index["as_IN"] = 1101
+ index["az_AZ"] = 2092
+ index["ba_RU"] = 1133
+ index["be_BY"] = 1059
+ index["bg_BG"] = 1026
+ index["bn_IN"] = 1093
+ index["bo_BT"] = 2129
+ index["bo_CN"] = 1105
+ index["br_FR"] = 1150
+ index["bs_BA"] = 8218
+ index["ca_ES"] = 1027
+ index["co_FR"] = 1155
+ index["cs_CZ"] = 1029
+ index["cy_GB"] = 1106
+ index["da_DK"] = 1030
+ index["de_AT"] = 3079
+ index["de_CH"] = 2055
+ index["de_DE"] = 1031
+ index["de_LI"] = 5127
+ index["de_LU"] = 4103
+ index["div_MV"] = 1125
+ index["dsb_DE"] = 2094
+ index["el_GR"] = 1032
+ index["en_AU"] = 3081
+ index["en_BZ"] = 10249
+ index["en_CA"] = 4105
+ index["en_CB"] = 9225
+ index["en_GB"] = 2057
+ index["en_IE"] = 6153
+ index["en_IN"] = 18441
+ index["en_JA"] = 8201
+ index["en_MY"] = 17417
+ index["en_NZ"] = 5129
+ index["en_PH"] = 13321
+ index["en_TT"] = 11273
+ index["en_US"] = 1033
+ index["en_ZA"] = 7177
+ index["en_ZW"] = 12297
+ index["es_AR"] = 11274
+ index["es_BO"] = 16394
+ index["es_CL"] = 13322
+ index["es_CO"] = 9226
+ index["es_CR"] = 5130
+ index["es_DO"] = 7178
+ index["es_EC"] = 12298
+ index["es_ES"] = 3082
+ index["es_GT"] = 4106
+ index["es_HN"] = 18442
+ index["es_MX"] = 2058
+ index["es_NI"] = 19466
+ index["es_PA"] = 6154
+ index["es_PE"] = 10250
+ index["es_PR"] = 20490
+ index["es_PY"] = 15370
+ index["es_SV"] = 17418
+ index["es_UR"] = 14346
+ index["es_US"] = 21514
+ index["es_VE"] = 8202
+ index["et_EE"] = 1061
+ index["eu_ES"] = 1069
+ index["fa_IR"] = 1065
+ index["fi_FI"] = 1035
+ index["fil_PH"] = 1124
+ index["fo_FO"] = 1080
+ index["fr_BE"] = 2060
+ index["fr_CA"] = 3084
+ index["fr_CH"] = 4108
+ index["fr_FR"] = 1036
+ index["fr_LU"] = 5132
+ index["fr_MC"] = 6156
+ index["fy_NL"] = 1122
+ index["ga_IE"] = 2108
+ index["gbz_AF"] = 1164
+ index["gl_ES"] = 1110
+ index["gsw_FR"] = 1156
+ index["gu_IN"] = 1095
+ index["ha_NG"] = 1128
+ index["he_IL"] = 1037
+ index["hi_IN"] = 1081
+ index["hr_BA"] = 4122
+ index["hr_HR"] = 1050
+ index["hu_HU"] = 1038
+ index["hy_AM"] = 1067
+ index["id_ID"] = 1057
+ index["ii_CN"] = 1144
+ index["is_IS"] = 1039
+ index["it_CH"] = 2064
+ index["it_IT"] = 1040
+ index["iu_CA"] = 2141
+ index["ja_JP"] = 1041
+ index["ka_GE"] = 1079
+ index["kh_KH"] = 1107
+ index["kk_KZ"] = 1087
+ index["kl_GL"] = 1135
+ index["kn_IN"] = 1099
+ index["ko_KR"] = 1042
+ index["kok_IN"] = 1111
+ index["ky_KG"] = 1088
+ index["lb_LU"] = 1134
+ index["lo_LA"] = 1108
+ index["lt_LT"] = 1063
+ index["lv_LV"] = 1062
+ index["mi_NZ"] = 1153
+ index["mk_MK"] = 1071
+ index["ml_IN"] = 1100
+ index["mn_CN"] = 2128
+ index["mn_MN"] = 1104
+ index["moh_CA"] = 1148
+ index["mr_IN"] = 1102
+ index["ms_BN"] = 2110
+ index["ms_MY"] = 1086
+ index["mt_MT"] = 1082
+ index["my_MM"] = 1109
+ index["nb_NO"] = 1044
+ index["ne_NP"] = 1121
+ index["nl_BE"] = 2067
+ index["nl_NL"] = 1043
+ index["nn_NO"] = 2068
+ index["ns_ZA"] = 1132
+ index["oc_FR"] = 1154
+ index["or_IN"] = 1096
+ index["pa_IN"] = 1094
+ index["pl_PL"] = 1045
+ index["ps_AF"] = 1123
+ index["pt_BR"] = 1046
+ index["pt_PT"] = 2070
+ index["qut_GT"] = 1158
+ index["quz_BO"] = 1131
+ index["quz_EC"] = 2155
+ index["quz_PE"] = 3179
+ index["rm_CH"] = 1047
+ index["ro_RO"] = 1048
+ index["ru_RU"] = 1049
+ index["rw_RW"] = 1159
+ index["sa_IN"] = 1103
+ index["sah_RU"] = 1157
+ index["se_FI"] = 3131
+ index["se_NO"] = 1083
+ index["se_SE"] = 2107
+ index["si_LK"] = 1115
+ index["sk_SK"] = 1051
+ index["sl_SI"] = 1060
+ index["sma_NO"] = 6203
+ index["sma_SE"] = 7227
+ index["smj_NO"] = 4155
+ index["smj_SE"] = 5179
+ index["smn_FI"] = 9275
+ index["sms_FI"] = 8251
+ index["sq_AL"] = 1052
+ index["sr_BA"] = 7194
+ index["sr_SP"] = 3098
+ index["sv_FI"] = 2077
+ index["sv_SE"] = 1053
+ index["sw_KE"] = 1089
+ index["syr_SY"] = 1114
+ index["ta_IN"] = 1097
+ index["te_IN"] = 1098
+ index["tg_TJ"] = 1064
+ index["th_TH"] = 1054
+ index["tk_TM"] = 1090
+ index["tmz_DZ"] = 2143
+ index["tn_ZA"] = 1074
+ index["tr_TR"] = 1055
+ index["tt_RU"] = 1092
+ index["ug_CN"] = 1152
+ index["uk_UA"] = 1058
+ index["ur_IN"] = 2080
+ index["ur_PK"] = 1056
+ index["uz_UZ"] = 2115
+ index["vi_VN"] = 1066
+ index["wen_DE"] = 1070
+ index["wo_SN"] = 1160
+ index["xh_ZA"] = 1076
+ index["yo_NG"] = 1130
+ index["zh_CHS"] = 4
+ index["zh_CHT"] = 31748
+ index["zh_CN"] = 2052
+ index["zh_HK"] = 3076
+ index["zh_MO"] = 5124
+ index["zh_SG"] = 4100
+ index["zh_TW"] = 1028
+ index["zu_ZA"] = 1077
+ _lc = LC{index}
+}
diff --git a/vendor/github.com/jmshal/go-locale/locale_test.go b/vendor/github.com/jmshal/go-locale/locale_test.go
new file mode 100644
index 0000000..e3743b6
--- /dev/null
+++ b/vendor/github.com/jmshal/go-locale/locale_test.go
@@ -0,0 +1,11 @@
+package go_locale
+
+import "testing"
+
+func TestLocale(t *testing.T) {
+ if lc, err := DetectLocale(); err != nil {
+ t.Fatal(err)
+ } else {
+ t.Logf("detected locale: %q", lc)
+ }
+}
diff --git a/vendor/github.com/mitchellh/go-ps/LICENSE.md b/vendor/github.com/mitchellh/go-ps/LICENSE.md
new file mode 100644
index 0000000..2298515
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/LICENSE.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Mitchell Hashimoto
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/github.com/mitchellh/go-ps/README.md b/vendor/github.com/mitchellh/go-ps/README.md
new file mode 100644
index 0000000..8e8baf9
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/README.md
@@ -0,0 +1,34 @@
+# Process List Library for Go
+
+go-ps is a library for Go that implements OS-specific APIs to list and
+manipulate processes in a platform-safe way. The library can find and
+list processes on Linux, Mac OS X, Solaris, and Windows.
+
+If you're new to Go, this library has a good amount of advanced Go educational
+value as well. It uses some advanced features of Go: build tags, accessing
+DLL methods for Windows, cgo for Darwin, etc.
+
+How it works:
+
+ * **Darwin** uses the `sysctl` syscall to retrieve the process table.
+ * **Unix** uses the procfs at `/proc` to inspect the process tree.
+ * **Windows** uses the Windows API, and methods such as
+ `CreateToolhelp32Snapshot` to get a point-in-time snapshot of
+ the process table.
+
+## Installation
+
+Install using standard `go get`:
+
+```
+$ go get github.com/mitchellh/go-ps
+...
+```
+
+## TODO
+
+Want to contribute? Here is a short TODO list of things that aren't
+implemented for this library that would be nice:
+
+ * FreeBSD support
+ * Plan9 support
diff --git a/vendor/github.com/mitchellh/go-ps/Vagrantfile b/vendor/github.com/mitchellh/go-ps/Vagrantfile
new file mode 100644
index 0000000..61662ab
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/Vagrantfile
@@ -0,0 +1,43 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
+VAGRANTFILE_API_VERSION = "2"
+
+Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+ config.vm.box = "chef/ubuntu-12.04"
+
+ config.vm.provision "shell", inline: $script
+
+ ["vmware_fusion", "vmware_workstation"].each do |p|
+ config.vm.provider "p" do |v|
+ v.vmx["memsize"] = "1024"
+ v.vmx["numvcpus"] = "2"
+ v.vmx["cpuid.coresPerSocket"] = "1"
+ end
+ end
+end
+
+$script = <<SCRIPT
+SRCROOT="/opt/go"
+
+# Install Go
+sudo apt-get update
+sudo apt-get install -y build-essential mercurial
+sudo hg clone -u release https://code.google.com/p/go ${SRCROOT}
+cd ${SRCROOT}/src
+sudo ./all.bash
+
+# Setup the GOPATH
+sudo mkdir -p /opt/gopath
+cat <<EOF >/tmp/gopath.sh
+export GOPATH="/opt/gopath"
+export PATH="/opt/go/bin:\$GOPATH/bin:\$PATH"
+EOF
+sudo mv /tmp/gopath.sh /etc/profile.d/gopath.sh
+sudo chmod 0755 /etc/profile.d/gopath.sh
+
+# Make sure the gopath is usable by bamboo
+sudo chown -R vagrant:vagrant $SRCROOT
+sudo chown -R vagrant:vagrant /opt/gopath
+SCRIPT
diff --git a/vendor/github.com/mitchellh/go-ps/process.go b/vendor/github.com/mitchellh/go-ps/process.go
new file mode 100644
index 0000000..2b5e8ed
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process.go
@@ -0,0 +1,40 @@
+// ps provides an API for finding and listing processes in a platform-agnostic
+// way.
+//
+// NOTE: If you're reading these docs online via GoDocs or some other system,
+// you might only see the Unix docs. This project makes heavy use of
+// platform-specific implementations. We recommend reading the source if you
+// are interested.
+package ps
+
+// Process is the generic interface that is implemented on every platform
+// and provides common operations for processes.
+type Process interface {
+ // Pid is the process ID for this process.
+ Pid() int
+
+ // PPid is the parent process ID for this process.
+ PPid() int
+
+ // Executable name running this process. This is not a path to the
+ // executable.
+ Executable() string
+}
+
+// Processes returns all processes.
+//
+// This of course will be a point-in-time snapshot of when this method was
+// called. Some operating systems don't provide snapshot capability of the
+// process table, in which case the process table returned might contain
+// ephemeral entities that happened to be running when this was called.
+func Processes() ([]Process, error) {
+ return processes()
+}
+
+// FindProcess looks up a single process by pid.
+//
+// Process will be nil and error will be nil if a matching process is
+// not found.
+func FindProcess(pid int) (Process, error) {
+ return findProcess(pid)
+}
diff --git a/vendor/github.com/mitchellh/go-ps/process_darwin.go b/vendor/github.com/mitchellh/go-ps/process_darwin.go
new file mode 100644
index 0000000..5ee87fb
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process_darwin.go
@@ -0,0 +1,138 @@
+// +build darwin
+
+package ps
+
+import (
+ "bytes"
+ "encoding/binary"
+ "syscall"
+ "unsafe"
+)
+
+type DarwinProcess struct {
+ pid int
+ ppid int
+ binary string
+}
+
+func (p *DarwinProcess) Pid() int {
+ return p.pid
+}
+
+func (p *DarwinProcess) PPid() int {
+ return p.ppid
+}
+
+func (p *DarwinProcess) Executable() string {
+ return p.binary
+}
+
+func findProcess(pid int) (Process, error) {
+ ps, err := processes()
+ if err != nil {
+ return nil, err
+ }
+
+ for _, p := range ps {
+ if p.Pid() == pid {
+ return p, nil
+ }
+ }
+
+ return nil, nil
+}
+
+func processes() ([]Process, error) {
+ buf, err := darwinSyscall()
+ if err != nil {
+ return nil, err
+ }
+
+ procs := make([]*kinfoProc, 0, 50)
+ k := 0
+ for i := _KINFO_STRUCT_SIZE; i < buf.Len(); i += _KINFO_STRUCT_SIZE {
+ proc := &kinfoProc{}
+ err = binary.Read(bytes.NewBuffer(buf.Bytes()[k:i]), binary.LittleEndian, proc)
+ if err != nil {
+ return nil, err
+ }
+
+ k = i
+ procs = append(procs, proc)
+ }
+
+ darwinProcs := make([]Process, len(procs))
+ for i, p := range procs {
+ darwinProcs[i] = &DarwinProcess{
+ pid: int(p.Pid),
+ ppid: int(p.PPid),
+ binary: darwinCstring(p.Comm),
+ }
+ }
+
+ return darwinProcs, nil
+}
+
+func darwinCstring(s [16]byte) string {
+ i := 0
+ for _, b := range s {
+ if b != 0 {
+ i++
+ } else {
+ break
+ }
+ }
+
+ return string(s[:i])
+}
+
+func darwinSyscall() (*bytes.Buffer, error) {
+ mib := [4]int32{_CTRL_KERN, _KERN_PROC, _KERN_PROC_ALL, 0}
+ size := uintptr(0)
+
+ _, _, errno := syscall.Syscall6(
+ syscall.SYS___SYSCTL,
+ uintptr(unsafe.Pointer(&mib[0])),
+ 4,
+ 0,
+ uintptr(unsafe.Pointer(&size)),
+ 0,
+ 0)
+
+ if errno != 0 {
+ return nil, errno
+ }
+
+ bs := make([]byte, size)
+ _, _, errno = syscall.Syscall6(
+ syscall.SYS___SYSCTL,
+ uintptr(unsafe.Pointer(&mib[0])),
+ 4,
+ uintptr(unsafe.Pointer(&bs[0])),
+ uintptr(unsafe.Pointer(&size)),
+ 0,
+ 0)
+
+ if errno != 0 {
+ return nil, errno
+ }
+
+ return bytes.NewBuffer(bs[0:size]), nil
+}
+
+const (
+ _CTRL_KERN = 1
+ _KERN_PROC = 14
+ _KERN_PROC_ALL = 0
+ _KINFO_STRUCT_SIZE = 648
+)
+
+type kinfoProc struct {
+ _ [40]byte
+ Pid int32
+ _ [199]byte
+ Comm [16]byte
+ _ [301]byte
+ PPid int32
+ _ [84]byte
+}
diff --git a/vendor/github.com/mitchellh/go-ps/process_darwin_test.go b/vendor/github.com/mitchellh/go-ps/process_darwin_test.go
new file mode 100644
index 0000000..ee04c5c
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process_darwin_test.go
@@ -0,0 +1,11 @@
+// +build darwin
+
+package ps
+
+import (
+ "testing"
+)
+
+func TestDarwinProcess_impl(t *testing.T) {
+ var _ Process = new(DarwinProcess)
+}
diff --git a/vendor/github.com/mitchellh/go-ps/process_freebsd.go b/vendor/github.com/mitchellh/go-ps/process_freebsd.go
new file mode 100644
index 0000000..0212b66
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process_freebsd.go
@@ -0,0 +1,260 @@
+// +build freebsd,amd64
+
+package ps
+
+import (
+ "bytes"
+ "encoding/binary"
+ "syscall"
+ "unsafe"
+)
+
+// copied from sys/sysctl.h
+const (
+ CTL_KERN = 1 // "high kernel": proc, limits
+ KERN_PROC = 14 // struct: process entries
+ KERN_PROC_PID = 1 // by process id
+ KERN_PROC_PROC = 8 // only return procs
+ KERN_PROC_PATHNAME = 12 // path to executable
+)
+
+// copied from sys/user.h
+type Kinfo_proc struct {
+ Ki_structsize int32
+ Ki_layout int32
+ Ki_args int64
+ Ki_paddr int64
+ Ki_addr int64
+ Ki_tracep int64
+ Ki_textvp int64
+ Ki_fd int64
+ Ki_vmspace int64
+ Ki_wchan int64
+ Ki_pid int32
+ Ki_ppid int32
+ Ki_pgid int32
+ Ki_tpgid int32
+ Ki_sid int32
+ Ki_tsid int32
+ Ki_jobc [2]byte
+ Ki_spare_short1 [2]byte
+ Ki_tdev int32
+ Ki_siglist [16]byte
+ Ki_sigmask [16]byte
+ Ki_sigignore [16]byte
+ Ki_sigcatch [16]byte
+ Ki_uid int32
+ Ki_ruid int32
+ Ki_svuid int32
+ Ki_rgid int32
+ Ki_svgid int32
+ Ki_ngroups [2]byte
+ Ki_spare_short2 [2]byte
+ Ki_groups [64]byte
+ Ki_size int64
+ Ki_rssize int64
+ Ki_swrss int64
+ Ki_tsize int64
+ Ki_dsize int64
+ Ki_ssize int64
+ Ki_xstat [2]byte
+ Ki_acflag [2]byte
+ Ki_pctcpu int32
+ Ki_estcpu int32
+ Ki_slptime int32
+ Ki_swtime int32
+ Ki_cow int32
+ Ki_runtime int64
+ Ki_start [16]byte
+ Ki_childtime [16]byte
+ Ki_flag int64
+ Ki_kiflag int64
+ Ki_traceflag int32
+ Ki_stat [1]byte
+ Ki_nice [1]byte
+ Ki_lock [1]byte
+ Ki_rqindex [1]byte
+ Ki_oncpu [1]byte
+ Ki_lastcpu [1]byte
+ Ki_ocomm [17]byte
+ Ki_wmesg [9]byte
+ Ki_login [18]byte
+ Ki_lockname [9]byte
+ Ki_comm [20]byte
+ Ki_emul [17]byte
+ Ki_sparestrings [68]byte
+ Ki_spareints [36]byte
+ Ki_cr_flags int32
+ Ki_jid int32
+ Ki_numthreads int32
+ Ki_tid int32
+ Ki_pri int32
+ Ki_rusage [144]byte
+ Ki_rusage_ch [144]byte
+ Ki_pcb int64
+ Ki_kstack int64
+ Ki_udata int64
+ Ki_tdaddr int64
+ Ki_spareptrs [48]byte
+ Ki_spareint64s [96]byte
+ Ki_sflag int64
+ Ki_tdflags int64
+}
+
+// UnixProcess is an implementation of Process that contains Unix-specific
+// fields and information.
+type UnixProcess struct {
+ pid int
+ ppid int
+ state rune
+ pgrp int
+ sid int
+
+ binary string
+}
+
+func (p *UnixProcess) Pid() int {
+ return p.pid
+}
+
+func (p *UnixProcess) PPid() int {
+ return p.ppid
+}
+
+func (p *UnixProcess) Executable() string {
+ return p.binary
+}
+
+// Refresh reloads all the data associated with this process.
+func (p *UnixProcess) Refresh() error {
+
+ mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PID, int32(p.pid)}
+
+ buf, length, err := call_syscall(mib)
+ if err != nil {
+ return err
+ }
+ proc_k := Kinfo_proc{}
+ if length != uint64(unsafe.Sizeof(proc_k)) {
+ return err
+ }
+
+ k, err := parse_kinfo_proc(buf)
+ if err != nil {
+ return err
+ }
+
+ p.ppid, p.pgrp, p.sid, p.binary = copy_params(&k)
+ return nil
+}
+
+func copy_params(k *Kinfo_proc) (int, int, int, string) {
+ n := -1
+ for i, b := range k.Ki_comm {
+ if b == 0 {
+ break
+ }
+ n = i + 1
+ }
+ comm := string(k.Ki_comm[:n])
+
+ return int(k.Ki_ppid), int(k.Ki_pgid), int(k.Ki_sid), comm
+}
+
+func findProcess(pid int) (Process, error) {
+ mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, int32(pid)}
+
+ _, _, err := call_syscall(mib)
+ if err != nil {
+ return nil, err
+ }
+
+ return newUnixProcess(pid)
+}
+
+func processes() ([]Process, error) {
+ results := make([]Process, 0, 50)
+
+ mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PROC, 0}
+ buf, length, err := call_syscall(mib)
+ if err != nil {
+ return results, err
+ }
+
+ // get kinfo_proc size
+ k := Kinfo_proc{}
+ procinfo_len := int(unsafe.Sizeof(k))
+ count := int(length / uint64(procinfo_len))
+
+ // parse buf to procs
+ for i := 0; i < count; i++ {
+ b := buf[i*procinfo_len : i*procinfo_len+procinfo_len]
+ k, err := parse_kinfo_proc(b)
+ if err != nil {
+ continue
+ }
+ p, err := newUnixProcess(int(k.Ki_pid))
+ if err != nil {
+ continue
+ }
+ p.ppid, p.pgrp, p.sid, p.binary = copy_params(&k)
+
+ results = append(results, p)
+ }
+
+ return results, nil
+}
+
+func parse_kinfo_proc(buf []byte) (Kinfo_proc, error) {
+ var k Kinfo_proc
+ br := bytes.NewReader(buf)
+ err := binary.Read(br, binary.LittleEndian, &k)
+ if err != nil {
+ return k, err
+ }
+
+ return k, nil
+}
+
+func call_syscall(mib []int32) ([]byte, uint64, error) {
+ miblen := uint64(len(mib))
+
+ // get required buffer size
+ length := uint64(0)
+ _, _, err := syscall.RawSyscall6(
+ syscall.SYS___SYSCTL,
+ uintptr(unsafe.Pointer(&mib[0])),
+ uintptr(miblen),
+ 0,
+ uintptr(unsafe.Pointer(&length)),
+ 0,
+ 0)
+ if err != 0 {
+ b := make([]byte, 0)
+ return b, length, err
+ }
+ if length == 0 {
+ b := make([]byte, 0)
+ return b, length, err
+ }
+ // get proc info itself
+ buf := make([]byte, length)
+ _, _, err = syscall.RawSyscall6(
+ syscall.SYS___SYSCTL,
+ uintptr(unsafe.Pointer(&mib[0])),
+ uintptr(miblen),
+ uintptr(unsafe.Pointer(&buf[0])),
+ uintptr(unsafe.Pointer(&length)),
+ 0,
+ 0)
+ if err != 0 {
+ return buf, length, err
+ }
+
+ return buf, length, nil
+}
+
+func newUnixProcess(pid int) (*UnixProcess, error) {
+ p := &UnixProcess{pid: pid}
+ return p, p.Refresh()
+}
diff --git a/vendor/github.com/mitchellh/go-ps/process_linux.go b/vendor/github.com/mitchellh/go-ps/process_linux.go
new file mode 100644
index 0000000..c1558f7
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process_linux.go
@@ -0,0 +1,35 @@
+// +build linux
+
+package ps
+
+import (
+ "fmt"
+ "io/ioutil"
+ "strings"
+)
+
+// Refresh reloads all the data associated with this process.
+func (p *UnixProcess) Refresh() error {
+ statPath := fmt.Sprintf("/proc/%d/stat", p.pid)
+ dataBytes, err := ioutil.ReadFile(statPath)
+ if err != nil {
+ return err
+ }
+
+ // First, parse out the image name
+ data := string(dataBytes)
+ binStart := strings.IndexRune(data, '(') + 1
+ binEnd := strings.IndexRune(data[binStart:], ')')
+ p.binary = data[binStart : binStart+binEnd]
+
+ // Move past the image name and start parsing the rest
+ data = data[binStart+binEnd+2:]
+ _, err = fmt.Sscanf(data,
+ "%c %d %d %d",
+ &p.state,
+ &p.ppid,
+ &p.pgrp,
+ &p.sid)
+
+ return err
+}
diff --git a/vendor/github.com/mitchellh/go-ps/process_solaris.go b/vendor/github.com/mitchellh/go-ps/process_solaris.go
new file mode 100644
index 0000000..014c416
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process_solaris.go
@@ -0,0 +1,96 @@
+// +build solaris
+
+package ps
+
+import (
+ "encoding/binary"
+ "fmt"
+ "os"
+)
+
+type ushort_t uint16
+
+type id_t int32
+type pid_t int32
+type uid_t int32
+type gid_t int32
+
+type dev_t uint64
+type size_t uint64
+type uintptr_t uint64
+
+type timestruc_t [16]byte
+
+// This is copy from /usr/include/sys/procfs.h
+type psinfo_t struct {
+ Pr_flag int32 /* process flags (DEPRECATED; do not use) */
+ Pr_nlwp int32 /* number of active lwps in the process */
+ Pr_pid pid_t /* unique process id */
+ Pr_ppid pid_t /* process id of parent */
+ Pr_pgid pid_t /* pid of process group leader */
+ Pr_sid pid_t /* session id */
+ Pr_uid uid_t /* real user id */
+ Pr_euid uid_t /* effective user id */
+ Pr_gid gid_t /* real group id */
+ Pr_egid gid_t /* effective group id */
+ Pr_addr uintptr_t /* address of process */
+ Pr_size size_t /* size of process image in Kbytes */
+ Pr_rssize size_t /* resident set size in Kbytes */
+ Pr_pad1 size_t
+ Pr_ttydev dev_t /* controlling tty device (or PRNODEV) */
+
+ // Guess this following 2 ushort_t values require a padding to properly
+ // align to the 64bit mark.
+ Pr_pctcpu ushort_t /* % of recent cpu time used by all lwps */
+ Pr_pctmem ushort_t /* % of system memory used by process */
+ Pr_pad64bit [4]byte
+
+ Pr_start timestruc_t /* process start time, from the epoch */
+ Pr_time timestruc_t /* usr+sys cpu time for this process */
+ Pr_ctime timestruc_t /* usr+sys cpu time for reaped children */
+ Pr_fname [16]byte /* name of execed file */
+ Pr_psargs [80]byte /* initial characters of arg list */
+ Pr_wstat int32 /* if zombie, the wait() status */
+ Pr_argc int32 /* initial argument count */
+ Pr_argv uintptr_t /* address of initial argument vector */
+ Pr_envp uintptr_t /* address of initial environment vector */
+ Pr_dmodel [1]byte /* data model of the process */
+ Pr_pad2 [3]byte
+ Pr_taskid id_t /* task id */
+ Pr_projid id_t /* project id */
+ Pr_nzomb int32 /* number of zombie lwps in the process */
+ Pr_poolid id_t /* pool id */
+ Pr_zoneid id_t /* zone id */
+ Pr_contract id_t /* process contract */
+ Pr_filler int32 /* reserved for future use */
+ Pr_lwp [128]byte /* information for representative lwp */
+}
+
+func (p *UnixProcess) Refresh() error {
+ var psinfo psinfo_t
+
+ path := fmt.Sprintf("/proc/%d/psinfo", p.pid)
+ fh, err := os.Open(path)
+ if err != nil {
+ return err
+ }
+ defer fh.Close()
+
+ err = binary.Read(fh, binary.LittleEndian, &psinfo)
+ if err != nil {
+ return err
+ }
+
+ p.ppid = int(psinfo.Pr_ppid)
+ p.binary = toString(psinfo.Pr_fname[:], 16)
+ return nil
+}
+
+func toString(array []byte, len int) string {
+ for i := 0; i < len; i++ {
+ if array[i] == 0 {
+ return string(array[:i])
+ }
+ }
+ return string(array[:])
+}
diff --git a/vendor/github.com/mitchellh/go-ps/process_test.go b/vendor/github.com/mitchellh/go-ps/process_test.go
new file mode 100644
index 0000000..1bcbc32
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process_test.go
@@ -0,0 +1,45 @@
+package ps
+
+import (
+ "os"
+ "testing"
+)
+
+func TestFindProcess(t *testing.T) {
+ p, err := FindProcess(os.Getpid())
+ if err != nil {
+ t.Fatalf("err: %s", err)
+ }
+ if p == nil {
+ t.Fatal("should have process")
+ }
+
+ if p.Pid() != os.Getpid() {
+ t.Fatalf("bad: %#v", p.Pid())
+ }
+}
+
+func TestProcesses(t *testing.T) {
+ // This test works because there will always be SOME processes
+ // running.
+ p, err := Processes()
+ if err != nil {
+ t.Fatalf("err: %s", err)
+ }
+
+ if len(p) <= 0 {
+ t.Fatal("should have processes")
+ }
+
+ found := false
+ for _, p1 := range p {
+ if p1.Executable() == "go" || p1.Executable() == "go.exe" {
+ found = true
+ break
+ }
+ }
+
+ if !found {
+ t.Fatal("should have Go")
+ }
+}
diff --git a/vendor/github.com/mitchellh/go-ps/process_unix.go b/vendor/github.com/mitchellh/go-ps/process_unix.go
new file mode 100644
index 0000000..3b733ce
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process_unix.go
@@ -0,0 +1,101 @@
+// +build linux solaris
+
+package ps
+
+import (
+ "fmt"
+ "io"
+ "os"
+ "strconv"
+)
+
+// UnixProcess is an implementation of Process that contains Unix-specific
+// fields and information.
+type UnixProcess struct {
+ pid int
+ ppid int
+ state rune
+ pgrp int
+ sid int
+
+ binary string
+}
+
+func (p *UnixProcess) Pid() int {
+ return p.pid
+}
+
+func (p *UnixProcess) PPid() int {
+ return p.ppid
+}
+
+func (p *UnixProcess) Executable() string {
+ return p.binary
+}
+
+func findProcess(pid int) (Process, error) {
+ dir := fmt.Sprintf("/proc/%d", pid)
+ _, err := os.Stat(dir)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return nil, nil
+ }
+
+ return nil, err
+ }
+
+ return newUnixProcess(pid)
+}
+
+func processes() ([]Process, error) {
+ d, err := os.Open("/proc")
+ if err != nil {
+ return nil, err
+ }
+ defer d.Close()
+
+ results := make([]Process, 0, 50)
+ for {
+ fis, err := d.Readdir(10)
+ if err == io.EOF {
+ break
+ }
+ if err != nil {
+ return nil, err
+ }
+
+ for _, fi := range fis {
+ // We only care about directories, since all pids are dirs
+ if !fi.IsDir() {
+ continue
+ }
+
+ // We only care if the name starts with a numeric
+ name := fi.Name()
+ if name[0] < '0' || name[0] > '9' {
+ continue
+ }
+
+ // From this point forward, any errors we just ignore, because
+ // it might simply be that the process doesn't exist anymore.
+ pid, err := strconv.ParseInt(name, 10, 0)
+ if err != nil {
+ continue
+ }
+
+ p, err := newUnixProcess(int(pid))
+ if err != nil {
+ continue
+ }
+
+ results = append(results, p)
+ }
+ }
+
+ return results, nil
+}
+
+func newUnixProcess(pid int) (*UnixProcess, error) {
+ p := &UnixProcess{pid: pid}
+ return p, p.Refresh()
+}
diff --git a/vendor/github.com/mitchellh/go-ps/process_unix_test.go b/vendor/github.com/mitchellh/go-ps/process_unix_test.go
new file mode 100644
index 0000000..754073e
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process_unix_test.go
@@ -0,0 +1,11 @@
+// +build linux solaris
+
+package ps
+
+import (
+ "testing"
+)
+
+func TestUnixProcess_impl(t *testing.T) {
+ var _ Process = new(UnixProcess)
+}
diff --git a/vendor/github.com/mitchellh/go-ps/process_windows.go b/vendor/github.com/mitchellh/go-ps/process_windows.go
new file mode 100644
index 0000000..f151974
--- /dev/null
+++ b/vendor/github.com/mitchellh/go-ps/process_windows.go
@@ -0,0 +1,119 @@
+// +build windows
+
+package ps
+
+import (
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+// Windows API functions
+var (
+ modKernel32 = syscall.NewLazyDLL("kernel32.dll")
+ procCloseHandle = modKernel32.NewProc("CloseHandle")
+ procCreateToolhelp32Snapshot = modKernel32.NewProc("CreateToolhelp32Snapshot")
+ procProcess32First = modKernel32.NewProc("Process32FirstW")
+ procProcess32Next = modKernel32.NewProc("Process32NextW")
+)
+
+// Some constants from the Windows API
+const (
+ ERROR_NO_MORE_FILES = 0x12
+ MAX_PATH = 260
+)
+
+// PROCESSENTRY32 is the Windows API structure that contains a process's
+// information.
+type PROCESSENTRY32 struct {
+ Size uint32
+ CntUsage uint32
+ ProcessID uint32
+ DefaultHeapID uintptr
+ ModuleID uint32
+ CntThreads uint32
+ ParentProcessID uint32
+ PriorityClassBase int32
+ Flags uint32
+ ExeFile [MAX_PATH]uint16
+}
+
+// WindowsProcess is an implementation of Process for Windows.
+type WindowsProcess struct {
+ pid int
+ ppid int
+ exe string
+}
+
+func (p *WindowsProcess) Pid() int {
+ return p.pid
+}
+
+func (p *WindowsProcess) PPid() int {
+ return p.ppid
+}
+
+func (p *WindowsProcess) Executable() string {
+ return p.exe
+}
+
+func newWindowsProcess(e *PROCESSENTRY32) *WindowsProcess {
+ // Find when the string ends for decoding
+ end := 0
+ for {
+ if e.ExeFile[end] == 0 {
+ break
+ }
+ end++
+ }
+
+ return &WindowsProcess{
+ pid: int(e.ProcessID),
+ ppid: int(e.ParentProcessID),
+ exe: syscall.UTF16ToString(e.ExeFile[:end]),
+ }
+}
+
+func findProcess(pid int) (Process, error) {
+ ps, err := processes()
+ if err != nil {
+ return nil, err
+ }
+
+ for _, p := range ps {
+ if p.Pid() == pid {
+ return p, nil
+ }
+ }
+
+ return nil, nil
+}
+
+func processes() ([]Process, error) {
+ handle, _, _ := procCreateToolhelp32Snapshot.Call(
+ 0x00000002,
+ 0)
+ if handle < 0 {
+ return nil, syscall.GetLastError()
+ }
+ defer procCloseHandle.Call(handle)
+
+ var entry PROCESSENTRY32
+ entry.Size = uint32(unsafe.Sizeof(entry))
+ ret, _, _ := procProcess32First.Call(handle, uintptr(unsafe.Pointer(&entry)))
+ if ret == 0 {
+ return nil, fmt.Errorf("Error retrieving process info.")
+ }
+
+ results := make([]Process, 0, 50)
+ for {
+ results = append(results, newWindowsProcess(&entry))
+
+ ret, _, _ := procProcess32Next.Call(handle, uintptr(unsafe.Pointer(&entry)))
+ if ret == 0 {
+ break
+ }
+ }
+
+ return results, nil
+}
diff --git a/vendor/github.com/oxtoacart/bpool/LICENSE b/vendor/github.com/oxtoacart/bpool/LICENSE
new file mode 100644
index 0000000..f94e97c
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2014 Percy Wegmann
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/vendor/github.com/oxtoacart/bpool/README.md b/vendor/github.com/oxtoacart/bpool/README.md
new file mode 100644
index 0000000..9acf3f9
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/README.md
@@ -0,0 +1,65 @@
+# bpool [![GoDoc](https://godoc.org/github.com/oxtoacart/bpool?status.png)](https://godoc.org/github.com/oxtoacart/bpool)
+
+Package bpool implements leaky pools of byte arrays and Buffers as bounded channels.
+It is based on the leaky buffer example from the Effective Go documentation: http://golang.org/doc/effective_go.html#leaky_buffer
+
+bpool provides the following pool types:
+
+* [bpool.BufferPool](https://godoc.org/github.com/oxtoacart/bpool#BufferPool)
+ which provides a fixed-size pool of
+ [bytes.Buffers](http://golang.org/pkg/bytes/#Buffer).
+* [bpool.BytePool](https://godoc.org/github.com/oxtoacart/bpool#BytePool) which
+ provides a fixed-size pool of `[]byte` slices with a pre-set width (length).
+* [bpool.SizedBufferPool](https://godoc.org/github.com/oxtoacart/bpool#SizedBufferPool),
+ which is an alternative to `bpool.BufferPool` that pre-sizes the capacity of
+ buffers issued from the pool and discards buffers that have grown too large
+ upon return.
+
+A common use case for this package is to use buffers to execute HTML templates
+against (via ExecuteTemplate) or encode JSON into (via json.NewEncoder). This
+allows you to catch any rendering or marshalling errors prior to writing to a
+`http.ResponseWriter`, which helps to avoid writing incomplete or malformed data
+to the response.
+
+## Install
+
+`go get github.com/oxtoacart/bpool`
+
+## Documentation
+
+See [godoc.org](http://godoc.org/github.com/oxtoacart/bpool) or use `godoc github.com/oxtoacart/bpool`
+
+## Example
+
+Here's a quick example for using `bpool.BufferPool`. We create a pool of the
+desired size, call the `Get()` method to obtain a buffer for use, and call
+`Put(buf)` to return the buffer to the pool.
+
+```go
+
+var bufpool *bpool.BufferPool
+
+func main() {
+
+ bufpool = bpool.NewBufferPool(48)
+
+}
+
+func someFunction() error {
+
+ // Get a buffer from the pool
+ buf := bufpool.Get()
+ ...
+ ...
+ ...
+ // Return the buffer to the pool
+ bufpool.Put(buf)
+
+ return nil
+}
+```
+
+## License
+
+Apache 2.0 Licensed. See the LICENSE file for details.
+
diff --git a/vendor/github.com/oxtoacart/bpool/bpool.go b/vendor/github.com/oxtoacart/bpool/bpool.go
new file mode 100644
index 0000000..6232a38
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/bpool.go
@@ -0,0 +1,6 @@
+/*
+Package bpool implements leaky pools of byte arrays and Buffers as bounded
+channels. It is based on the leaky buffer example from the Effective Go
+documentation: http://golang.org/doc/effective_go.html#leaky_buffer
+*/
+package bpool
diff --git a/vendor/github.com/oxtoacart/bpool/bufferpool.go b/vendor/github.com/oxtoacart/bpool/bufferpool.go
new file mode 100644
index 0000000..8c8ac64
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/bufferpool.go
@@ -0,0 +1,40 @@
+package bpool
+
+import (
+ "bytes"
+)
+
+// BufferPool implements a pool of bytes.Buffers in the form of a bounded
+// channel.
+type BufferPool struct {
+ c chan *bytes.Buffer
+}
+
+// NewBufferPool creates a new BufferPool bounded to the given size.
+func NewBufferPool(size int) (bp *BufferPool) {
+ return &BufferPool{
+ c: make(chan *bytes.Buffer, size),
+ }
+}
+
+// Get gets a Buffer from the BufferPool, or creates a new one if none are
+// available in the pool.
+func (bp *BufferPool) Get() (b *bytes.Buffer) {
+ select {
+ case b = <-bp.c:
+ // reuse existing buffer
+ default:
+ // create new buffer
+ b = bytes.NewBuffer([]byte{})
+ }
+ return
+}
+
+// Put returns the given Buffer to the BufferPool.
+func (bp *BufferPool) Put(b *bytes.Buffer) {
+ b.Reset()
+ select {
+ case bp.c <- b:
+ default: // Discard the buffer if the pool is full.
+ }
+}
diff --git a/vendor/github.com/oxtoacart/bpool/bufferpool_test.go b/vendor/github.com/oxtoacart/bpool/bufferpool_test.go
new file mode 100644
index 0000000..b344bdc
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/bufferpool_test.go
@@ -0,0 +1,30 @@
+package bpool
+
+import (
+ "bytes"
+ "testing"
+)
+
+func TestBufferPool(t *testing.T) {
+ var size int = 4
+
+ bufPool := NewBufferPool(size)
+
+ // Test Get/Put
+ b := bufPool.Get()
+ bufPool.Put(b)
+
+ // Add some additional buffers beyond the pool size.
+ for i := 0; i < size*2; i++ {
+ bufPool.Put(bytes.NewBuffer([]byte{}))
+ }
+
+ // Close the channel so we can iterate over it.
+ close(bufPool.c)
+
+ // Check the size of the pool.
+ if len(bufPool.c) != size {
+ t.Fatalf("bufferpool size invalid: got %v want %v", len(bufPool.c), size)
+ }
+
+}
diff --git a/vendor/github.com/oxtoacart/bpool/bytepool.go b/vendor/github.com/oxtoacart/bpool/bytepool.go
new file mode 100644
index 0000000..ef3898a
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/bytepool.go
@@ -0,0 +1,45 @@
+package bpool
+
+// BytePool implements a leaky pool of []byte in the form of a bounded
+// channel.
+type BytePool struct {
+ c chan []byte
+ w int
+}
+
+// NewBytePool creates a new BytePool bounded to the given maxSize, with new
+// byte arrays sized based on width.
+func NewBytePool(maxSize int, width int) (bp *BytePool) {
+ return &BytePool{
+ c: make(chan []byte, maxSize),
+ w: width,
+ }
+}
+
+// Get gets a []byte from the BytePool, or creates a new one if none are
+// available in the pool.
+func (bp *BytePool) Get() (b []byte) {
+ select {
+ case b = <-bp.c:
+ // reuse existing buffer
+ default:
+ // create new buffer
+ b = make([]byte, bp.w)
+ }
+ return
+}
+
+// Put returns the given Buffer to the BytePool.
+func (bp *BytePool) Put(b []byte) {
+ select {
+ case bp.c <- b:
+ // buffer went back into pool
+ default:
+ // buffer didn't go back into pool, just discard
+ }
+}
+
+// Width returns the width of the byte arrays in this pool.
+func (bp *BytePool) Width() (n int) {
+ return bp.w
+}
diff --git a/vendor/github.com/oxtoacart/bpool/bytepool_test.go b/vendor/github.com/oxtoacart/bpool/bytepool_test.go
new file mode 100644
index 0000000..216fd5b
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/bytepool_test.go
@@ -0,0 +1,37 @@
+package bpool
+
+import "testing"
+
+func TestBytePool(t *testing.T) {
+ var size int = 4
+ var width int = 10
+
+ bufPool := NewBytePool(size, width)
+
+ // Check the width
+ if bufPool.Width() != width {
+ t.Fatalf("bytepool width invalid: got %v want %v", bufPool.Width(), width)
+ }
+
+ // Check that retrieved buffer are of the expected width
+ b := bufPool.Get()
+ if len(b) != width {
+ t.Fatalf("bytepool length invalid: got %v want %v", len(b), width)
+ }
+
+ bufPool.Put(b)
+
+ // Fill the pool beyond the capped pool size.
+ for i := 0; i < size*2; i++ {
+ bufPool.Put(make([]byte, bufPool.w))
+ }
+
+ // Close the channel so we can iterate over it.
+ close(bufPool.c)
+
+ // Check the size of the pool.
+ if len(bufPool.c) != size {
+ t.Fatalf("bytepool size invalid: got %v want %v", len(bufPool.c), size)
+ }
+
+}
diff --git a/vendor/github.com/oxtoacart/bpool/sizedbufferpool.go b/vendor/github.com/oxtoacart/bpool/sizedbufferpool.go
new file mode 100644
index 0000000..8519aca
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/sizedbufferpool.go
@@ -0,0 +1,60 @@
+package bpool
+
+import (
+ "bytes"
+)
+
+// SizedBufferPool implements a pool of bytes.Buffers in the form of a bounded
+// channel. Buffers are pre-allocated to the requested size.
+type SizedBufferPool struct {
+ c chan *bytes.Buffer
+ a int
+}
+
+// SizedBufferPool creates a new BufferPool bounded to the given size.
+// size defines the number of buffers to be retained in the pool and alloc sets
+// the initial capacity of new buffers to minimize calls to make().
+//
+// The value of alloc should seek to provide a buffer that is representative of
+// most data written to the the buffer (i.e. 95th percentile) without being
+// overly large (which will increase static memory consumption). You may wish to
+// track the capacity of your last N buffers (i.e. using an []int) prior to
+// returning them to the pool as input into calculating a suitable alloc value.
+func NewSizedBufferPool(size int, alloc int) (bp *SizedBufferPool) {
+ return &SizedBufferPool{
+ c: make(chan *bytes.Buffer, size),
+ a: alloc,
+ }
+}
+
+// Get gets a Buffer from the SizedBufferPool, or creates a new one if none are
+// available in the pool. Buffers have a pre-allocated capacity.
+func (bp *SizedBufferPool) Get() (b *bytes.Buffer) {
+ select {
+ case b = <-bp.c:
+ // reuse existing buffer
+ default:
+ // create new buffer
+ b = bytes.NewBuffer(make([]byte, 0, bp.a))
+ }
+ return
+}
+
+// Put returns the given Buffer to the SizedBufferPool.
+func (bp *SizedBufferPool) Put(b *bytes.Buffer) {
+ b.Reset()
+
+ // Release buffers over our maximum capacity and re-create a pre-sized
+ // buffer to replace it.
+ // Note that the cap(b.Bytes()) provides the capacity from the read off-set
+ // only, but as we've called b.Reset() the full capacity of the underlying
+ // byte slice is returned.
+ if cap(b.Bytes()) > bp.a {
+ b = bytes.NewBuffer(make([]byte, 0, bp.a))
+ }
+
+ select {
+ case bp.c <- b:
+ default: // Discard the buffer if the pool is full.
+ }
+}
diff --git a/vendor/github.com/oxtoacart/bpool/sizedbufferpool_test.go b/vendor/github.com/oxtoacart/bpool/sizedbufferpool_test.go
new file mode 100644
index 0000000..6e574b3
--- /dev/null
+++ b/vendor/github.com/oxtoacart/bpool/sizedbufferpool_test.go
@@ -0,0 +1,50 @@
+package bpool
+
+import (
+ "bytes"
+ "testing"
+)
+
+// TestSizedBufferPool checks that over-sized buffers are released and that new
+// buffers are created in their place.
+func TestSizedBufferPool(t *testing.T) {
+
+ var size int = 4
+ var capacity int = 1024
+
+ bufPool := NewSizedBufferPool(size, capacity)
+
+ b := bufPool.Get()
+
+ // Check the cap before we use the buffer.
+ if cap(b.Bytes()) != capacity {
+ t.Fatalf("buffer capacity incorrect: got %v want %v", cap(b.Bytes()),
+ capacity)
+ }
+
+ // Grow the buffer beyond our capacity and return it to the pool
+ b.Grow(capacity * 3)
+ bufPool.Put(b)
+
+ // Add some additional buffers to fill up the pool.
+ for i := 0; i < size; i++ {
+ bufPool.Put(bytes.NewBuffer(make([]byte, 0, bufPool.a*2)))
+ }
+
+ // Check that oversized buffers are being replaced.
+ if len(bufPool.c) < size {
+ t.Fatalf("buffer pool too small: got %v want %v", len(bufPool.c), size)
+ }
+
+ // Close the channel so we can iterate over it.
+ close(bufPool.c)
+
+ // Check that there are buffers of the correct capacity in the pool.
+ for buffer := range bufPool.c {
+ if cap(buffer.Bytes()) != bufPool.a {
+ t.Fatalf("returned buffers wrong capacity: got %v want %v",
+ cap(buffer.Bytes()), capacity)
+ }
+ }
+
+}
diff --git a/vendor/github.com/skratchdot/open-golang/LICENSE-MIT b/vendor/github.com/skratchdot/open-golang/LICENSE-MIT
new file mode 100644
index 0000000..afd04c8
--- /dev/null
+++ b/vendor/github.com/skratchdot/open-golang/LICENSE-MIT
@@ -0,0 +1,22 @@
+Copyright (c) 2013 skratchdot
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/skratchdot/open-golang/open/exec.go b/vendor/github.com/skratchdot/open-golang/open/exec.go
new file mode 100644
index 0000000..1b0e713
--- /dev/null
+++ b/vendor/github.com/skratchdot/open-golang/open/exec.go
@@ -0,0 +1,18 @@
+// +build !windows,!darwin
+
+package open
+
+import (
+ "os/exec"
+)
+
+// http://sources.debian.net/src/xdg-utils/1.1.0~rc1%2Bgit20111210-7.1/scripts/xdg-open/
+// http://sources.debian.net/src/xdg-utils/1.1.0~rc1%2Bgit20111210-7.1/scripts/xdg-mime/
+
+func open(input string) *exec.Cmd {
+ return exec.Command("xdg-open", input)
+}
+
+func openWith(input string, appName string) *exec.Cmd {
+ return exec.Command(appName, input)
+}
diff --git a/vendor/github.com/skratchdot/open-golang/open/exec_darwin.go b/vendor/github.com/skratchdot/open-golang/open/exec_darwin.go
new file mode 100644
index 0000000..16160e6
--- /dev/null
+++ b/vendor/github.com/skratchdot/open-golang/open/exec_darwin.go
@@ -0,0 +1,15 @@
+// +build darwin
+
+package open
+
+import (
+ "os/exec"
+)
+
+func open(input string) *exec.Cmd {
+ return exec.Command("open", input)
+}
+
+func openWith(input string, appName string) *exec.Cmd {
+ return exec.Command("open", "-a", appName, input)
+}
diff --git a/vendor/github.com/skratchdot/open-golang/open/exec_windows.go b/vendor/github.com/skratchdot/open-golang/open/exec_windows.go
new file mode 100644
index 0000000..59f56b0
--- /dev/null
+++ b/vendor/github.com/skratchdot/open-golang/open/exec_windows.go
@@ -0,0 +1,33 @@
+// +build windows
+
+package open
+
+import (
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strings"
+ "syscall"
+)
+
+var (
+ cmd = "url.dll,FileProtocolHandler"
+ runDll32 = filepath.Join(os.Getenv("SYSTEMROOT"), "System32", "rundll32.exe")
+)
+
+func cleaninput(input string) string {
+ r := strings.NewReplacer("&", "^&")
+ return r.Replace(input)
+}
+
+func open(input string) *exec.Cmd {
+ cmd := exec.Command(runDll32, cmd, input)
+ cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
+ return cmd
+}
+
+func openWith(input string, appName string) *exec.Cmd {
+ cmd := exec.Command("cmd", "/C", "start", "", appName, cleaninput(input))
+ cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
+ return cmd
+}
diff --git a/vendor/github.com/skratchdot/open-golang/open/open.go b/vendor/github.com/skratchdot/open-golang/open/open.go
new file mode 100644
index 0000000..b1f648f
--- /dev/null
+++ b/vendor/github.com/skratchdot/open-golang/open/open.go
@@ -0,0 +1,50 @@
+/*
+
+ Open a file, directory, or URI using the OS's default
+ application for that object type. Optionally, you can
+ specify an application to use.
+
+ This is a proxy for the following commands:
+
+ OSX: "open"
+ Windows: "start"
+ Linux/Other: "xdg-open"
+
+ This is a golang port of the node.js module: https://github.com/pwnall/node-open
+
+*/
+package open
+
+/*
+ Open a file, directory, or URI using the OS's default
+ application for that object type. Wait for the open
+ command to complete.
+*/
+func Run(input string) error {
+ return open(input).Run()
+}
+
+/*
+ Open a file, directory, or URI using the OS's default
+ application for that object type. Don't wait for the
+ open command to complete.
+*/
+func Start(input string) error {
+ return open(input).Start()
+}
+
+/*
+ Open a file, directory, or URI using the specified application.
+ Wait for the open command to complete.
+*/
+func RunWith(input string, appName string) error {
+ return openWith(input, appName).Run()
+}
+
+/*
+ Open a file, directory, or URI using the specified application.
+ Don't wait for the open command to complete.
+*/
+func StartWith(input string, appName string) error {
+ return openWith(input, appName).Start()
+}
diff --git a/vendor/github.com/skratchdot/open-golang/open/open_test.go b/vendor/github.com/skratchdot/open-golang/open/open_test.go
new file mode 100644
index 0000000..5db2da2
--- /dev/null
+++ b/vendor/github.com/skratchdot/open-golang/open/open_test.go
@@ -0,0 +1,70 @@
+package open
+
+import "testing"
+
+func TestRun(t *testing.T) {
+ // shouldn't error
+ input := "https://google.com/"
+ err := Run(input)
+ if err != nil {
+ t.Errorf("open.Run(\"%s\") threw an error: %s", input, err)
+ }
+
+ // should error
+ input = "xxxxxxxxxxxxxxx"
+ err = Run(input)
+ if err == nil {
+ t.Errorf("Run(\"%s\") did not throw an error as expected", input)
+ }
+}
+
+func TestStart(t *testing.T) {
+ // shouldn't error
+ input := "https://google.com/"
+ err := Start(input)
+ if err != nil {
+ t.Errorf("open.Start(\"%s\") threw an error: %s", input, err)
+ }
+
+ // shouldn't error
+ input = "xxxxxxxxxxxxxxx"
+ err = Start(input)
+ if err != nil {
+ t.Errorf("open.Start(\"%s\") shouldn't even fail on invalid input: %s", input, err)
+ }
+}
+
+func TestRunWith(t *testing.T) {
+ // shouldn't error
+ input := "https://google.com/"
+ app := "firefox"
+ err := RunWith(input, app)
+ if err != nil {
+ t.Errorf("open.RunWith(\"%s\", \"%s\") threw an error: %s", input, app, err)
+ }
+
+ // should error
+ app = "xxxxxxxxxxxxxxx"
+ err = RunWith(input, app)
+ if err == nil {
+ t.Errorf("RunWith(\"%s\", \"%s\") did not throw an error as expected", input, app)
+ }
+}
+
+func TestStartWith(t *testing.T) {
+ // shouldn't error
+ input := "https://google.com/"
+ app := "firefox"
+ err := StartWith(input, app)
+ if err != nil {
+ t.Errorf("open.StartWith(\"%s\", \"%s\") threw an error: %s", input, app, err)
+ }
+
+ // shouldn't error
+ input = "[<Invalid URL>]"
+ err = StartWith(input, app)
+ if err != nil {
+ t.Errorf("StartWith(\"%s\", \"%s\") shouldn't even fail on invalid input: %s", input, app, err)
+ }
+
+}