diff -r c73cb391930b -r 24afd2b22579 pidgin/gtkwebview.c --- a/pidgin/gtkwebview.c Sun Feb 26 08:51:06 2012 +0000 +++ b/pidgin/gtkwebview.c Tue Feb 28 04:25:49 2012 +0000 @@ -68,16 +68,6 @@ GtkWebViewButtons format_functions; struct { gboolean wbfo:1; /* Whole buffer formatting only. */ - gboolean bold:1; - gboolean italic:1; - gboolean underline:1; - gboolean strike:1; - gchar *forecolor; - gchar *backcolor; - gchar *background; - gchar *fontface; - int fontsize; - /*GtkTextTag *link;*/ } edit; } GtkWebViewPriv; @@ -305,28 +295,13 @@ static void webview_clear_formatting(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); + WebKitDOMDocument *dom; if (!webkit_web_view_get_editable(WEBKIT_WEB_VIEW(webview))) return; - priv->edit.bold = FALSE; - priv->edit.italic = FALSE; - priv->edit.underline = FALSE; - priv->edit.strike = FALSE; - priv->edit.fontsize = 0; - - g_free(priv->edit.fontface); - priv->edit.fontface = NULL; - - g_free(priv->edit.forecolor); - priv->edit.forecolor = NULL; - - g_free(priv->edit.backcolor); - priv->edit.backcolor = NULL; - - g_free(priv->edit.background); - priv->edit.background = NULL; + dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); + webkit_dom_document_exec_command(dom, "removeFormat", FALSE, ""); } static void @@ -533,6 +508,7 @@ return g_string_free(str, FALSE); } + void gtk_webview_safe_execute_script(GtkWebView *webview, const char *script) { @@ -599,7 +575,8 @@ } } -void gtk_webview_page_up(GtkWebView *webview) +void +gtk_webview_page_up(GtkWebView *webview) { GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); GtkAdjustment *vadj = priv->vadj; @@ -616,7 +593,8 @@ gtk_adjustment_set_value(vadj, scroll_val); } -void gtk_webview_page_down(GtkWebView *webview) +void +gtk_webview_page_down(GtkWebView *webview) { GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); GtkAdjustment *vadj = priv->vadj; @@ -645,12 +623,12 @@ void gtk_webview_setup_entry(GtkWebView *webview, PurpleConnectionFlags flags) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); GtkWebViewButtons buttons; if (flags & PURPLE_CONNECTION_HTML) { char color[8]; GdkColor fg_color, bg_color; + gboolean bold, italic, underline, strike; buttons = GTK_WEBVIEW_ALL; @@ -664,17 +642,19 @@ if (flags & PURPLE_CONNECTION_NO_URLDESC) buttons &= ~GTK_WEBVIEW_LINKDESC; + gtk_webview_get_current_format(webview, &bold, &italic, &underline, &strike); + gtk_webview_set_format_functions(webview, GTK_WEBVIEW_ALL); - if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold") != priv->edit.bold) + if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold") != bold) gtk_webview_toggle_bold(webview); - if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_italic") != priv->edit.italic) + if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_italic") != italic) gtk_webview_toggle_italic(webview); - if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_underline") != priv->edit.underline) + if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_underline") != underline) gtk_webview_toggle_underline(webview); - if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_strike") != priv->edit.strike) + if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_strike") != strike) gtk_webview_toggle_strike(webview); gtk_webview_toggle_fontface(webview, @@ -693,28 +673,30 @@ { gdk_color_parse(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/fgcolor"), &fg_color); - g_snprintf(color, sizeof(color), "#%02x%02x%02x", - fg_color.red / 256, - fg_color.green / 256, - fg_color.blue / 256); + g_snprintf(color, sizeof(color), + "#%02x%02x%02x", + fg_color.red / 256, + fg_color.green / 256, + fg_color.blue / 256); } else strcpy(color, ""); gtk_webview_toggle_forecolor(webview, color); - if(!(flags & PURPLE_CONNECTION_NO_BGCOLOR) && - strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/bgcolor"), "") != 0) + if (!(flags & PURPLE_CONNECTION_NO_BGCOLOR) && + strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/bgcolor"), "") != 0) { gdk_color_parse(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/bgcolor"), &bg_color); - g_snprintf(color, sizeof(color), "#%02x%02x%02x", - bg_color.red / 256, - bg_color.green / 256, - bg_color.blue / 256); + g_snprintf(color, sizeof(color), + "#%02x%02x%02x", + bg_color.red / 256, + bg_color.green / 256, + bg_color.blue / 256); } else strcpy(color, ""); - gtk_webview_toggle_background(webview, color); + gtk_webview_toggle_backcolor(webview, color); if (flags & PURPLE_CONNECTION_FORMATTING_WBFO) gtk_webview_set_whole_buffer_formatting_only(webview, TRUE); @@ -765,50 +747,56 @@ gboolean *italic, gboolean *underline, gboolean *strike) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); + WebKitDOMDocument *dom; + dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); + if (bold) - *bold = priv->edit.bold; + *bold = webkit_dom_document_query_command_state(dom, "bold"); if (italic) - *italic = priv->edit.italic; + *italic = webkit_dom_document_query_command_state(dom, "italic"); if (underline) - *underline = priv->edit.underline; + *underline = webkit_dom_document_query_command_state(dom, "underline"); if (strike) - *strike = priv->edit.strike; -} - -const char * -gtk_webview_get_current_fontface(GtkWebView *webview) -{ - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); - return priv->edit.fontface; + *strike = webkit_dom_document_query_command_state(dom, "strikethrough"); } -const char * +char * +gtk_webview_get_current_fontface(GtkWebView *webview) +{ + WebKitDOMDocument *dom; + dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); + return webkit_dom_document_query_command_value(dom, "fontName"); +} + +char * gtk_webview_get_current_forecolor(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); - return priv->edit.forecolor; + WebKitDOMDocument *dom; + dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); + return webkit_dom_document_query_command_value(dom, "foreColor"); } -const char * +char * gtk_webview_get_current_backcolor(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); - return priv->edit.backcolor; -} - -const char * -gtk_webview_get_current_background(GtkWebView *webview) -{ - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); - return priv->edit.background; + WebKitDOMDocument *dom; + dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); + return webkit_dom_document_query_command_value(dom, "backColor"); } gint gtk_webview_get_current_fontsize(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); - return priv->edit.fontsize; + WebKitDOMDocument *dom; + gchar *text; + gint size; + + dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); + text = webkit_dom_document_query_command_value(dom, "fontSize"); + size = atoi(text); + g_free(text); + + return size; } gboolean @@ -833,11 +821,8 @@ void gtk_webview_toggle_bold(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; - priv->edit.bold = !priv->edit.bold; - dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); webkit_dom_document_exec_command(dom, "bold", FALSE, ""); } @@ -845,11 +830,8 @@ void gtk_webview_toggle_italic(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; - priv->edit.italic = !priv->edit.italic; - dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); webkit_dom_document_exec_command(dom, "italic", FALSE, ""); } @@ -857,11 +839,8 @@ void gtk_webview_toggle_underline(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; - priv->edit.underline = !priv->edit.underline; - dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); webkit_dom_document_exec_command(dom, "underline", FALSE, ""); } @@ -869,11 +848,8 @@ void gtk_webview_toggle_strike(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; - priv->edit.strike = !priv->edit.strike; - dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); webkit_dom_document_exec_command(dom, "strikethrough", FALSE, ""); } @@ -881,14 +857,10 @@ gboolean gtk_webview_toggle_forecolor(GtkWebView *webview, const char *color) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; - g_free(priv->edit.forecolor); - priv->edit.forecolor = g_strdup(color); - dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); - webkit_dom_document_exec_command(dom, "forecolor", FALSE, color); + webkit_dom_document_exec_command(dom, "foreColor", FALSE, color); return FALSE; } @@ -896,25 +868,10 @@ gboolean gtk_webview_toggle_backcolor(GtkWebView *webview, const char *color) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; - g_free(priv->edit.backcolor); - priv->edit.backcolor = g_strdup(color); - dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); - webkit_dom_document_exec_command(dom, "backcolor", FALSE, color); - - return FALSE; -} - -gboolean -gtk_webview_toggle_background(GtkWebView *webview, const char *color) -{ - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); - - g_free(priv->edit.background); - priv->edit.background = g_strdup(color); + webkit_dom_document_exec_command(dom, "backColor", FALSE, color); return FALSE; } @@ -922,14 +879,10 @@ gboolean gtk_webview_toggle_fontface(GtkWebView *webview, const char *face) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; - g_free(priv->edit.fontface); - priv->edit.fontface = g_strdup(face); - dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); - webkit_dom_document_exec_command(dom, "fontname", FALSE, face); + webkit_dom_document_exec_command(dom, "fontName", FALSE, face); return FALSE; } @@ -937,45 +890,44 @@ void gtk_webview_font_set_size(GtkWebView *webview, gint size) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; char *tmp; - priv->edit.fontsize = size; - dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); tmp = g_strdup_printf("%d", size); - webkit_dom_document_exec_command(dom, "fontsize", FALSE, tmp); + webkit_dom_document_exec_command(dom, "fontSize", FALSE, tmp); g_free(tmp); } void gtk_webview_font_shrink(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; + gint fontsize; char *tmp; - priv->edit.fontsize = MAX(priv->edit.fontsize - 1, 1); + fontsize = gtk_webview_get_current_fontsize(webview); + fontsize = MAX(fontsize - 1, 1); dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); - tmp = g_strdup_printf("%d", priv->edit.fontsize); - webkit_dom_document_exec_command(dom, "fontsize", FALSE, tmp); + tmp = g_strdup_printf("%d", fontsize); + webkit_dom_document_exec_command(dom, "fontSize", FALSE, tmp); g_free(tmp); } void gtk_webview_font_grow(GtkWebView *webview) { - GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); WebKitDOMDocument *dom; + gint fontsize; char *tmp; - priv->edit.fontsize = MIN(priv->edit.fontsize + 1, MAX_FONT_SIZE); + fontsize = gtk_webview_get_current_fontsize(webview); + fontsize = MIN(fontsize + 1, MAX_FONT_SIZE); dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); - tmp = g_strdup_printf("%d", priv->edit.fontsize); - webkit_dom_document_exec_command(dom, "fontsize", FALSE, tmp); + tmp = g_strdup_printf("%d", fontsize); + webkit_dom_document_exec_command(dom, "fontSize", FALSE, tmp); g_free(tmp); }