changeset 61:1c4bbae2ab88

This is a work in progress... but wanted to commit before I hit the road... Converting all classes to OO and making a generic HANDLE interface that can be interchanged between them...
author Brian Smith <brian@dbsoft.org>
date Thu, 14 Mar 2013 12:58:49 -0500
parents 9709643f623d
children fff7c3e22421
files src/dw/dw.go src/dw/dwglue.c src/dwtest/dwtest.go
diffstat 3 files changed, 1315 insertions(+), 751 deletions(-) [+]
line wrap: on
line diff
--- a/src/dw/dw.go	Fri Mar 08 18:46:49 2013 -0600
+++ b/src/dw/dw.go	Thu Mar 14 12:58:49 2013 -0500
@@ -15,15 +15,78 @@
 import "reflect"
 import "os"
 
+type HANDLE interface {
+   GetHandle() unsafe.Pointer
+}
 type HWND struct {
     hwnd unsafe.Pointer
 }
-type HTREEITEM unsafe.Pointer
+type HENTRYFIELD struct {
+   hwnd unsafe.Pointer
+}
+type HGENERIC struct {
+   hwnd unsafe.Pointer
+}
+type HTREE struct {
+   hwnd unsafe.Pointer
+}
+type HCONTAINER struct {
+   hwnd unsafe.Pointer
+   filesystem bool
+}
+type HMLE struct {
+   hwnd unsafe.Pointer
+}
+type HBUTTON struct {
+   hwnd unsafe.Pointer
+}
+type HSPINBUTTON struct {
+   hwnd unsafe.Pointer
+}
+type HNOTEBOOK struct {
+   hwnd unsafe.Pointer
+}
+type HBOX struct {
+   hwnd unsafe.Pointer
+}
+type HSCROLLBOX struct {
+   hwnd unsafe.Pointer
+}
+type HMENU struct {
+   hwnd unsafe.Pointer
+}
+type HLISTBOX struct {
+   hwnd unsafe.Pointer
+}
+type HPERCENT struct {
+   hwnd unsafe.Pointer
+}
+type HSLIDER struct {
+   hwnd unsafe.Pointer
+}
+type HSCROLLBAR struct {
+   hwnd unsafe.Pointer
+}
+type HRENDER struct {
+   hwnd unsafe.Pointer
+}
+type HHTML struct {
+   hwnd unsafe.Pointer
+}
+type HCALENDAR struct {
+   hwnd unsafe.Pointer
+}
+type HTREEITEM struct {
+    htreeitem unsafe.Pointer
+    htree HANDLE
+}
 type HICN unsafe.Pointer
 type HTIMER struct {
     tid C.int
 }
-type HMENUI unsafe.Pointer
+type HMENUI struct {
+    hmenui unsafe.Pointer
+}
 type HPIXMAP struct {
     hpixmap unsafe.Pointer
 }
@@ -31,7 +94,10 @@
     hprint unsafe.Pointer
     jobname string
 }
-type HNOTEPAGE C.ulong
+type HNOTEPAGE struct {
+    pageid C.ulong
+    hnotebook HANDLE
+}
 type COLOR C.ulong
 type POINTER unsafe.Pointer
 type SIGNAL_FUNC unsafe.Pointer
@@ -55,9 +121,9 @@
 var NOHTIMER HTIMER
 var NOHPRINT HPRINT
 var NOHPIXMAP HPIXMAP
-var NOHMENUI HMENUI = nil
+var NOHMENUI HMENUI
+var NOMENU HMENUI
 var NOHICN HICN = nil
-var NOMENU HMENUI = nil
 
 // Import as much as we can from C
 var HORZ = C.DW_HORZ
@@ -321,16 +387,92 @@
     return COLOR((0xF0000000 | (lred) | (lgreen << 8) | (lblue << 16)));
 }
 
-func POINTER_TO_HWND(ptr POINTER) HWND {
-    return HWND{unsafe.Pointer(ptr)};
-}
-
-func HWND_TO_UINTPTR(handle HWND) uintptr {
-    return uintptr(handle.hwnd);
-}
-
-func HWND_TO_POINTER(handle HWND) POINTER {
-    return POINTER(handle.hwnd);
+func POINTER_TO_HANDLE(ptr POINTER) HANDLE {
+    return HANDLE(HWND{unsafe.Pointer(ptr)});
+}
+
+func HANDLE_TO_UINTPTR(handle HANDLE) uintptr {
+    return uintptr(handle.GetHandle());
+}
+
+func HANDLE_TO_POINTER(handle HANDLE) POINTER {
+    return POINTER(handle.GetHandle());
+}
+
+func (window HWND) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HENTRYFIELD) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HGENERIC) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HTREE) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HCONTAINER) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HMLE) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HBUTTON) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HSPINBUTTON) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HNOTEBOOK) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HBOX) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HSCROLLBOX) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HMENU) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HLISTBOX) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HPERCENT) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HSLIDER) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HSCROLLBAR) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HRENDER) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HHTML) GetHandle() unsafe.Pointer {
+   return window.hwnd;
+}
+
+func (window HCALENDAR) GetHandle() unsafe.Pointer {
+   return window.hwnd;
 }
 
 func Init(newthread int) int {
@@ -381,171 +523,146 @@
     return HWND{C.go_window_new(unsafe.Pointer(owner.hwnd), ctitle, C.ulong(flags))};
 }
 
