comparison 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
comparison
equal deleted inserted replaced
2004:ebbdb2120659 2005:a17cc1958369
30 #include <fcntl.h> 30 #include <fcntl.h>
31 #include <unistd.h> 31 #include <unistd.h>
32 #include <math.h> 32 #include <math.h>
33 #include <gdk/gdkkeysyms.h> 33 #include <gdk/gdkkeysyms.h>
34 34
35 #ifdef USE_WEBKIT 35
36 #ifdef USE_WEBKIT2
37 #include <webkit2/webkit2.h>
38 #else
36 #include <webkit/webkit.h> 39 #include <webkit/webkit.h>
37 #endif 40 #endif
38 41
39 #include <gdk-pixbuf/gdk-pixbuf.h> 42 #include <gdk-pixbuf/gdk-pixbuf.h>
40 43
156 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data); 159 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data);
157 static gint _tree_expand_event(GtkTreeView *treeview, GtkTreeIter *arg1, GtkTreePath *arg2, gpointer data); 160 static gint _tree_expand_event(GtkTreeView *treeview, GtkTreeIter *arg1, GtkTreePath *arg2, gpointer data);
158 static gint _switch_page_event(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data); 161 static gint _switch_page_event(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data);
159 static gint _column_click_event(GtkWidget *widget, gpointer data); 162 static gint _column_click_event(GtkWidget *widget, gpointer data);
160 static void _dw_signal_disconnect(gpointer data, GClosure *closure); 163 static void _dw_signal_disconnect(gpointer data, GClosure *closure);
161
162
163 #ifdef USE_WEBKIT
164 /*
165 * we need to add these equivalents from webkitwebview.h so we can refer to
166 * our own pointers to functions (we don't link with the webkit libraries
167 */
168 # define DW_WEBKIT_TYPE_WEB_VIEW (_webkit_web_view_get_type())
169 # define DW_WEBKIT_WEB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), DW_WEBKIT_TYPE_WEB_VIEW, WebKitWebView))
170 WEBKIT_API GType (*_webkit_web_view_get_type)(void) = NULL;
171 WEBKIT_API void (*_webkit_web_view_load_html_string)(WebKitWebView *, const gchar *, const gchar *) = NULL;
172 WEBKIT_API void (*_webkit_web_view_open)(WebKitWebView *, const gchar *) = NULL;
173 WEBKIT_API GtkWidget *(*_webkit_web_view_new)(void) = NULL;
174 WEBKIT_API void (*_webkit_web_view_go_back)(WebKitWebView *) = NULL;
175 WEBKIT_API void (*_webkit_web_view_go_forward)(WebKitWebView *) = NULL;
176 WEBKIT_API void (*_webkit_web_view_reload)(WebKitWebView *) = NULL;
177 WEBKIT_API void (*_webkit_web_view_stop_loading)(WebKitWebView *) = NULL;
178 WEBKIT_API void (*_webkit_web_frame_print)(WebKitWebFrame *) = NULL;
179 WEBKIT_API WebKitWebFrame *(*_webkit_web_view_get_focused_frame)(WebKitWebView *) = NULL;
180 #endif
181 164
182 GObject *_DWObject = NULL; 165 GObject *_DWObject = NULL;
183 char *_DWDefaultFont = NULL; 166 char *_DWDefaultFont = NULL;
184 static char _dw_share_path[PATH_MAX+1] = { 0 }; 167 static char _dw_share_path[PATH_MAX+1] = { 0 };
185 168
1824 return icon_pixbuf; 1807 return icon_pixbuf;
1825 } 1808 }
1826 return NULL; 1809 return NULL;
1827 } 1810 }
1828 1811
1829 /* Try to load the WebKitGtk shared libary */
1830 #ifdef USE_WEBKIT
1831 void init_webkit(void)
1832 {
1833 char libname[100];
1834 void *handle = NULL;
1835
1836 sprintf( libname, "lib%s.so", WEBKIT_LIB);
1837 handle = dlopen( libname, RTLD_LAZY );
1838
1839 /* If we loaded it, grab the symbols we want */
1840 if ( handle )
1841 {
1842 _webkit_web_view_get_type = dlsym( handle, "webkit_web_view_get_type" );
1843 _webkit_web_view_load_html_string = dlsym( handle, "webkit_web_view_load_html_string" );
1844 _webkit_web_view_open = dlsym( handle, "webkit_web_view_open" );
1845 _webkit_web_view_new = dlsym( handle, "webkit_web_view_new" );
1846 _webkit_web_view_go_back = dlsym( handle, "webkit_web_view_go_back" );
1847 _webkit_web_view_go_forward = dlsym( handle, "webkit_web_view_go_forward" );
1848 _webkit_web_view_reload = dlsym( handle, "webkit_web_view_reload" );
1849 _webkit_web_view_stop_loading = dlsym( handle, "webkit_web_view_stop_loading" );
1850 _webkit_web_frame_print = dlsym( handle, "webkit_web_frame_print" );
1851 _webkit_web_view_get_focused_frame = dlsym( handle, "webkit_web_view_get_focused_frame" );
1852 }
1853 }
1854 #endif
1855
1856 /* 1812 /*
1857 * Initializes the Dynamic Windows engine. 1813 * Initializes the Dynamic Windows engine.
1858 * Parameters: 1814 * Parameters:
1859 * newthread: True if this is the only thread. 1815 * newthread: True if this is the only thread.
1860 * False if there is already a message loop running. 1816 * False if there is already a message loop running.
1921 1877
1922 _dw_init_thread(); 1878 _dw_init_thread();
1923 1879
1924 /* Create a global object for glib activities */ 1880 /* Create a global object for glib activities */
1925 _DWObject = g_object_new(G_TYPE_OBJECT, NULL); 1881 _DWObject = g_object_new(G_TYPE_OBJECT, NULL);
1926 1882
1927 #ifdef USE_WEBKIT
1928 init_webkit();
1929 #endif
1930
1931 return TRUE; 1883 return TRUE;
1932 } 1884 }
1933 1885
1934 /* 1886 /*
1935 * Runs a message loop for Dynamic Windows. 1887 * Runs a message loop for Dynamic Windows.
11288 11240
11289 return dw_exec(browser, DW_EXEC_GUI, execargs); 11241 return dw_exec(browser, DW_EXEC_GUI, execargs);
11290 } 11242 }
11291 } 11243 }
11292 11244
11245 #ifdef USE_WEBKIT
11246 /* Helper function to get the web view handle */
11247 WebKitWebView *_dw_html_web_view(GtkWidget *widget)
11248 {
11249 if(widget)
11250 {
11251 WebKitWebView *web_view = (WebKitWebView *)widget;
11252 if(WEBKIT_IS_WEB_VIEW(web_view))
11253 return web_view;
11254 #ifndef USE_WEBKIT2
11255 web_view = (WebKitWebView *)g_object_get_data(G_OBJECT(widget), "_dw_web_view");
11256 if(WEBKIT_IS_WEB_VIEW(web_view))
11257 return web_view;
11258 #endif
11259 }
11260 return NULL;
11261 }
11262 #endif
11293 /* 11263 /*
11294 * Causes the embedded HTML widget to take action. 11264 * Causes the embedded HTML widget to take action.
11295 * Parameters: 11265 * Parameters:
11296 * handle: Handle to the window. 11266 * handle: Handle to the window.
11297 * action: One of the DW_HTML_* constants. 11267 * action: One of the DW_HTML_* constants.
11299 void dw_html_action(HWND handle, int action) 11269 void dw_html_action(HWND handle, int action)
11300 { 11270 {
11301 #ifdef USE_WEBKIT 11271 #ifdef USE_WEBKIT
11302 int _locked_by_me = FALSE; 11272 int _locked_by_me = FALSE;
11303 WebKitWebView *web_view; 11273 WebKitWebView *web_view;
11304 WebKitWebFrame *frame; 11274
11305 11275 DW_MUTEX_LOCK;
11306 if (!_webkit_web_view_open) 11276
11307 return; 11277 if((web_view = _dw_html_web_view(handle)))
11308 11278 {
11309 DW_MUTEX_LOCK; 11279 switch(action)
11310 web_view = (WebKitWebView *)g_object_get_data(G_OBJECT(handle), "_dw_web_view");
11311 if ( web_view )
11312 {
11313 switch( action )
11314 { 11280 {
11315 case DW_HTML_GOBACK: 11281 case DW_HTML_GOBACK:
11316 _webkit_web_view_go_back( web_view ); 11282 webkit_web_view_go_back(web_view);
11317 break; 11283 break;
11318 case DW_HTML_GOFORWARD: 11284 case DW_HTML_GOFORWARD:
11319 _webkit_web_view_go_forward( web_view ); 11285 webkit_web_view_go_forward(web_view);
11320 break; 11286 break;
11321 case DW_HTML_GOHOME: 11287 case DW_HTML_GOHOME:
11322 _webkit_web_view_open( web_view, "http://dwindows.netlabs.org" ); 11288 #ifdef USE_WEBKIT2
11289 webkit_web_view_load_uri(web_view, DW_HOME_URL);
11290 #else
11291 webkit_web_view_open(web_view, DW_HOME_URL);
11292 #endif
11323 break; 11293 break;
11324 case DW_HTML_RELOAD: 11294 case DW_HTML_RELOAD:
11325 _webkit_web_view_reload( web_view ); 11295 webkit_web_view_reload(web_view);
11326 break; 11296 break;
11327 case DW_HTML_STOP: 11297 case DW_HTML_STOP:
11328 _webkit_web_view_stop_loading( web_view ); 11298 webkit_web_view_stop_loading(web_view);
11329 break; 11299 break;
11330 case DW_HTML_PRINT: 11300 case DW_HTML_PRINT:
11331 frame = _webkit_web_view_get_focused_frame( web_view ); 11301 {
11332 _webkit_web_frame_print( frame ); 11302 #ifdef USE_WEBKIT2
11303 WebKitPrintOperation *operation = webkit_print_operation_new(web_view);
11304 webkit_print_operation_run_dialog(operation, NULL);
11305 #else
11306 WebKitWebFrame *frame = webkit_web_view_get_focused_frame(web_view);
11307 webkit_web_frame_print(frame);
11308 #endif
11309 }
11333 break; 11310 break;
11334 } 11311 }
11335 } 11312 }
11336 DW_MUTEX_UNLOCK; 11313 DW_MUTEX_UNLOCK;
11337 #endif 11314 #endif
11350 { 11327 {
11351 #ifdef USE_WEBKIT 11328 #ifdef USE_WEBKIT
11352 int _locked_by_me = FALSE; 11329 int _locked_by_me = FALSE;
11353 WebKitWebView *web_view; 11330 WebKitWebView *web_view;
11354 11331
11355 if (!_webkit_web_view_open) 11332 DW_MUTEX_LOCK;
11356 return -1; 11333 if((web_view = _dw_html_web_view(handle)))
11357 11334 {
11358 DW_MUTEX_LOCK; 11335 #ifdef USE_WEBKIT2
11359 web_view = (WebKitWebView *)g_object_get_data(G_OBJECT(handle), "_dw_web_view"); 11336 webkit_web_view_load_html(web_view, string, "file:///");
11360 if ( web_view ) 11337 #else
11361 { 11338 webkit_web_view_load_html_string(web_view, string, "file:///");
11362 _webkit_web_view_load_html_string( web_view, string, "file:///"); 11339 #endif
11363 gtk_widget_show( GTK_WIDGET(handle) ); 11340 gtk_widget_show(GTK_WIDGET(handle));
11364 } 11341 }
11365 DW_MUTEX_UNLOCK; 11342 DW_MUTEX_UNLOCK;
11366 return 0; 11343 return DW_ERROR_NONE;
11367 #else 11344 #else
11368 return -1; 11345 return DW_ERROR_UNKNOWN;
11369 #endif 11346 #endif
11370 } 11347 }
11371 11348
11372 /* 11349 /*
11373 * Render file or web page in the embedded HTML widget.. 11350 * Render file or web page in the embedded HTML widget..
11382 { 11359 {
11383 #ifdef USE_WEBKIT 11360 #ifdef USE_WEBKIT
11384 int _locked_by_me = FALSE; 11361 int _locked_by_me = FALSE;
11385 WebKitWebView *web_view; 11362 WebKitWebView *web_view;
11386 11363
11387 if (!_webkit_web_view_open) 11364 DW_MUTEX_LOCK;
11388 return -1; 11365 if((web_view = _dw_html_web_view(handle)))
11389 11366 {
11390 DW_MUTEX_LOCK; 11367 #ifdef USE_WEBKIT2
11391 web_view = (WebKitWebView *)g_object_get_data(G_OBJECT(handle), "_dw_web_view"); 11368 webkit_web_view_load_uri(web_view, url);
11392 if ( web_view ) 11369 #else
11393 { 11370 webkit_web_view_open(web_view, url);
11394 _webkit_web_view_open( web_view, url ); 11371 #endif
11395 gtk_widget_show(GTK_WIDGET(handle)); 11372 gtk_widget_show(GTK_WIDGET(handle));
11396 } 11373 }
11397 DW_MUTEX_UNLOCK; 11374 DW_MUTEX_UNLOCK;
11398 return 0; 11375 return DW_ERROR_NONE;
11399 #else 11376 #else
11400 return -1; 11377 return DW_ERROR_UNKNOWN;
11401 #endif 11378 #endif
11402 } 11379 }
11403 11380
11404 #ifdef USE_WEBKIT 11381 #if defined(USE_WEBKIT) && !defined(USE_WEBKIT2)
11405 static void _dw_html_print_cb( GtkWidget *widget, gpointer *data ) 11382 static void _dw_html_print_cb(GtkWidget *widget, gpointer *data)
11406 { 11383 {
11407 WebKitWebView *web_view = DW_WEBKIT_WEB_VIEW(data); 11384 WebKitWebView *web_view = WEBKIT_WEB_VIEW(data);
11408 WebKitWebFrame *frame; 11385 WebKitWebFrame *frame;
11409 11386
11410 frame = _webkit_web_view_get_focused_frame( web_view ); 11387 frame = webkit_web_view_get_focused_frame(web_view);
11411 _webkit_web_frame_print( frame ); 11388 webkit_web_frame_print(frame);
11412 } 11389 }
11390
11413 /* 11391 /*
11414 * Fired when the user right-clicks to get the popup-menu on the HTML widget 11392 * Fired when the user right-clicks to get the popup-menu on the HTML widget
11415 * We add a "Print" menu item to enable printing 11393 * We add a "Print" menu item to enable printing
11416 * user_data is not used 11394 * user_data is not used
11417 */ 11395 */
11418 static void _dw_html_populate_popup_cb( WebKitWebView *web_view, GtkMenu *menu, gpointer user_data ) 11396 static void _dw_html_populate_popup_cb(WebKitWebView *web_view, GtkMenu *menu, gpointer user_data)
11419 { 11397 {
11420 GtkWidget *item = gtk_menu_item_new_with_mnemonic( _("_Print") ); 11398 GtkWidget *item = gtk_menu_item_new_with_mnemonic( _("_Print") );
11421 11399
11422 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); 11400 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
11423 g_signal_connect( item, "activate", G_CALLBACK(_dw_html_print_cb), web_view ); 11401 g_signal_connect(item, "activate", G_CALLBACK(_dw_html_print_cb), web_view);
11424 gtk_widget_show(item); 11402 gtk_widget_show(item);
11425 } 11403 }
11426 #endif 11404 #endif
11427 11405
11428 /* 11406 /*
11429 * Create a new Entryfield window (widget) to be packed. 11407 * Create a new HTML window (widget) to be packed.
11430 * Parameters: 11408 * Parameters:
11431 * text: The default text to be in the entryfield widget.
11432 * id: An ID to be used with dw_window_from_id() or 0L. 11409 * id: An ID to be used with dw_window_from_id() or 0L.
11433 */ 11410 */
11434 HWND dw_html_new(unsigned long id) 11411 HWND dw_html_new(unsigned long id)
11435 { 11412 {
11436 GtkWidget *widget = NULL; 11413 GtkWidget *widget = NULL;
11437 int _locked_by_me = FALSE;
11438
11439 DW_MUTEX_LOCK;
11440 #ifdef USE_WEBKIT 11414 #ifdef USE_WEBKIT
11441 if (!_webkit_web_view_open) 11415 int _locked_by_me = FALSE;
11442 { 11416 WebKitWebView *web_view;
11443 dw_debug( "HTML widget not available; you do not have access to webkit.\n" ); 11417
11444 } 11418 DW_MUTEX_LOCK;
11445 else 11419 web_view = (WebKitWebView *)webkit_web_view_new();
11446 { 11420 /* WebKit2 no longer requires a scrolled window...
11447 WebKitWebView *web_view; 11421 * So only create a scrolled window and pack it in older versions.
11448 widget = gtk_scrolled_window_new (NULL, NULL); 11422 */
11449 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW (widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); 11423 #ifndef USE_WEBKIT2
11450 web_view = (WebKitWebView *)_webkit_web_view_new(); 11424 widget = gtk_scrolled_window_new(NULL, NULL);
11451 /* web_view = WEBKIT_WEB_VIEW(_webkit_web_view_new() ); */ 11425 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
11452 gtk_container_add( GTK_CONTAINER (widget), GTK_WIDGET(web_view) ); 11426 gtk_container_add(GTK_CONTAINER (widget), GTK_WIDGET(web_view));
11453 gtk_widget_show( GTK_WIDGET(web_view) ); 11427 gtk_widget_show(GTK_WIDGET(web_view));
11454 g_object_set_data(G_OBJECT(widget), "_dw_web_view", (gpointer)web_view); 11428 g_object_set_data(G_OBJECT(widget), "_dw_web_view", (gpointer)web_view);
11455 g_signal_connect( web_view, "populate-popup", G_CALLBACK(_dw_html_populate_popup_cb), NULL ); 11429 g_signal_connect(web_view, "populate-popup", G_CALLBACK(_dw_html_populate_popup_cb), NULL);
11456 } 11430 #else
11431 widget = (GtkWidget *)web_view;
11432 #endif
11457 gtk_widget_show(widget); 11433 gtk_widget_show(widget);
11434 DW_MUTEX_UNLOCK;
11458 #else 11435 #else
11459 dw_debug( "HTML widget not available; you do not have access to webkit.\n" ); 11436 dw_debug( "HTML widget not available; you do not have access to webkit.\n" );
11460 #endif 11437 #endif
11461 DW_MUTEX_UNLOCK;
11462 return widget; 11438 return widget;
11463 } 11439 }
11464 11440
11465 /* 11441 /*
11466 * Gets the contents of the default clipboard as text. 11442 * Gets the contents of the default clipboard as text.