# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1573087043 0 # Node ID 74facb490f5a4af4136bf543f8c6f5f1ee049e6b # Parent 3a26e6f6691d2a20d91725fd931f58667aeedfc9 GTK: Fix html changed callbacks when using webkit1. Fix the code to disable javascript, it only worked on webkit2. Add code to the test program to demonstrate the callback. diff -r 3a26e6f6691d -r 74facb490f5a dwtest.c --- a/dwtest.c Wed Nov 06 14:37:01 2019 +0000 +++ b/dwtest.c Thu Nov 07 00:37:23 2019 +0000 @@ -1696,6 +1696,23 @@ dw_window_enable(startbutton); } +/* Handle web html changed */ +int DWSIGNAL web_html_changed(HWND html, int status, char *url, void *data) +{ + HWND hwndstatus = (HWND)data; + char *statusnames[] = { "none", "started", "redirect", "loading", "complete", NULL }; + + if(hwndstatus && url && status < 5) + { + int length = strlen(url) + strlen(statusnames[status]) + 10; + char *text = calloc(1, length+1); + + snprintf(text, length, "Status %s: %s", statusnames[status], url); + dw_window_set_text(hwndstatus, text); + free(text); + } + return FALSE; +} /* * Let's demonstrate the functionality of this library. :) @@ -1779,11 +1796,16 @@ rawhtml = dw_html_new(1001); if(rawhtml) { + HWND htmlstatus; + dw_box_pack_start( notebookbox7, rawhtml, 0, 100, TRUE, FALSE, 0); dw_html_raw(rawhtml, "

dwtest

"); html = dw_html_new(1002); dw_box_pack_start( notebookbox7, html, 0, 100, TRUE, TRUE, 0); dw_html_url(html, "http://dwindows.netlabs.org"); + htmlstatus = dw_status_text_new("HTML status loading...", 0); + dw_box_pack_start( notebookbox7, htmlstatus, 100, -1, TRUE, FALSE, 1); + dw_signal_connect(html, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(web_html_changed), DW_POINTER(htmlstatus)); } else { diff -r 3a26e6f6691d -r 74facb490f5a gtk3/dw.c --- a/gtk3/dw.c Wed Nov 06 14:37:01 2019 +0000 +++ b/gtk3/dw.c Thu Nov 07 00:37:23 2019 +0000 @@ -1290,7 +1290,7 @@ void **params = data; if(params) - status = DW_POINTER_TO_INT(params[1]); + status = DW_POINTER_TO_INT(params[3]); if(status && location && work.window && work.func) { @@ -11562,14 +11562,14 @@ #ifdef USE_WEBKIT int _locked_by_me = FALSE; WebKitWebView *web_view; +#ifdef USE_WEBKIT2 WebKitSettings *settings; +#else + WebKitWebSettings *settings; +#endif DW_MUTEX_LOCK; web_view = (WebKitWebView *)webkit_web_view_new(); - settings = webkit_web_view_get_settings(web_view); - /* Make sure java script is enabled */ - webkit_settings_set_enable_javascript(settings, TRUE); - webkit_web_view_set_settings(web_view, settings); /* WebKit2 no longer requires a scrolled window... * So only create a scrolled window and pack it in older versions. */ @@ -11580,7 +11580,15 @@ gtk_widget_show(GTK_WIDGET(web_view)); g_object_set_data(G_OBJECT(widget), "_dw_web_view", (gpointer)web_view); g_signal_connect(web_view, "populate-popup", G_CALLBACK(_dw_html_populate_popup_cb), NULL); + /* Create a new websettings and enable java script */ + settings = webkit_web_settings_new(); + g_object_set(G_OBJECT(settings), "enable-scripts", TRUE, NULL); + webkit_web_view_set_settings(WEBKIT_WEB_VIEW(web_view), settings); #else + settings = webkit_web_view_get_settings(web_view); + /* Make sure java script is enabled */ + webkit_settings_set_enable_javascript(settings, TRUE); + webkit_web_view_set_settings(web_view, settings); widget = (GtkWidget *)web_view; #endif gtk_widget_show(widget); @@ -11947,6 +11955,8 @@ } } +#define _DW_INTERNAL_CALLBACK_PARAMS 4 + /* * Add a callback to a window event with a closure callback. * Parameters: @@ -11962,7 +11972,7 @@ char *thisname = signame; HWND thiswindow = window; int sigid, _locked_by_me = FALSE; - void **params = calloc(3, sizeof(void *)); + void **params = calloc(_DW_INTERNAL_CALLBACK_PARAMS, sizeof(void *)); gint cid; /* Save the disconnect function pointer */ @@ -11973,7 +11983,11 @@ * If the window we are setting the signal on is a scrolled window we need to get * the "real" widget type. thiswindow is the "real" widget type */ - if (GTK_IS_SCROLLED_WINDOW(thiswindow)) + if (GTK_IS_SCROLLED_WINDOW(thiswindow) +#ifdef USE_WEBKIT + && !(thiswindow = (HWND)_dw_html_web_view(thiswindow)) +#endif + ) { thiswindow = (HWND)g_object_get_data(G_OBJECT(window), "_dw_user"); } @@ -12034,7 +12048,7 @@ cid = g_signal_connect_data(G_OBJECT(thiswindow), "key_press_event", G_CALLBACK(_container_enter_event), params, _dw_signal_disconnect, 0); _set_signal_handler_id(thiswindow, sigid, cid); - params = calloc(sizeof(void *), 3); + params = calloc(sizeof(void *), _DW_INTERNAL_CALLBACK_PARAMS); thisname = "button_press_event"; thisfunc = _findsigfunc(DW_SIGNAL_ITEM_ENTER); @@ -12063,22 +12077,22 @@ #else sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc, discfunc); params[0] = GINT_TO_POINTER(sigid); - params[1] = GINT_TO_POINTER(DW_HTML_CHANGE_STARTED); params[2] = (void *)thiswindow; + params[3] = GINT_TO_POINTER(DW_HTML_CHANGE_STARTED); cid = g_signal_connect_data(G_OBJECT(thiswindow), "load-started", G_CALLBACK(thisfunc), params, _dw_signal_disconnect, 0); _set_signal_handler_id(thiswindow, sigid, cid); - params = calloc(sizeof(void *), 3); + params = calloc(sizeof(void *), _DW_INTERNAL_CALLBACK_PARAMS); sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc, discfunc); params[0] = GINT_TO_POINTER(sigid); - params[1] = GINT_TO_POINTER(DW_HTML_CHANGE_LOADING); params[2] = (void *)thiswindow; + params[3] = GINT_TO_POINTER(DW_HTML_CHANGE_LOADING); cid = g_signal_connect_data(G_OBJECT(thiswindow), "load-committed", G_CALLBACK(thisfunc), params, _dw_signal_disconnect, 0); _set_signal_handler_id(thiswindow, sigid, cid); - params = calloc(sizeof(void *), 3); - params[1] = GINT_TO_POINTER(DW_HTML_CHANGE_COMPLETE); + params = calloc(sizeof(void *), _DW_INTERNAL_CALLBACK_PARAMS); + params[3] = GINT_TO_POINTER(DW_HTML_CHANGE_COMPLETE); thisname = "load-finished"; #endif