-func Window_show(handle HWND) int {
-   return int(C.go_window_show(unsafe.Pointer(handle.hwnd)));
+func Window_show(handle HANDLE) int {
+   return int(C.go_window_show(handle.GetHandle()));
 }
 
 func (window HWND) Show() int {
     return Window_show(window);
 }
 
-func Window_hide(handle HWND) int {
-   return int(C.go_window_hide(unsafe.Pointer(handle.hwnd)));
+func Window_hide(handle HANDLE) int {
+   return int(C.go_window_hide(handle.GetHandle()));
 }
 
 func (window HWND) Hide() int {
     return Window_hide(window);
 }
 
-func Window_lower(handle HWND) int {
-   return int(C.go_window_lower(unsafe.Pointer(handle.hwnd)));
+func Window_lower(handle HANDLE) int {
+   return int(C.go_window_lower(handle.GetHandle()));
 }
 
 func (window HWND) Lower() int {
     return Window_lower(window);
 }
 
-func Window_raise(handle HWND) int {
-   return int(C.go_window_raise(unsafe.Pointer(handle.hwnd)));
+func Window_raise(handle HANDLE) int {
+   return int(C.go_window_raise(handle.GetHandle()));
 }
 
 func (window HWND) Raise() int {
     return Window_raise(window);
 }
 
-func Window_minimize(handle HWND) int {
-   return int(C.go_window_minimize(unsafe.Pointer(handle.hwnd)));
+func Window_minimize(handle HANDLE) int {
+   return int(C.go_window_minimize(handle.GetHandle()));
 }
 
 func (window HWND) Minimize() int {
     return Window_minimize(window);
 }
 
-func Window_set_pos(handle HWND, x int, y int) {
-    C.go_window_set_pos(unsafe.Pointer(handle.hwnd), C.long(x), C.long(y));
+func Window_set_pos(handle HANDLE, x int, y int) {
+    C.go_window_set_pos(handle.GetHandle(), C.long(x), C.long(y));
 }
 
 func (window HWND) SetPos(x int, y int) {
     Window_set_pos(window, x, y);
 }
 
-func Window_set_pos_size(handle HWND, x int, y int, width uint, height uint) {
-    C.go_window_set_pos_size(unsafe.Pointer(handle.hwnd), C.long(x), C.long(y), C.ulong(width), C.ulong(height));
+func Window_set_pos_size(handle HANDLE, x int, y int, width uint, height uint) {
+    C.go_window_set_pos_size(handle.GetHandle(), C.long(x), C.long(y), C.ulong(width), C.ulong(height));
 }
 
 func (window HWND) SetPosSize(x int, y int, width uint, height uint) {
     Window_set_pos_size(window, x, y, width, height);
 }
 
-func Window_set_size(handle HWND, width uint, height uint) {
-    C.go_window_set_size(unsafe.Pointer(handle.hwnd), C.ulong(width), C.ulong(height));
+func Window_set_size(handle HANDLE, width uint, height uint) {
+    C.go_window_set_size(handle.GetHandle(), C.ulong(width), C.ulong(height));
 }
 
 func (window HWND) SetSize(width uint, height uint) {
     Window_set_size(window, width, height);
 }
 
-func Window_set_color(handle HWND, fore COLOR, back COLOR) int {
-   return int(C.go_window_set_color(unsafe.Pointer(handle.hwnd), C.ulong(fore), C.ulong(back)));
-}
-
-func (window HWND) SetColor(fore COLOR, back COLOR) int {
-    return Window_set_color(window, fore, back);
-}
-
-func Window_set_style(handle HWND, style uint, mask uint) {
-    C.go_window_set_style(unsafe.Pointer(handle.hwnd), C.ulong(style), C.ulong(mask));
-}
-
-func (window HWND) SetStyle(style uint, mask uint) {
-    Window_set_style(window, style, mask);
-}
-
-func Window_click_default(window HWND, next HWND) {
-    C.go_window_click_default(unsafe.Pointer(window.hwnd), unsafe.Pointer(next.hwnd));
-}
-
-func (window HWND) ClickDefault(next HWND) {
+func Window_set_color(handle HANDLE, fore COLOR, back COLOR) int {
+   return int(C.go_window_set_color(handle.GetHandle(), C.ulong(fore), C.ulong(back)));
+}
+
+func Window_set_style(handle HANDLE, style uint, mask uint) {
+    C.go_window_set_style(handle.GetHandle(), C.ulong(style), C.ulong(mask));
+}
+
+func Window_click_default(window HANDLE, next HANDLE) {
+    C.go_window_click_default(window.GetHandle(), next.GetHandle());
+}
+
+func (window HWND) ClickDefault(next HANDLE) {
     Window_click_default(window, next);
 }
 
-func Window_default(window HWND, defaultitem HWND) {
-    C.go_window_default(unsafe.Pointer(window.hwnd), unsafe.Pointer(defaultitem.hwnd));
-}
-
-func (window HWND) Default(defaultitem HWND) {
+func Window_default(window HWND, defaultitem HANDLE) {
+    C.go_window_default(unsafe.Pointer(window.hwnd), defaultitem.GetHandle());
+}
+
+func (window HWND) Default(defaultitem HANDLE) {
     Window_default(window, defaultitem);
 }
 
-func Window_destroy(handle HWND) int {
-    return int(C.go_window_destroy(unsafe.Pointer(handle.hwnd)));
-}
-
-func (window HWND) Destroy() int {
-    return Window_destroy(window);
-}
-
-func Window_disable(handle HWND) {
-   C.go_window_disable(unsafe.Pointer(handle.hwnd));
-}
-
-func (window HWND) Disable() {
-    Window_disable(window);
-}
-
-func Window_enable(handle HWND) {
-    C.go_window_enable(unsafe.Pointer(handle.hwnd));
-}
-
-func (window HWND) Enable() {
-    Window_enable(window);
-}
-
-func Window_from_id(handle HWND, cid int) HWND {
-    return HWND{C.go_window_from_id(unsafe.Pointer(handle.hwnd), C.int(cid))};
+func Window_destroy(handle HANDLE) int {
+    return int(C.go_window_destroy(handle.GetHandle()));
+}
+
+func Window_disable(handle HANDLE) {
+   C.go_window_disable(handle.GetHandle());
+}
+
+func Window_enable(handle HANDLE) {
+    C.go_window_enable(handle.GetHandle());
+}
+
+func Window_from_id(handle HANDLE, cid int) HWND {
+    return HWND{C.go_window_from_id(handle.GetHandle(), C.int(cid))};
 }
 
 func (window HWND) FromID(cid int) HWND {
     return Window_from_id(window, cid);
 }
 
-func Window_get_data(window HWND, dataname string) POINTER {
+func Window_get_data(window HANDLE, dataname string) POINTER {
     cdataname := C.CString(dataname);
     defer C.free(unsafe.Pointer(cdataname));
 
-    return POINTER(C.go_window_get_data(unsafe.Pointer(window.hwnd), cdataname));
-}
-
-func (window HWND) GetData(dataname string) POINTER {
-    return Window_get_data(window, dataname);
-}
-
-func Window_get_font(handle HWND) string {
-   cfontname := C.go_window_get_font(unsafe.Pointer(handle.hwnd));
+    return POINTER(C.go_window_get_data(window.GetHandle(), cdataname));
+}
+
+func Window_set_data(window HANDLE, dataname string, data POINTER) {
+    cdataname := C.CString(dataname);
+    defer C.free(unsafe.Pointer(cdataname));
+
+    C.go_window_set_data(window.GetHandle(), cdataname, unsafe.Pointer(data));
+}
+
+func Window_get_font(handle HANDLE) string {
+   cfontname := C.go_window_get_font(handle.GetHandle());
    fontname := C.GoString(cfontname);
    C.dw_free(unsafe.Pointer(cfontname));
    return fontname;
 }
 
-func (window HWND) GetFont() string {
-    return Window_get_font(window);
-}
-
-func Window_set_font(handle HWND, fontname string) int {
+func Window_set_font(handle HANDLE, fontname string) int {
     cfontname := C.CString(fontname);
     defer C.free(unsafe.Pointer(cfontname));
 
-    return int(C.go_window_set_font(unsafe.Pointer(handle.hwnd), cfontname));
-}
-
-func (window HWND) SetFont(fontname string) int {
-    return Window_set_font(window, fontname);
-}
-
-func Window_get_pos_size(handle HWND) (int, int, uint, uint) {
+    return int(C.go_window_set_font(handle.GetHandle(), cfontname));
+}
+
+func Window_get_pos_size(handle HANDLE) (int, int, uint, uint) {
     var x, y C.long;
     var width, height C.ulong;
-    C.go_window_get_pos_size(unsafe.Pointer(handle.hwnd), &x, &y, &width, &height);
+    C.go_window_get_pos_size(handle.GetHandle(), &x, &y, &width, &height);
     return int(x), int(y), uint(width), uint(height);
 }
 
@@ -553,47 +670,31 @@
     return Window_get_pos_size(window);
 }
 
-func Window_get_preferred_size(handle HWND) (int, int) {
+func Window_get_preferred_size(handle HANDLE) (int, int) {
     var width, height C.int;
-    C.go_window_get_preferred_size(unsafe.Pointer(handle.hwnd), &width, &height);
+    C.go_window_get_preferred_size(handle.GetHandle(), &width, &height);
     return int(width), int(height);
 }
 
-func (window HWND) GetPreferredSize() (int, int) {
-    return Window_get_preferred_size(window);
-}
-
-func Window_get_text(handle HWND) string {
-    ctext := C.go_window_get_text(unsafe.Pointer(handle.hwnd));
+func Window_get_text(handle HANDLE) string {
+    ctext := C.go_window_get_text(handle.GetHandle());
     text := C.GoString(ctext);
     C.dw_free(unsafe.Pointer(ctext));
     return text;
 }
 
-func (window HWND) GetText() string {
-    return Window_get_text(window);
-}
-
-func Window_set_text(handle HWND, text string) {
+func Window_set_text(handle HANDLE, text string) {
     ctext := C.CString(text);
     defer C.free(unsafe.Pointer(ctext));
 
-    C.go_window_set_text(unsafe.Pointer(handle.hwnd), ctext);
-}
-
-func (window HWND) SetText(text string) {
-    Window_set_text(window, text);
-}
-
-func Window_set_tooltip(handle HWND, bubbletext string) {
+    C.go_window_set_text(handle.GetHandle(), ctext);
+}
+
+func Window_set_tooltip(handle HANDLE, bubbletext string) {
     cbubbletext := C.CString(bubbletext);
     defer C.free(unsafe.Pointer(cbubbletext));
 
-    C.go_window_set_tooltip(unsafe.Pointer(handle.hwnd), cbubbletext);
-}
-
-func (window HWND) SetTooltip(bubbletext string) {
-    Window_set_tooltip(window, bubbletext);
+    C.go_window_set_tooltip(handle.GetHandle(), cbubbletext);
 }
 
 func Window_redraw(handle HWND) {
@@ -604,8 +705,8 @@
     Window_redraw(window);
 }
 
-func Window_capture(handle HWND) {
-    C.go_window_capture(unsafe.Pointer(handle.hwnd));
+func Window_capture(handle HANDLE) {
+    C.go_window_capture(handle.GetHandle());
 }
 
 func (window HWND) Capture() {
@@ -620,57 +721,109 @@
     Window_release();
 }
 
-func Window_set_bitmap(window HWND, id uint, filename string) {
+func Window_set_bitmap(window HANDLE, id uint, filename string) {
     cfilename := C.CString(filename);
     defer C.free(unsafe.Pointer(cfilename));
 
-    C.go_window_set_bitmap(unsafe.Pointer(window.hwnd), C.ulong(id), cfilename);
+    C.go_window_set_bitmap(window.GetHandle(), C.ulong(id), cfilename);
 }
 
 func (window HWND) SetBitmap(id uint, filename string) {
     Window_set_bitmap(window, id, filename);
 }
 
-func Window_set_border(handle HWND, border int) {
-    C.go_window_set_border(unsafe.Pointer(handle.hwnd), C.int(border));
+func Window_set_border(handle HANDLE, border int) {
+    C.go_window_set_border(handle.GetHandle(), C.int(border));
 }
 
 func (window HWND) SetBorder(border int) {
     Window_set_border(window, border);
 }
 
-func Window_set_focus(handle HWND) {
-    C.go_window_set_focus(unsafe.Pointer(handle.hwnd));
+func Window_set_focus(handle HANDLE) {
+    C.go_window_set_focus(handle.GetHandle());
+}
+
+func Window_set_gravity(handle HANDLE, horz int, vert int) {
+    C.go_window_set_gravity(handle.GetHandle(), C.int(horz), C.int(vert));
+}
+
+func (window HWND) SetGravity(horz int, vert int) {
+    Window_set_gravity(window, horz, vert);
+}
+
+func Window_set_icon(handle HANDLE, icon HICN) {
+    C.go_window_set_icon(handle.GetHandle(), unsafe.Pointer(icon));
+}
+
+func (window HWND) SetIcon(icon HICN) {
+    Window_set_icon(window, icon);
+}
+
+func Window_set_pointer(handle HANDLE, cursortype int) {
+    C.go_window_set_pointer(handle.GetHandle(), C.int(cursortype));
+}
+
+/* Start Generic Section ---
+ * These need to be implemented by basically every class/type 
+ */
+func (window HWND) Destroy() int {
+    return Window_destroy(window);
+}
+
+func (window HWND) Disable() {
+    Window_disable(window);
+}
+
+func (window HWND) Enable() {
+    Window_enable(window);
+}
+
+func (window HWND) GetData(dataname string) POINTER {
+    return Window_get_data(window, dataname);
+}
+
+func (window HWND) GetFont() string {
+    return Window_get_font(window);
+}
+
+func (window HWND) GetPreferredSize() (int, int) {
+    return Window_get_preferred_size(window);
+}
+
+func (window HWND) GetText() string {
+    return Window_get_text(window);
+}
+
+func (window HWND) SetColor(fore COLOR, back COLOR) int {
+    return Window_set_color(window, fore, back);
 }
 
 func (window HWND) SetFocus() {
     Window_set_focus(window);
 }
 
-func Window_set_gravity(handle HWND, horz int, vert int) {
-    C.go_window_set_gravity(unsafe.Pointer(handle.hwnd), C.int(horz), C.int(vert));
-}
-
-func (window HWND) SetGravity(horz int, vert int) {
-    Window_set_gravity(window, horz, vert);
-}
-
-func Window_set_icon(handle HWND, icon HICN) {
-    C.go_window_set_icon(unsafe.Pointer(handle.hwnd), unsafe.Pointer(icon));
-}
-
-func (window HWND) SetIcon(icon HICN) {
-    Window_set_icon(window, icon);
-}
-
-func Window_set_pointer(handle HWND, cursortype int) {
-    C.go_window_set_pointer(unsafe.Pointer(handle.hwnd), C.int(cursortype));
+func (window HWND) SetFont(fontname string) int {
+    return Window_set_font(window, fontname);
+}
+
+func (window HWND) SetText(text string) {
+    Window_set_text(window, text);
+}
+
+func (window HWND) SetTooltip(bubbletext string) {
+    Window_set_tooltip(window, bubbletext);
 }
 
 func (window HWND) SetPointer(cursortype int) {
     Window_set_pointer(window, cursortype);
 }
 
+func (window HWND) SetStyle(style uint, mask uint) {
+    Window_set_style(window, style, mask);
+}
+/* End Generic Section */
+
 func Main() {
     C.dw_main();
 }
@@ -691,83 +844,99 @@
     return HWND{C.go_box_new(C.int(btype), C.int(pad))};
 }
 
-func Box_pack_at_index(box HWND, item HWND, index int, width int, height int, hsize int, vsize int, pad int) {
-    C.go_box_pack_at_index(unsafe.Pointer(box.hwnd), unsafe.Pointer(item.hwnd), C.int(index), C.int(width), C.int(height), C.int(hsize), C.int(vsize), C.int(pad));
-}
-
-func (window HWND) PackAtIndex(item HWND, index int, width int, height int, hsize int, vsize int, pad int) {
+func Box_pack_at_index(box HANDLE, item HANDLE, index int, width int, height int, hsize int, vsize int, pad int) {
+    C.go_box_pack_at_index(box.GetHandle(), item.GetHandle(), C.int(index), C.int(width), C.int(height), C.int(hsize), C.int(vsize), C.int(pad));
+}
+
+func (window HWND) PackAtIndex(item HANDLE, index int, width int, height int, hsize int, vsize int, pad int) {
     Box_pack_at_index(window, item, index, width, height, hsize, vsize, pad);
 }
 
-func Box_pack_end(box HWND, item HWND, width int, height int, hsize int, vsize int, pad int) {
-   C.go_box_pack_end(unsafe.Pointer(box.hwnd), unsafe.Pointer(item.hwnd), C.int(width), C.int(height), C.int(hsize), C.int(vsize), C.int(pad));
-}
-
-func (window HWND) PackEnd(item HWND, width int, height int, hsize int, vsize int, pad int) {
+func Box_pack_end(box HANDLE, item HANDLE, width int, height int, hsize int, vsize int, pad int) {
+   C.go_box_pack_end(box.GetHandle(), item.GetHandle(), C.int(width), C.int(height), C.int(hsize), C.int(vsize), C.int(pad));
+}
+
+func (window HWND) PackEnd(item HANDLE, width int, height int, hsize int, vsize int, pad int) {
     Box_pack_end(window, item, width, height, hsize, vsize, pad);
 }
 
-func Box_pack_start(box HWND, item HWND, width int, height int, hsize int, vsize int, pad int) {
-   C.go_box_pack_start(unsafe.Pointer(box.hwnd), unsafe.Pointer(item.hwnd), C.int(width), C.int(height), C.int(hsize), C.int(vsize), C.int(pad));
-}
-
-func (window HWND) PackStart(item HWND, width int, height int, hsize int, vsize int, pad int) {
+func Box_pack_start(box HANDLE, item HANDLE, width int, height int, hsize int, vsize int, pad int) {
+   C.go_box_pack_start(box.GetHandle(), item.GetHandle(), C.int(width), C.int(height), C.int(hsize), C.int(vsize), C.int(pad));
+}
+
+func (window HWND) PackStart(item HANDLE, width int, height int, hsize int, vsize int, pad int) {
     Box_pack_start(window, item, width, height, hsize, vsize, pad);
 }
 
-func Box_unpack(handle HWND) int {
-   return int(C.go_box_unpack(unsafe.Pointer(handle.hwnd)));
+func Box_unpack(handle HANDLE) int {
+   return int(C.go_box_unpack(handle.GetHandle()));
 }
 
 func (window HWND) Unpack() int {
     return Box_unpack(window);
 }
 
-func Box_unpack_at_index(handle HWND, index int) HWND {
-    return HWND{C.go_box_unpack_at_index(unsafe.Pointer(handle.hwnd), C.int(index))};
-}
-
-func (window HWND) UnpackAtIndex(index int) HWND {
+func Box_unpack_at_index(handle HANDLE, index int) HANDLE {
+    return HANDLE(HWND{C.go_box_unpack_at_index(handle.GetHandle(), C.int(index))});
+}
+
+func (window HWND) UnpackAtIndex(index int) HANDLE {
     return Box_unpack_at_index(window, index);
 }
 
-func Text_new(text string, id uint) HWND {
+func Text_new(text string, id uint) HGENERIC {
    ctext := C.CString(text);
    defer C.free(unsafe.Pointer(ctext));
    
-   return HWND{C.go_text_new(ctext, C.ulong(id))};
-}
-
-func Status_text_new(text string, id uint) HWND {
+   return HGENERIC{C.go_text_new(ctext, C.ulong(id))};
+}
+
+func Status_text_new(text string, id uint) HGENERIC {
+   ctext := C.CString(text);
+   defer C.free(unsafe.Pointer(ctext));
+   
+   return HGENERIC{C.go_status_text_new(ctext, C.ulong(id))};
+}
+
+func Entryfield_new(text string, id uint) HENTRYFIELD {
    ctext := C.CString(text);
    defer C.free(unsafe.Pointer(ctext));
    
-   return HWND{C.go_status_text_new(ctext, C.ulong(id))};
-}
-
-func Entryfield_new(text string, id uint) HWND {
+   return HENTRYFIELD{C.go_entryfield_new(ctext, C.ulong(id))};
+}
+
+func EntryfieldNew(text string, id uint) HENTRYFIELD {
+   return Entryfield_new(text, id);
+}
+
+func Entryfield_password_new(text string, id uint) HENTRYFIELD {
    ctext := C.CString(text);
    defer C.free(unsafe.Pointer(ctext));
    
-   return HWND{C.go_entryfield_new(ctext, C.ulong(id))};
-}
-
-func Entryfield_password_new(text string, id uint) HWND {
+   return HENTRYFIELD{C.go_entryfield_password_new(ctext, C.ulong(id))};
+}
+
+func EntryfieldPasswordNew(text string, id uint) HENTRYFIELD {
+   return Entryfield_password_new(text, id);
+}
+
+func Entryfield_set_limit(handle HANDLE, limit int) {
+   C.go_entryfield_set_limit(handle.GetHandle(), C.int(limit));
+}
+
+func (handle HENTRYFIELD) SetLimit(limit int) {
+   Entryfield_set_limit(handle, limit);
+}
+
+func Button_new(text string, id uint) HBUTTON {
    ctext := C.CString(text);
    defer C.free(unsafe.Pointer(ctext));
    
-   return HWND{C.go_entryfield_password_new(ctext, C.ulong(id))};
-}
-
-func Entryfield_set_limit(handle HWND, limit int) {
-   C.go_entryfield_set_limit(unsafe.Pointer(handle.hwnd), C.int(limit));
-}
-
-func Button_new(text string, id uint) HWND {
-   ctext := C.CString(text);
-   defer C.free(unsafe.Pointer(ctext));
-   
-   return HWND{C.go_button_new(ctext, C.ulong(id))};
+   return HBUTTON{C.go_button_new(ctext, C.ulong(id))};
+}
+
+func ButtonNew(text string, id uint) HBUTTON {
+    return Button_new(text, id);
 }
 
 func Clipboard_get_text() string {
@@ -777,6 +946,10 @@
    return text;
 }
 
+func ClipboardGetText() string {
+    return Clipboard_get_text();
+}
+
 func Clipboard_set_text(text string) {
    ctext := C.CString(text);
    defer C.free(unsafe.Pointer(ctext));
@@ -784,6 +957,10 @@
    C.dw_clipboard_set_text(ctext, C.int(C.strlen(ctext)));
 }
 
+func ClipboardSetText(text string) {
+    Clipboard_set_text(text);
+}
+
 func File_browse(title string, defpath string, ext string, flags int) string {
    ctitle := C.CString(title);
    defer C.free(unsafe.Pointer(ctitle));
@@ -797,10 +974,18 @@
    return C.GoString(result);
 }
 
+func FileBrowse(title string, defpath string, ext string, flags int) string {
+    return File_browse(title, defpath, ext, flags);
+}
+
 func Color_choose(value COLOR) COLOR {
    return COLOR(C.dw_color_choose(C.ulong(value)));
 }
 
+func ColorChoose(value COLOR) COLOR {
+    return Color_choose(value);
+}
+
 func Timer_connect(interval int, sigfunc SIGNAL_FUNC, data POINTER) HTIMER {
    backs = append(backs, unsafe.Pointer(sigfunc));
    return HTIMER{C.go_timer_connect(C.int(interval), unsafe.Pointer(sigfunc), unsafe.Pointer(data), 0)};
@@ -812,12 +997,12 @@
    }
 }
 
-func Signal_connect(window HWND, signame string, sigfunc SIGNAL_FUNC, data POINTER) {
+func Signal_connect(window HANDLE, signame string, sigfunc SIGNAL_FUNC, data POINTER) {
    csigname := C.CString(signame);
    defer C.free(unsafe.Pointer(csigname));
    
    backs = append(backs, unsafe.Pointer(sigfunc));
-   C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(sigfunc), unsafe.Pointer(data), 0);
+   C.go_signal_connect(window.GetHandle(), csigname, unsafe.Pointer(sigfunc), unsafe.Pointer(data), 0);
 }
 
 func Beep(freq int, dur int) {
@@ -825,65 +1010,117 @@
 }
 
 func Menu_new(id uint) HMENUI {
-    return HMENUI(C.go_menu_new(C.ulong(id)));
+    return HMENUI{C.go_menu_new(C.ulong(id))};
+}
+
+func MenuNew(id uint) HMENUI {
+    return Menu_new(id);
 }
 
 func Menubar_new(location HWND) HMENUI {
-    return HMENUI(C.go_menubar_new(unsafe.Pointer(location.hwnd)));
-}
-
-func Menu_append_item(menu HMENUI, title string, id uint, flags uint, end int, check int, submenu HMENUI) HWND {
+    return HMENUI{C.go_menubar_new(unsafe.Pointer(location.hwnd))};
+}
+
+func (window HWND) MenubarNew() HMENUI {
+    return Menubar_new(window);
+}
+
+func Menu_append_item(menu HMENUI, title string, id uint, flags uint, end int, check int, submenu HMENUI) HMENU {
     ctitle := C.CString(title);
     defer C.free(unsafe.Pointer(ctitle));
 
-    return HWND{C.go_menu_append_item(unsafe.Pointer(menu), ctitle, C.ulong(id), C.ulong(flags), C.int(end), C.int(check), unsafe.Pointer(submenu))};
+    return HMENU{C.go_menu_append_item(menu.hmenui, ctitle, C.ulong(id), C.ulong(flags), C.int(end), C.int(check), submenu.hmenui)};
+}
+
+func (menui HMENUI) AppendItem(title string, id uint, flags uint, end int, check int, submenu HMENUI) HMENU {
+    return Menu_append_item(menui, title, id, flags, end, check, submenu);
 }
 
 func Menu_delete_item(menu HMENUI, id uint) {
-    C.go_menu_delete_item(unsafe.Pointer(menu), C.ulong(id));
+    C.go_menu_delete_item(menu.hmenui, C.ulong(id));
+}
+
+func (menui HMENUI) DeleteItem(id uint) {
+    Menu_delete_item(menui, id);
 }
 
 func Menu_destroy(menu HMENUI) {
-    C.go_menu_destroy(unsafe.Pointer(menu));
+    C.go_menu_destroy(menu.hmenui);
+}
+
+func (menui HMENUI) Destroy() {
+    Menu_destroy(menui);
 }
 
 func Menu_item_set_state(menu HMENUI, id uint, flags uint) {
-    C.go_menu_item_set_state(unsafe.Pointer(menu), C.ulong(id), C.ulong(flags));
-}
-
-func Menu_popup(menu HMENUI, parent HWND, x int, y int) {
-    C.go_menu_popup(unsafe.Pointer(menu), unsafe.Pointer(parent.hwnd), C.int(x), C.int(y));
-}
-
-func Notebook_new(id uint, top int) HWND {
-    return HWND{C.go_notebook_new(C.ulong(id), C.int(top))};
-}
-
-func Notebook_pack(handle HWND, pageid HNOTEPAGE, page HWND) {
-    C.go_notebook_pack(unsafe.Pointer(handle.hwnd), C.ulong(pageid), unsafe.Pointer(page.hwnd));
-}
-
-func Notebook_page_destroy(handle HWND, pageid HNOTEPAGE) {
-    C.go_notebook_page_destroy(unsafe.Pointer(handle.hwnd), C.ulong(pageid));
-}
-
-func Notebook_page_get(handle HWND) HNOTEPAGE {
-    return HNOTEPAGE(C.go_notebook_page_get(unsafe.Pointer(handle.hwnd)));
-}
-
-func Notebook_page_new(handle HWND, flags uint, front int) HNOTEPAGE {
-    return HNOTEPAGE(C.go_notebook_page_new(unsafe.Pointer(handle.hwnd), C.ulong(flags), C.int(front)));
-}
-
-func Notebook_page_set(handle HWND, pageid HNOTEPAGE) {
-    C.go_notebook_page_set(unsafe.Pointer(handle.hwnd), C.ulong(pageid));
-}
-
-func Notebook_page_set_text(handle HWND, pageid HNOTEPAGE, text string) {
+    C.go_menu_item_set_state(menu.hmenui, C.ulong(id), C.ulong(flags));
+}
+
+func (menui HMENUI) SetState(id uint, flags uint) {
+    Menu_item_set_state(menui, id, flags);
+}
+
+func Menu_popup(menu HMENUI, parent HANDLE, x int, y int) {
+    C.go_menu_popup(menu.hmenui, parent.GetHandle(), C.int(x), C.int(y));
+}
+
+func (menui HMENUI) Popup(parent HANDLE, x int, y int) {
+    Menu_popup(menui, parent, x, y);
+}
+
+func Notebook_new(id uint, top int) HNOTEBOOK {
+    return HNOTEBOOK{C.go_notebook_new(C.ulong(id), C.int(top))};
+}
+
+func NotebookNew(id uint, top int) HNOTEBOOK {
+    return Notebook_new(id, top);
+}
+
+func Notebook_pack(handle HANDLE, pageid HNOTEPAGE, page HANDLE) {
+    C.go_notebook_pack(handle.GetHandle(), pageid.pageid, page.GetHandle());
+}
+
+func (handle HNOTEPAGE) Pack(page HANDLE) {
+    Notebook_pack(handle.hnotebook, handle, page);
+}
+
+func Notebook_page_destroy(handle HANDLE, pageid HNOTEPAGE) {
+    C.go_notebook_page_destroy(handle.GetHandle(), pageid.pageid);
+}
+
+func (handle HNOTEPAGE) Destroy() {
+    Notebook_page_destroy(handle.hnotebook, handle);
+}
+
+func Notebook_page_get(handle HANDLE) HNOTEPAGE {
+    return HNOTEPAGE{C.go_notebook_page_get(handle.GetHandle()), handle};
+}
+
+func (handle HNOTEBOOK) PageGet() HNOTEPAGE {
+    return Notebook_page_get(handle);
+}
+
+func Notebook_page_new(handle HANDLE, flags uint, front int) HNOTEPAGE {
+    return HNOTEPAGE{C.go_notebook_page_new(handle.GetHandle(), C.ulong(flags), C.int(front)), handle};
+}
+
+func (handle HNOTEBOOK) PageNew(flags uint, front int) HNOTEPAGE {
+    return Notebook_page_new(handle, flags, front);
+}
+
+func Notebook_page_set(handle HANDLE, pageid HNOTEPAGE) {
+    C.go_notebook_page_set(handle.GetHandle(), pageid.pageid);
+}
+
+func Notebook_page_set_text(handle HANDLE, pageid HNOTEPAGE, text string) {
     ctext := C.CString(text);
     defer C.free(unsafe.Pointer(ctext));
     
-    C.go_notebook_page_set_text(unsafe.Pointer(handle.hwnd), C.ulong(pageid), ctext);
+    C.go_notebook_page_set_text(handle.GetHandle(), pageid.pageid, ctext);
+}
+
+func (handle HNOTEPAGE) SetText(text string) {
+    Notebook_page_set_text(handle.hnotebook, handle, text);
 }
 
 func Icon_load_from_file(filename string) HICN {
@@ -893,40 +1130,68 @@
     return HICN(C.go_icon_load_from_file(cfilename));
 }
 
+func IconLoadFromFile(filename string) HICN {
+    return Icon_load_from_file(filename);
+}
+
 func Icon_load(id uint) HICN {
     return HICN(C.go_icon_load(0, C.ulong(id)));
 }
 
-func Taskbar_delete(handle HWND, icon HICN) {
-    C.go_taskbar_delete(unsafe.Pointer(handle.hwnd), unsafe.Pointer(icon));
-}
-
-func Taskbar_insert(handle HWND, icon HICN, bubbletext string) {
+func IconLoad(id uint) HICN {
+    return Icon_load(id);
+}
+
+func Taskbar_delete(handle HANDLE, icon HICN) {
+    C.go_taskbar_delete(handle.GetHandle(), unsafe.Pointer(icon));
+}
+
+func TaskbarDelete(handle HANDLE, icon HICN) {
+    Taskbar_delete(handle, icon);
+}
+
+func Taskbar_insert(handle HANDLE, icon HICN, bubbletext string) {
     cbubbletext := C.CString(bubbletext);
     defer C.free(unsafe.Pointer(cbubbletext));
     
-    C.go_taskbar_insert(unsafe.Pointer(handle.hwnd), unsafe.Pointer(icon), cbubbletext);
-}
-
-func Combobox_new(text string, id uint) HWND {
+    C.go_taskbar_insert(handle.GetHandle(), unsafe.Pointer(icon), cbubbletext);
+}
+
+func TaskbarInsert(handle HANDLE, icon HICN, bubbletext string) {
+    Taskbar_insert(handle, icon, bubbletext);
+}
+
+func Combobox_new(text string, id uint) HLISTBOX {
     ctext := C.CString(text);
     defer C.free(unsafe.Pointer(ctext));
     
-    return HWND{C.go_combobox_new(ctext, C.ulong(id))};
-}
-
-func Listbox_new(id uint, multi int) HWND {
-    return HWND{C.go_listbox_new(C.ulong(id), C.int(multi))};
-}
-
-func Listbox_append(handle HWND, text string) {
+    return HLISTBOX{C.go_combobox_new(ctext, C.ulong(id))};
+}
+
+func ComboboxNew(text string, id uint) HLISTBOX {
+    return Combobox_new(text, id);
+}
+
+func Listbox_new(id uint, multi int) HLISTBOX {
+    return HLISTBOX{C.go_listbox_new(C.ulong(id), C.int(multi))};
+}
+
+func ListboxNew(id uint, multi int) HLISTBOX {
+    return Listbox_new(id, multi);
+}
+
+func Listbox_append(handle HANDLE, text string) {
     ctext := C.CString(text);
     defer C.free(unsafe.Pointer(ctext));
     
-    C.go_listbox_append(unsafe.Pointer(handle.hwnd), ctext);
-}
-
-func Listbox_list_append(handle HWND, text []string) {
+    C.go_listbox_append(handle.GetHandle(), ctext);
+}
+
+func (handle HLISTBOX) Append(text string) {
+    Listbox_append(handle, text);
+}
+
+func Listbox_list_append(handle HANDLE, text []string) {
    count := len(text);
    ctext := C.go_string_array_make(C.int(count))
    defer C.go_string_array_free(ctext, C.int(count))
@@ -935,176 +1200,312 @@
         C.go_string_array_set(ctext, C.CString(s), C.int(i))
     }   
    
-   C.go_listbox_list_append(unsafe.Pointer(handle.hwnd), ctext, C.int(count));
-}
-
-func Listbox_insert(handle HWND, text string, pos int) {
+   C.go_listbox_list_append(handle.GetHandle(), ctext, C.int(count));
+}
+
+func (handle HLISTBOX) AppendList(text []string) {
+    Listbox_list_append(handle, text);
+}
+
+func Listbox_insert(handle HANDLE, text string, pos int) {
     ctext := C.CString(text);
     defer C.free(unsafe.Pointer(ctext));
     
-    C.go_listbox_insert(unsafe.Pointer(handle.hwnd), ctext, C.int(pos));
-}
-
-func Listbox_clear(handle HWND) {
-    C.go_listbox_clear(unsafe.Pointer(handle.hwnd));
-}
-
-func Listbox_count(handle HWND) int {
-    return int(C.go_listbox_count(unsafe.Pointer(handle.hwnd)));
-}
-
-func Listbox_set_top(handle HWND, top int) {
-    C.go_listbox_set_top(unsafe.Pointer(handle.hwnd), C.int(top));
-}
-
-func Listbox_select(handle HWND, index C.int, state C.int) {
-    C.go_listbox_select(unsafe.Pointer(handle.hwnd), index, state);
-}
-
-func Listbox_delete(handle HWND, index int) {
-    C.go_listbox_delete(unsafe.Pointer(handle.hwnd), C.int(index));
-}
-
-func Listbox_get_text(handle HWND, index int) string {
+    C.go_listbox_insert(handle.GetHandle(), ctext, C.int(pos));
+}
+
+func (handle HLISTBOX) Insert(text string, pos int) {
+    Listbox_insert(handle, text, pos);
+}
+
+func Listbox_clear(handle HANDLE) {
+    C.go_listbox_clear(handle.GetHandle());
+}
+
+func (handle HLISTBOX) Clear() {
+    Listbox_clear(handle);
+}
+
+func Listbox_count(handle HANDLE) int {
+    return int(C.go_listbox_count(handle.GetHandle()));
+}
+
+func (handle HLISTBOX) Count() int {
+    return Listbox_count(handle);
+}
+
+func Listbox_set_top(handle HANDLE, top int) {
+    C.go_listbox_set_top(handle.GetHandle(), C.int(top));
+}
+
+func (handle HLISTBOX) SetTop(top int) {
+    Listbox_set_top(handle, top);
+}
+
+func Listbox_select(handle HANDLE, index int, state int) {
+    C.go_listbox_select(handle.GetHandle(), C.int(index), C.int(state));
+}
+
+func (handle HLISTBOX) Select(index int, state int) {
+    Listbox_select(handle, index, state);
+}
+
+func Listbox_delete(handle HANDLE, index int) {
+    C.go_listbox_delete(handle.GetHandle(), C.int(index));
+}
+
+func (handle HLISTBOX) Delete(index int) {
+    Listbox_delete(handle, index);
+}
+
+func Listbox_get_text(handle HANDLE, index int) string {
     var buf [201]C.char;
     
-    C.go_listbox_get_text(unsafe.Pointer(handle.hwnd), C.int(index), &buf[0], 200);
+    C.go_listbox_get_text(handle.GetHandle(), C.int(index), &buf[0], 200);
     return C.GoString((*C.char)(unsafe.Pointer(&buf[0])));
 }
 
-func Listbox_set_text(handle HWND, index int, text string) {
+func (handle HLISTBOX) GetText(index int) string {
+    return Listbox_get_text(handle, index);
+}
+
+func Listbox_set_text(handle HANDLE, index int, text string) {
     ctext := C.CString(text);
     defer C.free(unsafe.Pointer(ctext));
     
-    C.go_listbox_set_text(unsafe.Pointer(handle.hwnd), C.int(index), ctext);
-}
-
-func Listbox_selected(handle HWND) int {
-    return int(C.go_listbox_selected(unsafe.Pointer(handle.hwnd)));
-}
-
-func Listbox_selected_multi(handle HWND, where int) int {
-    return int(C.go_listbox_selected_multi(unsafe.Pointer(handle.hwnd), C.int(where)));
+    C.go_listbox_set_text(handle.GetHandle(), C.int(index), ctext);
+}
+
+func (handle HLISTBOX) SetText(index int, text string) {
+    Listbox_set_text(handle, index, text);
+}
+
+func Listbox_selected(handle HANDLE) int {
+    return int(C.go_listbox_selected(handle.GetHandle()));
+}
+
+func (handle HLISTBOX) Selected() int {
+    return Listbox_selected(handle);
+}
+
+func Listbox_selected_multi(handle HANDLE, where int) int {
+    return int(C.go_listbox_selected_multi(handle.GetHandle(), C.int(where)));
+}
+
+func (handle HLISTBOX) SelectedMulti(where int) int {
+    return Listbox_selected_multi(handle, where);
 }
 
 func Screen_width() int {
     return int(C.dw_screen_width());
 }
 
+func ScreenWidth() int {
+    return Screen_width();
+}
+
 func Screen_height() int {
     return int(C.dw_screen_height());
 }
 
+func ScreenHeight() int {
+    return Screen_height();
+}
+
 func Color_depth_get() uint {
     return uint(C.dw_color_depth_get());
 }
 
+func ColorDepthGet() uint {
+    return Color_depth_get();
+}
+
 func Color_foreground_set(color COLOR) {
     C.dw_color_foreground_set(C.ulong(color));
 }
 
+func ColorForegroundSet(color COLOR) {
+    Color_foreground_set(color);
+}
+
 func Color_background_set(color COLOR) {
     C.dw_color_background_set(C.ulong(color));
 }
 
-func Spinbutton_new(text string, id C.ulong) HWND {
+func ColorBackgroundSet(color COLOR) {
+    Color_background_set(color);
+}
+
+func Spinbutton_new(text string, id C.ulong) HSPINBUTTON {
     ctext := C.CString(text);
     defer C.free(unsafe.Pointer(ctext));
     
-    return HWND{C.go_spinbutton_new(ctext, id)};
-}
-
-func Spinbutton_set_pos(handle HWND, position int) {
-    C.go_spinbutton_set_pos(unsafe.Pointer(handle.hwnd), C.long(position));
-}
-
-func Spinbutton_set_limits(handle HWND, upper int, lower int) {
-    C.go_spinbutton_set_limits(unsafe.Pointer(handle.hwnd), C.long(upper), C.long(lower));
-}
-
-func Spinbutton_get_pos(handle HWND) int {
-    return int(C.go_spinbutton_get_pos(unsafe.Pointer(handle.hwnd)));
-}
-
-func Radiobutton_new(text string, id uint) HWND {
+    return HSPINBUTTON{C.go_spinbutton_new(ctext, id)};
+}
+
+func Spinbutton_set_pos(handle HANDLE, position int) {
+    C.go_spinbutton_set_pos(handle.GetHandle(), C.long(position));
+}
+
+func (handle HSPINBUTTON) SetPos(position int) {
+    Spinbutton_set_pos(handle, position);
+}
+
+func Spinbutton_set_limits(handle HANDLE, upper int, lower int) {
+    C.go_spinbutton_set_limits(handle.GetHandle(), C.long(upper), C.long(lower));
+}
+
+func (handle HSPINBUTTON) SetLimits(upper int, lower int) {
+    Spinbutton_set_limits(handle, upper, lower);
+}
+
+func Spinbutton_get_pos(handle HANDLE) int {
+    return int(C.go_spinbutton_get_pos(handle.GetHandle()));
+}
+
+func (handle HSPINBUTTON) GetPos() int {
+    return Spinbutton_get_pos(handle);
+}
+
+func Radiobutton_new(text string, id uint) HBUTTON {
     ctext := C.CString(text);
     defer C.free(unsafe.Pointer(ctext));
     
-    return HWND{C.go_radiobutton_new(ctext, C.ulong(id))};
-}
-
-func Checkbox_new(text string, id uint) HWND {
+    return HBUTTON{C.go_radiobutton_new(ctext, C.ulong(id))};
+}
+
+func RadioButtonNew(text string id uint) HBUTTON {
+    return Radiobutton_new(text, id); 
+}
+
+func Checkbox_new(text string, id uint) HBUTTON {
     ctext := C.CString(text);
     defer C.free(unsafe.Pointer(ctext));
     
-    return HWND{C.go_checkbox_new(ctext, C.ulong(id))};
-}
-
-func Checkbox_get(handle HWND) int {
-    return int(C.go_checkbox_get(unsafe.Pointer(handle.hwnd)));
-}
-
-func Checkbox_set(handle HWND, value int) {
-    C.go_checkbox_set(unsafe.Pointer(handle.hwnd), C.int(value));
-}
-
-func Percent_new(id C.ulong) HWND {
-    return HWND{C.go_percent_new(id)};
-}
-
-func Percent_set_pos(handle HWND, position uint) {
-   C.go_percent_set_pos(unsafe.Pointer(handle.hwnd), C.uint(position));
-}
-
-func Slider_new(vertical int, increments int, id uint) HWND {
-    return HWND{C.go_slider_new(C.int(vertical), C.int(increments), C.ulong(id))};
-}
-
-func Scrollbar_new(vertical int, id uint) HWND {
-    return HWND{C.go_scrollbar_new(C.int(vertical), C.ulong(id))};
-}
-
-func Slider_get_pos(handle HWND) uint {
-    return uint(C.go_slider_get_pos(unsafe.Pointer(handle.hwnd)));
-}
-
-func Slider_set_pos(handle HWND, position uint) {
-    C.go_slider_set_pos(unsafe.Pointer(handle.hwnd), C.uint(position));
-}
-
-func Scrollbar_get_pos(handle HWND) uint {
-    return uint(C.go_scrollbar_get_pos(unsafe.Pointer(handle.hwnd)));
-}
-
-func Scrollbar_set_pos(handle HWND, position uint) {
-    C.go_scrollbar_set_pos(unsafe.Pointer(handle.hwnd), C.uint(position));
-}
-
-func Scrollbar_set_range(handle HWND, srange uint, visible uint) {
-    C.go_scrollbar_set_range(unsafe.Pointer(handle.hwnd), C.uint(srange), C.uint(visible));
-}
-
-func Scrollbox_new(btype int, pad int) HWND {
-    return HWND{C.go_scrollbox_new(C.int(btype), C.int(pad))};
-}
-
-func Scrollbox_get_pos(handle HWND, orient int) int {
-    return int(C.go_scrollbox_get_pos(unsafe.Pointer(handle.hwnd), C.int(orient)));
-}
-
-func Scrollbox_get_range(handle HWND, orient int) int {
-    return int(C.go_scrollbox_get_range(unsafe.Pointer(handle.hwnd), C.int(orient)));
-}
-
-func Groupbox_new(btype C.int, pad int, title string) HWND {
+    return HBUTTON{C.go_checkbox_new(ctext, C.ulong(id))};
+}
+
+func CheckButtonNew(text string id uint) HBUTTON {
+    return Checkbox_new(text, id);
+}
+
+func Checkbox_get(handle HANDLE) int {
+    return int(C.go_checkbox_get(handle.GetHandle()));
+}
+
+func (handle HBUTTON) Get() int {
+    return Checkbox_get(handle);
+}
+
+func Checkbox_set(handle HANDLE, value int) {
+    C.go_checkbox_set(handle.GetHandle(), C.int(value));
+}
+
+func (handle HBUTTON) Set(value int) {
+    Checkbox_set(handle, value);
+}
+
+func Percent_new(id C.ulong) HPERCENT {
+    return HPERCENT{C.go_percent_new(id)};
+}
+
+func PercentNew(id C.ulong) HPERCENT {
+    return Percent_new(id);
+}
+
+func Percent_set_pos(handle HANDLE, position uint) {
+   C.go_percent_set_pos(handle.GetHandle(), C.uint(position));
+}
+
+func (handle HPERCENT) SetPos(position uint) {
+    Percent_set_pos(handle, position);
+}
+
+func Slider_new(vertical int, increments int, id uint) HSLIDER {
+    return HSLIDER{C.go_slider_new(C.int(vertical), C.int(increments), C.ulong(id))};
+}
+
+func SliderNew(vertical int, increments int, id uint) HSLIDER {
+    return Slider_new(vertical, increments, id);
+}
+
+func Scrollbar_new(vertical int, id uint) HSCROLLBAR {
+    return HSCROLLBAR{C.go_scrollbar_new(C.int(vertical), C.ulong(id))};
+}
+
+func ScrollbarNew(vertical int, id uint) HSCROLLBAR {
+    return Scrollbar_new(vertical, id);
+}
+
+func Slider_get_pos(handle HANDLE) uint {
+    return uint(C.go_slider_get_pos(handle.GetHandle()));
+}
+
+func (handle HSLIDER) GetPos() uint {
+    return Slider_get_pos(handle);
+}
+
+func Slider_set_pos(handle HANDLE, position uint) {
+    C.go_slider_set_pos(handle.GetHandle(), C.uint(position));
+}
+
+func (handle HSLIDER) SetPos(position uint) {
+    Slider_set_pos(handle, position);
+}
+
+func Scrollbar_get_pos(handle HANDLE) uint {
+    return uint(C.go_scrollbar_get_pos(handle.GetHandle()));
+}
+
+func (handle HSCROLLBAR) GetPos() uint {
+    return Scrollbar_get_pos(handle);
+}
+
+func Scrollbar_set_pos(handle HANDLE, position uint) {
+    C.go_scrollbar_set_pos(handle.GetHandle(), C.uint(position));
+}
+
+func (handle HSCROLLBAR) SetPos(position uint) {
+    Scrollbar_set_pos(handle, position);
+}
+
+func Scrollbar_set_range(handle HANDLE, srange uint, visible uint) {
+    C.go_scrollbar_set_range(handle.GetHandle(), C.uint(srange), C.uint(visible));
+}
+
+func (handle HSCROLLBAR) SetRange(srange uint, visible uint) {
+    Scrollbar_set_range(handle, srange, visible);
+}
+
+func Scrollbox_new(btype int, pad int) HSCROLLBOX {
+    return HSCROLLBOX{C.go_scrollbox_new(C.int(btype), C.int(pad))};
+}
+
+func Scrollbox_get_pos(handle HANDLE) (int, int) {
+    return int(C.go_scrollbox_get_pos(handle.GetHandle(), C.int(C.DW_HORZ))), int(C.go_scrollbox_get_pos(handle.GetHandle(), C.int(C.DW_VERT)));
+}
+
+func (handle HSCROLLBOX) GetPos() (int, int) {
+    return Scrollbox_get_pos(handle);
+}
+
+func Scrollbox_get_range(handle HANDLE) (int, int) {
+    return int(C.go_scrollbox_get_range(handle.GetHandle(), C.int(C.DW_HORZ))), int(C.go_scrollbox_get_range(handle.GetHandle(), C.int(C.DW_VERT)));
+}
+
+func (handle HSCROLLBOX) GetRange() (int, int) {
+    return Scrollbox_get_range(handle);
+}
+
+func Groupbox_new(btype C.int, pad int, title string) HBOX {
     ctitle := C.CString(title);
     defer C.free(unsafe.Pointer(ctitle));
     
-    return HWND{C.go_groupbox_new(btype, C.int(pad), ctitle)};
-}
-
-func Render_new(id uint) HWND {
-    return HWND{C.go_render_new(C.ulong(id))};
+    return HBOX{C.go_groupbox_new(btype, C.int(pad), ctitle)};
+}
+
+func Render_new(id uint) HRENDER {
+    return HRENDER{C.go_render_new(C.ulong(id))};
 }
 
 func Font_choose(currfont string) string {
@@ -1115,12 +1516,20 @@
     return C.GoString(newfont);
 }
 
+func FontChoose(currfont string) string {
+    return Font_choose(currfont);
+}
+
 func Font_set_default(fontname string) {
     cfontname := C.CString(fontname);
     defer C.free(unsafe.Pointer(cfontname));
     C.dw_font_set_default(cfontname);
 }
 
+func FontSetFefault(fontname string) {
+    Font_set_default(fontname);
+}
+
 func Font_text_extents_get(handle HWND, pixmap HPIXMAP, text string) (int, int) {
    var width, height C.int;
    
@@ -1139,19 +1548,31 @@
     return Font_text_extents_get(NOHWND, pixmap, text);
 }
 
-func Pixmap_new(handle HWND, width uint, height uint, depth uint) HPIXMAP {
-    return HPIXMAP{C.go_pixmap_new(unsafe.Pointer(handle.hwnd), C.ulong(width), C.ulong(height), C.ulong(depth))};
-}
-
-func Pixmap_new_from_file(handle HWND, filename string) HPIXMAP {
+func Pixmap_new(handle HANDLE, width uint, height uint, depth uint) HPIXMAP {
+    return HPIXMAP{C.go_pixmap_new(handle.GetHandle(), C.ulong(width), C.ulong(height), C.ulong(depth))};
+}
+
+func PixmapNew(handle HANDLE, width uint, height uint, depth uint) HPIXMAP {
+    return Pixmap_new(handle, width, height, depth);
+}
+
+func Pixmap_new_from_file(handle HANDLE, filename string) HPIXMAP {
     cfilename := C.CString(filename);
     defer C.free(unsafe.Pointer(cfilename));
     
-    return HPIXMAP{C.go_pixmap_new_from_file(unsafe.Pointer(handle.hwnd), cfilename)};
-}
-
-func Pixmap_grab(handle HWND, id uint) HPIXMAP {
-    return HPIXMAP{C.go_pixmap_grab(unsafe.Pointer(handle.hwnd), C.ulong(id))};
+    return HPIXMAP{C.go_pixmap_new_from_file(handle.GetHandle(), cfilename)};
+}
+
+func PixmapNewFromFile(handle HANDLE, filename string) HPIXMAP {
+    return Pixmap_new_from_file(handle, filename);
+}
+
+func Pixmap_grab(handle HANDLE, id uint) HPIXMAP {
+    return HPIXMAP{C.go_pixmap_grab(handle.GetHandle(), C.ulong(id))};
+}
+
+func PixmapGrab(handle HANDLE, id uint) HPIXMAP {
+    return Pixmap_grab(handle, id);
 }
 
 func (window HWND) PixmapGrab(id uint) HPIXMAP {
@@ -1335,185 +1756,289 @@
    return int(x), int(y);
 }
 
+func PointerGetPos() (int, int) {
+    return Pointer_query_pos();
+}
+
 func Pointer_set_pos(x int, y int) {
    C.dw_pointer_set_pos(C.long(x), C.long(y));
 }
 
+func PointerSetPos(x int, y int) {
+    Pointer_set_pos(x, y);
+}
+
 func Flush() {
     C.dw_flush();
 }
 
-func Tree_new(id uint) HWND {
-    return HWND{C.go_tree_new(C.ulong(id))};
-}
-
-func Tree_insert(handle HWND, title string, icon HICN, parent HTREEITEM, itemdata POINTER) HTREEITEM {
+func Tree_new(id uint) HTREE {
+    return HTREE{C.go_tree_new(C.ulong(id))};
+}
+
+func Tree_insert(handle HANDLE, title string, icon HICN, parent HTREEITEM, itemdata POINTER) HTREEITEM {
+   ctitle := C.CString(title);
+   defer C.free(unsafe.Pointer(ctitle));
+   
+   return HTREEITEM{C.go_tree_insert(handle.GetHandle(), ctitle, unsafe.Pointer(icon), parent.htreeitem, unsafe.Pointer(itemdata)), handle};
+}
+
+func (handle HTREE) Insert(title string, icon HICN, parent HTREEITEM, itemdata POINTER) HTREEITEM {
+    return Tree_insert(handle, title, icon, parent, itemdata);
+}
+
+func Tree_insert_after(handle HANDLE, item HTREEITEM, title string, icon HICN, parent HTREEITEM, itemdata POINTER) HTREEITEM {
    ctitle := C.CString(title);
    defer C.free(unsafe.Pointer(ctitle));
    
-   return HTREEITEM(C.go_tree_insert(unsafe.Pointer(handle.hwnd), ctitle, unsafe.Pointer(icon), unsafe.Pointer(parent), unsafe.Pointer(itemdata)));
-}
-
-func Tree_insert_after(handle HWND, item HTREEITEM, title string, icon HICN, parent HTREEITEM, itemdata POINTER) HTREEITEM {
-   ctitle := C.CString(title);
-   defer C.free(unsafe.Pointer(ctitle));
-   
-   return HTREEITEM(C.go_tree_insert_after(unsafe.Pointer(handle.hwnd), unsafe.Pointer(item), ctitle, unsafe.Pointer(icon), unsafe.Pointer(parent), unsafe.Pointer(itemdata)));
-}
-
-func Tree_clear(handle HWND) {
-   C.go_tree_clear(unsafe.Pointer(handle.hwnd));
-}
-
-func Tree_item_delete(handle HWND, item HTREEITEM) {
-   C.go_tree_item_delete(unsafe.Pointer(handle.hwnd), unsafe.Pointer(item));
-}
-
-func Tree_item_change(handle HWND, item HTREEITEM, title string, icon HICN) {
+   return HTREEITEM{C.go_tree_insert_after(handle.GetHandle(), item.htreeitem, ctitle, unsafe.Pointer(icon), parent.htreeitem, unsafe.Pointer(itemdata)), handle};
+}
+
+func (handle HTREE) InsertAfter(item HTREEITEM, title string, icon HICN, parent HTREEITEM, itemdata POINTER) HTREEITEM {
+    return Tree_insert_after(handle, item, title, icon, parent, itemdata);
+}
+
+func Tree_clear(handle HANDLE) {
+   C.go_tree_clear(handle.GetHandle());
+}
+
+func (handle HTREE) Clear() {
+    Tree_clear(handle);
+}
+
+func Tree_item_delete(handle HANDLE, item HTREEITEM) {
+   C.go_tree_item_delete(handle.GetHandle(), item.htreeitem);
+}
+
+func (handle HTREEITEM) Delete() {
+    Tree_item_delete(handle.htree, handle);
+}
+
+func Tree_item_change(handle HANDLE, item HTREEITEM, title string, icon HICN) {
    ctitle := C.CString(title);
    defer C.free(unsafe.Pointer(ctitle));
    
-   C.go_tree_item_change(unsafe.Pointer(handle.hwnd), unsafe.Pointer(item), ctitle, unsafe.Pointer(icon));
-}
-
-func Tree_item_expand(handle HWND, item HTREEITEM) {
-   C.go_tree_item_expand(unsafe.Pointer(handle.hwnd), unsafe.Pointer(item));
-}
-
-func Tree_item_collapse(handle HWND, item HTREEITEM) {
-   C.go_tree_item_collapse(unsafe.Pointer(handle.hwnd), unsafe.Pointer(item));
-}
-
-func Tree_item_select(handle HWND, item HTREEITEM) {
-   C.go_tree_item_select(unsafe.Pointer(handle.hwnd), unsafe.Pointer(item));
-}
-
-func Tree_item_set_data(handle HWND, item HTREEITEM, itemdata POINTER) {
-   C.go_tree_item_set_data(unsafe.Pointer(handle.hwnd), unsafe.Pointer(item), unsafe.Pointer(itemdata));
-}
-
-func Tree_item_get_data(handle HWND, item HTREEITEM) unsafe.Pointer {
-   return unsafe.Pointer(C.go_tree_item_get_data(unsafe.Pointer(handle.hwnd), unsafe.Pointer(item)));
-}
-
-func Tree_get_title(handle HWND, item HTREEITEM) string {
-   ctitle := C.go_tree_get_title(unsafe.Pointer(handle.hwnd), unsafe.Pointer(item));
+   C.go_tree_item_change(handle.GetHandle(), item.htreeitem, ctitle, unsafe.Pointer(icon));
+}
+
+func (handle HTREEITEM) Change(title string, icon HICN) {
+    Tree_item_change(handle.htree, handle, title, icon);
+}
+
+func Tree_item_expand(handle HANDLE, item HTREEITEM) {
+   C.go_tree_item_expand(handle.GetHandle(), item.htreeitem);
+}
+
+func (handle HTREEITEM) Expand() {
+    Tree_item_expand(handle.htree, handle);
+}
+
+func Tree_item_collapse(handle HANDLE, item HTREEITEM) {
+   C.go_tree_item_collapse(handle.GetHandle(), item.htreeitem);
+}
+
+func (handle HTREEITEM) Collapse() {
+    Tree_item_collapse(handle.htree, handle);
+}
+
+func Tree_item_select(handle HANDLE, item HTREEITEM) {
+   C.go_tree_item_select(handle.GetHandle(), item.htreeitem);
+}
+
+func (handle HTREEITEM) Select() {
+    Tree_item_select(handle.htree, handle);
+}
+
+func Tree_item_set_data(handle HANDLE, item HTREEITEM, itemdata POINTER) {
+   C.go_tree_item_set_data(handle.GetHandle(), item.htreeitem, unsafe.Pointer(itemdata));
+}
+
+func (handle HTREEITEM) SetData(itemdata POINTER) {
+    Tree_item_set_data(handle.htree, handle, itemdata);
+}
+
+func Tree_item_get_data(handle HANDLE, item HTREEITEM) POINTER {
+   return POINTER(C.go_tree_item_get_data(handle.GetHandle(), item.htreeitem));
+}
+
+func (handle HTREEITEM) GetData() POINTER {
+    return Tree_item_get_data(handle.htree, handle);
+}
+
+func Tree_get_title(handle HANDLE, item HTREEITEM) string {
+   ctitle := C.go_tree_get_title(handle.GetHandle(), item.htreeitem);
    title := C.GoString(ctitle);
    C.dw_free(unsafe.Pointer(ctitle));
    return title;
 }
 
-func Html_new(id uint) HWND {
-    return HWND{C.go_html_new(C.ulong(id))};
-}
-
-func Html_action(hwnd HWND, action int) {
-   C.go_html_action(unsafe.Pointer(hwnd.hwnd), C.int(action));
-}
-
-func Html_raw(handle HWND, code string) int {
+func (handle HTREEITEM) GetTitle() string {
+    return Tree_get_title(handle.htree, handle);
+}
+
+func Html_new(id uint) HHTML {
+    return HHTML{C.go_html_new(C.ulong(id))};
+}
+
+func HtmlNew(id uint) HHTML {
+    return Html_new(id);
+}
+
+func Html_action(handle HANDLE, action int) {
+   C.go_html_action(handle.GetHandle(), C.int(action));
+}
+
+func (handle HHTML) Action(action int) {
+    Html_action(handle, action);
+}
+
+func Html_raw(handle HANDLE, code string) int {
    ccode := C.CString(code);
    defer C.free(unsafe.Pointer(ccode));
    
-   return int(C.go_html_raw(unsafe.Pointer(handle.hwnd), ccode));
-}
-
-func Html_url(handle HWND, url string) int {
+   return int(C.go_html_raw(handle.GetHandle(), ccode));
+}
+
+func (handle HHTML) Raw(code string) {
+    Html_raw(handle, code);
+}
+
+func Html_url(handle HANDLE, url string) int {
    curl := C.CString(url);
    defer C.free(unsafe.Pointer(curl));
    
-   return int(C.go_html_url(unsafe.Pointer(handle.hwnd), curl));
-}
-
-func Mle_new(id uint) HWND {
-    return HWND{C.go_mle_new(C.ulong(id))};
-}
-
-func Mle_import(handle HWND, buffer string, startpoint int) int {
+   return int(C.go_html_url(handle.GetHandle(), curl));
+}
+
+func (handle HHTML) URL(url string) int {
+    return Html_url(handle, url);
+}
+
+func Mle_new(id uint) HMLE {
+    return HMLE{C.go_mle_new(C.ulong(id))};
+}
+
+func MLENew(id uint) HMLE {
+    return Mle_new(id);
+}
+
+func Mle_import(handle HANDLE, buffer string, startpoint int) int {
    cbuffer := C.CString(buffer);
    defer C.free(unsafe.Pointer(cbuffer));
    
-   return int(C.go_mle_import(unsafe.Pointer(handle.hwnd), cbuffer, C.int(startpoint)));
-}
-
-func Mle_export(handle HWND, startpoint int, length int) string {
+   return int(C.go_mle_import(handle.GetHandle(), cbuffer, C.int(startpoint)));
+}
+
+func (handle HMLE) Import(buffer string, startpoint int) int {
+    return Mle_import(handle, buffer, startpoint);
+}
+
+func Mle_export(handle HANDLE, startpoint int, length int) string {
    cbuf := C.calloc(1, C.size_t(length+1));
-   C.go_mle_export(unsafe.Pointer(handle.hwnd), (*C.char)(cbuf), C.int(startpoint), C.int(length));
+   C.go_mle_export(handle.GetHandle(), (*C.char)(cbuf), C.int(startpoint), C.int(length));
    buf := C.GoString((*C.char)(cbuf));
    C.free(cbuf);
    return buf;
 }
 
-func Mle_get_size(handle HWND) (int, int) {
+func (handle HMLE) Export(startpoint int, length int) string {
+    return Mle_export(handle, startpoint, length);
+}
+
+func Mle_get_size(handle HANDLE) (int, int) {
    var bytes, lines C.ulong;
-   C.go_mle_get_size(unsafe.Pointer(handle.hwnd), &bytes, &lines);
+   C.go_mle_get_size(handle.GetHandle(), &bytes, &lines);
    return int(bytes), int(lines);
 }
 
-func Mle_delete(handle HWND, startpoint int, length int) {
-   C.go_mle_delete(unsafe.Pointer(handle.hwnd), C.int(startpoint), C.int(length));
-}
-
-func Mle_clear(handle HWND) {
-   C.go_mle_clear(unsafe.Pointer(handle.hwnd));
-}
-
-func Mle_freeze(handle HWND) {
-   C.go_mle_freeze(unsafe.Pointer(handle.hwnd));
-}
-
-func Mle_thaw(handle HWND) {
-   C.go_mle_thaw(unsafe.Pointer(handle.hwnd));
-}
-
-func Mle_set_cursor(handle HWND, point int) {
-   C.go_mle_set_cursor(unsafe.Pointer(handle.hwnd), C.int(point));
-}
-
-func Mle_set_visible(handle HWND, line int) {
-   C.go_mle_set_visible(unsafe.Pointer(handle.hwnd), C.int(line));
-}
-
-func Mle_set_editable(handle HWND, state int) {
-   C.go_mle_set_editable(unsafe.Pointer(handle.hwnd), C.int(state));
-}
-
-func Mle_set_word_wrap(handle HWND, state int) {
-   C.go_mle_set_word_wrap(unsafe.Pointer(handle.hwnd), C.int(state));
-}
-
-func Mle_search(handle HWND, text string, point int, flags uint) int {
+func (handle HMLE) GetSize() (int, int) {
+    return Mle_get_size(handle);
+}
+
+func Mle_delete(handle HANDLE, startpoint int, length int) {
+   C.go_mle_delete(handle.GetHandle(), C.int(startpoint), C.int(length));
+}
+
+func (handle HMLE) Delete(startpoint int, length int) {
+    Mle_delete(handle, startpoint, length);
+}
+
+func Mle_clear(handle HANDLE) {
+   C.go_mle_clear(handle.GetHandle());
+}
+
+func (handle HMLE) Clear() {
+    Mle_clear(handle);
+}
+
+func Mle_freeze(handle HANDLE) {
+   C.go_mle_freeze(handle.GetHandle());
+}
+
+func (handle HMLE) Freeze() {
+    Mle_freeze(handle);
+}
+
+func Mle_thaw(handle HANDLE) {
+   C.go_mle_thaw(handle.GetHandle());
+}
+
+func (handle HMLE) Thaw() {
+    Mle_thaw(handle);
+}
+
+func Mle_set_cursor(handle HANDLE, point int) {
+   C.go_mle_set_cursor(handle.GetHandle(), C.int(point));
+}
+
+func (handle HMLE) SetCursor(point int) {
+    Mle_set_cursor(handle, point);
+}
+
+func Mle_set_visible(handle HANDLE, line int) {
+   C.go_mle_set_visible(handle.GetHandle(), C.int(line));
+}
+
+func (handle HMLE) SetVisible(line int) {
+    Mle_set_visible(handle, line);
+}
+
+func Mle_set_editable(handle HANDLE, state int) {
+   C.go_mle_set_editable(handle.GetHandle(), C.int(state));
+}
+
+func (handle HMLE) SetEditable(state int) {
+    Mle_set_editable(handle, state);
+}
+
+func Mle_set_word_wrap(handle HANDLE, state int) {
+   C.go_mle_set_word_wrap(handle.GetHandle(), C.int(state));
+}
+
+func (handle HMLE) SetWordWrap(state int) {
+    Mle_set_word_wrap(handle, state);
+}
+
+func Mle_search(handle HANDLE, text string, point int, flags uint) int {
    ctext := C.CString(text);
    defer C.free(unsafe.Pointer(ctext));
    
-   return int(C.go_mle_search(unsafe.Pointer(handle.hwnd), ctext, C.int(point), C.ulong(flags)));
-}
-
-func Container_new(id uint, multi int) HWND {
-    return HWND{C.go_container_new(C.ulong(id), C.int(multi))};
-}
-
-func Container_setup(handle HWND, flags []uint, titles []string, separator int) int {
-    count := len(flags);
-    if len(titles) < count {
-        count = len(titles);
-    }
-
-    ctitles := C.go_string_array_make(C.int(len(titles)))
-    defer C.go_string_array_free(ctitles, C.int(len(titles)))
-    for i, s := range titles {
-        C.go_string_array_set(ctitles, C.CString(s), C.int(i))
-    }   
-
-    cflags := make([]C.ulong, count);
-    for n := 0; n < count; n++ {
-        cflags[n] = C.ulong(flags[n]);
-    }
-    flagsHeader := (*reflect.SliceHeader)((unsafe.Pointer(&cflags)));
-    return int(C.go_container_setup(unsafe.Pointer(handle.hwnd), (*C.ulong)(unsafe.Pointer(flagsHeader.Data)), ctitles, C.int(count), C.int(separator)));
-}
-
-func Filesystem_setup(handle HWND, flags []uint, titles []string) int {
+   return int(C.go_mle_search(handle.GetHandle(), ctext, C.int(point), C.ulong(flags)));
+}
+
+func (handle HMLE) Search(text string, point int, flags uint) int {
+    return Mle_search(handle, text, point, flags);
+}
+
+func Container_new(id uint, multi int) HCONTAINER {
+    return HCONTAINER{C.go_container_new(C.ulong(id), C.int(multi)), false};
+}
+
+func ContainerNew(id uint, multi int) HCONTAINER {
+    return Container_new(id, multi);
+}
+
+func Container_setup(handle HANDLE, flags []uint, titles []string, separator int) int {
     count := len(flags);
     if len(titles) < count {
         count = len(titles);
@@ -1530,55 +2055,88 @@
         cflags[n] = C.ulong(flags[n]);
     }
     flagsHeader := (*reflect.SliceHeader)((unsafe.Pointer(&cflags)));
-    return int(C.go_filesystem_setup(unsafe.Pointer(handle.hwnd), (*C.ulong)(unsafe.Pointer(flagsHeader.Data)), ctitles, C.int(count)));
-}
-
-func Container_alloc(handle HWND, rowcount int) POINTER {
-   return POINTER(C.go_container_alloc(unsafe.Pointer(handle.hwnd), C.int(rowcount)));
-}
-
-func Container_set_item(handle HWND, ptr POINTER, column int, row int, data unsafe.Pointer) {
-   C.go_container_set_item(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), data);
-}
-
-func Container_set_item_ulong(handle HWND, ptr POINTER, column int, row int, val uint) {
-   C.go_container_set_item_ulong(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), C.ulong(val));
-}
-
-func Container_set_item_icon(handle HWND, ptr POINTER, column int, row int, icon HICN) {
-   C.go_container_set_item_icon(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), unsafe.Pointer(icon));
-}
-
-func Container_set_item_time(handle HWND, ptr POINTER, column int, row int, seconds int, minutes int, hours int) {
-   C.go_container_set_item_time(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), C.int(seconds), C.int(minutes), C.int(hours));
-}
-
-func Container_set_item_date(handle HWND, ptr POINTER, column int, row int, day int, month int, year int) {
-   C.go_container_set_item_date(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), C.int(day), C.int(month), C.int(year));
-}
-
-func Container_change_item(handle HWND, column int, row int, data unsafe.Pointer) {
-   C.go_container_change_item(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), data);
-}
-
-func Container_change_item_ulong(handle HWND, column int, row int, val uint) {
-   C.go_container_change_item_ulong(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), C.ulong(val));
-}
-
-func Container_change_item_icon(handle HWND, column int, row int, icon HICN) {
-   C.go_container_change_item_icon(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), unsafe.Pointer(icon));
-}
-
-func Container_change_item_time(handle HWND, column int, row int, seconds int, minutes int, hours int) {
-   C.go_container_change_item_time(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), C.int(seconds), C.int(minutes), C.int(hours));
-}
-
-func Container_change_item_date(handle HWND, column int, row int, day int, month int, year int) {
-   C.go_container_change_item_date(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), C.int(day), C.int(month), C.int(year));
-}
-
-func Container_set_column_width(handle HWND, column int, width int) {
-   C.go_container_set_column_width(unsafe.Pointer(handle.hwnd), C.int(column), C.int(width));
+    return int(C.go_container_setup(handle.GetHandle(), (*C.ulong)(unsafe.Pointer(flagsHeader.Data)), ctitles, C.int(count), C.int(separator)));
+}
+
+func (handle HCONTAINER) Setup(flags []uint, titles []string, separator int) int {
+    return Container_setup(handle, flags, titles, separator);
+}
+
+func Filesystem_setup(handle HANDLE, flags []uint, titles []string) int {
+    count := len(flags);
+    if len(titles) < count {
+        count = len(titles);
+    }
+
+    ctitles := C.go_string_array_make(C.int(len(titles)))
+    defer C.go_string_array_free(ctitles, C.int(len(titles)))
+    for i, s := range titles {
+        C.go_string_array_set(ctitles, C.CString(s), C.int(i))
+    }   
+
+    cflags := make([]C.ulong, count);
+    for n := 0; n < count; n++ {
+        cflags[n] = C.ulong(flags[n]);
+    }
+    flagsHeader := (*reflect.SliceHeader)((unsafe.Pointer(&cflags)));
+    return int(C.go_filesystem_setup(handle.GetHandle(), (*C.ulong)(unsafe.Pointer(flagsHeader.Data)), ctitles, C.int(count)));
+}
+
+func (handle HCONTAINER) FileSytemSetup(flags []uint, titles []string) int {
+    handle.filesystem = true;
+    return Filesystem_setup(handle, flags, titles);
+}
+
+func Container_alloc(handle HANDLE, rowcount int) POINTER {
+   return POINTER(C.go_container_alloc(handle.GetHandle(), C.int(rowcount)));
+}
+
+func (handle HCONTAINER) Alloc(rowcount int) POINTER {
+    return Container_alloc(handle, rowcount);
+}
+
+func Container_set_item(handle HANDLE, ptr POINTER, column int, row int, data unsafe.Pointer) {
+   C.go_container_set_item(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), data);
+}
+
+func Container_set_item_ulong(handle HANDLE, ptr POINTER, column int, row int, val uint) {
+   C.go_container_set_item_ulong(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), C.ulong(val));
+}
+
+func Container_set_item_icon(handle HANDLE, ptr POINTER, column int, row int, icon HICN) {
+   C.go_container_set_item_icon(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), unsafe.Pointer(icon));
+}
+
+func Container_set_item_time(handle HANDLE, ptr POINTER, column int, row int, seconds int, minutes int, hours int) {
+   C.go_container_set_item_time(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), C.int(seconds), C.int(minutes), C.int(hours));
+}
+
+func Container_set_item_date(handle HANDLE, ptr POINTER, column int, row int, day int, month int, year int) {
+   C.go_container_set_item_date(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), C.int(day), C.int(month), C.int(year));
+}
+
+func Container_change_item(handle HANDLE, column int, row int, data unsafe.Pointer) {
+   C.go_container_change_item(handle.GetHandle(), C.int(column), C.int(row), data);
+}
+
+func Container_change_item_ulong(handle HANDLE, column int, row int, val uint) {
+   C.go_container_change_item_ulong(handle.GetHandle(), C.int(column), C.int(row), C.ulong(val));
+}
+
+func Container_change_item_icon(handle HANDLE, column int, row int, icon HICN) {
+   C.go_container_change_item_icon(handle.GetHandle(), C.int(column), C.int(row), unsafe.Pointer(icon));
+}
+
+func Container_change_item_time(handle HANDLE, column int, row int, seconds int, minutes int, hours int) {
+   C.go_container_change_item_time(handle.GetHandle(), C.int(column), C.int(row), C.int(seconds), C.int(minutes), C.int(hours));
+}
+
+func Container_change_item_date(handle HANDLE, column int, row int, day int, month int, year int) {
+   C.go_container_change_item_date(handle.GetHandle(), C.int(column), C.int(row), C.int(day), C.int(month), C.int(year));
+}
+
+func Container_set_column_width(handle HANDLE, column int, width int) {
+   C.go_container_set_column_width(handle.GetHandle(), C.int(column), C.int(width));
 }
 
 func Container_set_row_title(ptr POINTER, row int, title string) {
@@ -1587,152 +2145,152 @@
    /* TODO: Probably need to have a way to free this or leak */
 }
 
-func Container_set_row_data(ptr unsafe.Pointer row int, data POINTER) {
-   C.dw_container_set_row_title(ptr, C.int(row), (*C.char)(data));
-}
-
-func Container_change_row_title(handle HWND, row int, title string) {
+func Container_set_row_data(ptr POINTER, row int, data POINTER) {
+   C.dw_container_set_row_title(unsafe.Pointer(ptr), C.int(row), (*C.char)(data));
+}
+
+func Container_change_row_title(handle HANDLE, row int, title string) {
    ctitle := C.CString(title);
-   C.go_container_change_row_title(unsafe.Pointer(handle.hwnd), C.int(row), ctitle);
-}
-
-func Container_change_row_data(handle HWND, row int, data unsafe.Pointer) {
-   C.go_container_change_row_data(unsafe.Pointer(handle.hwnd), C.int(row), data);
-}
-
-func Container_insert(handle HWND, ptr POINTER, rowcount int) {
-   C.go_container_insert(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(rowcount));
-}
-
-func Container_clear(handle HWND, redraw int) {
-   C.go_container_clear(unsafe.Pointer(handle.hwnd), C.int(redraw));
-}
-
-func Container_delete(handle HWND, rowcount int) {
-   C.go_container_delete(unsafe.Pointer(handle.hwnd), C.int(rowcount));
-}
-
-func Container_query_start(handle HWND, flags uint) string {
-   cresult := C.go_container_query_start(unsafe.Pointer(handle.hwnd), C.ulong(flags));
+   C.go_container_change_row_title(handle.GetHandle(), C.int(row), ctitle);
+}
+
+func Container_change_row_data(handle HANDLE, row int, data unsafe.Pointer) {
+   C.go_container_change_row_data(handle.GetHandle(), C.int(row), data);
+}
+
+func Container_insert(handle HANDLE, ptr POINTER, rowcount int) {
+   C.go_container_insert(handle.GetHandle(), unsafe.Pointer(ptr), C.int(rowcount));
+}
+
+func Container_clear(handle HANDLE, redraw int) {
+   C.go_container_clear(handle.GetHandle(), C.int(redraw));
+}
+
+func Container_delete(handle HANDLE, rowcount int) {
+   C.go_container_delete(handle.GetHandle(), C.int(rowcount));
+}
+
+func Container_query_start(handle HANDLE, flags uint) string {
+   cresult := C.go_container_query_start(handle.GetHandle(), C.ulong(flags));
    result := C.GoString(cresult);
    /* TODO: Do I need to free this? */
    return result;
 }
 
-func Container_query_next(handle HWND, flags uint) string {
-   cresult := C.go_container_query_next(unsafe.Pointer(handle.hwnd), C.ulong(flags));
+func Container_query_next(handle HANDLE, flags uint) string {
+   cresult := C.go_container_query_next(handle.GetHandle(), C.ulong(flags));
    result := C.GoString(cresult);
    /* TODO: Do I need to free this? */
    return result;
 }
 
-func Container_scroll(handle HWND, direction int, rows int) {
-   C.go_container_scroll(unsafe.Pointer(handle.hwnd), C.int(direction), C.long(rows));
-}
-
-func Container_cursor(handle HWND, text string) {
+func Container_scroll(handle HANDLE, direction int, rows int) {
+   C.go_container_scroll(handle.GetHandle(), C.int(direction), C.long(rows));
+}
+
+func Container_cursor(handle HANDLE, text string) {
    ctext := C.CString(text);
    defer C.free(unsafe.Pointer(ctext));
    
-   C.go_container_cursor(unsafe.Pointer(handle.hwnd), ctext);
-}
-
-func Container_delete_row(handle HWND, text string) {
+   C.go_container_cursor(handle.GetHandle(), ctext);
+}
+
+func Container_delete_row(handle HANDLE, text string) {
    ctext := C.CString(text);
    defer C.free(unsafe.Pointer(ctext));
    
-   C.go_container_delete_row(unsafe.Pointer(handle.hwnd), ctext);
-}
-
-func Container_optimize(handle HWND) {
-   C.go_container_optimize(unsafe.Pointer(handle.hwnd));
-}
-
-func Container_set_stripe(handle HWND, oddcolor COLOR, evencolor COLOR) {
-   C.go_container_set_stripe(unsafe.Pointer(handle.hwnd), C.ulong(oddcolor), C.ulong(evencolor));
-}
-
-func Container_get_column_type(handle HWND, column int) uint {
-   return uint(C.go_container_get_column_type(unsafe.Pointer(handle.hwnd), C.int(column)));
-}
-
-func Filesystem_get_column_type(handle HWND, column int) uint {
-   return uint(C.go_filesystem_get_column_type(unsafe.Pointer(handle.hwnd), C.int(column)));
-}
-
-func Filesystem_set_column_title(handle HWND, title string) {
+   C.go_container_delete_row(handle.GetHandle(), ctext);
+}
+
+func Container_optimize(handle HANDLE) {
+   C.go_container_optimize(handle.GetHandle());
+}
+
+func Container_set_stripe(handle HANDLE, oddcolor COLOR, evencolor COLOR) {
+   C.go_container_set_stripe(handle.GetHandle(), C.ulong(oddcolor), C.ulong(evencolor));
+}
+
+func Container_get_column_type(handle HANDLE, column int) uint {
+   return uint(C.go_container_get_column_type(handle.GetHandle(), C.int(column)));
+}
+
+func Filesystem_get_column_type(handle HANDLE, column int) uint {
+   return uint(C.go_filesystem_get_column_type(handle.GetHandle(), C.int(column)));
+}
+
+func Filesystem_set_column_title(handle HANDLE, title string) {
    ctitle := C.CString(title);
    defer C.free(unsafe.Pointer(ctitle));
    
-   C.go_filesystem_set_column_title(unsafe.Pointer(handle.hwnd), ctitle);
-}
-
-func Filesystem_set_item(handle HWND, ptr POINTER, column int, row int, data unsafe.Pointer) {
-   C.go_filesystem_set_item(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), data);
-}
-
-func Filesystem_set_item_ulong(handle HWND, ptr POINTER, column int, row int, val uint) {
-   C.go_filesystem_set_item_ulong(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), C.ulong(val));
-}
-
-func Filesystem_set_item_icon(handle HWND, ptr POINTER, column int, row int, icon HICN) {
-   C.go_filesystem_set_item_icon(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), unsafe.Pointer(icon));
-}
-
-func Filesystem_set_item_time(handle HWND, ptr POINTER, column int, row int, seconds int, minutes int, hours int) {
-   C.go_filesystem_set_item_time(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), C.int(seconds), C.int(minutes), C.int(hours));
-}
-
-func Filesystem_set_item_date(handle HWND, ptr POINTER, column int, row int, day int, month int, year int) {
-   C.go_filesystem_set_item_date(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(column), C.int(row), C.int(day), C.int(month), C.int(year));
-}
-
-func Filesystem_set_file(handle HWND, ptr POINTER, row int, filename string, icon HICN) {
+   C.go_filesystem_set_column_title(handle.GetHandle(), ctitle);
+}
+
+func Filesystem_set_item(handle HANDLE, ptr POINTER, column int, row int, data unsafe.Pointer) {
+   C.go_filesystem_set_item(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), data);
+}
+
+func Filesystem_set_item_ulong(handle HANDLE, ptr POINTER, column int, row int, val uint) {
+   C.go_filesystem_set_item_ulong(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), C.ulong(val));
+}
+
+func Filesystem_set_item_icon(handle HANDLE, ptr POINTER, column int, row int, icon HICN) {
+   C.go_filesystem_set_item_icon(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), unsafe.Pointer(icon));
+}
+
+func Filesystem_set_item_time(handle HANDLE, ptr POINTER, column int, row int, seconds int, minutes int, hours int) {
+   C.go_filesystem_set_item_time(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), C.int(seconds), C.int(minutes), C.int(hours));
+}
+
+func Filesystem_set_item_date(handle HANDLE, ptr POINTER, column int, row int, day int, month int, year int) {
+   C.go_filesystem_set_item_date(handle.GetHandle(), unsafe.Pointer(ptr), C.int(column), C.int(row), C.int(day), C.int(month), C.int(year));
+}
+
+func Filesystem_set_file(handle HANDLE, ptr POINTER, row int, filename string, icon HICN) {
    cfilename := C.CString(filename);
    defer C.free(unsafe.Pointer(cfilename));
    
-   C.go_filesystem_set_file(unsafe.Pointer(handle.hwnd), unsafe.Pointer(ptr), C.int(row), cfilename, unsafe.Pointer(icon));
-}
-
-func Filesystem_change_item(handle HWND, column int, row int, data unsafe.Pointer) {
-   C.go_filesystem_change_item(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), data);
-}
-
-func Filesystem_change_item_ulong(handle HWND, column int, row int, val uint) {
-   C.go_filesystem_change_item_ulong(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), C.ulong(val));
-}
-
-func Filesystem_change_item_icon(handle HWND, column int, row int, icon HICN) {
-   C.go_filesystem_change_item_icon(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), unsafe.Pointer(icon));
-}
-
-func Filesystem_change_item_time(handle HWND, column int, row int, seconds int, minutes int, hours int) {
-   C.go_filesystem_change_item_time(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), C.int(seconds), C.int(minutes), C.int(hours));
-}
-
-func Filesystem_change_item_date(handle HWND, column int, row int, day int, month int, year int) {
-   C.go_filesystem_change_item_date(unsafe.Pointer(handle.hwnd), C.int(column), C.int(row), C.int(day), C.int(month), C.int(year));
-}
-
-func Filesystem_change_file(handle HWND, row int, filename string, icon HICN) {
+   C.go_filesystem_set_file(handle.GetHandle(), unsafe.Pointer(ptr), C.int(row), cfilename, unsafe.Pointer(icon));
+}
+
+func Filesystem_change_item(handle HANDLE, column int, row int, data unsafe.Pointer) {
+   C.go_filesystem_change_item(handle.GetHandle(), C.int(column), C.int(row), data);
+}
+
+func Filesystem_change_item_ulong(handle HANDLE, column int, row int, val uint) {
+   C.go_filesystem_change_item_ulong(handle.GetHandle(), C.int(column), C.int(row), C.ulong(val));
+}
+
+func Filesystem_change_item_icon(handle HANDLE, column int, row int, icon HICN) {
+   C.go_filesystem_change_item_icon(handle.GetHandle(), C.int(column), C.int(row), unsafe.Pointer(icon));
+}
+
+func Filesystem_change_item_time(handle HANDLE, column int, row int, seconds int, minutes int, hours int) {
+   C.go_filesystem_change_item_time(handle.GetHandle(), C.int(column), C.int(row), C.int(seconds), C.int(minutes), C.int(hours));
+}
+
+func Filesystem_change_item_date(handle HANDLE, column int, row int, day int, month int, year int) {
+   C.go_filesystem_change_item_date(handle.GetHandle(), C.int(column), C.int(row), C.int(day), C.int(month), C.int(year));
+}
+
+func Filesystem_change_file(handle HANDLE, row int, filename string, icon HICN) {
    cfilename := C.CString(filename);
    defer C.free(unsafe.Pointer(cfilename));
    
-   C.go_filesystem_change_file(unsafe.Pointer(handle.hwnd), C.int(row), cfilename, unsafe.Pointer(icon));
-}
-
-func Calendar_new(id uint) HWND {
-    return HWND{C.go_calendar_new(C.ulong(id))};
-}
-
-func Calendar_set_date(handle HWND, year uint, month uint, day uint) {
-   C.go_calendar_set_date(unsafe.Pointer(handle.hwnd), C.uint(year), C.uint(month), C.uint(day));
-}
-
-func Calendar_get_date(handle HWND) (uint, uint, uint) {
+   C.go_filesystem_change_file(handle.GetHandle(), C.int(row), cfilename, unsafe.Pointer(icon));
+}
+
+func Calendar_new(id uint) HCALENDAR {
+    return HCALENDAR{C.go_calendar_new(C.ulong(id))};
+}
+
+func Calendar_set_date(handle HANDLE, year uint, month uint, day uint) {
+   C.go_calendar_set_date(handle.GetHandle(), C.uint(year), C.uint(month), C.uint(day));
+}
+
+func Calendar_get_date(handle HANDLE) (uint, uint, uint) {
    var year, month, day C.uint;
    
-   C.go_calendar_get_date(unsafe.Pointer(handle.hwnd), &year, &month, &day);
+   C.go_calendar_get_date(handle.GetHandle(), &year, &month, &day);
    return uint(year), uint(month), uint(day);
 }
 
@@ -2049,10 +2607,10 @@
 func go_int_callback_item_select(pfunc unsafe.Pointer, window unsafe.Pointer, item unsafe.Pointer, text *C.char, data unsafe.Pointer, itemdata unsafe.Pointer, flags C.int) C.int {
    if (flags & go_flags_no_data) == go_flags_no_data {
       thisfunc := *(*func(HWND, HTREEITEM, string, POINTER) int)(pfunc);
-      return C.int(thisfunc(HWND{window}, HTREEITEM(item), C.GoString(text), POINTER(itemdata)));
+      return C.int(thisfunc(HWND{window}, HTREEITEM{item, HWND{window}}, C.GoString(text), POINTER(itemdata)));
    }
    thisfunc := *(*func(HWND, HTREEITEM, string, POINTER, POINTER) int)(pfunc);
-   return C.int(thisfunc(HWND{window}, HTREEITEM(item), C.GoString(text), POINTER(data), POINTER(itemdata)));
+   return C.int(thisfunc(HWND{window}, HTREEITEM{item, HWND{window}}, C.GoString(text), POINTER(data), POINTER(itemdata)));
 }
 
 //export go_int_callback_numeric
@@ -2079,10 +2637,10 @@
 func go_int_callback_tree(pfunc unsafe.Pointer, window unsafe.Pointer, tree unsafe.Pointer, data unsafe.Pointer, flags C.int) C.int {
    if (flags & go_flags_no_data) == go_flags_no_data {
       thisfunc := *(*func(HWND, HTREEITEM) int)(pfunc);
-      return C.int(thisfunc(HWND{window}, HTREEITEM(tree)));
+      return C.int(thisfunc(HWND{window}, HTREEITEM{tree, HWND{window}}));
    }
    thisfunc := *(*func(HWND, HTREEITEM, POINTER) int)(pfunc);
-   return C.int(thisfunc(HWND{window}, HTREEITEM(tree), POINTER(data)));
+   return C.int(thisfunc(HWND{window}, HTREEITEM{tree, HWND{window}}, POINTER(data)));
 }
 
 //export go_int_callback_timer
--- a/src/dw/dwglue.c	Fri Mar 08 18:46:49 2013 -0600
+++ b/src/dw/dwglue.c	Thu Mar 14 12:58:49 2013 -0500
@@ -102,6 +102,11 @@
    return dw_window_get_data((HWND)handle, dataname);
 }
 
+static void go_window_set_data(void *handle, char *dataname, void *data)
+{
+   dw_window_set_data((HWND)handle, dataname, data);
+}
+
 static char *go_window_get_font(void *handle)
 {
    return dw_window_get_font((HWND)handle);
--- a/src/dwtest/dwtest.go	Fri Mar 08 18:46:49 2013 -0600
+++ b/src/dwtest/dwtest.go	Thu Mar 14 12:58:49 2013 -0500
@@ -20,7 +20,8 @@
 var FIXEDFONT = "10.monospace"
 
 // Page 1
-var notebookbox1, copypastefield, entryfield, cursortogglebutton, mainwindow, noncheckable_menuitem, checkable_menuitem dw.HWND
+var notebookbox1, cursortogglebutton, mainwindow, noncheckable_menuitem, checkable_menuitem dw.HWND
+var copypastefield, entryfield dw.HENTRYFIELD
 var current_color dw.COLOR = dw.RGB(100, 100, 100)
 var cursor_arrow bool = true
 var timerid dw.HTIMER
@@ -205,11 +206,11 @@
 func cursortoggle_callback(window dw.HWND, data dw.POINTER) int {
     if cursor_arrow {
         dw.Window_set_text(cursortogglebutton, "Set Cursor pointer - ARROW");
-        dw.Window_set_pointer(dw.POINTER_TO_HWND(data), dw.POINTER_CLOCK);
+        dw.Window_set_pointer(dw.POINTER_TO_HANDLE(data), dw.POINTER_CLOCK);
         cursor_arrow = false;
     } else {
         dw.Window_set_text(cursortogglebutton, "Set Cursor pointer - CLOCK");
-        dw.Window_set_pointer(dw.POINTER_TO_HWND(data), dw.POINTER_DEFAULT);
+        dw.Window_set_pointer(dw.POINTER_TO_HANDLE(data), dw.POINTER_DEFAULT);
         cursor_arrow = true;
     }
     return FALSE;
@@ -240,7 +241,7 @@
 }
 
 func show_window_callback(window dw.HWND, data dw.POINTER) int {
-    thiswindow := dw.POINTER_TO_HWND(data);
+    thiswindow := dw.POINTER_TO_HANDLE(data);
 
     if thiswindow != dw.NOHWND {
         dw.Window_show(thiswindow);
@@ -253,10 +254,10 @@
     hwndMenu := dw.Menu_new(0);
     menuitem := dw.Menu_append_item(hwndMenu, "~Quit", dw.MENU_POPUP, 0, TRUE, FALSE, dw.NOMENU);
 
-    dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&exit_callback_func), dw.HWND_TO_POINTER(mainwindow));
+    dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow));
     dw.Menu_append_item(hwndMenu, dw.MENU_SEPARATOR, dw.MENU_POPUP, 0, TRUE, FALSE, dw.NOMENU);
     menuitem = dw.Menu_append_item(hwndMenu, "~Show Window", dw.MENU_POPUP, 0, TRUE, FALSE, dw.NOMENU);
-    dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&show_window_callback_func), dw.HWND_TO_POINTER(mainwindow));
+    dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&show_window_callback_func), dw.HANDLE_TO_POINTER(mainwindow));
     px, py := dw.Pointer_query_pos();
     /* Use the toplevel window handle here.... because on the Mac..
      * using the control itself, when a different tab is active
@@ -499,7 +500,7 @@
 /* Callback to handle user selection of the scrollbar position */
 func scrollbar_valuechanged_callback(hwnd dw.HWND, value int, data dw.POINTER) int {
     if data != nil {
-        stext := dw.POINTER_TO_HWND(data);
+        stext := dw.POINTER_TO_HANDLE(data);
 
         if hwnd == vscrollbar {
             current_row = value;
@@ -627,35 +628,35 @@
 
 // Page 3 and 4 Callbacks
 func item_enter_cb(window dw.HWND, text string, data dw.POINTER) int {
-    message := fmt.Sprintf("DW_SIGNAL_ITEM_ENTER: Window: %x Text: %s", dw.HWND_TO_UINTPTR(window), text);
-    dw.Window_set_text(dw.POINTER_TO_HWND(data), message);
+    message := fmt.Sprintf("DW_SIGNAL_ITEM_ENTER: Window: %x Text: %s", dw.HANDLE_TO_UINTPTR(window), text);
+    dw.Window_set_text(dw.POINTER_TO_HANDLE(data), message);
     return FALSE;
 }
 
 func item_context_cb(window dw.HWND, text string, x int, y int, data dw.POINTER, itemdata dw.POINTER) int {
-    message := fmt.Sprintf("DW_SIGNAL_ITEM_CONTEXT: Window: %x Text: %s x: %d y: %d Itemdata: %x", dw.HWND_TO_UINTPTR(window), 
+    message := fmt.Sprintf("DW_SIGNAL_ITEM_CONTEXT: Window: %x Text: %s x: %d y: %d Itemdata: %x", dw.HANDLE_TO_UINTPTR(window), 
           text, x, y, uintptr(itemdata));
-    dw.Window_set_text(dw.POINTER_TO_HWND(data), message);
+    dw.Window_set_text(dw.POINTER_TO_HANDLE(data), message);
     return FALSE;
 }
 
 func list_select_cb(window dw.HWND, item int, data dw.POINTER) int {
-    message := fmt.Sprintf("DW_SIGNAL_LIST_SELECT: Window: %x Item: %d", dw.HWND_TO_UINTPTR(window), item);
-    dw.Window_set_text(dw.POINTER_TO_HWND(data), message);
+    message := fmt.Sprintf("DW_SIGNAL_LIST_SELECT: Window: %x Item: %d", dw.HANDLE_TO_UINTPTR(window), item);
+    dw.Window_set_text(dw.POINTER_TO_HANDLE(data), message);
     return FALSE;
 }
 
 func item_select_cb(window dw.HWND, item dw.HTREEITEM, text string, data dw.POINTER, itemdata dw.POINTER) int {
-    message := fmt.Sprintf("DW_SIGNAL_ITEM_SELECT: Window: %x Item: %x Text: %s Itemdata: %x", dw.HWND_TO_UINTPTR(window),
+    message := fmt.Sprintf("DW_SIGNAL_ITEM_SELECT: Window: %x Item: %x Text: %s Itemdata: %x", dw.HANDLE_TO_UINTPTR(window),
             uintptr(dw.POINTER(item)), text, uintptr(itemdata));
-    dw.Window_set_text(dw.POINTER_TO_HWND(data), message);
+    dw.Window_set_text(dw.POINTER_TO_HANDLE(data), message);
     return FALSE;
 }
 
 func container_select_cb(window dw.HWND, item dw.HTREEITEM, text string, data dw.POINTER, itemdata dw.POINTER)  int {
-    message := fmt.Sprintf("DW_SIGNAL_ITEM_SELECT: Window: %x Item: %x Text: %s Itemdata: %x", dw.HWND_TO_UINTPTR(window),
+    message := fmt.Sprintf("DW_SIGNAL_ITEM_SELECT: Window: %x Item: %x Text: %s Itemdata: %x", dw.HANDLE_TO_UINTPTR(window),
             uintptr(dw.POINTER(item)), text, uintptr(itemdata));
-    dw.Window_set_text(dw.POINTER_TO_HWND(data), message);
+    dw.Window_set_text(dw.POINTER_TO_HANDLE(data), message);
     mle_point = dw.Mle_import(container_mle, message, mle_point);
     str := dw.Container_query_start(container, dw.CRA_SELECTED);
     for len(str) > 0 {
@@ -695,9 +696,9 @@
             stype = "BitmapOrIcon";
         }
     }
-    message := fmt.Sprintf("DW_SIGNAL_COLUMN_CLICK: Window: %x Column: %d Type: %s Itemdata: %x", dw.HWND_TO_UINTPTR(window),
+    message := fmt.Sprintf("DW_SIGNAL_COLUMN_CLICK: Window: %x Column: %d Type: %s Itemdata: %x", dw.HANDLE_TO_UINTPTR(window),
             column_num, stype);
-    dw.Window_set_text(dw.POINTER_TO_HWND(data), message);
+    dw.Window_set_text(dw.POINTER_TO_HANDLE(data), message);
     return FALSE;
 }
 
@@ -816,7 +817,7 @@
     /* add menus to the menubar */
     menu := dw.Menu_new(0);
     menuitem := dw.Menu_append_item(menu, "~Quit", dw.MENU_AUTO, 0, dw.TRUE, dw.FALSE, dw.NOMENU);
-    dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&exit_callback_func), dw.HWND_TO_POINTER(mainwindow));
+    dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow));
     /*
      * Add the "File" menu to the menubar...
      */
@@ -839,7 +840,7 @@
 
     menu = dw.Menu_new(0);
     menuitem = dw.Menu_append_item(menu, "~About", dw.MENU_AUTO, 0, dw.TRUE, dw.FALSE, dw.NOMENU);
-    dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&helpabout_callback_func), dw.HWND_TO_POINTER(mainwindow));
+    dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&helpabout_callback_func), dw.HANDLE_TO_POINTER(mainwindow));
     /*
      * Add the "Help" menu to the menubar...
      */
