Mercurial > godwindows
changeset 104:c3b5fae31eda
Implment HTML callbacks: changed and result. Untested, will test with dw(oo)test changes.
Also switch to using uintptr_t to store the timer id... HTIMER is no longer always int.
author | Brian Smith <brian@dbsoft.org> |
---|---|
date | Mon, 08 Nov 2021 19:18:44 -0600 |
parents | 59f9c8888e0a |
children | 0ed080cc4207 |
files | dw/dw.go dw/dwglue.c |
diffstat | 2 files changed, 94 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/dw/dw.go Mon Nov 08 17:52:27 2021 -0600 +++ b/dw/dw.go Mon Nov 08 19:18:44 2021 -0600 @@ -123,7 +123,7 @@ } type HICN C.uintptr_t type HTIMER struct { - tid C.int + tid C.uintptr_t } type HMENUI struct { hmenui C.uintptr_t @@ -306,6 +306,8 @@ var SIGNAL_SWITCH_PAGE = C.DW_SIGNAL_SWITCH_PAGE var SIGNAL_COLUMN_CLICK = C.DW_SIGNAL_COLUMN_CLICK var SIGNAL_TREE_EXPAND = C.DW_SIGNAL_TREE_EXPAND +var SIGNAL_HTML_CHANGED = C.DW_SIGNAL_HTML_CHANGED +var SIGNAL_HTML_RESULT = C.DW_SIGNAL_HTML_RESULT /* status of menu items */ var MIS_ENABLED uint = C.DW_MIS_ENABLED @@ -2850,7 +2852,7 @@ //Removes timer callback. func Timer_disconnect(id HTIMER) { if id.tid > 0 { - C.dw_timer_disconnect(C.int(id.tid)) + C.go_timer_disconnect(C.uintptr_t(id.tid)) } } @@ -5178,6 +5180,22 @@ C.go_signal_connect(window.GetHandle(), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data) } +// Connect a function or closure to a HTML changed event. +func (window HHTML) ConnectChanged(sigfunc func(window HHTML, status int, url string) int) { + csigname := C.CString(C.DW_SIGNAL_HTML_CHANGED) + defer C.free(unsafe.Pointer(csigname)) + + C.go_signal_connect(window.GetHandle(), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data) +} + +// Connect a function or closure to a HTML javascript result event. +func (window HHTML) ConnectResult(sigfunc func(window HHTML, status int, result string) int) { + csigname := C.CString(C.DW_SIGNAL_HTML_RESULT) + defer C.free(unsafe.Pointer(csigname)) + + C.go_signal_connect(window.GetHandle(), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data) +} + // Connect a function or closure to a timer event. func (id *HTIMER) Connect(sigfunc func() int, interval int) { if id.tid == 0 { @@ -5188,7 +5206,7 @@ // Disconnect an active timer event. func (id HTIMER) Disconnect() { if id.tid > 0 { - C.dw_timer_disconnect(C.int(id.tid)) + C.go_timer_disconnect(C.uintptr_t(id.tid)) } } @@ -6234,6 +6252,42 @@ return C.int(thisfunc(HGENERIC{window}, HTREEITEM{tree, HWND{window}}, POINTER(data))) } +//export go_int_callback_html_changed +func go_int_callback_html_changed(h unsafe.Pointer, window C.uintptr_t, status C.int, url *C.char, data unsafe.Pointer, flags C.uint) C.int { + pfunc := cgo.Handle(h) + switch flags { + case (18 << 8): // HHTML + thisfunc := pfunc.Value().(func(HHTML, int, string, POINTER) int) + return C.int(thisfunc(HHTML{window}, int(status), C.GoString(url), POINTER(data))) + case go_flags_no_data: + thisfunc := pfunc.Value().(func(HANDLE, int, string) int) + return C.int(thisfunc(HGENERIC{window}, int(status), C.GoString(url))) + case (18 << 8) | go_flags_no_data: // HHTML + thisfunc := pfunc.Value().(func(HHTML, int, string) int) + return C.int(thisfunc(HHTML{window}, int(status), C.GoString(url))) + } + thisfunc := pfunc.Value().(func(HANDLE, int, string, POINTER) int) + return C.int(thisfunc(HGENERIC{window}, int(status), C.GoString(url), POINTER(data))) +} + +//export go_int_callback_html_result +func go_int_callback_html_result(h unsafe.Pointer, window C.uintptr_t, status C.int, url *C.char, scriptdata unsafe.Pointer, data unsafe.Pointer, flags C.uint) C.int { + pfunc := cgo.Handle(h) + switch flags { + case (18 << 8): // HHTML + thisfunc := pfunc.Value().(func(HHTML, int, string, POINTER, POINTER) int) + return C.int(thisfunc(HHTML{window}, int(status), C.GoString(url), POINTER(scriptdata), POINTER(data))) + case go_flags_no_data: + thisfunc := pfunc.Value().(func(HANDLE, int, string, POINTER) int) + return C.int(thisfunc(HGENERIC{window}, int(status), C.GoString(url), POINTER(scriptdata))) + case (18 << 8) | go_flags_no_data: // HHTML + thisfunc := pfunc.Value().(func(HHTML, int, string, POINTER) int) + return C.int(thisfunc(HHTML{window}, int(status), C.GoString(url), POINTER(scriptdata))) + } + thisfunc := pfunc.Value().(func(HANDLE, int, string, POINTER, POINTER) int) + return C.int(thisfunc(HGENERIC{window}, int(status), C.GoString(url), POINTER(scriptdata), POINTER(data))) +} + //export go_int_callback_timer func go_int_callback_timer(h unsafe.Pointer, data unsafe.Pointer, flags C.uint) C.int { pfunc := cgo.Handle(h)
--- a/dw/dwglue.c Mon Nov 08 17:52:27 2021 -0600 +++ b/dw/dwglue.c Mon Nov 08 19:18:44 2021 -0600 @@ -1245,6 +1245,8 @@ extern int go_int_callback_tree(void *pfunc, uintptr_t window, uintptr_t item, void *data, unsigned int flags); extern int go_int_callback_timer(void *pfunc, void *data, unsigned int flags); extern int go_int_callback_print(void *pfunc, uintptr_t print, uintptr_t pixmap, int page_num, void *data, unsigned int flags); +extern int go_int_callback_html_changed(void *pfunc, uintptr_t html, int status, char *url, void *data, unsigned int flags); +extern int go_int_callback_html_result(void *pfunc, uintptr_t html, int status, char *result, void *scriptdata, void *data, unsigned int flags); extern void go_callback_remove(void *pfunc); static int DWSIGNAL go_callback_basic(HWND window, void *data) @@ -1387,6 +1389,26 @@ return 0; } +static int DWSIGNAL go_callback_html_changed(HWND html, int status, char *url, void *data) +{ + if(data) + { + void **param = (void **)data; + return go_int_callback_html_changed(param[0], (uintptr_t)html, status, url, param[1], DW_POINTER_TO_INT(param[2])); + } + return 0; +} + +static int DWSIGNAL go_callback_html_result(HWND html, int status, char *result, void *scriptdata, void *data) +{ + if(data) + { + void **param = (void **)data; + return go_int_callback_html_result(param[0], (uintptr_t)html, status, result, scriptdata, param[1], DW_POINTER_TO_INT(param[2])); + } + return 0; +} + static uintptr_t go_print_new(char *jobname, unsigned long flags, unsigned int pages, void *drawfunc, void *drawdata, unsigned int sflags) { void **param = malloc(sizeof(void *) * 3); @@ -1401,7 +1423,7 @@ return 0; } -static int go_timer_connect(int interval, void *sigfunc, void *data, unsigned int flags) +static uintptr_t go_timer_connect(int interval, void *sigfunc, void *data, unsigned int flags) { void **param = malloc(sizeof(void *) * 3); @@ -1410,11 +1432,16 @@ param[0] = sigfunc; param[1] = data; param[2] = DW_UINT_TO_POINTER(flags); - return dw_timer_connect(interval, DW_SIGNAL_FUNC(go_callback_timer), param); + return (uintptr_t)dw_timer_connect(interval, DW_SIGNAL_FUNC(go_callback_timer), param); } return 0; } +static void go_timer_disconnect(uintptr_t tid) +{ + dw_timer_disconnect((HTIMER)tid); +} + static void DWSIGNAL go_signal_free(HWND window, void *data) { if(data) @@ -1480,6 +1507,14 @@ { func = (void *)go_callback_tree; } + else if(strcmp(signame, DW_SIGNAL_HTML_CHANGED) == 0) + { + func = (void *)go_callback_html_changed; + } + else if(strcmp(signame, DW_SIGNAL_HTML_RESULT) == 0) + { + func = (void *)go_callback_html_result; + } dw_signal_connect_data((HWND)window, signame, func, DW_SIGNAL_FUNC(go_signal_free), param); }