pidgin/gtkwebview.c

branch
soc.2013.gobjectification
changeset 34874
e03d555394c5
parent 34746
dc9c911dbd35
parent 34276
2b602f67f875
child 34883
7d9d0d7b7b62
equal deleted inserted replaced
34873:777795d0a0ca 34874:e03d555394c5
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 */
118 guint scroll_src; 119 guint scroll_src;
119 GTimer *scroll_time; 120 GTimer *scroll_time;
120 121
121 /* Format options */ 122 /* Format options */
122 GtkWebViewButtons format_functions; 123 GtkWebViewButtons format_functions;
124 GtkWebViewToolbar *toolbar;
123 struct { 125 struct {
124 gboolean wbfo:1; /* Whole buffer formatting only. */ 126 gboolean wbfo:1; /* Whole buffer formatting only. */
125 gboolean block_changed:1; 127 gboolean block_changed:1;
126 } edit; 128 } edit;
127 129
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);
2042 g_free(text); 2041 g_free(text);
2043 2042
2044 return size; 2043 return size;
2045 } 2044 }
2046 2045
2047 gboolean
2048 gtk_webview_get_editable(GtkWebView *webview)
2049 {
2050 return webkit_web_view_get_editable(WEBKIT_WEB_VIEW(webview));
2051 }
2052
2053 void 2046 void
2054 gtk_webview_clear_formatting(GtkWebView *webview) 2047 gtk_webview_clear_formatting(GtkWebView *webview)
2055 { 2048 {
2056 GObject *object; 2049 GObject *object;
2057 2050
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

mercurial