@@ -927,12 +928,12 @@
 
     dw.Signal_connect(browsefilebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&browse_file_callback_func), nil);
     dw.Signal_connect(browsefolderbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&browse_folder_callback_func), nil);
-    dw.Signal_connect(copybutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&copy_clicked_callback_func), dw.HWND_TO_POINTER(copypastefield));
-    dw.Signal_connect(pastebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&paste_clicked_callback_func), dw.HWND_TO_POINTER(copypastefield));
+    dw.Signal_connect(copybutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&copy_clicked_callback_func), dw.HANDLE_TO_POINTER(copypastefield));
+    dw.Signal_connect(pastebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&paste_clicked_callback_func), dw.HANDLE_TO_POINTER(copypastefield));
     dw.Signal_connect(okbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&beep_callback_func), nil);
-    dw.Signal_connect(cancelbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&exit_callback_func), dw.HWND_TO_POINTER(mainwindow));
-    dw.Signal_connect(cursortogglebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&cursortoggle_callback_func), dw.HWND_TO_POINTER(mainwindow));
-    dw.Signal_connect(colorchoosebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&colorchoose_callback_func), dw.HWND_TO_POINTER(mainwindow));
+    dw.Signal_connect(cancelbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow));
+    dw.Signal_connect(cursortogglebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&cursortoggle_callback_func), dw.HANDLE_TO_POINTER(mainwindow));
+    dw.Signal_connect(colorchoosebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&colorchoose_callback_func), dw.HANDLE_TO_POINTER(mainwindow));
 }
 
 // Create Page 2
