| 30 #include "pidgin.h" |
30 #include "pidgin.h" |
| 31 |
31 |
| 32 #include <gdk/gdkkeysyms.h> |
32 #include <gdk/gdkkeysyms.h> |
| 33 #include "gtkutils.h" |
33 #include "gtkutils.h" |
| 34 #include "gtkwebview.h" |
34 #include "gtkwebview.h" |
| |
35 #include "gtkwebviewtoolbar.h" |
| 35 |
36 |
| 36 #include "gtk3compat.h" |
37 #include "gtk3compat.h" |
| 37 |
38 |
| 38 #define MAX_FONT_SIZE 7 |
39 #define MAX_FONT_SIZE 7 |
| 39 #define MAX_SCROLL_TIME 0.4 /* seconds */ |
40 #define MAX_SCROLL_TIME 0.4 /* seconds */ |
| 1350 /****************************************************************************** |
1352 /****************************************************************************** |
| 1351 * GObject Stuff |
1353 * GObject Stuff |
| 1352 *****************************************************************************/ |
1354 *****************************************************************************/ |
| 1353 |
1355 |
| 1354 GtkWidget * |
1356 GtkWidget * |
| 1355 gtk_webview_new(void) |
1357 gtk_webview_new(gboolean editable) |
| 1356 { |
1358 { |
| 1357 WebKitWebView *webview = WEBKIT_WEB_VIEW(g_object_new(gtk_webview_get_type(), NULL)); |
1359 GtkWidget *result; |
| 1358 WebKitWebSettings *settings = webkit_web_view_get_settings(webview); |
1360 WebKitWebView *webview; |
| 1359 |
1361 WebKitWebSettings *settings; |
| |
1362 |
| |
1363 result = g_object_new(gtk_webview_get_type(), NULL); |
| |
1364 webview = WEBKIT_WEB_VIEW(result); |
| |
1365 settings = webkit_web_view_get_settings(webview); |
| |
1366 |
| 1360 g_object_set(G_OBJECT(settings), "default-encoding", "utf-8", NULL); |
1367 g_object_set(G_OBJECT(settings), "default-encoding", "utf-8", NULL); |
| 1361 #ifdef _WIN32 |
1368 #ifdef _WIN32 |
| 1362 /* XXX: win32 WebKitGTK replaces backslash with yen sign for |
1369 /* XXX: win32 WebKitGTK replaces backslash with yen sign for |
| 1363 * "sans-serif" font. We should figure out, how to disable this |
1370 * "sans-serif" font. We should figure out, how to disable this |
| 1364 * behavior, but for now I will just apply this simple hack (using other |
1371 * behavior, but for now I will just apply this simple hack (using other |
| 1365 * font family). |
1372 * font family). |
| 1366 */ |
1373 */ |
| 1367 g_object_set(G_OBJECT(settings), "default-font-family", "Verdana", NULL); |
1374 g_object_set(G_OBJECT(settings), "default-font-family", "Verdana", NULL); |
| 1368 #endif |
1375 #endif |
| 1369 webkit_web_view_set_settings(webview, settings); |
1376 webkit_web_view_set_settings(webview, settings); |
| 1370 |
1377 |
| 1371 return GTK_WIDGET(webview); |
1378 if (editable) { |
| |
1379 webkit_web_view_set_editable(WEBKIT_WEB_VIEW(webview), editable); |
| |
1380 |
| |
1381 g_signal_connect(G_OBJECT(webview), "user-changed-contents", |
| |
1382 G_CALLBACK(editable_input_cb), NULL); |
| |
1383 } |
| |
1384 |
| |
1385 return result; |
| 1372 } |
1386 } |
| 1373 |
1387 |
| 1374 static void |
1388 static void |
| 1375 gtk_webview_finalize(GObject *webview) |
1389 gtk_webview_finalize(GObject *webview) |
| 1376 { |
1390 { |
| 1402 |
1416 |
| 1403 parent_class = g_type_class_ref(webkit_web_view_get_type()); |
1417 parent_class = g_type_class_ref(webkit_web_view_get_type()); |
| 1404 gobject_class = G_OBJECT_CLASS(klass); |
1418 gobject_class = G_OBJECT_CLASS(klass); |
| 1405 |
1419 |
| 1406 g_type_class_add_private(klass, sizeof(GtkWebViewPriv)); |
1420 g_type_class_add_private(klass, sizeof(GtkWebViewPriv)); |
| |
1421 |
| |
1422 /* Signals */ |
| 1407 |
1423 |
| 1408 signals[BUTTONS_UPDATE] = g_signal_new("allowed-formats-updated", |
1424 signals[BUTTONS_UPDATE] = g_signal_new("allowed-formats-updated", |
| 1409 G_TYPE_FROM_CLASS(gobject_class), |
1425 G_TYPE_FROM_CLASS(gobject_class), |
| 1410 G_SIGNAL_RUN_FIRST, |
1426 G_SIGNAL_RUN_FIRST, |
| 1411 G_STRUCT_OFFSET(GtkWebViewClass, buttons_update), |
1427 G_STRUCT_OFFSET(GtkWebViewClass, buttons_update), |
| 1442 NULL, NULL, |
1458 NULL, NULL, |
| 1443 g_cclosure_marshal_VOID__OBJECT, |
1459 g_cclosure_marshal_VOID__OBJECT, |
| 1444 G_TYPE_NONE, 1, WEBKIT_TYPE_DOM_RANGE, |
1460 G_TYPE_NONE, 1, WEBKIT_TYPE_DOM_RANGE, |
| 1445 NULL); |
1461 NULL); |
| 1446 |
1462 |
| |
1463 /* Class Methods */ |
| |
1464 |
| 1447 klass->toggle_format = webview_toggle_format; |
1465 klass->toggle_format = webview_toggle_format; |
| 1448 klass->clear_format = webview_clear_formatting; |
1466 klass->clear_format = webview_clear_formatting; |
| 1449 |
1467 |
| 1450 gobject_class->finalize = gtk_webview_finalize; |
1468 gobject_class->finalize = gtk_webview_finalize; |
| |
1469 |
| |
1470 /* Key Bindings */ |
| 1451 |
1471 |
| 1452 binding_set = gtk_binding_set_by_class(parent_class); |
1472 binding_set = gtk_binding_set_by_class(parent_class); |
| 1453 gtk_binding_entry_add_signal(binding_set, GDK_KEY_b, GDK_CONTROL_MASK, |
1473 gtk_binding_entry_add_signal(binding_set, GDK_KEY_b, GDK_CONTROL_MASK, |
| 1454 "format-toggled", 1, G_TYPE_INT, |
1474 "format-toggled", 1, G_TYPE_INT, |
| 1455 GTK_WEBVIEW_BOLD); |
1475 GTK_WEBVIEW_BOLD); |
| 1706 |
1726 |
| 1707 gtk_adjustment_set_value(vadj, scroll_val); |
1727 gtk_adjustment_set_value(vadj, scroll_val); |
| 1708 } |
1728 } |
| 1709 |
1729 |
| 1710 void |
1730 void |
| 1711 gtk_webview_set_editable(GtkWebView *webview, gboolean editable) |
|
| 1712 { |
|
| 1713 GtkWebViewPriv *priv; |
|
| 1714 g_return_if_fail(webview != NULL); |
|
| 1715 |
|
| 1716 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
|
| 1717 webkit_web_view_set_editable(WEBKIT_WEB_VIEW(webview), editable); |
|
| 1718 |
|
| 1719 if (editable) { |
|
| 1720 g_signal_connect(G_OBJECT(webview), "user-changed-contents", |
|
| 1721 G_CALLBACK(editable_input_cb), NULL); |
|
| 1722 } else { |
|
| 1723 g_signal_handlers_disconnect_by_func(G_OBJECT(webview), |
|
| 1724 G_CALLBACK(editable_input_cb), |
|
| 1725 NULL); |
|
| 1726 } |
|
| 1727 |
|
| 1728 priv->format_functions = GTK_WEBVIEW_ALL; |
|
| 1729 } |
|
| 1730 |
|
| 1731 void |
|
| 1732 gtk_webview_setup_entry(GtkWebView *webview, PurpleConnectionFlags flags) |
1731 gtk_webview_setup_entry(GtkWebView *webview, PurpleConnectionFlags flags) |
| 1733 { |
1732 { |
| 1734 GtkWebViewButtons buttons; |
1733 GtkWebViewButtons buttons; |
| 1735 |
1734 |
| 1736 g_return_if_fail(webview != NULL); |
1735 g_return_if_fail(webview != NULL); |
| 2203 webkit_dom_document_exec_command(dom, "insertHTML", FALSE, img); |
2196 webkit_dom_document_exec_command(dom, "insertHTML", FALSE, img); |
| 2204 priv->edit.block_changed = FALSE; |
2197 priv->edit.block_changed = FALSE; |
| 2205 g_free(img); |
2198 g_free(img); |
| 2206 } |
2199 } |
| 2207 |
2200 |
| |
2201 void |
| |
2202 gtk_webview_set_toolbar(GtkWebView *webview, GtkWidget *toolbar) |
| |
2203 { |
| |
2204 GtkWebViewPriv *priv; |
| |
2205 |
| |
2206 g_return_if_fail(webview != NULL); |
| |
2207 |
| |
2208 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
| |
2209 priv->toolbar = GTK_WEBVIEWTOOLBAR(toolbar); |
| |
2210 } |
| |
2211 |
| |
2212 void |
| |
2213 gtk_webview_show_toolbar(GtkWebView *webview) |
| |
2214 { |
| |
2215 GtkWebViewPriv *priv; |
| |
2216 |
| |
2217 g_return_if_fail(webview != NULL); |
| |
2218 |
| |
2219 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
| |
2220 g_return_if_fail(priv->toolbar != NULL); |
| |
2221 |
| |
2222 gtk_widget_show(GTK_WIDGET(priv->toolbar)); |
| |
2223 } |
| |
2224 |
| |
2225 void |
| |
2226 gtk_webview_hide_toolbar(GtkWebView *webview) |
| |
2227 { |
| |
2228 GtkWebViewPriv *priv; |
| |
2229 |
| |
2230 g_return_if_fail(webview != NULL); |
| |
2231 |
| |
2232 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
| |
2233 g_return_if_fail(priv->toolbar != NULL); |
| |
2234 |
| |
2235 gtk_widget_hide(GTK_WIDGET(priv->toolbar)); |
| |
2236 } |
| |
2237 |
| |
2238 void |
| |
2239 gtk_webview_activate_toolbar(GtkWebView *webview, GtkWebViewAction action) |
| |
2240 { |
| |
2241 GtkWebViewPriv *priv; |
| |
2242 |
| |
2243 g_return_if_fail(webview != NULL); |
| |
2244 |
| |
2245 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
| |
2246 g_return_if_fail(priv->toolbar != NULL); |
| |
2247 |
| |
2248 gtk_webviewtoolbar_activate(priv->toolbar, action); |
| |
2249 } |
| |
2250 |