Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions include/webui.h
Original file line number Diff line number Diff line change
Expand Up @@ -530,19 +530,6 @@ WEBUI_EXPORT void webui_set_browser_folder(const char* path);
*/
WEBUI_EXPORT bool webui_set_default_root_folder(const char* path);

/**
* @brief Set a callback to catch the navigation event of the WebView window.
* Must return `false` to prevent the navigation event, `true` otherwise.
*
* @example
* bool myNavigationEvent(size_t window) {
* // Prevent WebView window navigation event
* return false;
* }
* webui_set_navigation_handler_wv(myWindow, myNavigationEvent);
*/
WEBUI_EXPORT void webui_set_navigation_handler_wv(size_t window, bool (*navigate_handler)(size_t window));

/**
* @brief Set a callback to catch the close event of the WebView window.
* Must return `false` to prevent the close event, `true` otherwise.
Expand Down
68 changes: 49 additions & 19 deletions src/webui.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ typedef struct webui_event_inf_t {
bool navigate;
bool size;
bool position;
bool in_show;
unsigned int width;
unsigned int height;
unsigned int x;
Expand Down Expand Up @@ -825,21 +826,6 @@ void webui_run(size_t window, const char* script) {
_webui_send_all(win, 0, WEBUI_CMD_JS_QUICK, script, js_len);
}

void webui_set_navigation_handler_wv(size_t window, bool (*navigate_handler)(size_t window)) {
#ifdef WEBUI_LOG
_webui_log_info("[User]webui_set_navigation_handler_wv(%zu, %p)", window, navigate_handler);
#endif

// Dereference
if (_webui_mutex_app_is_exit_now(WEBUI_MUTEX_GET_STATUS) || _webui.wins[window] == NULL)
return;

_webui_window_t* win = _webui.wins[window];

// Set the navigation handler
win->navigation_handler_wv = navigate_handler;
}

void webui_set_close_handler_wv(size_t window, bool(*close_handler)(size_t window)) {

// Initialization
Expand Down Expand Up @@ -1954,6 +1940,26 @@ void webui_set_context(size_t window, const char* element, void* context) {
#endif
}


#if __linux__
static bool _webui_may_navigate_gtk_wv(size_t window)
{
if (_webui_mutex_app_is_exit_now(WEBUI_MUTEX_GET_STATUS) || _webui.wins[window] == NULL)
return true;

_webui_window_t* win = _webui.wins[window];
if (win->webView) {
bool in_show = win->webView->in_show;
if (in_show) {
win->webView->in_show = false;
}
return in_show;
}

return true;
}
#endif

size_t webui_bind(size_t window, const char* element, void(*func)(webui_event_t* e)) {

#ifdef WEBUI_LOG
Expand Down Expand Up @@ -1986,7 +1992,18 @@ size_t webui_bind(size_t window, const char* element, void(*func)(webui_event_t*
#ifdef WEBUI_LOG
_webui_log_info("[User] webui_bind() -> Save bind (all events) index %zu, address 0x%p\n", index, func);
#endif

#if __linux__
if (win->navigation_handler_wv == NULL) {
win->navigation_handler_wv = _webui_may_navigate_gtk_wv;
}
#endif
}
#if __linux__
else {
win->navigation_handler_wv = NULL;
}
#endif
return index;
} else {
// Non-empty Element ID Binding (New / Update)
Expand Down Expand Up @@ -8150,6 +8167,12 @@ static const char* _webui_get_local_ip(void) {
#endif
}

#if __linux__
#define IN_SHOW(yes) if (win->webView) win->webView->in_show = true;
#else
#define IN_SHOW(yes)
#endif

static bool _webui_show_window(_webui_window_t* win, struct mg_connection* client, const char* content, int type, size_t browser) {

#ifdef WEBUI_LOG
Expand All @@ -8163,6 +8186,8 @@ static bool _webui_show_window(_webui_window_t* win, struct mg_connection* clien
_webui_log_debug("[Core]\t\t_webui_show_window(FILE, [%zu])\n", browser);
#endif

IN_SHOW(true)

#ifdef WEBUI_TLS
// TLS
if (_webui_is_empty(_webui.ssl_cert) || _webui_is_empty(_webui.ssl_key)) {
Expand Down Expand Up @@ -8193,6 +8218,7 @@ static bool _webui_show_window(_webui_window_t* win, struct mg_connection* clien
_webui_free_mem((void*)ssl_cert);
_webui_free_mem((void*)ssl_key);
WEBUI_ASSERT("Generating self-signed TLS certificate failed");
IN_SHOW(false)
return false;
}

Expand Down Expand Up @@ -8377,6 +8403,7 @@ static bool _webui_show_window(_webui_window_t* win, struct mg_connection* clien
_webui_free_mem((void*)win->url);
_webui_free_port(win->server_port);
win->server_port = 0;
IN_SHOW(false)
return false;
}
}
Expand Down Expand Up @@ -11876,9 +11903,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
snprintf(buf, 20, "%d", navigation_type);
size_t nt_s = strlen(buf) + 1;
char *type = (char *) _webui_malloc(nt_s);
strncpy(uri, buf, nt_s - 1);
uri[nt_s] = '\0';
strncpy(type, buf, nt_s - 1);
type[nt_s] = '\0';

// Event Info
webui_event_inf_t* event_inf = NULL;
size_t event_num = _webui_new_event_inf(win, &event_inf);
Expand Down Expand Up @@ -12087,13 +12114,16 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
_webui_wv_event_on_close), (void *)win, NULL, 0);
g_signal_connect_data(win->webView->gtk_win, "destroy", G_CALLBACK(
_webui_wv_event_closed), (void *)win, NULL, 0);

g_signal_connect_data(win->webView->gtk_wv, "decide-policy", G_CALLBACK(
_webui_wv_event_decision), (void *)win, NULL, 0);

// Linux GTK WebView Auto JS Inject
if (_webui.config.show_auto_js_inject) {
// ...
}

// Show
IN_SHOW(true)
webkit_web_view_load_uri(win->webView->gtk_wv, win->webView->url);
gtk_widget_show_all(win->webView->gtk_win);
win->webView->open = true;
Expand Down
Loading