@@ -1045,8 +1046,8 @@
     dw.Signal_connect(textbox2, dw.SIGNAL_CONFIGURE, dw.SIGNAL_FUNC(&configure_event_func), nil);
     dw.Signal_connect(textbox2, dw.SIGNAL_MOTION_NOTIFY, dw.SIGNAL_FUNC(&motion_notify_event_func), dw.POINTER(uintptr(1)));
     dw.Signal_connect(textbox2, dw.SIGNAL_BUTTON_PRESS, dw.SIGNAL_FUNC(&motion_notify_event_func), nil);
-    dw.Signal_connect(hscrollbar, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(&scrollbar_valuechanged_callback_func), dw.HWND_TO_POINTER(status1));
-    dw.Signal_connect(vscrollbar, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(&scrollbar_valuechanged_callback_func), dw.HWND_TO_POINTER(status1));
+    dw.Signal_connect(hscrollbar, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(&scrollbar_valuechanged_callback_func), dw.HANDLE_TO_POINTER(status1));
+    dw.Signal_connect(vscrollbar, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(&scrollbar_valuechanged_callback_func), dw.HANDLE_TO_POINTER(status1));
     dw.Signal_connect(imagestretchcheck, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&refresh_callback_func), nil);
     dw.Signal_connect(button1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&refresh_callback_func), nil);
     dw.Signal_connect(button2, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&print_callback_func), nil);
