Mercurial > dwindows
diff gtk/dw.c @ 643:9ab89d89e6b4
Add dw_listview_insert()
Default to using webkit for Gtk+ HTML widget
Add option to build with libgtkhtml2 - incomplete
Initial attempt to use customdraw for Win32 container - not working
Added dw_window_get_font() for Gtk+ - not implemented in other ports yet
Change package name from dw to dwindows for Linux ports - use dwindows-config now
Add debian package build target
author | mhessling@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Sun, 03 Oct 2010 00:34:36 +0000 |
parents | 06be879f5137 |
children | c60a4f6cfae8 |
line wrap: on
line diff
--- a/gtk/dw.c Sun Apr 12 01:41:50 2009 +0000 +++ b/gtk/dw.c Sun Oct 03 00:34:36 2010 +0000 @@ -31,11 +31,25 @@ #ifdef USE_IMLIB #include <gdk_imlib.h> #endif + #ifdef USE_GTKMOZEMBED -#include <gtkmozembed.h> -#undef GTK_TYPE_MOZ_EMBED -#define GTK_TYPE_MOZ_EMBED (_dw_moz_embed_get_type()) -#endif +# include <gtkmozembed.h> +# undef GTK_TYPE_MOZ_EMBED +# define GTK_TYPE_MOZ_EMBED (_dw_moz_embed_get_type()) +#endif + +#ifdef USE_LIBGTKHTML2 +# include <libgtkhtml/gtkhtml.h> +#endif + +#ifdef USE_WEBKIT +# if defined(USE_WEBKIT10) || defined(USE_WEBKIT11) +# include <webkit/webkit.h> +# else +# include <webkit.h> +# endif +#endif + #if GTK_MAJOR_VERSION > 1 #include <gdk-pixbuf/gdk-pixbuf.h> #endif @@ -83,14 +97,17 @@ { 0, 0xffff, 0xffff, 0xffff }, /* 15 bright white */ }; +/* + * List those icons that have transparency first + */ #define NUM_EXTS 5 char *image_exts[NUM_EXTS] = { ".xpm", ".png", - ".bmp", + ".ico", ".jpg", - ".ico", + ".bmp", }; #define DW_THREAD_LIMIT 50 @@ -123,7 +140,7 @@ /* Use default border size for the default enlightenment theme */ static int _dw_border_width = 12, _dw_border_height = 28; -#define DW_MUTEX_LOCK { int index = _find_thread_index(dw_thread_id()); if(pthread_self() != _dw_thread && _dw_mutex_locked[index] == FALSE) { gdk_threads_enter(); _dw_mutex_locked[index] = TRUE; _locked_by_me = TRUE; } } +#define DW_MUTEX_LOCK { int index = _find_thread_index(dw_thread_id()); if(pthread_self() != _dw_thread && _dw_mutex_locked[index] == FALSE) { gdk_threads_enter(); _dw_mutex_locked[index] = TRUE; _locked_by_me = TRUE; } } #define DW_MUTEX_UNLOCK { if(pthread_self() != _dw_thread && _locked_by_me == TRUE) { gdk_threads_leave(); _dw_mutex_locked[_find_thread_index(dw_thread_id())] = FALSE; _locked_by_me = FALSE; } } #define DEFAULT_SIZE_WIDTH 12 @@ -170,6 +187,38 @@ GtkType (*_dw_moz_embed_get_type)(void) = NULL; gboolean (*_gtk_moz_embed_can_go_back)(GtkMozEmbed *) = NULL; gboolean (*_gtk_moz_embed_can_go_forward)(GtkMozEmbed *) = NULL; +void (*_gtk_moz_embed_set_comp_path)(const char *) = NULL; +void (*_gtk_moz_embed_set_profile_path)(const char *, const char *) = NULL; +void (*_gtk_moz_embed_push_startup)(void) = NULL; +#endif + +#ifdef USE_LIBGTKHTML2 +GtkHtmlContext *(*_gtk_html_context_get)(void) = NULL; +HtmlDocument *(*_html_document_new)(void) = NULL; +GtkWidget *(*_html_view_new)(void) = NULL; +#endif + +#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; +# ifdef WEBKIT_CHECK_VERSION +# if WEBKIT_CHECK_VERSION(1,1,5) +WEBKIT_API void (*_webkit_web_frame_print)(WebKitWebFrame *) = NULL; +WEBKIT_API WebKitWebFrame *(*_webkit_web_view_get_focused_frame)(WebKitWebView *) = NULL; +# endif +# endif #endif typedef struct @@ -232,6 +281,8 @@ #define DW_CENTER 0.5f #define DW_LEFT 0.0f #define DW_RIGHT 1.0f +#define DW_TOP 0.0f +#define DW_BOTTOM 1.0f /* MDI Support Code */ #if GTK_MAJOR_VERSION > 1 @@ -1979,16 +2030,71 @@ _gtk_moz_embed_new = dlsym(handle, "gtk_moz_embed_new"); _gtk_moz_embed_can_go_back = dlsym(handle, "gtk_moz_embed_can_go_back"); _gtk_moz_embed_can_go_forward = dlsym(handle, "gtk_moz_embed_can_go_forward"); - gtk_moz_embed_set_comp_path( "/usr/lib/mozilla"); - gtk_moz_embed_set_comp_path( "/usr/lib/firefox"); + _gtk_moz_embed_set_comp_path = dlsym(handle, "gtk_moz_embed_set_comp_path"); + _gtk_moz_embed_set_profile_path = dlsym(handle, "gtk_moz_embed_set_profile_path"); + _gtk_moz_embed_push_startup = dlsym(handle, "gtk_moz_embed_push_startup"); + _gtk_moz_embed_set_comp_path( "/usr/lib/mozilla"); + _gtk_moz_embed_set_comp_path( "/usr/lib/firefox"); profile = g_build_filename(g_get_home_dir(), ".dwindows/mozilla", NULL); /* initialize profile */ - gtk_moz_embed_set_profile_path(profile, "dwindows"); + _gtk_moz_embed_set_profile_path(profile, "dwindows"); g_free(profile); /* startup done */ - gtk_moz_embed_push_startup(); + _gtk_moz_embed_push_startup(); + } +} +#endif + +/* Try to load the libgtkhtml2 shared libary */ +#ifdef USE_LIBGTKHTML2 +#include <ctype.h> + +void init_libgtkhtml2 (void) +{ + void *handle = NULL; + handle = dlopen( "libgtkhtml-2.so", RTLD_LAZY ); + + /* If we loaded it, grab the symbols we want */ + if ( handle ) + { + _html_document_new = dlsym(handle, "html_document_new"); + _html_view_new = dlsym(handle, "html_view_new"); + //... + _gtk_html_context_get = dlsym(handle, "gtk_html_context_get" ); + g_object_set( G_OBJECT(_gtk_html_context_get()), "debug_painting", FALSE, NULL ); + } +} +#endif + +/* 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" ); +# ifdef WEBKIT_CHECK_VERSION +# if WEBKIT_CHECK_VERSION(1,1,5) + _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 +# endif } } #endif @@ -2041,6 +2147,14 @@ #ifdef USE_GTKMOZEMBED init_mozembed(); #endif + +#ifdef USE_LIBGTKHTML2 + init_libgtkhtml2(); +#endif + +#ifdef USE_WEBKIT + init_webkit(); +#endif /* * Setup logging/debugging */ @@ -2139,14 +2253,16 @@ { DWDialog *tmp = malloc(sizeof(DWDialog)); - tmp->eve = dw_event_new(); - dw_event_reset(tmp->eve); - tmp->data = data; - tmp->done = FALSE; - tmp->method = FALSE; - tmp->result = NULL; - - return tmp; + if ( tmp ) + { + tmp->eve = dw_event_new(); + dw_event_reset(tmp->eve); + tmp->data = data; + tmp->done = FALSE; + tmp->method = FALSE; + tmp->result = NULL; + } + return tmp; } /* @@ -2340,6 +2456,7 @@ stext = dw_text_new(outbuf, 0); dw_window_set_style(stext, DW_DT_WORDBREAK, DW_DT_WORDBREAK); dw_font_text_extents_get(stext, NULL, outbuf, &width, &height); +#if 0 height = height+3; if(width < text_width) text_height = height*2; @@ -2352,6 +2469,10 @@ text_width = (width / 3) + 60; text_height = height*4; } +#else +text_width = min( width, dw_screen_width() - extra_width - 100 ); +text_height = min( height, dw_screen_height() ); +#endif dw_box_pack_start(texttargetbox, stext, text_width, text_height, TRUE, TRUE, 2); /* Buttons */ @@ -2400,7 +2521,7 @@ } height = max(50,text_height)+100; - x = (dw_screen_width() - (text_width+60+extra_width))/2; + x = ( - (text_width+60+extra_width))/2; y = (dw_screen_height() - height)/2; dw_window_set_pos_size(entrywindow, x, y, (text_width+60+extra_width), height); @@ -2704,6 +2825,71 @@ return TRUE; } +/* + * Gets the font used by a specified window (widget) handle. + * Parameters: + * handle: The window (widget) handle. + */ +char *dw_window_get_font(HWND handle) +{ +#if GTK_MAJOR_VERSION > 1 + PangoFontDescription *pfont; + PangoContext *pcontext; +#else + GdkFont *gdkfont; +#endif + GtkWidget *handle2 = handle; + char *font; + char *retfont=NULL; + int _locked_by_me = FALSE; + gpointer data; + + DW_MUTEX_LOCK; + if(GTK_IS_SCROLLED_WINDOW(handle)) + { + GtkWidget *tmp = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle)); + if(tmp) + handle2 = tmp; + } + +#if GTK_MAJOR_VERSION < 2 +???? + /* Free old font if it exists */ + gdkfont = (GdkFont *)gtk_object_get_data(GTK_OBJECT(handle2), "_dw_gdkfont"); + if(gdkfont) + gdk_font_unref(gdkfont); + gdkfont = gdk_font_load(fontname); + if(!gdkfont) + gdkfont = gdk_font_load("fixed"); + gtk_object_set_data(GTK_OBJECT(handle2), "_dw_gdkfont", (gpointer)gdkfont); +#endif + +#if 0 + /* Free old font name if one is allocated */ + data = gtk_object_get_data(GTK_OBJECT(handle2), "_dw_fontname"); + if(data) + free(data); + + gtk_object_set_data(GTK_OBJECT(handle2), "_dw_fontname", (gpointer)font); +#endif + +#if GTK_MAJOR_VERSION > 1 + pcontext = gtk_widget_get_pango_context( handle2 ); + if ( pcontext ) + { + pfont = pango_context_get_font_description( pcontext ); + if ( pfont ) + { + font = pango_font_description_to_string( pfont ); + retfont = strdup(font); + g_free( font ); + } + } +#endif + DW_MUTEX_UNLOCK; + return retfont; +} + void _free_gdk_colors(HWND handle) { GdkColor *old = (GdkColor *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_foregdk"); @@ -3283,7 +3469,7 @@ /* * Adds a menuitem or submenu to an existing menu. * Parameters: - * menu: The handle the the existing menu. + * menu: The handle to the existing menu. * title: The title text on the menu item to be added. * id: An ID to be used for message passing. * flags: Extended attributes to set on the menu. @@ -4199,7 +4385,7 @@ /* check if we can read from this file (it exists and read permission) */ if ( access(file, 04 ) != 0 ) { - /* Try with .xpm extention */ + /* Try with various extentions */ for ( i = 0; i < NUM_EXTS; i++ ) { strcpy( file, filename ); @@ -6191,6 +6377,8 @@ #endif char *file = alloca(strlen(filename) + 5); unsigned long z, ret = 0; + int found_ext = 0; + int i; if (!file) return 0; @@ -6200,10 +6388,21 @@ /* check if we can read from this file (it exists and read permission) */ if (access(file, 04) != 0) { - /* Try with .xpm extention */ - strcat(file, ".xpm"); - if(access(file, 04) != 0) + /* Try with various extentions */ + for ( i = 0; i < NUM_EXTS; i++ ) + { + strcpy( file, filename ); + strcat( file, image_exts[i] ); + if ( access( file, 04 ) == 0 ) + { + found_ext = 1; + break; + } + } + if ( found_ext == 0 ) + { return 0; + } } DW_MUTEX_LOCK; @@ -7537,13 +7736,21 @@ GdkFont *font; #endif char *fontname = NULL; + int free_fontname = 0; if(!text) return; DW_MUTEX_LOCK; if(handle) + { fontname = (char *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_fontname"); + if ( fontname == NULL ) + { + fontname = dw_window_get_font(handle); + free_fontname = 1; + } + } else if(pixmap) fontname = (char *)gtk_object_get_data(GTK_OBJECT(pixmap->handle), "_dw_fontname"); @@ -7590,6 +7797,8 @@ gdk_font_unref(font); } #endif + if ( free_fontname ) + free( fontname ); DW_MUTEX_UNLOCK; } @@ -7649,6 +7858,8 @@ GdkImlibImage *image; #endif char *file = alloca(strlen(filename) + 5); + int found_ext = 0; + int i; if (!file || !(pixmap = calloc(1,sizeof(struct _hpixmap)))) return NULL; @@ -7658,9 +7869,18 @@ /* check if we can read from this file (it exists and read permission) */ if(access(file, 04) != 0) { - /* Try with .xpm extention */ - strcat(file, ".xpm"); - if(access(file, 04) != 0) + /* Try with various extentions */ + for ( i = 0; i < NUM_EXTS; i++ ) + { + strcpy( file, filename ); + strcat( file, image_exts[i] ); + if ( access( file, 04 ) == 0 ) + { + found_ext = 1; + break; + } + } + if ( found_ext == 0 ) { free(pixmap); return NULL; @@ -9049,24 +9269,26 @@ if(tmp && GTK_IS_LABEL(tmp)) handle2 = tmp; } - if(GTK_IS_LABEL(handle2)) - { - if(style & DW_DT_CENTER || style & DW_DT_VCENTER) - { - gfloat x, y; - - x = y = DW_LEFT; - - if(style & DW_DT_CENTER) - x = DW_CENTER; - - if(style & DW_DT_VCENTER) - y = DW_CENTER; - - gtk_misc_set_alignment(GTK_MISC(handle2), x, y); - } - if(style & DW_DT_WORDBREAK) - gtk_label_set_line_wrap(GTK_LABEL(handle), TRUE); + if ( GTK_IS_LABEL(handle2) ) + { + gfloat x=DW_LEFT, y=DW_CENTER; + /* horizontal... */ + if ( style & DW_DT_CENTER ) + x = DW_CENTER; + if ( style & DW_DT_RIGHT ) + x = DW_RIGHT; + if ( style & DW_DT_LEFT ) + x = DW_LEFT; + /* vertical... */ + if ( style & DW_DT_VCENTER ) + y = DW_CENTER; + if ( style & DW_DT_TOP ) + y = DW_TOP; + if ( style & DW_DT_BOTTOM ) + y = DW_BOTTOM; + gtk_misc_set_alignment( GTK_MISC(handle2), x, y ); + if ( style & DW_DT_WORDBREAK ) + gtk_label_set_line_wrap( GTK_LABEL(handle), TRUE ); } DW_MUTEX_UNLOCK; } @@ -9345,9 +9567,69 @@ if(addtext) { + char *defstr = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(handle2)->entry)); tmp = g_list_append(tmp, addtext); gtk_object_set_user_data(GTK_OBJECT(handle2), tmp); gtk_combo_set_popdown_strings(GTK_COMBO(handle2), tmp); + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(handle2)->entry), defstr); + } + } + gtk_object_set_data(GTK_OBJECT(handle), "_dw_appending", NULL); + DW_MUTEX_UNLOCK; +} + +/* + * Inserts the specified text int the listbox's (or combobox) entry list at the + * position indicated. + * Parameters: + * handle: Handle to the listbox to be appended to. + * text: Text to insert into listbox. + * pos: 0-based index into listbox. -1 will append + */ +void dw_listbox_insert(HWND handle, char *text, int pos) +{ + GtkWidget *handle2 = handle; + int _locked_by_me = FALSE; + + DW_MUTEX_LOCK; + if(GTK_IS_SCROLLED_WINDOW(handle)) + { + GtkWidget *tmp = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle)); + if(tmp) + handle2 = tmp; + } + gtk_object_set_data(GTK_OBJECT(handle), "_dw_appending", GINT_TO_POINTER(1)); + if(GTK_IS_LIST(handle2)) + { + GtkWidget *list_item; + GList *tmp; + char *font = (char *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_font"); + GdkColor *fore = (GdkColor *)gtk_object_get_data(GTK_OBJECT(handle2), "_dw_foregdk"); + GdkColor *back = (GdkColor *)gtk_object_get_data(GTK_OBJECT(handle2), "_dw_backgdk"); + + list_item=gtk_list_item_new_with_label(text); + + if(font) + _set_font(GTK_LIST_ITEM(list_item)->item.bin.child, font); + if(fore && back) + _set_color(GTK_LIST_ITEM(list_item)->item.bin.child, + DW_RGB(fore->red, fore->green, fore->blue), + DW_RGB(back->red, back->green, back->blue)); + + tmp = g_list_insert(NULL, list_item, pos); + gtk_widget_show(list_item); + gtk_list_append_items(GTK_LIST(handle2),tmp); + } + else if(GTK_IS_COMBO(handle2)) + { + GList *tmp = (GList *)gtk_object_get_user_data(GTK_OBJECT(handle2)); + char *addtext = strdup(text); + + if(addtext) + { + tmp = g_list_insert(tmp, addtext, pos); + gtk_object_set_user_data(GTK_OBJECT(handle2), tmp); + gtk_combo_set_popdown_strings(GTK_COMBO(handle2), tmp); } } gtk_object_set_data(GTK_OBJECT(handle), "_dw_appending", NULL); @@ -10721,26 +11003,85 @@ DW_MUTEX_LOCK; switch(action) { - case DW_HTML_GOBACK: - _gtk_moz_embed_go_back(GTK_MOZ_EMBED(handle)); - break; - case DW_HTML_GOFORWARD: - _gtk_moz_embed_go_forward(GTK_MOZ_EMBED(handle)); - break; - case DW_HTML_GOHOME: - _gtk_moz_embed_load_url(GTK_MOZ_EMBED(handle), "http://dwindows.netlabs.org"); - break; - case DW_HTML_RELOAD: - _gtk_moz_embed_reload(GTK_MOZ_EMBED(handle), 0); - break; - case DW_HTML_STOP: - _gtk_moz_embed_stop_load(GTK_MOZ_EMBED(handle)); - break; - } - DW_MUTEX_UNLOCK; -#endif -} - + case DW_HTML_GOBACK: + _gtk_moz_embed_go_back(GTK_MOZ_EMBED(handle)); + break; + case DW_HTML_GOFORWARD: + _gtk_moz_embed_go_forward(GTK_MOZ_EMBED(handle)); + break; + case DW_HTML_GOHOME: + _gtk_moz_embed_load_url(GTK_MOZ_EMBED(handle), "http://dwindows.netlabs.org"); + break; + case DW_HTML_RELOAD: + _gtk_moz_embed_reload(GTK_MOZ_EMBED(handle), 0); + break; + case DW_HTML_STOP: + _gtk_moz_embed_stop_load(GTK_MOZ_EMBED(handle)); + break; + } + DW_MUTEX_UNLOCK; +#elif defined(USE_WEBKIT) + int _locked_by_me = FALSE; + WebKitWebView *web_view; + WebKitWebFrame *frame; + + if (!_webkit_web_view_open) + return; + + DW_MUTEX_LOCK; + web_view = (WebKitWebView *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_web_view"); + if ( web_view ) + { + switch( action ) + { + case DW_HTML_GOBACK: + _webkit_web_view_go_back( web_view ); + break; + case DW_HTML_GOFORWARD: + _webkit_web_view_go_forward( web_view ); + break; + case DW_HTML_GOHOME: + _webkit_web_view_open( web_view, "http://dwindows.netlabs.org" ); + break; + case DW_HTML_RELOAD: + _webkit_web_view_reload( web_view ); + break; + case DW_HTML_STOP: + _webkit_web_view_stop_loading( web_view ); + break; +# ifdef WEBKIT_CHECK_VERSION +# if WEBKIT_CHECK_VERSION(1,1,5) + case DW_HTML_PRINT: + frame = _webkit_web_view_get_focused_frame( web_view ); + _webkit_web_frame_print( frame ); + break; +# endif +# endif + } + } + DW_MUTEX_UNLOCK; +#endif +} + +#ifdef USE_LIBGTKHTML2 +void _dw_html_render_data( HWND handle, char *string, int i ) +{ + HtmlDocument *document; + + html_view_set_document (HTML_VIEW(handle), NULL); + document = (HtmlDocument *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_html_document" ); +/* html_document_clear (document);*/ + if ( document ) + { + html_view_set_document (HTML_VIEW(handle), document); + if ( html_document_open_stream( document, "text/html" ) ) + { + html_document_write_stream( document, string, i ); + } + html_document_close_stream (document); + } +} +#endif /* * Render raw HTML code in the embedded HTML widget.. * Parameters: @@ -10755,7 +11096,7 @@ #ifdef USE_GTKMOZEMBED int _locked_by_me = FALSE; - if(!_gtk_moz_embed_new) + if (!_gtk_moz_embed_new) return -1; DW_MUTEX_LOCK; @@ -10763,6 +11104,33 @@ gtk_widget_show(GTK_WIDGET(handle)); DW_MUTEX_UNLOCK; return 0; +#elif defined(USE_LIBGTKHTML2) + int _locked_by_me = FALSE; + + if ( !_html_document_new ) + return -1; + + DW_MUTEX_LOCK; + _dw_html_render_data( handle, string, strlen(string) ); + gtk_widget_show( GTK_WIDGET(handle) ); + DW_MUTEX_UNLOCK; + return 0; +#elif defined(USE_WEBKIT) + int _locked_by_me = FALSE; + WebKitWebView *web_view; + + if (!_webkit_web_view_open) + return -1; + + DW_MUTEX_LOCK; + web_view = (WebKitWebView *)gtk_object_get_data(GTK_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; #endif return -1; } @@ -10789,6 +11157,22 @@ gtk_widget_show(GTK_WIDGET(handle)); DW_MUTEX_UNLOCK; return 0; +#elif defined( USE_WEBKIT ) + int _locked_by_me = FALSE; + WebKitWebView *web_view; + + if (!_webkit_web_view_open) + return -1; + + DW_MUTEX_LOCK; + web_view = (WebKitWebView *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_web_view"); + if ( web_view ) + { + _webkit_web_view_open( web_view, url ); + gtk_widget_show(GTK_WIDGET(handle)); + } + DW_MUTEX_UNLOCK; + return 0; #endif return -1; } @@ -10883,6 +11267,63 @@ } #endif +#ifdef USE_LIBGTKHTML2 +static gboolean dom_mouse_down( HtmlDocument *doc, DomMouseEvent *event, gpointer data ) +{ +fprintf(stderr,"mouse down\n"); +return TRUE; +} +static gboolean dom_mouse_up( HtmlDocument *doc, DomMouseEvent *event, gpointer data ) +{ +fprintf(stderr,"mouse up\n"); +return TRUE; +} +static gboolean dom_mouse_click( HtmlDocument *doc, DomMouseEvent *event, gpointer data ) +{ +fprintf(stderr,"mouse click\n"); +return TRUE; +} +static gboolean url_requested (HtmlDocument *doc, const gchar *url, HtmlStream *stream) +{ +fprintf(stderr,"URL IS REQUESTED: %s\n",url); +return TRUE; +} +static void link_clicked (HtmlDocument *doc, const gchar *url) +{ +fprintf(stderr,"link clicked: %s!\n", url); +} +#endif + +#ifdef USE_WEBKIT +# ifdef WEBKIT_CHECK_VERSION +# if WEBKIT_CHECK_VERSION(1,1,5) +static void _dw_html_print_cb( GtkWidget *widget, gpointer *data ) +{ + WebKitWebView *web_view = DW_WEBKIT_WEB_VIEW(data); + WebKitWebFrame *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 ) +{ + GtkWidget *image = gtk_image_new_from_stock( GTK_STOCK_PRINT, GTK_ICON_SIZE_MENU ); + GtkWidget *item = gtk_image_menu_item_new_with_label( "Print" ); + + gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM(item), image ); + gtk_menu_append( GTK_MENU(menu), item); + g_signal_connect( item, "activate", G_CALLBACK(_dw_html_print_cb), web_view ); + gtk_widget_show(item); +} +# endif +# endif +#endif + /* * Create a new Entryfield window (widget) to be packed. * Parameters: @@ -10911,11 +11352,54 @@ gtk_signal_connect( GTK_OBJECT(widget), "net-stop", GTK_SIGNAL_FUNC(_dw_html_net_stop_cb), widget ); gtk_signal_connect( GTK_OBJECT(widget), "dom_mouse_click", GTK_SIGNAL_FUNC(_dw_dom_mouse_click_cb), widget ); } +#elif defined(USE_LIBGTKHTML2) + if ( !_html_document_new ) + { + widget = dw_box_new(DW_HORZ, 0); + stext = dw_text_new( "HTML widget not available; you do not have access to libgtkhtml-2.", 0); + dw_box_pack_start(widget, stext, 0, 0, TRUE, TRUE, 10); + } + else + { + HtmlDocument *document; + document = html_document_new (); + g_signal_connect (G_OBJECT (document), "dom_mouse_down", G_CALLBACK (dom_mouse_down), NULL); + g_signal_connect (G_OBJECT (document), "dom_mouse_up", G_CALLBACK (dom_mouse_up), NULL); + g_signal_connect (G_OBJECT (document), "dom_mouse_click", G_CALLBACK (dom_mouse_click), NULL); + g_signal_connect (G_OBJECT (document), "request_url", G_CALLBACK (url_requested), NULL); + g_signal_connect (G_OBJECT (document), "link_clicked", G_CALLBACK (link_clicked), NULL); + widget = _html_view_new(); + gtk_object_set_data(GTK_OBJECT(widget), "_dw_html_document", (gpointer)document); + } +#elif defined(USE_WEBKIT) + if (!_webkit_web_view_open) + { + widget = dw_box_new(DW_HORZ, 0); + stext = dw_text_new( "HTML widget not available; you do not have access to webkit.", 0); + dw_box_pack_start(widget, stext, 0, 0, TRUE, TRUE, 10); + } + 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) ); + gtk_object_set_data( GTK_OBJECT(widget), "_dw_web_view", (gpointer)web_view ); +# ifdef WEBKIT_CHECK_VERSION +# if WEBKIT_CHECK_VERSION(1,1,5) + g_signal_connect( web_view, "populate-popup", G_CALLBACK(_dw_html_populate_popup_cb), NULL ); +# endif +# endif + } #else widget = dw_box_new(DW_HORZ, 0); stext = dw_text_new( "HTML widget not available; you do not have access to gtkmozembed.", 0); dw_box_pack_start(widget, stext, 0, 0, TRUE, TRUE, 10); #endif + gtk_widget_show(widget); DW_MUTEX_UNLOCK; return widget; }