@@ -19,6 +19,7 @@ extern void goWebuiEventHandler(webui_event_t* e);
1919extern void* goWebuiFileHandler(char* filename, int* length);
2020extern void* goWebuiFileHandlerWindow(size_t window, char* filename, int* length);
2121extern void goWebuiLoggerHandler(size_t level, char* message, void* user_data);
22+ extern bool goWebuiCloseHandlerWv(size_t window);
2223
2324// Wrapper functions to handle const casting
2425static const void* goWebuiFileHandlerWrapper(const char* filename, int* length) {
@@ -48,6 +49,14 @@ static void go_webui_set_file_handler_window(size_t win) {
4849static void go_webui_set_logger(void* user_data) {
4950 webui_set_logger(goWebuiLoggerHandlerWrapper, user_data);
5051}
52+
53+ static bool goWebuiCloseHandlerWvWrapper(size_t window) {
54+ return goWebuiCloseHandlerWv(window);
55+ }
56+
57+ static void go_webui_set_close_handler_wv(size_t win) {
58+ webui_set_close_handler_wv(win, goWebuiCloseHandlerWvWrapper);
59+ }
5160*/
5261import "C"
5362
@@ -79,6 +88,7 @@ const (
7988 Epic
8089 Yandex
8190 ChromiumBased
91+ Webview
8292)
8393
8494type Runtime uint8
@@ -141,11 +151,14 @@ const (
141151)
142152
143153type Event struct {
144- Window Window
145- EventType EventType
146- Element string
147- eventNumber uint
148- bindId uint
154+ Window Window
155+ EventType EventType
156+ Element string
157+ eventNumber uint
158+ bindId uint
159+ ClientId uint
160+ ConnectionId uint
161+ Cookies string
149162}
150163
151164type ScriptOptions struct {
@@ -172,6 +185,9 @@ var funcList = make(map[Window]map[uint]func(Event) any)
172185var fileHandlerList = make (map [Window ]FileHandler )
173186var fileHandlerWindowList = make (map [Window ]FileHandlerWindow )
174187
188+ // User Go Close Handler Functions (WebView)
189+ var closeHandlerList = make (map [Window ]func (Window ) bool )
190+
175191// User Go Logger Function
176192var loggerFunc LoggerFunc
177193var loggerUserData unsafe.Pointer
@@ -202,11 +218,14 @@ func NewWindowId() Window {
202218func goWebuiEventHandler (e * C.webui_event_t ) {
203219 // Create Go event from C event.
204220 goEvent := Event {
205- Window : Window (e .window ),
206- EventType : EventType (e .event_type ),
207- Element : C .GoString (e .element ),
208- eventNumber : uint (e .event_number ),
209- bindId : uint (e .bind_id ),
221+ Window : Window (e .window ),
222+ EventType : EventType (e .event_type ),
223+ Element : C .GoString (e .element ),
224+ eventNumber : uint (e .event_number ),
225+ bindId : uint (e .bind_id ),
226+ ClientId : uint (e .client_id ),
227+ ConnectionId : uint (e .connection_id ),
228+ Cookies : C .GoString (e .cookies ),
210229 }
211230 // Call user callback function.
212231 result := funcList [goEvent.Window ][goEvent.bindId ](goEvent )
@@ -310,6 +329,18 @@ func goWebuiFileHandlerWindow(window C.size_t, filename *C.char, length *C.int)
310329 return webuiBuffer
311330}
312331
332+ // Private function that receives and handles WebView close handler callbacks.
333+ //
334+ //export goWebuiCloseHandlerWv
335+ func goWebuiCloseHandlerWv (window C.size_t ) C._Bool {
336+ goWindow := Window (window )
337+ handler , exists := closeHandlerList [goWindow ]
338+ if ! exists || handler == nil {
339+ return C ._Bool (true )
340+ }
341+ return C ._Bool (handler (goWindow ))
342+ }
343+
313344// Private function that receives and handles logger callbacks.
314345//
315346//export goWebuiLoggerHandler
@@ -751,11 +782,13 @@ func (e *getArgError) Error() string {
751782
752783func (e Event ) cStruct () * C.webui_event_t {
753784 return & C.webui_event_t {
754- window : C .size_t (e .Window ),
755- event_type : C .size_t (e .EventType ),
756- element : C .CString (e .Element ),
757- event_number : C .size_t (e .eventNumber ),
758- bind_id : C .size_t (e .bindId ),
785+ window : C .size_t (e .Window ),
786+ event_type : C .size_t (e .EventType ),
787+ element : C .CString (e .Element ),
788+ event_number : C .size_t (e .eventNumber ),
789+ bind_id : C .size_t (e .bindId ),
790+ client_id : C .size_t (e .ClientId ),
791+ connection_id : C .size_t (e .ConnectionId ),
759792 }
760793}
761794
@@ -922,6 +955,25 @@ func (w Window) SetCustomParameters(params string) {
922955 C .webui_set_custom_parameters (C .size_t (w ), cparams )
923956}
924957
958+ // Focus brings a window to the front and focuses it.
959+ func (w Window ) Focus () {
960+ C .webui_focus (C .size_t (w ))
961+ }
962+
963+ // WaitAsync waits asynchronously until all opened windows get closed.
964+ // Returns true if more windows are still open, false otherwise.
965+ // In WebView mode, call this from the main thread.
966+ func WaitAsync () bool {
967+ return bool (C .webui_wait_async ())
968+ }
969+
970+ // SetCloseHandlerWebView sets a callback to catch the close event of a WebView window.
971+ // The handler must return false to prevent the close, or true to allow it.
972+ func (w Window ) SetCloseHandlerWebView (handler func (Window ) bool ) {
973+ closeHandlerList [w ] = handler
974+ C .go_webui_set_close_handler_wv (C .size_t (w ))
975+ }
976+
925977// GetMimeType returns the HTTP mime type of a file.
926978func GetMimeType (filename string ) string {
927979 cfilename := C .CString (filename )
0 commit comments