@@ -1076,8 +1077,8 @@
     dw.Box_pack_start(notebookbox3, tree_status, 100, -1, TRUE, FALSE, 1);
 
     /* set up our signal trappers... */
-    dw.Signal_connect(tree, dw.SIGNAL_ITEM_CONTEXT, dw.SIGNAL_FUNC(&item_context_cb_func), dw.HWND_TO_POINTER(tree_status));
-    dw.Signal_connect(tree, dw.SIGNAL_ITEM_SELECT, dw.SIGNAL_FUNC(&item_select_cb_func), dw.HWND_TO_POINTER(tree_status));
+    dw.Signal_connect(tree, dw.SIGNAL_ITEM_CONTEXT, dw.SIGNAL_FUNC(&item_context_cb_func), dw.HANDLE_TO_POINTER(tree_status));
+    dw.Signal_connect(tree, dw.SIGNAL_ITEM_SELECT, dw.SIGNAL_FUNC(&item_select_cb_func), dw.HANDLE_TO_POINTER(tree_status));
 
     t1 := dw.Tree_insert(tree, "tree folder 1", foldericon, nil, dw.POINTER(uintptr(1)));
     t2 := dw.Tree_insert(tree, "tree folder 2", foldericon, nil, dw.POINTER(uintptr(2)));
