Mercurial > dwindows
diff gtk3/dw.c @ 2005:a17cc1958369
GTK: Added WebKit2 support for GTK3. Remove dead code from GTK2.
Use linker to pull in webkit libraries instead of dlopen() etc.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Wed, 06 Nov 2019 08:48:49 +0000 |
parents | eb488c379969 |
children | 6f1adc77de02 |
line wrap: on
line diff
--- a/gtk3/dw.c Tue Nov 05 21:06:23 2019 +0000 +++ b/gtk3/dw.c Wed Nov 06 08:48:49 2019 +0000 @@ -32,7 +32,10 @@ #include <math.h> #include <gdk/gdkkeysyms.h> -#ifdef USE_WEBKIT + +#ifdef USE_WEBKIT2 +#include <webkit2/webkit2.h> +#else #include <webkit/webkit.h> #endif @@ -159,26 +162,6 @@ static gint _column_click_event(GtkWidget *widget, gpointer data); static void _dw_signal_disconnect(gpointer data, GClosure *closure); - -#ifdef USE_WEBKIT -/* - * we need to add these equivalents from webkitwebview.h so we can refer to - * our own pointers to functions (we don't link with the webkit libraries - */ -# define DW_WEBKIT_TYPE_WEB_VIEW (_webkit_web_view_get_type()) -# define DW_WEBKIT_WEB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), DW_WEBKIT_TYPE_WEB_VIEW, WebKitWebView)) -WEBKIT_API GType (*_webkit_web_view_get_type)(void) = NULL; -WEBKIT_API void (*_webkit_web_view_load_html_string)(WebKitWebView *, const gchar *, const gchar *) = NULL; -WEBKIT_API void (*_webkit_web_view_open)(WebKitWebView *, const gchar *) = NULL; -WEBKIT_API GtkWidget *(*_webkit_web_view_new)(void) = NULL; -WEBKIT_API void (*_webkit_web_view_go_back)(WebKitWebView *) = NULL; -WEBKIT_API void (*_webkit_web_view_go_forward)(WebKitWebView *) = NULL; -WEBKIT_API void (*_webkit_web_view_reload)(WebKitWebView *) = NULL; -WEBKIT_API void (*_webkit_web_view_stop_loading)(WebKitWebView *) = NULL; -WEBKIT_API void (*_webkit_web_frame_print)(WebKitWebFrame *) = NULL; -WEBKIT_API WebKitWebFrame *(*_webkit_web_view_get_focused_frame)(WebKitWebView *) = NULL; -#endif - GObject *_DWObject = NULL; char *_DWDefaultFont = NULL; static char _dw_share_path[PATH_MAX+1] = { 0 }; @@ -1826,33 +1809,6 @@ return NULL; } -/* Try to load the WebKitGtk shared libary */ -#ifdef USE_WEBKIT -void init_webkit(void) -{ - char libname[100]; - void *handle = NULL; - - sprintf( libname, "lib%s.so", WEBKIT_LIB); - handle = dlopen( libname, RTLD_LAZY ); - - /* If we loaded it, grab the symbols we want */ - if ( handle ) - { - _webkit_web_view_get_type = dlsym( handle, "webkit_web_view_get_type" ); - _webkit_web_view_load_html_string = dlsym( handle, "webkit_web_view_load_html_string" ); - _webkit_web_view_open = dlsym( handle, "webkit_web_view_open" ); - _webkit_web_view_new = dlsym( handle, "webkit_web_view_new" ); - _webkit_web_view_go_back = dlsym( handle, "webkit_web_view_go_back" ); - _webkit_web_view_go_forward = dlsym( handle, "webkit_web_view_go_forward" ); - _webkit_web_view_reload = dlsym( handle, "webkit_web_view_reload" ); - _webkit_web_view_stop_loading = dlsym( handle, "webkit_web_view_stop_loading" ); - _webkit_web_frame_print = dlsym( handle, "webkit_web_frame_print" ); - _webkit_web_view_get_focused_frame = dlsym( handle, "webkit_web_view_get_focused_frame" ); - } -} -#endif - /* * Initializes the Dynamic Windows engine. * Parameters: @@ -1923,11 +1879,7 @@ /* Create a global object for glib activities */ _DWObject = g_object_new(G_TYPE_OBJECT, NULL); - -#ifdef USE_WEBKIT - init_webkit(); -#endif - + return TRUE; } @@ -11290,6 +11242,24 @@ } } +#ifdef USE_WEBKIT +/* Helper function to get the web view handle */ +WebKitWebView *_dw_html_web_view(GtkWidget *widget) +{ + if(widget) + { + WebKitWebView *web_view = (WebKitWebView *)widget; + if(WEBKIT_IS_WEB_VIEW(web_view)) + return web_view; +#ifndef USE_WEBKIT2 + web_view = (WebKitWebView *)g_object_get_data(G_OBJECT(widget), "_dw_web_view"); + if(WEBKIT_IS_WEB_VIEW(web_view)) + return web_view; +#endif + } + return NULL; +} +#endif /* * Causes the embedded HTML widget to take action. * Parameters: @@ -11301,35 +11271,42 @@ #ifdef USE_WEBKIT int _locked_by_me = FALSE; WebKitWebView *web_view; - WebKitWebFrame *frame; - - if (!_webkit_web_view_open) - return; - - DW_MUTEX_LOCK; - web_view = (WebKitWebView *)g_object_get_data(G_OBJECT(handle), "_dw_web_view"); - if ( web_view ) - { - switch( action ) + + DW_MUTEX_LOCK; + + if((web_view = _dw_html_web_view(handle))) + { + switch(action) { case DW_HTML_GOBACK: - _webkit_web_view_go_back( web_view ); + webkit_web_view_go_back(web_view); break; case DW_HTML_GOFORWARD: - _webkit_web_view_go_forward( web_view ); + webkit_web_view_go_forward(web_view); break; case DW_HTML_GOHOME: - _webkit_web_view_open( web_view, "http://dwindows.netlabs.org" ); +#ifdef USE_WEBKIT2 + webkit_web_view_load_uri(web_view, DW_HOME_URL); +#else + webkit_web_view_open(web_view, DW_HOME_URL); +#endif break; case DW_HTML_RELOAD: - _webkit_web_view_reload( web_view ); + webkit_web_view_reload(web_view); break; case DW_HTML_STOP: - _webkit_web_view_stop_loading( web_view ); + webkit_web_view_stop_loading(web_view); break; case DW_HTML_PRINT: - frame = _webkit_web_view_get_focused_frame( web_view ); - _webkit_web_frame_print( frame ); + { +#ifdef USE_WEBKIT2 + WebKitPrintOperation *operation = webkit_print_operation_new(web_view); + webkit_print_operation_run_dialog(operation, NULL); +#else + WebKitWebFrame *frame = webkit_web_view_get_focused_frame(web_view); + webkit_web_frame_print(frame); +#endif + } break; } } @@ -11352,20 +11329,20 @@ int _locked_by_me = FALSE; WebKitWebView *web_view; - if (!_webkit_web_view_open) - return -1; - - DW_MUTEX_LOCK; - web_view = (WebKitWebView *)g_object_get_data(G_OBJECT(handle), "_dw_web_view"); - if ( web_view ) - { - _webkit_web_view_load_html_string( web_view, string, "file:///"); - gtk_widget_show( GTK_WIDGET(handle) ); - } - DW_MUTEX_UNLOCK; - return 0; + DW_MUTEX_LOCK; + if((web_view = _dw_html_web_view(handle))) + { +#ifdef USE_WEBKIT2 + webkit_web_view_load_html(web_view, string, "file:///"); +#else + webkit_web_view_load_html_string(web_view, string, "file:///"); +#endif + gtk_widget_show(GTK_WIDGET(handle)); + } + DW_MUTEX_UNLOCK; + return DW_ERROR_NONE; #else - return -1; + return DW_ERROR_UNKNOWN; #endif } @@ -11384,81 +11361,80 @@ int _locked_by_me = FALSE; WebKitWebView *web_view; - if (!_webkit_web_view_open) - return -1; - - DW_MUTEX_LOCK; - web_view = (WebKitWebView *)g_object_get_data(G_OBJECT(handle), "_dw_web_view"); - if ( web_view ) - { - _webkit_web_view_open( web_view, url ); + DW_MUTEX_LOCK; + if((web_view = _dw_html_web_view(handle))) + { +#ifdef USE_WEBKIT2 + webkit_web_view_load_uri(web_view, url); +#else + webkit_web_view_open(web_view, url); +#endif gtk_widget_show(GTK_WIDGET(handle)); } DW_MUTEX_UNLOCK; - return 0; + return DW_ERROR_NONE; #else - return -1; -#endif -} - -#ifdef USE_WEBKIT -static void _dw_html_print_cb( GtkWidget *widget, gpointer *data ) -{ - WebKitWebView *web_view = DW_WEBKIT_WEB_VIEW(data); + return DW_ERROR_UNKNOWN; +#endif +} + +#if defined(USE_WEBKIT) && !defined(USE_WEBKIT2) +static void _dw_html_print_cb(GtkWidget *widget, gpointer *data) +{ + WebKitWebView *web_view = WEBKIT_WEB_VIEW(data); WebKitWebFrame *frame; - frame = _webkit_web_view_get_focused_frame( web_view ); - _webkit_web_frame_print( frame ); -} + frame = webkit_web_view_get_focused_frame(web_view); + webkit_web_frame_print(frame); +} + /* * Fired when the user right-clicks to get the popup-menu on the HTML widget * We add a "Print" menu item to enable printing * user_data is not used */ -static void _dw_html_populate_popup_cb( WebKitWebView *web_view, GtkMenu *menu, gpointer user_data ) +static void _dw_html_populate_popup_cb(WebKitWebView *web_view, GtkMenu *menu, gpointer user_data) { GtkWidget *item = gtk_menu_item_new_with_mnemonic( _("_Print") ); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - g_signal_connect( item, "activate", G_CALLBACK(_dw_html_print_cb), web_view ); + g_signal_connect(item, "activate", G_CALLBACK(_dw_html_print_cb), web_view); gtk_widget_show(item); } #endif /* - * Create a new Entryfield window (widget) to be packed. - * Parameters: - * text: The default text to be in the entryfield widget. + * Create a new HTML window (widget) to be packed. + * Parameters: * id: An ID to be used with dw_window_from_id() or 0L. */ HWND dw_html_new(unsigned long id) { GtkWidget *widget = NULL; - int _locked_by_me = FALSE; - - DW_MUTEX_LOCK; #ifdef USE_WEBKIT - if (!_webkit_web_view_open) - { - dw_debug( "HTML widget not available; you do not have access to webkit.\n" ); - } - else - { - WebKitWebView *web_view; - widget = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW (widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); - web_view = (WebKitWebView *)_webkit_web_view_new(); - /* web_view = WEBKIT_WEB_VIEW(_webkit_web_view_new() ); */ - gtk_container_add( GTK_CONTAINER (widget), GTK_WIDGET(web_view) ); - 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 ); - } + int _locked_by_me = FALSE; + WebKitWebView *web_view; + + DW_MUTEX_LOCK; + web_view = (WebKitWebView *)webkit_web_view_new(); + /* WebKit2 no longer requires a scrolled window... + * So only create a scrolled window and pack it in older versions. + */ +#ifndef USE_WEBKIT2 + widget = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER (widget), GTK_WIDGET(web_view)); + 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); +#else + widget = (GtkWidget *)web_view; +#endif gtk_widget_show(widget); + DW_MUTEX_UNLOCK; #else dw_debug( "HTML widget not available; you do not have access to webkit.\n" ); #endif - DW_MUTEX_UNLOCK; return widget; }