| 310 return 0; |
310 return 0; |
| 311 } |
311 } |
| 312 #endif |
312 #endif |
| 313 |
313 |
| 314 static void |
314 static void |
| 315 gtk_webview_disassociate_smiley_foreach(gpointer key, gpointer value, |
315 pidgin_webview_disassociate_smiley_foreach(gpointer key, gpointer value, |
| 316 gpointer user_data) |
316 gpointer user_data) |
| 317 { |
317 { |
| 318 GtkSmileyTree *tree = (GtkSmileyTree *)value; |
318 GtkSmileyTree *tree = (GtkSmileyTree *)value; |
| 319 GtkWebViewSmiley *smiley = (GtkWebViewSmiley *)user_data; |
319 PidginWebViewSmiley *smiley = (PidginWebViewSmiley *)user_data; |
| 320 gtk_smiley_tree_remove(tree, smiley); |
320 gtk_smiley_tree_remove(tree, smiley); |
| 321 } |
321 } |
| 322 |
322 |
| 323 static void |
323 static void |
| 324 gtk_webview_disconnect_smiley(GtkWebView *webview, GtkWebViewSmiley *smiley) |
324 pidgin_webview_disconnect_smiley(PidginWebView *webview, PidginWebViewSmiley *smiley) |
| 325 { |
325 { |
| 326 smiley->webview = NULL; |
326 smiley->webview = NULL; |
| 327 g_signal_handlers_disconnect_matched(webview, G_SIGNAL_MATCH_DATA, 0, 0, |
327 g_signal_handlers_disconnect_matched(webview, G_SIGNAL_MATCH_DATA, 0, 0, |
| 328 NULL, NULL, smiley); |
328 NULL, NULL, smiley); |
| 329 } |
329 } |
| 330 |
330 |
| 331 static void |
331 static void |
| 332 gtk_webview_disassociate_smiley(GtkWebViewSmiley *smiley) |
332 pidgin_webview_disassociate_smiley(PidginWebViewSmiley *smiley) |
| 333 { |
333 { |
| 334 if (smiley->webview) { |
334 if (smiley->webview) { |
| 335 GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(smiley->webview); |
335 PidginWebViewPriv *priv = PIDGIN_WEBVIEW_GET_PRIVATE(smiley->webview); |
| 336 gtk_smiley_tree_remove(priv->default_smilies, smiley); |
336 gtk_smiley_tree_remove(priv->default_smilies, smiley); |
| 337 g_hash_table_foreach(priv->smiley_data, |
337 g_hash_table_foreach(priv->smiley_data, |
| 338 gtk_webview_disassociate_smiley_foreach, smiley); |
338 pidgin_webview_disassociate_smiley_foreach, smiley); |
| 339 g_signal_handlers_disconnect_matched(smiley->webview, |
339 g_signal_handlers_disconnect_matched(smiley->webview, |
| 340 G_SIGNAL_MATCH_DATA, 0, 0, NULL, |
340 G_SIGNAL_MATCH_DATA, 0, 0, NULL, |
| 341 NULL, smiley); |
341 NULL, smiley); |
| 342 smiley->webview = NULL; |
342 smiley->webview = NULL; |
| 343 } |
343 } |
| 344 } |
344 } |
| 345 |
345 |
| 346 void |
346 void |
| 347 gtk_webview_associate_smiley(GtkWebView *webview, const char *sml, |
347 pidgin_webview_associate_smiley(PidginWebView *webview, const char *sml, |
| 348 GtkWebViewSmiley *smiley) |
348 PidginWebViewSmiley *smiley) |
| 349 { |
349 { |
| 350 GtkSmileyTree *tree; |
350 GtkSmileyTree *tree; |
| 351 GtkWebViewPriv *priv; |
351 PidginWebViewPriv *priv; |
| 352 |
352 |
| 353 g_return_if_fail(webview != NULL); |
353 g_return_if_fail(webview != NULL); |
| 354 g_return_if_fail(GTK_IS_WEBVIEW(webview)); |
354 g_return_if_fail(GTK_IS_WEBVIEW(webview)); |
| 355 |
355 |
| 356 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
356 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 357 |
357 |
| 358 if (sml == NULL) |
358 if (sml == NULL) |
| 359 tree = priv->default_smilies; |
359 tree = priv->default_smilies; |
| 360 else if (!(tree = g_hash_table_lookup(priv->smiley_data, sml))) { |
360 else if (!(tree = g_hash_table_lookup(priv->smiley_data, sml))) { |
| 361 tree = gtk_smiley_tree_new(); |
361 tree = gtk_smiley_tree_new(); |
| 628 g_free(smiley->data); |
628 g_free(smiley->data); |
| 629 g_free(smiley); |
629 g_free(smiley); |
| 630 } |
630 } |
| 631 |
631 |
| 632 void |
632 void |
| 633 gtk_webview_remove_smileys(GtkWebView *webview) |
633 pidgin_webview_remove_smileys(PidginWebView *webview) |
| 634 { |
634 { |
| 635 GtkWebViewPriv *priv; |
635 PidginWebViewPriv *priv; |
| 636 |
636 |
| 637 g_return_if_fail(webview != NULL); |
637 g_return_if_fail(webview != NULL); |
| 638 |
638 |
| 639 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
639 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 640 |
640 |
| 641 g_hash_table_destroy(priv->smiley_data); |
641 g_hash_table_destroy(priv->smiley_data); |
| 642 gtk_smiley_tree_destroy(priv->default_smilies); |
642 gtk_smiley_tree_destroy(priv->default_smilies); |
| 643 priv->smiley_data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
643 priv->smiley_data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
| 644 (GDestroyNotify)gtk_smiley_tree_destroy); |
644 (GDestroyNotify)gtk_smiley_tree_destroy); |
| 645 priv->default_smilies = gtk_smiley_tree_new(); |
645 priv->default_smilies = gtk_smiley_tree_new(); |
| 646 } |
646 } |
| 647 |
647 |
| 648 void |
648 void |
| 649 gtk_webview_insert_smiley(GtkWebView *webview, const char *sml, |
649 pidgin_webview_insert_smiley(PidginWebView *webview, const char *sml, |
| 650 const char *smiley) |
650 const char *smiley) |
| 651 { |
651 { |
| 652 GtkWebViewPriv *priv; |
652 PidginWebViewPriv *priv; |
| 653 char *unescaped; |
653 char *unescaped; |
| 654 GtkWebViewSmiley *webview_smiley; |
654 PidginWebViewSmiley *webview_smiley; |
| 655 |
655 |
| 656 g_return_if_fail(webview != NULL); |
656 g_return_if_fail(webview != NULL); |
| 657 |
657 |
| 658 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
658 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 659 |
659 |
| 660 unescaped = purple_unescape_html(smiley); |
660 unescaped = purple_unescape_html(smiley); |
| 661 webview_smiley = gtk_webview_smiley_find(webview, sml, unescaped); |
661 webview_smiley = pidgin_webview_smiley_find(webview, sml, unescaped); |
| 662 |
662 |
| 663 if (priv->format_functions & GTK_WEBVIEW_SMILEY) { |
663 if (priv->format_functions & PIDGIN_WEBVIEW_SMILEY) { |
| 664 char *tmp; |
664 char *tmp; |
| 665 /* TODO Better smiley insertion... */ |
665 /* TODO Better smiley insertion... */ |
| 666 tmp = g_strdup_printf("<img isEmoticon src='purple-smiley:%p' alt='%s'>", |
666 tmp = g_strdup_printf("<img isEmoticon src='purple-smiley:%p' alt='%s'>", |
| 667 webview_smiley, smiley); |
667 webview_smiley, smiley); |
| 668 gtk_webview_append_html(webview, tmp); |
668 pidgin_webview_append_html(webview, tmp); |
| 669 g_free(tmp); |
669 g_free(tmp); |
| 670 } else { |
670 } else { |
| 671 gtk_webview_append_html(webview, smiley); |
671 pidgin_webview_append_html(webview, smiley); |
| 672 } |
672 } |
| 673 |
673 |
| 674 g_free(unescaped); |
674 g_free(unescaped); |
| 675 } |
675 } |
| 676 |
676 |
| 1353 } |
1353 } |
| 1354 } |
1354 } |
| 1355 } |
1355 } |
| 1356 |
1356 |
| 1357 static void |
1357 static void |
| 1358 webview_font_shrink(GtkWebView *webview) |
1358 webview_font_shrink(PidginWebView *webview) |
| 1359 { |
1359 { |
| 1360 gint fontsize; |
1360 gint fontsize; |
| 1361 char *tmp; |
1361 char *tmp; |
| 1362 |
1362 |
| 1363 fontsize = gtk_webview_get_current_fontsize(webview); |
1363 fontsize = pidgin_webview_get_current_fontsize(webview); |
| 1364 fontsize = MAX(fontsize - 1, 1); |
1364 fontsize = MAX(fontsize - 1, 1); |
| 1365 |
1365 |
| 1366 tmp = g_strdup_printf("%d", fontsize); |
1366 tmp = g_strdup_printf("%d", fontsize); |
| 1367 do_formatting(webview, "fontSize", tmp); |
1367 do_formatting(webview, "fontSize", tmp); |
| 1368 g_free(tmp); |
1368 g_free(tmp); |
| 1369 } |
1369 } |
| 1370 |
1370 |
| 1371 static void |
1371 static void |
| 1372 webview_font_grow(GtkWebView *webview) |
1372 webview_font_grow(PidginWebView *webview) |
| 1373 { |
1373 { |
| 1374 gint fontsize; |
1374 gint fontsize; |
| 1375 char *tmp; |
1375 char *tmp; |
| 1376 |
1376 |
| 1377 fontsize = gtk_webview_get_current_fontsize(webview); |
1377 fontsize = pidgin_webview_get_current_fontsize(webview); |
| 1378 fontsize = MIN(fontsize + 1, MAX_FONT_SIZE); |
1378 fontsize = MIN(fontsize + 1, MAX_FONT_SIZE); |
| 1379 |
1379 |
| 1380 tmp = g_strdup_printf("%d", fontsize); |
1380 tmp = g_strdup_printf("%d", fontsize); |
| 1381 do_formatting(webview, "fontSize", tmp); |
1381 do_formatting(webview, "fontSize", tmp); |
| 1382 g_free(tmp); |
1382 g_free(tmp); |
| 1383 } |
1383 } |
| 1384 |
1384 |
| 1385 static void |
1385 static void |
| 1386 webview_clear_formatting(GtkWebView *webview) |
1386 webview_clear_formatting(PidginWebView *webview) |
| 1387 { |
1387 { |
| 1388 if (!webkit_web_view_get_editable(WEBKIT_WEB_VIEW(webview))) |
1388 if (!webkit_web_view_get_editable(WEBKIT_WEB_VIEW(webview))) |
| 1389 return; |
1389 return; |
| 1390 |
1390 |
| 1391 do_formatting(webview, "removeFormat", ""); |
1391 do_formatting(webview, "removeFormat", ""); |
| 1392 do_formatting(webview, "unlink", ""); |
1392 do_formatting(webview, "unlink", ""); |
| 1393 do_formatting(webview, "backColor", "inherit"); |
1393 do_formatting(webview, "backColor", "inherit"); |
| 1394 } |
1394 } |
| 1395 |
1395 |
| 1396 static void |
1396 static void |
| 1397 webview_toggle_format(GtkWebView *webview, GtkWebViewButtons buttons) |
1397 webview_toggle_format(PidginWebView *webview, PidginWebViewButtons buttons) |
| 1398 { |
1398 { |
| 1399 /* since this function is the handler for the formatting keystrokes, |
1399 /* since this function is the handler for the formatting keystrokes, |
| 1400 we need to check here that the formatting attempted is permitted */ |
1400 we need to check here that the formatting attempted is permitted */ |
| 1401 buttons &= gtk_webview_get_format_functions(webview); |
1401 buttons &= pidgin_webview_get_format_functions(webview); |
| 1402 |
1402 |
| 1403 switch (buttons) { |
1403 switch (buttons) { |
| 1404 case GTK_WEBVIEW_BOLD: |
1404 case PIDGIN_WEBVIEW_BOLD: |
| 1405 do_formatting(webview, "bold", ""); |
1405 do_formatting(webview, "bold", ""); |
| 1406 break; |
1406 break; |
| 1407 case GTK_WEBVIEW_ITALIC: |
1407 case PIDGIN_WEBVIEW_ITALIC: |
| 1408 do_formatting(webview, "italic", ""); |
1408 do_formatting(webview, "italic", ""); |
| 1409 break; |
1409 break; |
| 1410 case GTK_WEBVIEW_UNDERLINE: |
1410 case PIDGIN_WEBVIEW_UNDERLINE: |
| 1411 do_formatting(webview, "underline", ""); |
1411 do_formatting(webview, "underline", ""); |
| 1412 break; |
1412 break; |
| 1413 case GTK_WEBVIEW_STRIKE: |
1413 case PIDGIN_WEBVIEW_STRIKE: |
| 1414 do_formatting(webview, "strikethrough", ""); |
1414 do_formatting(webview, "strikethrough", ""); |
| 1415 break; |
1415 break; |
| 1416 case GTK_WEBVIEW_SHRINK: |
1416 case PIDGIN_WEBVIEW_SHRINK: |
| 1417 webview_font_shrink(webview); |
1417 webview_font_shrink(webview); |
| 1418 break; |
1418 break; |
| 1419 case GTK_WEBVIEW_GROW: |
1419 case PIDGIN_WEBVIEW_GROW: |
| 1420 webview_font_grow(webview); |
1420 webview_font_grow(webview); |
| 1421 break; |
1421 break; |
| 1422 default: |
1422 default: |
| 1423 break; |
1423 break; |
| 1424 } |
1424 } |
| 1425 } |
1425 } |
| 1426 |
1426 |
| 1427 static void |
1427 static void |
| 1428 editable_input_cb(GtkWebView *webview, gpointer data) |
1428 editable_input_cb(PidginWebView *webview, gpointer data) |
| 1429 { |
1429 { |
| 1430 GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1430 PidginWebViewPriv *priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1431 if (!priv->edit.block_changed && gtk_widget_is_sensitive(GTK_WIDGET(webview))) |
1431 if (!priv->edit.block_changed && gtk_widget_is_sensitive(GTK_WIDGET(webview))) |
| 1432 g_signal_emit(webview, signals[CHANGED], 0); |
1432 g_signal_emit(webview, signals[CHANGED], 0); |
| 1433 } |
1433 } |
| 1434 |
1434 |
| 1435 /****************************************************************************** |
1435 /****************************************************************************** |
| 1436 * GObject Stuff |
1436 * GObject Stuff |
| 1437 *****************************************************************************/ |
1437 *****************************************************************************/ |
| 1438 |
1438 |
| 1439 GtkWidget * |
1439 GtkWidget * |
| 1440 gtk_webview_new(gboolean editable) |
1440 pidgin_webview_new(gboolean editable) |
| 1441 { |
1441 { |
| 1442 GtkWidget *result; |
1442 GtkWidget *result; |
| 1443 WebKitWebView *webview; |
1443 WebKitWebView *webview; |
| 1444 WebKitWebSettings *settings; |
1444 WebKitWebSettings *settings; |
| 1445 |
1445 |
| 1446 result = g_object_new(gtk_webview_get_type(), NULL); |
1446 result = g_object_new(pidgin_webview_get_type(), NULL); |
| 1447 webview = WEBKIT_WEB_VIEW(result); |
1447 webview = WEBKIT_WEB_VIEW(result); |
| 1448 settings = webkit_web_view_get_settings(webview); |
1448 settings = webkit_web_view_get_settings(webview); |
| 1449 |
1449 |
| 1450 g_object_set(G_OBJECT(settings), "default-encoding", "utf-8", NULL); |
1450 g_object_set(G_OBJECT(settings), "default-encoding", "utf-8", NULL); |
| 1451 #ifdef _WIN32 |
1451 #ifdef _WIN32 |
| 1493 |
1493 |
| 1494 G_OBJECT_CLASS(parent_class)->finalize(G_OBJECT(webview)); |
1494 G_OBJECT_CLASS(parent_class)->finalize(G_OBJECT(webview)); |
| 1495 } |
1495 } |
| 1496 |
1496 |
| 1497 static void |
1497 static void |
| 1498 gtk_webview_class_init(GtkWebViewClass *klass, gpointer userdata) |
1498 pidgin_webview_class_init(PidginWebViewClass *klass, gpointer userdata) |
| 1499 { |
1499 { |
| 1500 GObjectClass *gobject_class; |
1500 GObjectClass *gobject_class; |
| 1501 GtkBindingSet *binding_set; |
1501 GtkBindingSet *binding_set; |
| 1502 |
1502 |
| 1503 parent_class = g_type_class_ref(webkit_web_view_get_type()); |
1503 parent_class = g_type_class_ref(webkit_web_view_get_type()); |
| 1504 gobject_class = G_OBJECT_CLASS(klass); |
1504 gobject_class = G_OBJECT_CLASS(klass); |
| 1505 |
1505 |
| 1506 g_type_class_add_private(klass, sizeof(GtkWebViewPriv)); |
1506 g_type_class_add_private(klass, sizeof(PidginWebViewPriv)); |
| 1507 |
1507 |
| 1508 /* Signals */ |
1508 /* Signals */ |
| 1509 |
1509 |
| 1510 signals[BUTTONS_UPDATE] = g_signal_new("allowed-formats-updated", |
1510 signals[BUTTONS_UPDATE] = g_signal_new("allowed-formats-updated", |
| 1511 G_TYPE_FROM_CLASS(gobject_class), |
1511 G_TYPE_FROM_CLASS(gobject_class), |
| 1512 G_SIGNAL_RUN_FIRST, |
1512 G_SIGNAL_RUN_FIRST, |
| 1513 G_STRUCT_OFFSET(GtkWebViewClass, buttons_update), |
1513 G_STRUCT_OFFSET(PidginWebViewClass, buttons_update), |
| 1514 NULL, 0, g_cclosure_marshal_VOID__INT, |
1514 NULL, 0, g_cclosure_marshal_VOID__INT, |
| 1515 G_TYPE_NONE, 1, G_TYPE_INT); |
1515 G_TYPE_NONE, 1, G_TYPE_INT); |
| 1516 signals[TOGGLE_FORMAT] = g_signal_new("format-toggled", |
1516 signals[TOGGLE_FORMAT] = g_signal_new("format-toggled", |
| 1517 G_TYPE_FROM_CLASS(gobject_class), |
1517 G_TYPE_FROM_CLASS(gobject_class), |
| 1518 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, |
1518 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, |
| 1519 G_STRUCT_OFFSET(GtkWebViewClass, toggle_format), |
1519 G_STRUCT_OFFSET(PidginWebViewClass, toggle_format), |
| 1520 NULL, 0, g_cclosure_marshal_VOID__INT, |
1520 NULL, 0, g_cclosure_marshal_VOID__INT, |
| 1521 G_TYPE_NONE, 1, G_TYPE_INT); |
1521 G_TYPE_NONE, 1, G_TYPE_INT); |
| 1522 signals[CLEAR_FORMAT] = g_signal_new("format-cleared", |
1522 signals[CLEAR_FORMAT] = g_signal_new("format-cleared", |
| 1523 G_TYPE_FROM_CLASS(gobject_class), |
1523 G_TYPE_FROM_CLASS(gobject_class), |
| 1524 G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, |
1524 G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, |
| 1525 G_STRUCT_OFFSET(GtkWebViewClass, clear_format), |
1525 G_STRUCT_OFFSET(PidginWebViewClass, clear_format), |
| 1526 NULL, 0, g_cclosure_marshal_VOID__VOID, |
1526 NULL, 0, g_cclosure_marshal_VOID__VOID, |
| 1527 G_TYPE_NONE, 0); |
1527 G_TYPE_NONE, 0); |
| 1528 signals[UPDATE_FORMAT] = g_signal_new("format-updated", |
1528 signals[UPDATE_FORMAT] = g_signal_new("format-updated", |
| 1529 G_TYPE_FROM_CLASS(gobject_class), |
1529 G_TYPE_FROM_CLASS(gobject_class), |
| 1530 G_SIGNAL_RUN_FIRST, |
1530 G_SIGNAL_RUN_FIRST, |
| 1531 G_STRUCT_OFFSET(GtkWebViewClass, update_format), |
1531 G_STRUCT_OFFSET(PidginWebViewClass, update_format), |
| 1532 NULL, 0, g_cclosure_marshal_VOID__VOID, |
1532 NULL, 0, g_cclosure_marshal_VOID__VOID, |
| 1533 G_TYPE_NONE, 0); |
1533 G_TYPE_NONE, 0); |
| 1534 signals[CHANGED] = g_signal_new("changed", |
1534 signals[CHANGED] = g_signal_new("changed", |
| 1535 G_TYPE_FROM_CLASS(gobject_class), |
1535 G_TYPE_FROM_CLASS(gobject_class), |
| 1536 G_SIGNAL_RUN_FIRST, |
1536 G_SIGNAL_RUN_FIRST, |
| 1537 G_STRUCT_OFFSET(GtkWebViewClass, changed), |
1537 G_STRUCT_OFFSET(PidginWebViewClass, changed), |
| 1538 NULL, NULL, g_cclosure_marshal_VOID__VOID, |
1538 NULL, NULL, g_cclosure_marshal_VOID__VOID, |
| 1539 G_TYPE_NONE, 0); |
1539 G_TYPE_NONE, 0); |
| 1540 signals[HTML_APPENDED] = g_signal_new("html-appended", |
1540 signals[HTML_APPENDED] = g_signal_new("html-appended", |
| 1541 G_TYPE_FROM_CLASS(gobject_class), |
1541 G_TYPE_FROM_CLASS(gobject_class), |
| 1542 G_SIGNAL_RUN_FIRST, |
1542 G_SIGNAL_RUN_FIRST, |
| 1543 G_STRUCT_OFFSET(GtkWebViewClass, html_appended), |
1543 G_STRUCT_OFFSET(PidginWebViewClass, html_appended), |
| 1544 NULL, NULL, |
1544 NULL, NULL, |
| 1545 g_cclosure_marshal_VOID__OBJECT, |
1545 g_cclosure_marshal_VOID__OBJECT, |
| 1546 G_TYPE_NONE, 1, WEBKIT_TYPE_DOM_RANGE, |
1546 G_TYPE_NONE, 1, WEBKIT_TYPE_DOM_RANGE, |
| 1547 NULL); |
1547 NULL); |
| 1548 |
1548 |
| 1549 /* Class Methods */ |
1549 /* Class Methods */ |
| 1550 |
1550 |
| 1551 klass->toggle_format = webview_toggle_format; |
1551 klass->toggle_format = webview_toggle_format; |
| 1552 klass->clear_format = webview_clear_formatting; |
1552 klass->clear_format = webview_clear_formatting; |
| 1553 |
1553 |
| 1554 gobject_class->finalize = gtk_webview_finalize; |
1554 gobject_class->finalize = pidgin_webview_finalize; |
| 1555 |
1555 |
| 1556 /* Key Bindings */ |
1556 /* Key Bindings */ |
| 1557 |
1557 |
| 1558 binding_set = gtk_binding_set_by_class(parent_class); |
1558 binding_set = gtk_binding_set_by_class(parent_class); |
| 1559 gtk_binding_entry_add_signal(binding_set, GDK_KEY_b, GDK_CONTROL_MASK, |
1559 gtk_binding_entry_add_signal(binding_set, GDK_KEY_b, GDK_CONTROL_MASK, |
| 1560 "format-toggled", 1, G_TYPE_INT, |
1560 "format-toggled", 1, G_TYPE_INT, |
| 1561 GTK_WEBVIEW_BOLD); |
1561 PIDGIN_WEBVIEW_BOLD); |
| 1562 gtk_binding_entry_add_signal(binding_set, GDK_KEY_i, GDK_CONTROL_MASK, |
1562 gtk_binding_entry_add_signal(binding_set, GDK_KEY_i, GDK_CONTROL_MASK, |
| 1563 "format-toggled", 1, G_TYPE_INT, |
1563 "format-toggled", 1, G_TYPE_INT, |
| 1564 GTK_WEBVIEW_ITALIC); |
1564 PIDGIN_WEBVIEW_ITALIC); |
| 1565 gtk_binding_entry_add_signal(binding_set, GDK_KEY_u, GDK_CONTROL_MASK, |
1565 gtk_binding_entry_add_signal(binding_set, GDK_KEY_u, GDK_CONTROL_MASK, |
| 1566 "format-toggled", 1, G_TYPE_INT, |
1566 "format-toggled", 1, G_TYPE_INT, |
| 1567 GTK_WEBVIEW_UNDERLINE); |
1567 PIDGIN_WEBVIEW_UNDERLINE); |
| 1568 gtk_binding_entry_add_signal(binding_set, GDK_KEY_plus, GDK_CONTROL_MASK, |
1568 gtk_binding_entry_add_signal(binding_set, GDK_KEY_plus, GDK_CONTROL_MASK, |
| 1569 "format-toggled", 1, G_TYPE_INT, |
1569 "format-toggled", 1, G_TYPE_INT, |
| 1570 GTK_WEBVIEW_GROW); |
1570 PIDGIN_WEBVIEW_GROW); |
| 1571 gtk_binding_entry_add_signal(binding_set, GDK_KEY_equal, GDK_CONTROL_MASK, |
1571 gtk_binding_entry_add_signal(binding_set, GDK_KEY_equal, GDK_CONTROL_MASK, |
| 1572 "format-toggled", 1, G_TYPE_INT, |
1572 "format-toggled", 1, G_TYPE_INT, |
| 1573 GTK_WEBVIEW_GROW); |
1573 PIDGIN_WEBVIEW_GROW); |
| 1574 gtk_binding_entry_add_signal(binding_set, GDK_KEY_minus, GDK_CONTROL_MASK, |
1574 gtk_binding_entry_add_signal(binding_set, GDK_KEY_minus, GDK_CONTROL_MASK, |
| 1575 "format-toggled", 1, G_TYPE_INT, |
1575 "format-toggled", 1, G_TYPE_INT, |
| 1576 GTK_WEBVIEW_SHRINK); |
1576 PIDGIN_WEBVIEW_SHRINK); |
| 1577 |
1577 |
| 1578 binding_set = gtk_binding_set_by_class(klass); |
1578 binding_set = gtk_binding_set_by_class(klass); |
| 1579 gtk_binding_entry_add_signal(binding_set, GDK_KEY_r, GDK_CONTROL_MASK, |
1579 gtk_binding_entry_add_signal(binding_set, GDK_KEY_r, GDK_CONTROL_MASK, |
| 1580 "format-cleared", 0); |
1580 "format-cleared", 0); |
| 1581 |
1581 |
| 1582 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/webview"); |
1582 purple_prefs_add_none(PIDGIN_PREFS_ROOT "/webview"); |
| 1583 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/webview/inspector_enabled", FALSE); |
1583 purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/webview/inspector_enabled", FALSE); |
| 1584 } |
1584 } |
| 1585 |
1585 |
| 1586 static void |
1586 static void |
| 1587 gtk_webview_init(GtkWebView *webview, gpointer userdata) |
1587 pidgin_webview_init(PidginWebView *webview, gpointer userdata) |
| 1588 { |
1588 { |
| 1589 GtkWebViewPriv *priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1589 PidginWebViewPriv *priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1590 WebKitWebInspector *inspector; |
1590 WebKitWebInspector *inspector; |
| 1591 |
1591 |
| 1592 priv->load_queue = g_queue_new(); |
1592 priv->load_queue = g_queue_new(); |
| 1593 |
1593 |
| 1594 priv->smiley_data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
1594 priv->smiley_data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
| 1676 |
1676 |
| 1677 return g_string_free(str, FALSE); |
1677 return g_string_free(str, FALSE); |
| 1678 } |
1678 } |
| 1679 |
1679 |
| 1680 void |
1680 void |
| 1681 gtk_webview_safe_execute_script(GtkWebView *webview, const char *script) |
1681 pidgin_webview_safe_execute_script(PidginWebView *webview, const char *script) |
| 1682 { |
1682 { |
| 1683 GtkWebViewPriv *priv; |
1683 PidginWebViewPriv *priv; |
| 1684 |
1684 |
| 1685 g_return_if_fail(webview != NULL); |
1685 g_return_if_fail(webview != NULL); |
| 1686 |
1686 |
| 1687 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1687 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1688 g_queue_push_tail(priv->load_queue, GINT_TO_POINTER(LOAD_JS)); |
1688 g_queue_push_tail(priv->load_queue, GINT_TO_POINTER(LOAD_JS)); |
| 1689 g_queue_push_tail(priv->load_queue, g_strdup(script)); |
1689 g_queue_push_tail(priv->load_queue, g_strdup(script)); |
| 1690 if (!priv->is_loading && priv->loader == 0) |
1690 if (!priv->is_loading && priv->loader == 0) |
| 1691 priv->loader = g_idle_add((GSourceFunc)process_load_queue, webview); |
1691 priv->loader = g_idle_add((GSourceFunc)process_load_queue, webview); |
| 1692 } |
1692 } |
| 1693 |
1693 |
| 1694 void |
1694 void |
| 1695 gtk_webview_load_html_string(GtkWebView *webview, const char *html) |
1695 pidgin_webview_load_html_string(PidginWebView *webview, const char *html) |
| 1696 { |
1696 { |
| 1697 g_return_if_fail(webview != NULL); |
1697 g_return_if_fail(webview != NULL); |
| 1698 |
1698 |
| 1699 webkit_web_view_load_string(WEBKIT_WEB_VIEW(webview), html, NULL, NULL, |
1699 webkit_web_view_load_string(WEBKIT_WEB_VIEW(webview), html, NULL, NULL, |
| 1700 "file:///"); |
1700 "file:///"); |
| 1701 } |
1701 } |
| 1702 |
1702 |
| 1703 void |
1703 void |
| 1704 gtk_webview_load_html_string_with_selection(GtkWebView *webview, const char *html) |
1704 pidgin_webview_load_html_string_with_selection(PidginWebView *webview, const char *html) |
| 1705 { |
1705 { |
| 1706 g_return_if_fail(webview != NULL); |
1706 g_return_if_fail(webview != NULL); |
| 1707 |
1707 |
| 1708 gtk_webview_load_html_string(webview, html); |
1708 pidgin_webview_load_html_string(webview, html); |
| 1709 gtk_webview_safe_execute_script(webview, |
1709 pidgin_webview_safe_execute_script(webview, |
| 1710 "var s = window.getSelection();" |
1710 "var s = window.getSelection();" |
| 1711 "var r = document.createRange();" |
1711 "var r = document.createRange();" |
| 1712 "var n = document.getElementById('caret');" |
1712 "var n = document.getElementById('caret');" |
| 1713 "r.selectNodeContents(n);" |
1713 "r.selectNodeContents(n);" |
| 1714 "var f = r.extractContents();" |
1714 "var f = r.extractContents();" |
| 1718 "s.removeAllRanges();" |
1718 "s.removeAllRanges();" |
| 1719 "s.addRange(r);"); |
1719 "s.addRange(r);"); |
| 1720 } |
1720 } |
| 1721 |
1721 |
| 1722 void |
1722 void |
| 1723 gtk_webview_append_html(GtkWebView *webview, const char *html) |
1723 pidgin_webview_append_html(PidginWebView *webview, const char *html) |
| 1724 { |
1724 { |
| 1725 GtkWebViewPriv *priv; |
1725 PidginWebViewPriv *priv; |
| 1726 |
1726 |
| 1727 g_return_if_fail(webview != NULL); |
1727 g_return_if_fail(webview != NULL); |
| 1728 |
1728 |
| 1729 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1729 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1730 g_queue_push_tail(priv->load_queue, GINT_TO_POINTER(LOAD_HTML)); |
1730 g_queue_push_tail(priv->load_queue, GINT_TO_POINTER(LOAD_HTML)); |
| 1731 g_queue_push_tail(priv->load_queue, g_strdup(html)); |
1731 g_queue_push_tail(priv->load_queue, g_strdup(html)); |
| 1732 if (!priv->is_loading && priv->loader == 0) |
1732 if (!priv->is_loading && priv->loader == 0) |
| 1733 priv->loader = g_idle_add((GSourceFunc)process_load_queue, webview); |
1733 priv->loader = g_idle_add((GSourceFunc)process_load_queue, webview); |
| 1734 } |
1734 } |
| 1735 |
1735 |
| 1736 void |
1736 void |
| 1737 gtk_webview_set_vadjustment(GtkWebView *webview, GtkAdjustment *vadj) |
1737 pidgin_webview_set_vadjustment(PidginWebView *webview, GtkAdjustment *vadj) |
| 1738 { |
1738 { |
| 1739 GtkWebViewPriv *priv; |
1739 PidginWebViewPriv *priv; |
| 1740 |
1740 |
| 1741 g_return_if_fail(webview != NULL); |
1741 g_return_if_fail(webview != NULL); |
| 1742 |
1742 |
| 1743 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1743 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1744 priv->vadj = vadj; |
1744 priv->vadj = vadj; |
| 1745 } |
1745 } |
| 1746 |
1746 |
| 1747 void |
1747 void |
| 1748 gtk_webview_scroll_to_end(GtkWebView *webview, gboolean smooth) |
1748 pidgin_webview_scroll_to_end(PidginWebView *webview, gboolean smooth) |
| 1749 { |
1749 { |
| 1750 GtkWebViewPriv *priv; |
1750 PidginWebViewPriv *priv; |
| 1751 |
1751 |
| 1752 g_return_if_fail(webview != NULL); |
1752 g_return_if_fail(webview != NULL); |
| 1753 |
1753 |
| 1754 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1754 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1755 if (priv->scroll_time) |
1755 if (priv->scroll_time) |
| 1756 g_timer_destroy(priv->scroll_time); |
1756 g_timer_destroy(priv->scroll_time); |
| 1757 if (priv->scroll_src) |
1757 if (priv->scroll_src) |
| 1758 g_source_remove(priv->scroll_src); |
1758 g_source_remove(priv->scroll_src); |
| 1759 if (smooth) { |
1759 if (smooth) { |
| 1764 priv->scroll_src = g_idle_add_full(G_PRIORITY_LOW, scroll_idle_cb, priv, NULL); |
1764 priv->scroll_src = g_idle_add_full(G_PRIORITY_LOW, scroll_idle_cb, priv, NULL); |
| 1765 } |
1765 } |
| 1766 } |
1766 } |
| 1767 |
1767 |
| 1768 void |
1768 void |
| 1769 gtk_webview_set_autoscroll(GtkWebView *webview, gboolean scroll) |
1769 pidgin_webview_set_autoscroll(PidginWebView *webview, gboolean scroll) |
| 1770 { |
1770 { |
| 1771 GtkWebViewPriv *priv; |
1771 PidginWebViewPriv *priv; |
| 1772 |
1772 |
| 1773 g_return_if_fail(webview != NULL); |
1773 g_return_if_fail(webview != NULL); |
| 1774 |
1774 |
| 1775 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1775 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1776 priv->autoscroll = scroll; |
1776 priv->autoscroll = scroll; |
| 1777 } |
1777 } |
| 1778 |
1778 |
| 1779 gboolean |
1779 gboolean |
| 1780 gtk_webview_get_autoscroll(GtkWebView *webview) |
1780 pidgin_webview_get_autoscroll(PidginWebView *webview) |
| 1781 { |
1781 { |
| 1782 GtkWebViewPriv *priv; |
1782 PidginWebViewPriv *priv; |
| 1783 |
1783 |
| 1784 g_return_val_if_fail(webview != NULL, FALSE); |
1784 g_return_val_if_fail(webview != NULL, FALSE); |
| 1785 |
1785 |
| 1786 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1786 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1787 return priv->autoscroll; |
1787 return priv->autoscroll; |
| 1788 } |
1788 } |
| 1789 |
1789 |
| 1790 void |
1790 void |
| 1791 gtk_webview_page_up(GtkWebView *webview) |
1791 pidgin_webview_page_up(PidginWebView *webview) |
| 1792 { |
1792 { |
| 1793 GtkWebViewPriv *priv; |
1793 PidginWebViewPriv *priv; |
| 1794 GtkAdjustment *vadj; |
1794 GtkAdjustment *vadj; |
| 1795 gdouble scroll_val; |
1795 gdouble scroll_val; |
| 1796 |
1796 |
| 1797 g_return_if_fail(webview != NULL); |
1797 g_return_if_fail(webview != NULL); |
| 1798 |
1798 |
| 1799 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1799 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1800 vadj = priv->vadj; |
1800 vadj = priv->vadj; |
| 1801 scroll_val = gtk_adjustment_get_value(vadj) - gtk_adjustment_get_page_size(vadj); |
1801 scroll_val = gtk_adjustment_get_value(vadj) - gtk_adjustment_get_page_size(vadj); |
| 1802 scroll_val = MAX(scroll_val, gtk_adjustment_get_lower(vadj)); |
1802 scroll_val = MAX(scroll_val, gtk_adjustment_get_lower(vadj)); |
| 1803 |
1803 |
| 1804 gtk_adjustment_set_value(vadj, scroll_val); |
1804 gtk_adjustment_set_value(vadj, scroll_val); |
| 1805 } |
1805 } |
| 1806 |
1806 |
| 1807 void |
1807 void |
| 1808 gtk_webview_page_down(GtkWebView *webview) |
1808 pidgin_webview_page_down(PidginWebView *webview) |
| 1809 { |
1809 { |
| 1810 GtkWebViewPriv *priv; |
1810 PidginWebViewPriv *priv; |
| 1811 GtkAdjustment *vadj; |
1811 GtkAdjustment *vadj; |
| 1812 gdouble scroll_val; |
1812 gdouble scroll_val; |
| 1813 gdouble page_size; |
1813 gdouble page_size; |
| 1814 |
1814 |
| 1815 g_return_if_fail(webview != NULL); |
1815 g_return_if_fail(webview != NULL); |
| 1816 |
1816 |
| 1817 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1817 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1818 vadj = priv->vadj; |
1818 vadj = priv->vadj; |
| 1819 page_size = gtk_adjustment_get_page_size(vadj); |
1819 page_size = gtk_adjustment_get_page_size(vadj); |
| 1820 scroll_val = gtk_adjustment_get_value(vadj) + page_size; |
1820 scroll_val = gtk_adjustment_get_value(vadj) + page_size; |
| 1821 scroll_val = MIN(scroll_val, gtk_adjustment_get_upper(vadj) - page_size); |
1821 scroll_val = MIN(scroll_val, gtk_adjustment_get_upper(vadj) - page_size); |
| 1822 |
1822 |
| 1823 gtk_adjustment_set_value(vadj, scroll_val); |
1823 gtk_adjustment_set_value(vadj, scroll_val); |
| 1824 } |
1824 } |
| 1825 |
1825 |
| 1826 void |
1826 void |
| 1827 gtk_webview_setup_entry(GtkWebView *webview, PurpleConnectionFlags flags) |
1827 pidgin_webview_setup_entry(PidginWebView *webview, PurpleConnectionFlags flags) |
| 1828 { |
1828 { |
| 1829 GtkWebViewButtons buttons; |
1829 PidginWebViewButtons buttons; |
| 1830 |
1830 |
| 1831 g_return_if_fail(webview != NULL); |
1831 g_return_if_fail(webview != NULL); |
| 1832 |
1832 |
| 1833 if (flags & PURPLE_CONNECTION_FLAG_HTML) { |
1833 if (flags & PURPLE_CONNECTION_FLAG_HTML) { |
| 1834 gboolean bold, italic, underline, strike; |
1834 gboolean bold, italic, underline, strike; |
| 1835 |
1835 |
| 1836 buttons = GTK_WEBVIEW_ALL; |
1836 buttons = PIDGIN_WEBVIEW_ALL; |
| 1837 |
1837 |
| 1838 if (flags & PURPLE_CONNECTION_FLAG_NO_BGCOLOR) |
1838 if (flags & PURPLE_CONNECTION_FLAG_NO_BGCOLOR) |
| 1839 buttons &= ~GTK_WEBVIEW_BACKCOLOR; |
1839 buttons &= ~PIDGIN_WEBVIEW_BACKCOLOR; |
| 1840 if (flags & PURPLE_CONNECTION_FLAG_NO_FONTSIZE) |
1840 if (flags & PURPLE_CONNECTION_FLAG_NO_FONTSIZE) |
| 1841 { |
1841 { |
| 1842 buttons &= ~GTK_WEBVIEW_GROW; |
1842 buttons &= ~PIDGIN_WEBVIEW_GROW; |
| 1843 buttons &= ~GTK_WEBVIEW_SHRINK; |
1843 buttons &= ~PIDGIN_WEBVIEW_SHRINK; |
| 1844 } |
1844 } |
| 1845 if (flags & PURPLE_CONNECTION_FLAG_NO_URLDESC) |
1845 if (flags & PURPLE_CONNECTION_FLAG_NO_URLDESC) |
| 1846 buttons &= ~GTK_WEBVIEW_LINKDESC; |
1846 buttons &= ~PIDGIN_WEBVIEW_LINKDESC; |
| 1847 |
1847 |
| 1848 gtk_webview_get_current_format(webview, &bold, &italic, &underline, &strike); |
1848 pidgin_webview_get_current_format(webview, &bold, &italic, &underline, &strike); |
| 1849 |
1849 |
| 1850 gtk_webview_set_format_functions(webview, GTK_WEBVIEW_ALL); |
1850 pidgin_webview_set_format_functions(webview, PIDGIN_WEBVIEW_ALL); |
| 1851 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold") != bold) |
1851 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold") != bold) |
| 1852 gtk_webview_toggle_bold(webview); |
1852 pidgin_webview_toggle_bold(webview); |
| 1853 |
1853 |
| 1854 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_italic") != italic) |
1854 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_italic") != italic) |
| 1855 gtk_webview_toggle_italic(webview); |
1855 pidgin_webview_toggle_italic(webview); |
| 1856 |
1856 |
| 1857 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_underline") != underline) |
1857 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_underline") != underline) |
| 1858 gtk_webview_toggle_underline(webview); |
1858 pidgin_webview_toggle_underline(webview); |
| 1859 |
1859 |
| 1860 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_strike") != strike) |
1860 if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_strike") != strike) |
| 1861 gtk_webview_toggle_strike(webview); |
1861 pidgin_webview_toggle_strike(webview); |
| 1862 |
1862 |
| 1863 gtk_webview_toggle_fontface(webview, |
1863 pidgin_webview_toggle_fontface(webview, |
| 1864 purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/font_face")); |
1864 purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/font_face")); |
| 1865 |
1865 |
| 1866 if (!(flags & PURPLE_CONNECTION_FLAG_NO_FONTSIZE)) |
1866 if (!(flags & PURPLE_CONNECTION_FLAG_NO_FONTSIZE)) |
| 1867 { |
1867 { |
| 1868 int size = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/font_size"); |
1868 int size = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/font_size"); |
| 1869 |
1869 |
| 1870 /* 3 is the default. */ |
1870 /* 3 is the default. */ |
| 1871 if (size != 3) |
1871 if (size != 3) |
| 1872 gtk_webview_font_set_size(webview, size); |
1872 pidgin_webview_font_set_size(webview, size); |
| 1873 } |
1873 } |
| 1874 |
1874 |
| 1875 gtk_webview_toggle_forecolor(webview, |
1875 pidgin_webview_toggle_forecolor(webview, |
| 1876 purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/fgcolor")); |
1876 purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/fgcolor")); |
| 1877 |
1877 |
| 1878 if (!(flags & PURPLE_CONNECTION_FLAG_NO_BGCOLOR)) { |
1878 if (!(flags & PURPLE_CONNECTION_FLAG_NO_BGCOLOR)) { |
| 1879 gtk_webview_toggle_backcolor(webview, |
1879 pidgin_webview_toggle_backcolor(webview, |
| 1880 purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/bgcolor")); |
1880 purple_prefs_get_string(PIDGIN_PREFS_ROOT "/conversations/bgcolor")); |
| 1881 } else { |
1881 } else { |
| 1882 gtk_webview_toggle_backcolor(webview, ""); |
1882 pidgin_webview_toggle_backcolor(webview, ""); |
| 1883 } |
1883 } |
| 1884 |
1884 |
| 1885 if (flags & PURPLE_CONNECTION_FLAG_FORMATTING_WBFO) |
1885 if (flags & PURPLE_CONNECTION_FLAG_FORMATTING_WBFO) |
| 1886 gtk_webview_set_whole_buffer_formatting_only(webview, TRUE); |
1886 pidgin_webview_set_whole_buffer_formatting_only(webview, TRUE); |
| 1887 else |
1887 else |
| 1888 gtk_webview_set_whole_buffer_formatting_only(webview, FALSE); |
1888 pidgin_webview_set_whole_buffer_formatting_only(webview, FALSE); |
| 1889 } else { |
1889 } else { |
| 1890 buttons = GTK_WEBVIEW_SMILEY | GTK_WEBVIEW_IMAGE; |
1890 buttons = PIDGIN_WEBVIEW_SMILEY | PIDGIN_WEBVIEW_IMAGE; |
| 1891 webview_clear_formatting(webview); |
1891 webview_clear_formatting(webview); |
| 1892 } |
1892 } |
| 1893 |
1893 |
| 1894 if (flags & PURPLE_CONNECTION_FLAG_NO_IMAGES) |
1894 if (flags & PURPLE_CONNECTION_FLAG_NO_IMAGES) |
| 1895 buttons &= ~GTK_WEBVIEW_IMAGE; |
1895 buttons &= ~PIDGIN_WEBVIEW_IMAGE; |
| 1896 |
1896 |
| 1897 if (flags & PURPLE_CONNECTION_FLAG_ALLOW_CUSTOM_SMILEY) |
1897 if (flags & PURPLE_CONNECTION_FLAG_ALLOW_CUSTOM_SMILEY) |
| 1898 buttons |= GTK_WEBVIEW_CUSTOM_SMILEY; |
1898 buttons |= PIDGIN_WEBVIEW_CUSTOM_SMILEY; |
| 1899 else |
1899 else |
| 1900 buttons &= ~GTK_WEBVIEW_CUSTOM_SMILEY; |
1900 buttons &= ~PIDGIN_WEBVIEW_CUSTOM_SMILEY; |
| 1901 |
1901 |
| 1902 gtk_webview_set_format_functions(webview, buttons); |
1902 pidgin_webview_set_format_functions(webview, buttons); |
| 1903 } |
1903 } |
| 1904 |
1904 |
| 1905 void |
1905 void |
| 1906 pidgin_webview_set_spellcheck(GtkWebView *webview, gboolean enable) |
1906 pidgin_webview_set_spellcheck(PidginWebView *webview, gboolean enable) |
| 1907 { |
1907 { |
| 1908 WebKitWebSettings *settings; |
1908 WebKitWebSettings *settings; |
| 1909 |
1909 |
| 1910 g_return_if_fail(webview != NULL); |
1910 g_return_if_fail(webview != NULL); |
| 1911 |
1911 |
| 1913 g_object_set(G_OBJECT(settings), "enable-spell-checking", enable, NULL); |
1913 g_object_set(G_OBJECT(settings), "enable-spell-checking", enable, NULL); |
| 1914 webkit_web_view_set_settings(WEBKIT_WEB_VIEW(webview), settings); |
1914 webkit_web_view_set_settings(WEBKIT_WEB_VIEW(webview), settings); |
| 1915 } |
1915 } |
| 1916 |
1916 |
| 1917 void |
1917 void |
| 1918 gtk_webview_set_whole_buffer_formatting_only(GtkWebView *webview, gboolean wbfo) |
1918 pidgin_webview_set_whole_buffer_formatting_only(PidginWebView *webview, gboolean wbfo) |
| 1919 { |
1919 { |
| 1920 GtkWebViewPriv *priv; |
1920 PidginWebViewPriv *priv; |
| 1921 |
1921 |
| 1922 g_return_if_fail(webview != NULL); |
1922 g_return_if_fail(webview != NULL); |
| 1923 |
1923 |
| 1924 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1924 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1925 priv->edit.wbfo = wbfo; |
1925 priv->edit.wbfo = wbfo; |
| 1926 } |
1926 } |
| 1927 |
1927 |
| 1928 void |
1928 void |
| 1929 gtk_webview_set_format_functions(GtkWebView *webview, GtkWebViewButtons buttons) |
1929 pidgin_webview_set_format_functions(PidginWebView *webview, PidginWebViewButtons buttons) |
| 1930 { |
1930 { |
| 1931 GtkWebViewPriv *priv; |
1931 PidginWebViewPriv *priv; |
| 1932 GObject *object; |
1932 GObject *object; |
| 1933 |
1933 |
| 1934 g_return_if_fail(webview != NULL); |
1934 g_return_if_fail(webview != NULL); |
| 1935 |
1935 |
| 1936 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
1936 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 1937 object = g_object_ref(G_OBJECT(webview)); |
1937 object = g_object_ref(G_OBJECT(webview)); |
| 1938 priv->format_functions = buttons; |
1938 priv->format_functions = buttons; |
| 1939 g_signal_emit(object, signals[BUTTONS_UPDATE], 0, buttons); |
1939 g_signal_emit(object, signals[BUTTONS_UPDATE], 0, buttons); |
| 1940 g_object_unref(object); |
1940 g_object_unref(object); |
| 1941 } |
1941 } |
| 1942 |
1942 |
| 1943 void |
1943 void |
| 1944 gtk_webview_activate_anchor(WebKitDOMHTMLAnchorElement *link) |
1944 pidgin_webview_activate_anchor(WebKitDOMHTMLAnchorElement *link) |
| 1945 { |
1945 { |
| 1946 WebKitDOMDocument *doc; |
1946 WebKitDOMDocument *doc; |
| 1947 WebKitDOMEvent *event; |
1947 WebKitDOMEvent *event; |
| 1948 |
1948 |
| 1949 doc = webkit_dom_node_get_owner_document(WEBKIT_DOM_NODE(link)); |
1949 doc = webkit_dom_node_get_owner_document(WEBKIT_DOM_NODE(link)); |
| 2204 g_signal_emit(object, signals[CLEAR_FORMAT], 0); |
2204 g_signal_emit(object, signals[CLEAR_FORMAT], 0); |
| 2205 g_object_unref(object); |
2205 g_object_unref(object); |
| 2206 } |
2206 } |
| 2207 |
2207 |
| 2208 void |
2208 void |
| 2209 gtk_webview_toggle_bold(GtkWebView *webview) |
2209 pidgin_webview_toggle_bold(PidginWebView *webview) |
| 2210 { |
2210 { |
| 2211 g_return_if_fail(webview != NULL); |
2211 g_return_if_fail(webview != NULL); |
| 2212 emit_format_signal(webview, GTK_WEBVIEW_BOLD); |
2212 emit_format_signal(webview, PIDGIN_WEBVIEW_BOLD); |
| 2213 } |
2213 } |
| 2214 |
2214 |
| 2215 void |
2215 void |
| 2216 gtk_webview_toggle_italic(GtkWebView *webview) |
2216 pidgin_webview_toggle_italic(PidginWebView *webview) |
| 2217 { |
2217 { |
| 2218 g_return_if_fail(webview != NULL); |
2218 g_return_if_fail(webview != NULL); |
| 2219 emit_format_signal(webview, GTK_WEBVIEW_ITALIC); |
2219 emit_format_signal(webview, PIDGIN_WEBVIEW_ITALIC); |
| 2220 } |
2220 } |
| 2221 |
2221 |
| 2222 void |
2222 void |
| 2223 gtk_webview_toggle_underline(GtkWebView *webview) |
2223 pidgin_webview_toggle_underline(PidginWebView *webview) |
| 2224 { |
2224 { |
| 2225 g_return_if_fail(webview != NULL); |
2225 g_return_if_fail(webview != NULL); |
| 2226 emit_format_signal(webview, GTK_WEBVIEW_UNDERLINE); |
2226 emit_format_signal(webview, PIDGIN_WEBVIEW_UNDERLINE); |
| 2227 } |
2227 } |
| 2228 |
2228 |
| 2229 void |
2229 void |
| 2230 gtk_webview_toggle_strike(GtkWebView *webview) |
2230 pidgin_webview_toggle_strike(PidginWebView *webview) |
| 2231 { |
2231 { |
| 2232 g_return_if_fail(webview != NULL); |
2232 g_return_if_fail(webview != NULL); |
| 2233 emit_format_signal(webview, GTK_WEBVIEW_STRIKE); |
2233 emit_format_signal(webview, PIDGIN_WEBVIEW_STRIKE); |
| 2234 } |
2234 } |
| 2235 |
2235 |
| 2236 gboolean |
2236 gboolean |
| 2237 gtk_webview_toggle_forecolor(GtkWebView *webview, const char *color) |
2237 pidgin_webview_toggle_forecolor(PidginWebView *webview, const char *color) |
| 2238 { |
2238 { |
| 2239 g_return_val_if_fail(webview != NULL, FALSE); |
2239 g_return_val_if_fail(webview != NULL, FALSE); |
| 2240 |
2240 |
| 2241 do_formatting(webview, "foreColor", color); |
2241 do_formatting(webview, "foreColor", color); |
| 2242 emit_format_signal(webview, GTK_WEBVIEW_FORECOLOR); |
2242 emit_format_signal(webview, PIDGIN_WEBVIEW_FORECOLOR); |
| 2243 |
2243 |
| 2244 return FALSE; |
2244 return FALSE; |
| 2245 } |
2245 } |
| 2246 |
2246 |
| 2247 gboolean |
2247 gboolean |
| 2248 gtk_webview_toggle_backcolor(GtkWebView *webview, const char *color) |
2248 pidgin_webview_toggle_backcolor(PidginWebView *webview, const char *color) |
| 2249 { |
2249 { |
| 2250 g_return_val_if_fail(webview != NULL, FALSE); |
2250 g_return_val_if_fail(webview != NULL, FALSE); |
| 2251 |
2251 |
| 2252 do_formatting(webview, "backColor", color); |
2252 do_formatting(webview, "backColor", color); |
| 2253 emit_format_signal(webview, GTK_WEBVIEW_BACKCOLOR); |
2253 emit_format_signal(webview, PIDGIN_WEBVIEW_BACKCOLOR); |
| 2254 |
2254 |
| 2255 return FALSE; |
2255 return FALSE; |
| 2256 } |
2256 } |
| 2257 |
2257 |
| 2258 gboolean |
2258 gboolean |
| 2259 gtk_webview_toggle_fontface(GtkWebView *webview, const char *face) |
2259 pidgin_webview_toggle_fontface(PidginWebView *webview, const char *face) |
| 2260 { |
2260 { |
| 2261 g_return_val_if_fail(webview != NULL, FALSE); |
2261 g_return_val_if_fail(webview != NULL, FALSE); |
| 2262 |
2262 |
| 2263 do_formatting(webview, "fontName", face); |
2263 do_formatting(webview, "fontName", face); |
| 2264 emit_format_signal(webview, GTK_WEBVIEW_FACE); |
2264 emit_format_signal(webview, PIDGIN_WEBVIEW_FACE); |
| 2265 |
2265 |
| 2266 return FALSE; |
2266 return FALSE; |
| 2267 } |
2267 } |
| 2268 |
2268 |
| 2269 void |
2269 void |
| 2270 gtk_webview_font_set_size(GtkWebView *webview, gint size) |
2270 pidgin_webview_font_set_size(PidginWebView *webview, gint size) |
| 2271 { |
2271 { |
| 2272 char *tmp; |
2272 char *tmp; |
| 2273 |
2273 |
| 2274 g_return_if_fail(webview != NULL); |
2274 g_return_if_fail(webview != NULL); |
| 2275 |
2275 |
| 2276 tmp = g_strdup_printf("%d", size); |
2276 tmp = g_strdup_printf("%d", size); |
| 2277 do_formatting(webview, "fontSize", tmp); |
2277 do_formatting(webview, "fontSize", tmp); |
| 2278 emit_format_signal(webview, GTK_WEBVIEW_SHRINK|GTK_WEBVIEW_GROW); |
2278 emit_format_signal(webview, PIDGIN_WEBVIEW_SHRINK|PIDGIN_WEBVIEW_GROW); |
| 2279 g_free(tmp); |
2279 g_free(tmp); |
| 2280 } |
2280 } |
| 2281 |
2281 |
| 2282 void |
2282 void |
| 2283 gtk_webview_font_shrink(GtkWebView *webview) |
2283 pidgin_webview_font_shrink(PidginWebView *webview) |
| 2284 { |
2284 { |
| 2285 g_return_if_fail(webview != NULL); |
2285 g_return_if_fail(webview != NULL); |
| 2286 emit_format_signal(webview, GTK_WEBVIEW_SHRINK); |
2286 emit_format_signal(webview, PIDGIN_WEBVIEW_SHRINK); |
| 2287 } |
2287 } |
| 2288 |
2288 |
| 2289 void |
2289 void |
| 2290 gtk_webview_font_grow(GtkWebView *webview) |
2290 pidgin_webview_font_grow(PidginWebView *webview) |
| 2291 { |
2291 { |
| 2292 g_return_if_fail(webview != NULL); |
2292 g_return_if_fail(webview != NULL); |
| 2293 emit_format_signal(webview, GTK_WEBVIEW_GROW); |
2293 emit_format_signal(webview, PIDGIN_WEBVIEW_GROW); |
| 2294 } |
2294 } |
| 2295 |
2295 |
| 2296 void |
2296 void |
| 2297 gtk_webview_insert_hr(GtkWebView *webview) |
2297 pidgin_webview_insert_hr(PidginWebView *webview) |
| 2298 { |
2298 { |
| 2299 GtkWebViewPriv *priv; |
2299 PidginWebViewPriv *priv; |
| 2300 WebKitDOMDocument *dom; |
2300 WebKitDOMDocument *dom; |
| 2301 |
2301 |
| 2302 g_return_if_fail(webview != NULL); |
2302 g_return_if_fail(webview != NULL); |
| 2303 |
2303 |
| 2304 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
2304 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 2305 dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); |
2305 dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); |
| 2306 |
2306 |
| 2307 priv->edit.block_changed = TRUE; |
2307 priv->edit.block_changed = TRUE; |
| 2308 webkit_dom_document_exec_command(dom, "insertHorizontalRule", FALSE, ""); |
2308 webkit_dom_document_exec_command(dom, "insertHorizontalRule", FALSE, ""); |
| 2309 priv->edit.block_changed = FALSE; |
2309 priv->edit.block_changed = FALSE; |
| 2310 } |
2310 } |
| 2311 |
2311 |
| 2312 void |
2312 void |
| 2313 gtk_webview_insert_link(GtkWebView *webview, const char *url, const char *desc) |
2313 pidgin_webview_insert_link(PidginWebView *webview, const char *url, const char *desc) |
| 2314 { |
2314 { |
| 2315 GtkWebViewPriv *priv; |
2315 PidginWebViewPriv *priv; |
| 2316 WebKitDOMDocument *dom; |
2316 WebKitDOMDocument *dom; |
| 2317 char *link; |
2317 char *link; |
| 2318 |
2318 |
| 2319 g_return_if_fail(webview != NULL); |
2319 g_return_if_fail(webview != NULL); |
| 2320 |
2320 |
| 2321 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
2321 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 2322 dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); |
2322 dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); |
| 2323 link = g_strdup_printf("<a href='%s'>%s</a>", url, desc ? desc : url); |
2323 link = g_strdup_printf("<a href='%s'>%s</a>", url, desc ? desc : url); |
| 2324 |
2324 |
| 2325 priv->edit.block_changed = TRUE; |
2325 priv->edit.block_changed = TRUE; |
| 2326 webkit_dom_document_exec_command(dom, "insertHTML", FALSE, link); |
2326 webkit_dom_document_exec_command(dom, "insertHTML", FALSE, link); |
| 2327 priv->edit.block_changed = FALSE; |
2327 priv->edit.block_changed = FALSE; |
| 2328 g_free(link); |
2328 g_free(link); |
| 2329 } |
2329 } |
| 2330 |
2330 |
| 2331 void |
2331 void |
| 2332 gtk_webview_insert_image(GtkWebView *webview, int id) |
2332 pidgin_webview_insert_image(PidginWebView *webview, int id) |
| 2333 { |
2333 { |
| 2334 GtkWebViewPriv *priv; |
2334 PidginWebViewPriv *priv; |
| 2335 WebKitDOMDocument *dom; |
2335 WebKitDOMDocument *dom; |
| 2336 char *img; |
2336 char *img; |
| 2337 |
2337 |
| 2338 g_return_if_fail(webview != NULL); |
2338 g_return_if_fail(webview != NULL); |
| 2339 |
2339 |
| 2340 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
2340 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 2341 dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); |
2341 dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); |
| 2342 img = g_strdup_printf("<img src='" PURPLE_STORED_IMAGE_PROTOCOL "%d'/>", |
2342 img = g_strdup_printf("<img src='" PURPLE_STORED_IMAGE_PROTOCOL "%d'/>", |
| 2343 id); |
2343 id); |
| 2344 |
2344 |
| 2345 priv->edit.block_changed = TRUE; |
2345 priv->edit.block_changed = TRUE; |
| 2347 priv->edit.block_changed = FALSE; |
2347 priv->edit.block_changed = FALSE; |
| 2348 g_free(img); |
2348 g_free(img); |
| 2349 } |
2349 } |
| 2350 |
2350 |
| 2351 void |
2351 void |
| 2352 gtk_webview_set_toolbar(GtkWebView *webview, GtkWidget *toolbar) |
2352 pidgin_webview_set_toolbar(PidginWebView *webview, GtkWidget *toolbar) |
| 2353 { |
2353 { |
| 2354 GtkWebViewPriv *priv; |
2354 PidginWebViewPriv *priv; |
| 2355 |
2355 |
| 2356 g_return_if_fail(webview != NULL); |
2356 g_return_if_fail(webview != NULL); |
| 2357 |
2357 |
| 2358 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
2358 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 2359 priv->toolbar = GTK_WEBVIEWTOOLBAR(toolbar); |
2359 priv->toolbar = PIDGIN_WEBVIEWTOOLBAR(toolbar); |
| 2360 } |
2360 } |
| 2361 |
2361 |
| 2362 void |
2362 void |
| 2363 gtk_webview_show_toolbar(GtkWebView *webview) |
2363 pidgin_webview_show_toolbar(PidginWebView *webview) |
| 2364 { |
2364 { |
| 2365 GtkWebViewPriv *priv; |
2365 PidginWebViewPriv *priv; |
| 2366 |
2366 |
| 2367 g_return_if_fail(webview != NULL); |
2367 g_return_if_fail(webview != NULL); |
| 2368 |
2368 |
| 2369 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
2369 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 2370 g_return_if_fail(priv->toolbar != NULL); |
2370 g_return_if_fail(priv->toolbar != NULL); |
| 2371 |
2371 |
| 2372 gtk_widget_show(GTK_WIDGET(priv->toolbar)); |
2372 gtk_widget_show(GTK_WIDGET(priv->toolbar)); |
| 2373 } |
2373 } |
| 2374 |
2374 |
| 2375 void |
2375 void |
| 2376 gtk_webview_hide_toolbar(GtkWebView *webview) |
2376 pidgin_webview_hide_toolbar(PidginWebView *webview) |
| 2377 { |
2377 { |
| 2378 GtkWebViewPriv *priv; |
2378 PidginWebViewPriv *priv; |
| 2379 |
2379 |
| 2380 g_return_if_fail(webview != NULL); |
2380 g_return_if_fail(webview != NULL); |
| 2381 |
2381 |
| 2382 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
2382 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 2383 g_return_if_fail(priv->toolbar != NULL); |
2383 g_return_if_fail(priv->toolbar != NULL); |
| 2384 |
2384 |
| 2385 gtk_widget_hide(GTK_WIDGET(priv->toolbar)); |
2385 gtk_widget_hide(GTK_WIDGET(priv->toolbar)); |
| 2386 } |
2386 } |
| 2387 |
2387 |
| 2388 void |
2388 void |
| 2389 gtk_webview_activate_toolbar(GtkWebView *webview, GtkWebViewAction action) |
2389 pidgin_webview_activate_toolbar(PidginWebView *webview, PidginWebViewAction action) |
| 2390 { |
2390 { |
| 2391 GtkWebViewPriv *priv; |
2391 PidginWebViewPriv *priv; |
| 2392 |
2392 |
| 2393 g_return_if_fail(webview != NULL); |
2393 g_return_if_fail(webview != NULL); |
| 2394 |
2394 |
| 2395 priv = GTK_WEBVIEW_GET_PRIVATE(webview); |
2395 priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); |
| 2396 g_return_if_fail(priv->toolbar != NULL); |
2396 g_return_if_fail(priv->toolbar != NULL); |
| 2397 |
2397 |
| 2398 gtk_webviewtoolbar_activate(priv->toolbar, action); |
2398 pidgin_webviewtoolbar_activate(priv->toolbar, action); |
| 2399 } |
2399 } |
| 2400 |
2400 |