@@ -1122,7 +1123,7 @@
         if z == 0 {
              thisicon = foldericon;
         } 
-        fmt.Printf("Initial: container: %x containerinfo: %x icon: %x\n", uintptr(dw.HWND_TO_POINTER(container)),
+        fmt.Printf("Initial: container: %x containerinfo: %x icon: %x\n", uintptr(dw.HANDLE_TO_POINTER(container)),
                   uintptr(containerinfo), uintptr(dw.POINTER(thisicon)));
         dw.Filesystem_set_file(container, containerinfo, z, fmt.Sprintf("Filename %d", z+1), thisicon);
         dw.Filesystem_set_item_icon(container, containerinfo, 0, z, thisicon);
@@ -1157,10 +1158,10 @@
     mle_point = dw.Mle_import(container_mle, fmt.Sprintf("[%d]\r\n\r\n", mle_point), mle_point);
     dw.Mle_set_cursor(container_mle, mle_point);
     /* connect our event trappers... */
-    dw.Signal_connect(container, dw.SIGNAL_ITEM_ENTER, dw.SIGNAL_FUNC(&item_enter_cb_func), dw.HWND_TO_POINTER(container_status));
-    dw.Signal_connect(container, dw.SIGNAL_ITEM_CONTEXT, dw.SIGNAL_FUNC(&item_context_cb_func), dw.HWND_TO_POINTER(container_status));
-    dw.Signal_connect(container, dw.SIGNAL_ITEM_SELECT, dw.SIGNAL_FUNC(&container_select_cb_func), dw.HWND_TO_POINTER(container_status));
-    dw.Signal_connect(container, dw.SIGNAL_COLUMN_CLICK, dw.SIGNAL_FUNC(&column_click_cb_func), dw.HWND_TO_POINTER(container_status));
+    dw.Signal_connect(container, dw.SIGNAL_ITEM_ENTER, dw.SIGNAL_FUNC(&item_enter_cb_func), dw.HANDLE_TO_POINTER(container_status));
+    dw.Signal_connect(container, dw.SIGNAL_ITEM_CONTEXT, dw.SIGNAL_FUNC(&item_context_cb_func), dw.HANDLE_TO_POINTER(container_status));
+    dw.Signal_connect(container, dw.SIGNAL_ITEM_SELECT, dw.SIGNAL_FUNC(&container_select_cb_func), dw.HANDLE_TO_POINTER(container_status));
+    dw.Signal_connect(container, dw.SIGNAL_COLUMN_CLICK, dw.SIGNAL_FUNC(&column_click_cb_func), dw.HANDLE_TO_POINTER(container_status));
 }
 
 // Page 5
@@ -1387,7 +1388,7 @@
    /* Set the default field */
    dw.Window_default(mainwindow, copypastefield);
 
-   dw.Signal_connect(mainwindow, dw.SIGNAL_DELETE, dw.SIGNAL_FUNC(&exit_callback_func), dw.HWND_TO_POINTER(mainwindow));
+   dw.Signal_connect(mainwindow, dw.SIGNAL_DELETE, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow));
    /*
    * The following is a special case handler for the Mac and other platforms which contain
    * an application object which can be closed.  It function identically to a window delete/close
@@ -1395,7 +1396,7 @@
    * handled or you allow the default handler to take place the entire application will close.
    * On platforms which do not have an application object this line will be ignored.
    */
-   dw.Signal_connect(dw.DESKTOP, dw.SIGNAL_DELETE, dw.SIGNAL_FUNC(&exit_callback_func), dw.HWND_TO_POINTER(mainwindow));
+   dw.Signal_connect(dw.DESKTOP, dw.SIGNAL_DELETE, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow));
    timerid = dw.Timer_connect(2000, dw.SIGNAL_FUNC(&timer_callback_func), nil);
    dw.Window_set_size(mainwindow, 640, 550);
    dw.Window_show(mainwindow);