Mercurial > dwindows
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. |