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);
    }