~ubuntu-branches/ubuntu/trusty/gtkhtml3.14/trusty-proposed

« back to all changes in this revision

Viewing changes to gtkhtml/gtkhtml.c

  • Committer: Bazaar Package Importer
  • Author(s): Mathieu Trudel-Lapierre
  • Date: 2010-11-02 14:34:48 UTC
  • mfrom: (1.6.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20101102143448-3cxzy1h4oh5v7igz
Tags: 1:3.32.0-0ubuntu1
* New upstream release 3.32.0
  - Crash after closing inline view of text attachment (LP: #178959, #284060)
  - Translations not working in Emoticons, Find/Replace dialogs (LP: #562633)
* debian/patches/gtkhtml3.14_ftbfs.patch: dropped.
* debian/rules: append API_VER for libgtkhtml-editor chrpath as well
* debian/libgtkhtml-editor-dev.install: append api version to pkgconfig
  file name.
* debian/*.shlibs: update shlibs files for new version with same soname, also
  rename libgtkhtml-editor to libgtkhtml-editor-3.14
* debian/control: Replaces/Conflicts gtkhtml3.14 (<< 3.32.0)
* debian/control: bump libgtk2.0-dev and libgail-dev Build-Depends to 2.20
* debian/rules: disable deprecation warnings so the build completes

Show diffs side-by-side

added added

removed removed

Lines of Context:
70
70
#include "math.h"
71
71
 
72
72
enum DndTargetType {
73
 
        DND_TARGET_TYPE_MESSAGE_RFC822,
74
 
        DND_TARGET_TYPE_X_UID_LIST,
75
73
        DND_TARGET_TYPE_TEXT_URI_LIST,
76
74
        DND_TARGET_TYPE_MOZILLA_URL,
77
 
        DND_TARGET_TYPE_TEXT_VCARD,
78
 
        DND_TARGET_TYPE_TEXT_CALENDAR,
79
75
        DND_TARGET_TYPE_TEXT_HTML,
80
76
        DND_TARGET_TYPE_UTF8_STRING,
81
77
        DND_TARGET_TYPE_TEXT_PLAIN,
82
78
        DND_TARGET_TYPE_STRING
83
79
};
84
80
 
85
 
static GtkTargetEntry dnd_link_sources [] = {
86
 
        { (gchar *) "message/rfc822", 0, DND_TARGET_TYPE_MESSAGE_RFC822 },
87
 
        { (gchar *) "x-uid-list", 0, DND_TARGET_TYPE_X_UID_LIST },
88
 
        { (gchar *) "text/uri-list", 0, DND_TARGET_TYPE_TEXT_URI_LIST },
89
 
        { (gchar *) "_NETSCAPE_URL", 0, DND_TARGET_TYPE_MOZILLA_URL },
90
 
        { (gchar *) "text/x-vcard", 0, DND_TARGET_TYPE_TEXT_VCARD },
91
 
        { (gchar *) "text/calendar", 0, DND_TARGET_TYPE_TEXT_CALENDAR },
92
 
        { (gchar *) "text/html", 0, DND_TARGET_TYPE_TEXT_HTML },
93
 
        { (gchar *) "UTF8_STRING", 0, DND_TARGET_TYPE_UTF8_STRING },
94
 
        { (gchar *) "text/plain", 0, DND_TARGET_TYPE_TEXT_PLAIN },
95
 
        { (gchar *) "STRING", 0, DND_TARGET_TYPE_STRING },
96
 
};
97
 
#define DND_LINK_SOURCES sizeof (dnd_link_sources) / sizeof (GtkTargetEntry)
 
81
static GtkTargetEntry drag_dest_targets[] = {
 
82
        { (gchar *) "text/uri-list", 0, DND_TARGET_TYPE_TEXT_URI_LIST },
 
83
        { (gchar *) "_NETSCAPE_URL", 0, DND_TARGET_TYPE_MOZILLA_URL },
 
84
        { (gchar *) "text/html", 0, DND_TARGET_TYPE_TEXT_HTML },
 
85
        { (gchar *) "UTF8_STRING", 0, DND_TARGET_TYPE_UTF8_STRING },
 
86
        { (gchar *) "text/plain", 0, DND_TARGET_TYPE_TEXT_PLAIN },
 
87
        { (gchar *) "STRING", 0, DND_TARGET_TYPE_STRING },
 
88
};
 
89
 
 
90
static GtkTargetEntry drag_source_targets[] = {
 
91
        { (gchar *) "text/uri-list", 0, DND_TARGET_TYPE_TEXT_URI_LIST },
 
92
        { (gchar *) "_NETSCAPE_URL", 0, DND_TARGET_TYPE_MOZILLA_URL },
 
93
        { (gchar *) "text/html", 0, DND_TARGET_TYPE_TEXT_HTML },
 
94
        { (gchar *) "UTF8_STRING", 0, DND_TARGET_TYPE_UTF8_STRING },
 
95
        { (gchar *) "text/plain", 0, DND_TARGET_TYPE_TEXT_PLAIN },
 
96
        { (gchar *) "STRING", 0, DND_TARGET_TYPE_STRING },
 
97
};
98
98
 
99
99
enum _TargetInfo {
100
100
        TARGET_HTML,
173
173
static void     gtk_html_set_property  (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
174
174
#endif
175
175
 
176
 
static guint signals [LAST_SIGNAL] = { 0 };
 
176
static guint signals[LAST_SIGNAL] = { 0 };
177
177
 
178
178
static void
179
179
gtk_html_update_scrollbars_on_resize (GtkHTML *html,
346
346
 
347
347
        if (paragraph_style != html->priv->paragraph_style) {
348
348
                html->priv->paragraph_style = paragraph_style;
349
 
                g_signal_emit (html, signals [CURRENT_PARAGRAPH_STYLE_CHANGED], 0, paragraph_style);
 
349
                g_signal_emit (html, signals[CURRENT_PARAGRAPH_STYLE_CHANGED], 0, paragraph_style);
350
350
        }
351
351
 
352
352
        indentation = html_engine_get_current_clueflow_indentation (engine);
353
353
        if (indentation != html->priv->paragraph_indentation) {
354
354
                html->priv->paragraph_indentation = indentation;
355
 
                g_signal_emit (html, signals [CURRENT_PARAGRAPH_INDENTATION_CHANGED], 0, indentation);
 
355
                g_signal_emit (html, signals[CURRENT_PARAGRAPH_INDENTATION_CHANGED], 0, indentation);
356
356
        }
357
357
 
358
358
        alignment = html_alignment_to_paragraph (html_engine_get_current_clueflow_alignment (engine));
359
359
        if (alignment != html->priv->paragraph_alignment) {
360
360
                html->priv->paragraph_alignment = alignment;
361
 
                g_signal_emit (html, signals [CURRENT_PARAGRAPH_ALIGNMENT_CHANGED], 0, alignment);
 
361
                g_signal_emit (html, signals[CURRENT_PARAGRAPH_ALIGNMENT_CHANGED], 0, alignment);
362
362
        }
363
363
 
364
364
        if (html_engine_update_insertion_font_style (engine))
365
 
                g_signal_emit (html, signals [INSERTION_FONT_STYLE_CHANGED], 0, engine->insertion_font_style);
 
365
                g_signal_emit (html, signals[INSERTION_FONT_STYLE_CHANGED], 0, engine->insertion_font_style);
366
366
        if (html_engine_update_insertion_color (engine))
367
 
                g_signal_emit (html, signals [INSERTION_COLOR_CHANGED], 0, engine->insertion_color);
 
367
                g_signal_emit (html, signals[INSERTION_COLOR_CHANGED], 0, engine->insertion_color);
368
368
 
369
369
        /* TODO add insertion_url_or_targed_changed signal */
370
370
        html_engine_update_insertion_url_and_target (engine);
448
448
        GtkHTML *gtk_html;
449
449
 
450
450
        gtk_html = GTK_HTML (data);
451
 
        g_signal_emit (gtk_html, signals [TITLE_CHANGED], 0, engine->title->str);
 
451
        g_signal_emit (gtk_html, signals[TITLE_CHANGED], 0, engine->title->str);
452
452
}
453
453
 
454
454
static void
560
560
        GdkWindow *bin_window;
561
561
        gint x, y;
562
562
 
563
 
#if GTK_CHECK_VERSION(2,19,7)
564
563
        if (!gtk_widget_get_realized (widget))
565
 
#else
566
 
        if (!GTK_WIDGET_REALIZED (widget))
567
 
#endif
568
564
                return;
569
565
 
570
566
        window = gtk_widget_get_window (widget);
677
673
        GdkWindow *window;
678
674
        GtkHTML *html;
679
675
        HTMLEngine *engine;
680
 
 
 
676
        GtkAllocation allocation;
681
677
        GtkAdjustment *hadjustment;
682
678
        GtkAdjustment *vadjustment;
683
679
        gint x_scroll, y_scroll;
692
688
        window = gtk_widget_get_window (widget);
693
689
        gdk_window_get_pointer (window, &x, &y, NULL);
694
690
 
 
691
        gtk_widget_get_allocation (widget, &allocation);
 
692
 
695
693
        if (x < 0) {
696
694
                x_scroll = x;
697
695
                if (x + engine->x_offset >= 0)
698
696
                        x = 0;
699
 
        } else if (x >= widget->allocation.width) {
700
 
                x_scroll = x - widget->allocation.width + 1;
701
 
                x = widget->allocation.width;
 
697
        } else if (x >= allocation.width) {
 
698
                x_scroll = x - allocation.width + 1;
 
699
                x = allocation.width;
702
700
        } else {
703
701
                x_scroll = 0;
704
702
        }
708
706
                y_scroll = y;
709
707
                if (y + engine->y_offset >= 0)
710
708
                        y = 0;
711
 
        } else if (y >= widget->allocation.height) {
712
 
                y_scroll = y - widget->allocation.height + 1;
713
 
                y = widget->allocation.height;
 
709
        } else if (y >= allocation.height) {
 
710
                y_scroll = y - allocation.height + 1;
 
711
                y = allocation.height;
714
712
        } else {
715
713
                y_scroll = 0;
716
714
        }
724
722
        vadjustment = gtk_layout_get_vadjustment (GTK_LAYOUT (widget));
725
723
 
726
724
        inc_adjustment (hadjustment, html_engine_get_doc_width (html->engine),
727
 
                        widget->allocation.width, x_scroll);
 
725
                        allocation.width, x_scroll);
728
726
        inc_adjustment (vadjustment, html_engine_get_doc_height (html->engine),
729
 
                        widget->allocation.height, y_scroll);
 
727
                        allocation.height, y_scroll);
730
728
 
731
729
        GDK_THREADS_LEAVE ();
732
730
 
1097
1095
                                        /* printf ("link clicked: %s\n", url); */
1098
1096
                                        if (HTML_IS_TEXT(focus_object)) {
1099
1097
                                                html_text_set_link_visited (HTML_TEXT (focus_object), focus_object_offset, html->engine, TRUE);
1100
 
                                        g_signal_emit (html, signals [LINK_CLICKED], 0, url);
 
1098
                                        g_signal_emit (html, signals[LINK_CLICKED], 0, url);
1101
1099
                                        }
1102
1100
                                        g_free (url);
1103
1101
                                }
1140
1138
gtk_html_drag_dest_set (GtkHTML *html)
1141
1139
{
1142
1140
        if (html_engine_get_editable (html->engine))
1143
 
                gtk_drag_dest_set (GTK_WIDGET (html), GTK_DEST_DEFAULT_ALL,
1144
 
                                   dnd_link_sources, DND_LINK_SOURCES, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
 
1141
                gtk_drag_dest_set (
 
1142
                        GTK_WIDGET (html),
 
1143
                        GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP,
 
1144
                        drag_dest_targets, G_N_ELEMENTS (drag_dest_targets),
 
1145
                        GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
1145
1146
        else
1146
1147
                gtk_drag_dest_unset (GTK_WIDGET (html));
1147
1148
}
1282
1283
}
1283
1284
 
1284
1285
static void
 
1286
set_adjustment_upper (GtkAdjustment *adjustment,
 
1287
                      gdouble upper)
 
1288
{
 
1289
        gdouble page_size;
 
1290
        gdouble value;
 
1291
        gdouble min;
 
1292
 
 
1293
        /* XXX Stolen from gtklayout.c and simplified. */
 
1294
 
 
1295
        value = gtk_adjustment_get_value (adjustment);
 
1296
        page_size = gtk_adjustment_get_page_size (adjustment);
 
1297
        min = MAX (0., upper - page_size);
 
1298
 
 
1299
        gtk_adjustment_set_upper (adjustment, upper);
 
1300
 
 
1301
        if (value > min)
 
1302
                gtk_adjustment_set_value (adjustment, min);
 
1303
}
 
1304
 
 
1305
static void
 
1306
gtk_layout_faux_size_allocate (GtkWidget *widget,
 
1307
                               GtkAllocation *allocation)
 
1308
{
 
1309
        GtkLayout *layout = GTK_LAYOUT (widget);
 
1310
        GtkAdjustment *adjustment;
 
1311
        guint width, height;
 
1312
 
 
1313
        /* XXX This is essentially a copy of GtkLayout's size_allocate()
 
1314
         *     method, but with the GtkLayoutChild loop removed.  We call
 
1315
         *     this instead of chaining up to GtkLayout. */
 
1316
 
 
1317
        gtk_widget_set_allocation (widget, allocation);
 
1318
        gtk_layout_get_size (layout, &width, &height);
 
1319
 
 
1320
        if (gtk_widget_get_realized (widget)) {
 
1321
                gdk_window_move_resize (
 
1322
                        gtk_widget_get_window (widget),
 
1323
                        allocation->x, allocation->y,
 
1324
                        allocation->width, allocation->height);
 
1325
 
 
1326
                gdk_window_resize (
 
1327
                        gtk_layout_get_bin_window (layout),
 
1328
                        MAX (width, allocation->width),
 
1329
                        MAX (height, allocation->height));
 
1330
        }
 
1331
 
 
1332
        /* XXX Does the previous logic alter the GtkLayout size?
 
1333
         *     Not sure, so best refetch the size just to be safe. */
 
1334
        gtk_layout_get_size (layout, &width, &height);
 
1335
 
 
1336
        adjustment = gtk_layout_get_hadjustment (layout);
 
1337
        g_object_freeze_notify (G_OBJECT (adjustment));
 
1338
        gtk_adjustment_set_page_size (adjustment, allocation->width);
 
1339
        gtk_adjustment_set_page_increment (adjustment, allocation->width * 0.9);
 
1340
        gtk_adjustment_set_lower (adjustment, 0);
 
1341
        set_adjustment_upper (adjustment, MAX (allocation->width, width));
 
1342
        g_object_thaw_notify (G_OBJECT (adjustment));
 
1343
 
 
1344
        adjustment = gtk_layout_get_vadjustment (layout);
 
1345
        g_object_freeze_notify (G_OBJECT (adjustment));
 
1346
        gtk_adjustment_set_page_size (adjustment, allocation->height);
 
1347
        gtk_adjustment_set_page_increment (adjustment, allocation->height * 0.9);
 
1348
        gtk_adjustment_set_lower (adjustment, 0);
 
1349
        set_adjustment_upper (adjustment, MAX (allocation->height, height));
 
1350
        g_object_thaw_notify (G_OBJECT (adjustment));
 
1351
}
 
1352
 
 
1353
static void
1285
1354
size_allocate (GtkWidget *widget, GtkAllocation *allocation)
1286
1355
{
1287
1356
        GtkHTML *html;
1288
1357
        GtkLayout *layout;
1289
1358
        gboolean changed_x = FALSE, changed_y = FALSE;
1290
 
        GList *children;
1291
1359
 
1292
1360
        g_return_if_fail (widget != NULL);
1293
1361
        g_return_if_fail (GTK_IS_HTML (widget));
1298
1366
 
1299
1367
        /* isolate childs from layout - we want to set them after calc size is performed
1300
1368
           and we know the children positions */
1301
 
        children = GTK_LAYOUT (widget)->children;
1302
 
        GTK_LAYOUT (widget)->children = NULL;
1303
 
        if (GTK_WIDGET_CLASS (parent_class)->size_allocate)
1304
 
                (*GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation);
1305
 
        GTK_LAYOUT (widget)->children = children;
 
1369
        gtk_layout_faux_size_allocate (widget, allocation);
1306
1370
 
1307
1371
        if (html->engine->width != allocation->width
1308
1372
            || html->engine->height != allocation->height) {
1361
1425
        if (!html_engine_get_editable (GTK_HTML (widget)->engine)) {
1362
1426
                /* printf ("dnd_link_set %p\n", o); */
1363
1427
 
1364
 
                gtk_drag_source_set (widget, GDK_BUTTON1_MASK,
1365
 
                                     dnd_link_sources, DND_LINK_SOURCES,
1366
 
                                     GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
 
1428
                gtk_drag_source_set (
 
1429
                        widget, GDK_BUTTON1_MASK,
 
1430
                        drag_source_targets, G_N_ELEMENTS (drag_source_targets),
 
1431
                        GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
1367
1432
                GTK_HTML (widget)->priv->dnd_object = o;
1368
1433
                GTK_HTML (widget)->priv->dnd_object_offset = offset;
1369
1434
        }
1442
1507
        HTMLType type;
1443
1508
        gint offset;
1444
1509
 
1445
 
#if GTK_CHECK_VERSION(2,19,7)
1446
1510
        if (!gtk_widget_get_realized (widget))
1447
 
#else
1448
 
        if (!GTK_WIDGET_REALIZED (widget))
1449
 
#endif
1450
1511
                return FALSE;
1451
1512
 
1452
1513
        html   = GTK_HTML (widget);
1454
1515
        obj    = html_engine_get_object_at (engine, x, y, (guint *) &offset, FALSE);
1455
1516
 
1456
1517
        if ((html->in_selection || html->in_selection_drag) && html->allow_selection) {
 
1518
                GtkAllocation allocation;
1457
1519
                gboolean need_scroll;
1458
1520
 
 
1521
                gtk_widget_get_allocation (widget, &allocation);
 
1522
 
1459
1523
                if (obj) {
1460
1524
                        type = HTML_OBJECT_TYPE (obj);
1461
1525
 
1484
1548
 
1485
1549
                if (x < html->engine->x_offset) {
1486
1550
                        need_scroll = TRUE;
1487
 
                } else if (x >= widget->allocation.width) {
 
1551
                } else if (x >= allocation.width) {
1488
1552
                        need_scroll = TRUE;
1489
1553
                }
1490
1554
 
1491
1555
                if (y < html->engine->y_offset) {
1492
1556
                        need_scroll = TRUE;
1493
 
                } else if (y >= widget->allocation.height) {
 
1557
                } else if (y >= allocation.height) {
1494
1558
                        need_scroll = TRUE;
1495
1559
                }
1496
1560
 
1632
1696
 
1633
1697
        if (!isalpha (*url))
1634
1698
                return FALSE;
1635
 
        url ++;
 
1699
        url++;
1636
1700
 
1637
1701
        while (*url && (isalnum (*url) || *url == '+' || *url == '-' || *url == '.'))
1638
 
                url ++;
 
1702
                url++;
1639
1703
 
1640
1704
        return *url && *url == ':';
1641
1705
}
1746
1810
shift_to_iframe_parent (GtkWidget *widget, gint *x, gint *y)
1747
1811
{
1748
1812
        while (GTK_HTML (widget)->iframe_parent) {
 
1813
                GtkAllocation allocation;
 
1814
 
 
1815
                gtk_widget_get_allocation (widget, &allocation);
 
1816
 
1749
1817
                if (x)
1750
 
                        *x += widget->allocation.x - GTK_HTML (widget)->engine->x_offset;
 
1818
                        *x += allocation.x - GTK_HTML (widget)->engine->x_offset;
1751
1819
                if (y)
1752
 
                        *y += widget->allocation.y - GTK_HTML (widget)->engine->y_offset;
 
1820
                        *y += allocation.y - GTK_HTML (widget)->engine->y_offset;
1753
1821
 
1754
1822
                widget = GTK_HTML (widget)->iframe_parent;
1755
1823
 
2049
2117
 
2050
2118
        engine =  html->engine;
2051
2119
 
2052
 
        if (html->in_selection) {
 
2120
        if (html->in_selection && !html->priv->dnd_in_progress) {
2053
2121
                html_engine_update_selection_active_state (html->engine, html->priv->event_time);
2054
2122
                if (html->in_selection_drag)
2055
2123
                        html_engine_select_region (engine, html->selection_x1, html->selection_y1,
2154
2222
 
2155
2223
        /* printf ("focus in\n"); */
2156
2224
        if (!html->iframe_parent) {
2157
 
                GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
2158
2225
                if (html->engine->cursor && html->engine->cursor->position == 0 && html->engine->caret_mode)
2159
2226
                        goto_caret_anchor (html);
2160
2227
                html_engine_set_focus (html->engine, TRUE);
2185
2252
        html_engine_redraw_selection (html->engine);
2186
2253
        /* printf ("focus out\n"); */
2187
2254
        if (!html->iframe_parent) {
2188
 
                GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
2189
2255
                html_engine_set_focus (html->engine, FALSE);
2190
2256
        }
2191
2257
 
2412
2478
                        gtk_widget_grab_focus (w);
2413
2479
 
2414
2480
                        update_primary_selection (GTK_HTML (w));
2415
 
                        g_signal_emit (GTK_HTML (w), signals [CURSOR_CHANGED], 0);
 
2481
                        g_signal_emit (GTK_HTML (w), signals[CURSOR_CHANGED], 0);
2416
2482
 
2417
2483
                        return TRUE;
2418
2484
                }
2480
2546
                }
2481
2547
 
2482
2548
                update_primary_selection (GTK_HTML (w));
2483
 
                g_signal_emit (GTK_HTML (w), signals [CURSOR_CHANGED], 0);
 
2549
                g_signal_emit (GTK_HTML (w), signals[CURSOR_CHANGED], 0);
2484
2550
 
2485
2551
                return TRUE;
2486
2552
        }
2712
2778
                                 pasted = TRUE;
2713
2779
                         }
2714
2780
                 } while (list_len);
2715
 
                 html_undo_level_end (engine->undo);
 
2781
                 html_undo_level_end (engine->undo, engine);
2716
2782
        }
2717
2783
        break;
2718
2784
        }
2833
2899
 
2834
2900
        parent_class = g_type_class_peek_parent (klass);
2835
2901
 
2836
 
        signals [TITLE_CHANGED] =
 
2902
        signals[TITLE_CHANGED] =
2837
2903
                g_signal_new ("title_changed",
2838
2904
                              G_TYPE_FROM_CLASS (object_class),
2839
2905
                              G_SIGNAL_RUN_FIRST,
2842
2908
                              g_cclosure_marshal_VOID__STRING,
2843
2909
                              G_TYPE_NONE, 1,
2844
2910
                              G_TYPE_STRING);
2845
 
        signals [URL_REQUESTED] =
 
2911
        signals[URL_REQUESTED] =
2846
2912
                g_signal_new ("url_requested",
2847
2913
                              G_TYPE_FROM_CLASS (object_class),
2848
2914
                              G_SIGNAL_RUN_LAST,
2852
2918
                              G_TYPE_NONE, 2,
2853
2919
                              G_TYPE_STRING,
2854
2920
                              G_TYPE_POINTER);
2855
 
        signals [LOAD_DONE] =
 
2921
        signals[LOAD_DONE] =
2856
2922
                g_signal_new ("load_done",
2857
2923
                              G_TYPE_FROM_CLASS (object_class),
2858
2924
                              G_SIGNAL_RUN_FIRST,
2860
2926
                              NULL, NULL,
2861
2927
                              g_cclosure_marshal_VOID__VOID,
2862
2928
                              G_TYPE_NONE, 0);
2863
 
        signals [LINK_CLICKED] =
 
2929
        signals[LINK_CLICKED] =
2864
2930
                g_signal_new ("link_clicked",
2865
2931
                              G_TYPE_FROM_CLASS (object_class),
2866
2932
                              G_SIGNAL_RUN_FIRST,
2869
2935
                              g_cclosure_marshal_VOID__STRING,
2870
2936
                              G_TYPE_NONE, 1,
2871
2937
                              G_TYPE_STRING);
2872
 
        signals [SET_BASE] =
 
2938
        signals[SET_BASE] =
2873
2939
                g_signal_new ("set_base",
2874
2940
                              G_TYPE_FROM_CLASS (object_class),
2875
2941
                              G_SIGNAL_RUN_FIRST,
2878
2944
                              g_cclosure_marshal_VOID__STRING,
2879
2945
                              G_TYPE_NONE, 1,
2880
2946
                              G_TYPE_STRING);
2881
 
        signals [SET_BASE_TARGET] =
 
2947
        signals[SET_BASE_TARGET] =
2882
2948
                g_signal_new ("set_base_target",
2883
2949
                              G_TYPE_FROM_CLASS (object_class),
2884
2950
                              G_SIGNAL_RUN_FIRST,
2888
2954
                              G_TYPE_NONE, 1,
2889
2955
                              G_TYPE_STRING);
2890
2956
 
2891
 
        signals [ON_URL] =
 
2957
        signals[ON_URL] =
2892
2958
                g_signal_new ("on_url",
2893
2959
                              G_TYPE_FROM_CLASS (object_class),
2894
2960
                              G_SIGNAL_RUN_FIRST,
2898
2964
                              G_TYPE_NONE, 1,
2899
2965
                              G_TYPE_STRING);
2900
2966
 
2901
 
        signals [REDIRECT] =
 
2967
        signals[REDIRECT] =
2902
2968
                g_signal_new ("redirect",
2903
2969
                              G_TYPE_FROM_CLASS (object_class),
2904
2970
                              G_SIGNAL_RUN_FIRST,
2909
2975
                              G_TYPE_STRING,
2910
2976
                              G_TYPE_INT);
2911
2977
 
2912
 
        signals [SUBMIT] =
 
2978
        signals[SUBMIT] =
2913
2979
                g_signal_new ("submit",
2914
2980
                              G_TYPE_FROM_CLASS (object_class),
2915
2981
                              G_SIGNAL_RUN_FIRST,
2921
2987
                              G_TYPE_STRING,
2922
2988
                              G_TYPE_STRING);
2923
2989
 
2924
 
        signals [OBJECT_REQUESTED] =
 
2990
        signals[OBJECT_REQUESTED] =
2925
2991
                g_signal_new ("object_requested",
2926
2992
                              G_TYPE_FROM_CLASS (object_class),
2927
2993
                              G_SIGNAL_RUN_LAST,
2931
2997
                              G_TYPE_BOOLEAN, 1,
2932
2998
                              G_TYPE_OBJECT);
2933
2999
 
2934
 
        signals [CURRENT_PARAGRAPH_STYLE_CHANGED] =
 
3000
        signals[CURRENT_PARAGRAPH_STYLE_CHANGED] =
2935
3001
                g_signal_new ("current_paragraph_style_changed",
2936
3002
                              G_TYPE_FROM_CLASS (object_class),
2937
3003
                              G_SIGNAL_RUN_FIRST,
2941
3007
                              G_TYPE_NONE, 1,
2942
3008
                              G_TYPE_INT);
2943
3009
 
2944
 
        signals [CURRENT_PARAGRAPH_INDENTATION_CHANGED] =
 
3010
        signals[CURRENT_PARAGRAPH_INDENTATION_CHANGED] =
2945
3011
                g_signal_new ("current_paragraph_indentation_changed",
2946
3012
                              G_TYPE_FROM_CLASS (object_class),
2947
3013
                              G_SIGNAL_RUN_FIRST,
2951
3017
                              G_TYPE_NONE, 1,
2952
3018
                              G_TYPE_INT);
2953
3019
 
2954
 
        signals [CURRENT_PARAGRAPH_ALIGNMENT_CHANGED] =
 
3020
        signals[CURRENT_PARAGRAPH_ALIGNMENT_CHANGED] =
2955
3021
                g_signal_new ("current_paragraph_alignment_changed",
2956
3022
                              G_TYPE_FROM_CLASS (object_class),
2957
3023
                              G_SIGNAL_RUN_FIRST,
2961
3027
                              G_TYPE_NONE, 1,
2962
3028
                              G_TYPE_INT);
2963
3029
 
2964
 
        signals [INSERTION_FONT_STYLE_CHANGED] =
 
3030
        signals[INSERTION_FONT_STYLE_CHANGED] =
2965
3031
                g_signal_new ("insertion_font_style_changed",
2966
3032
                              G_TYPE_FROM_CLASS (object_class),
2967
3033
                              G_SIGNAL_RUN_FIRST,
2971
3037
                              G_TYPE_NONE, 1,
2972
3038
                              G_TYPE_INT);
2973
3039
 
2974
 
        signals [INSERTION_COLOR_CHANGED] =
 
3040
        signals[INSERTION_COLOR_CHANGED] =
2975
3041
                g_signal_new ("insertion_color_changed",
2976
3042
                              G_TYPE_FROM_CLASS (object_class),
2977
3043
                              G_SIGNAL_RUN_FIRST,
2981
3047
                              G_TYPE_NONE, 1,
2982
3048
                              G_TYPE_POINTER);
2983
3049
 
2984
 
        signals [SIZE_CHANGED] =
 
3050
        signals[SIZE_CHANGED] =
2985
3051
                g_signal_new ("size_changed",
2986
3052
                              G_TYPE_FROM_CLASS (object_class),
2987
3053
                              G_SIGNAL_RUN_FIRST,
2989
3055
                              NULL, NULL,
2990
3056
                              g_cclosure_marshal_VOID__VOID,
2991
3057
                              G_TYPE_NONE, 0);
2992
 
        signals [IFRAME_CREATED] =
 
3058
        signals[IFRAME_CREATED] =
2993
3059
                g_signal_new ("iframe_created",
2994
3060
                              G_TYPE_FROM_CLASS (object_class),
2995
3061
                              G_SIGNAL_RUN_FIRST,
2999
3065
                              G_TYPE_NONE, 1,
3000
3066
                              GTK_TYPE_HTML);
3001
3067
 
3002
 
        signals [SCROLL] =
 
3068
        signals[SCROLL] =
3003
3069
                g_signal_new ("scroll",
3004
3070
                              G_TYPE_FROM_CLASS (object_class),
3005
3071
                              G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
3010
3076
                              GTK_TYPE_ORIENTATION,
3011
3077
                              GTK_TYPE_SCROLL_TYPE, G_TYPE_FLOAT);
3012
3078
 
3013
 
        signals [CURSOR_MOVE] =
 
3079
        signals[CURSOR_MOVE] =
3014
3080
                g_signal_new ("cursor_move",
3015
3081
                              G_TYPE_FROM_CLASS (object_class),
3016
3082
                              G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
3019
3085
                              html_g_cclosure_marshal_VOID__ENUM_ENUM,
3020
3086
                              G_TYPE_NONE, 2, GTK_TYPE_DIRECTION_TYPE, GTK_TYPE_HTML_CURSOR_SKIP);
3021
3087
 
3022
 
        signals [COMMAND] =
 
3088
        signals[COMMAND] =
3023
3089
                g_signal_new ("command",
3024
3090
                              G_TYPE_FROM_CLASS (object_class),
3025
3091
                              G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
3028
3094
                              html_g_cclosure_marshal_BOOL__ENUM,
3029
3095
                              G_TYPE_BOOLEAN, 1, GTK_TYPE_HTML_COMMAND);
3030
3096
 
3031
 
        signals [CURSOR_CHANGED] =
 
3097
        signals[CURSOR_CHANGED] =
3032
3098
                g_signal_new ("cursor_changed",
3033
3099
                              G_TYPE_FROM_CLASS (object_class),
3034
3100
                              G_SIGNAL_RUN_FIRST,
3037
3103
                              g_cclosure_marshal_VOID__VOID,
3038
3104
                              G_TYPE_NONE, 0);
3039
3105
 
3040
 
        signals [OBJECT_INSERTED] =
 
3106
        signals[OBJECT_INSERTED] =
3041
3107
                g_signal_new ("object_inserted",
3042
3108
                              G_TYPE_FROM_CLASS (object_class),
3043
3109
                              G_SIGNAL_RUN_FIRST,
3047
3113
                              G_TYPE_NONE, 2,
3048
3114
                              G_TYPE_INT, G_TYPE_INT);
3049
3115
 
3050
 
        signals [OBJECT_DELETE] =
 
3116
        signals[OBJECT_DELETE] =
3051
3117
                g_signal_new ("object_delete",
3052
3118
                              G_TYPE_FROM_CLASS (object_class),
3053
3119
                              G_SIGNAL_RUN_FIRST,
3065
3131
        g_object_class_install_property (gobject_class,
3066
3132
                                         PROP_EDITABLE,
3067
3133
                                         g_param_spec_boolean ("editable",
3068
 
                                                               _("Editable"),
3069
 
                                                               _("Whether the html can be edited"),
 
3134
                                                               "Editable",
 
3135
                                                               "Whether the html can be edited",
3070
3136
                                                               FALSE,
3071
3137
                                                               G_PARAM_READABLE | G_PARAM_WRITABLE));
3072
3138
        g_object_class_install_property (gobject_class,
3073
3139
                                         PROP_TITLE,
3074
3140
                                         g_param_spec_string ("title",
3075
 
                                                              _("Document Title"),
3076
 
                                                              _("The title of the current document"),
 
3141
                                                              "Document Title",
 
3142
                                                              "The title of the current document",
3077
3143
                                                              NULL,
3078
3144
                                                              G_PARAM_WRITABLE | G_PARAM_READABLE));
3079
3145
        g_object_class_install_property (gobject_class,
3080
3146
                                         PROP_DOCUMENT_BASE,
3081
3147
                                         g_param_spec_string ("document_base",
3082
 
                                                              _("Document Base"),
3083
 
                                                              _("The base URL for relative references"),
 
3148
                                                              "Document Base",
 
3149
                                                              "The base URL for relative references",
3084
3150
                                                              NULL,
3085
3151
                                                              G_PARAM_WRITABLE | G_PARAM_READABLE));
3086
3152
        g_object_class_install_property (gobject_class,
3087
3153
                                         PROP_TARGET_BASE,
3088
3154
                                         g_param_spec_string ("target_base",
3089
 
                                                              _("Target Base"),
3090
 
                                                              _("The base URL of the target frame"),
 
3155
                                                              "Target Base",
 
3156
                                                              "The base URL of the target frame",
3091
3157
                                                              NULL,
3092
3158
                                                              G_PARAM_WRITABLE | G_PARAM_READABLE));
3093
3159
 
3095
3161
 
3096
3162
        gtk_widget_class_install_style_property (widget_class,
3097
3163
                                                 g_param_spec_string ("fixed_font_name",
3098
 
                                                                     _("Fixed Width Font"),
3099
 
                                                                     _("The Monospace font to use for typewriter text"),
 
3164
                                                                     "Fixed Width Font",
 
3165
                                                                     "The Monospace font to use for typewriter text",
3100
3166
                                                                     NULL,
3101
3167
                                                                     G_PARAM_READABLE));
3102
3168
 
3103
3169
        gtk_widget_class_install_style_property (widget_class,
3104
3170
                                                 g_param_spec_boxed ("link_color",
3105
 
                                                                     _("New Link Color"),
3106
 
                                                                     _("The color of new link elements"),
 
3171
                                                                     "New Link Color",
 
3172
                                                                     "The color of new link elements",
3107
3173
                                                                     GDK_TYPE_COLOR,
3108
3174
                                                                     G_PARAM_READABLE));
3109
3175
        gtk_widget_class_install_style_property (widget_class,
3110
3176
                                                 g_param_spec_boxed ("vlink_color",
3111
 
                                                                     _("Visited Link Color"),
3112
 
                                                                     _("The color of visited link elements"),
 
3177
                                                                     "Visited Link Color",
 
3178
                                                                     "The color of visited link elements",
3113
3179
                                                                     GDK_TYPE_COLOR,
3114
3180
                                                                     G_PARAM_READABLE));
3115
3181
        gtk_widget_class_install_style_property (widget_class,
3116
3182
                                                 g_param_spec_boxed ("alink_color",
3117
 
                                                                     _("Active Link Color"),
3118
 
                                                                     _("The color of active link elements"),
 
3183
                                                                     "Active Link Color",
 
3184
                                                                     "The color of active link elements",
3119
3185
                                                                     GDK_TYPE_COLOR,
3120
3186
                                                                     G_PARAM_READABLE));
3121
3187
        gtk_widget_class_install_style_property (widget_class,
3122
3188
                                                 g_param_spec_boxed ("spell_error_color",
3123
 
                                                                     _("Spelling Error Color"),
3124
 
                                                                     _("The color of the spelling error markers"),
 
3189
                                                                     "Spelling Error Color",
 
3190
                                                                     "The color of the spelling error markers",
3125
3191
                                                                     GDK_TYPE_COLOR,
3126
3192
                                                                     G_PARAM_READABLE));
3127
3193
        gtk_widget_class_install_style_property (widget_class,
3128
3194
                                                 g_param_spec_boxed ("cite_color",
3129
 
                                                                     _("Cite Quotation Color"),
3130
 
                                                                     _("The color of the cited text"),
 
3195
                                                                     "Cite Quotation Color",
 
3196
                                                                     "The color of the cited text",
3131
3197
                                                                     GDK_TYPE_COLOR,
3132
3198
                                                                     G_PARAM_READABLE));
3133
3199
 
3414
3480
static void
3415
3481
gtk_html_init (GtkHTML* html)
3416
3482
{
3417
 
        GTK_WIDGET_SET_FLAGS (GTK_WIDGET (html), GTK_CAN_FOCUS);
3418
 
        GTK_WIDGET_SET_FLAGS (GTK_WIDGET (html), GTK_APP_PAINTABLE);
 
3483
        gtk_widget_set_can_focus (GTK_WIDGET (html), TRUE);
 
3484
        gtk_widget_set_app_paintable (GTK_WIDGET (html), TRUE);
3419
3485
 
3420
3486
        html->editor_api = NULL;
3421
3487
        html->debug = FALSE;
3891
3957
        gint width, height;
3892
3958
        gdouble value;
3893
3959
 
3894
 
#if GTK_CHECK_VERSION(2,19,7)
3895
3960
        if (!gtk_widget_get_realized (GTK_WIDGET (html)))
3896
 
#else
3897
 
        if (!GTK_WIDGET_REALIZED (html))
3898
 
#endif
3899
3961
                return;
3900
3962
 
3901
3963
        /* printf ("calc scrollbars\n"); */
3924
3986
 
3925
3987
        gtk_layout_get_size (layout, &layout_width, &layout_height);
3926
3988
        if ((width != layout_width) || (height != layout_height)) {
3927
 
                g_signal_emit (html, signals [SIZE_CHANGED], 0);
 
3989
                g_signal_emit (html, signals[SIZE_CHANGED], 0);
3928
3990
                gtk_layout_set_size (layout, width, height);
3929
3991
        }
3930
3992
 
4026
4088
 
4027
4089
        html->priv->inline_spelling = inline_spell;
4028
4090
 
 
4091
        /* do not update content, when there is none set (yet) */
 
4092
        if (!html->engine || !html->engine->clue)
 
4093
                return;
 
4094
 
4029
4095
        if (gtk_html_get_editable (html) && html->priv->inline_spelling)
4030
4096
                html_engine_spell_check (html->engine);
4031
4097
        else
4314
4380
        g_return_if_fail (GTK_IS_HTML (html));
4315
4381
 
4316
4382
        if (html_engine_set_font_style (html->engine, and_mask, or_mask))
4317
 
                g_signal_emit (html, signals [INSERTION_FONT_STYLE_CHANGED], 0, html->engine->insertion_font_style);
 
4383
                g_signal_emit (html, signals[INSERTION_FONT_STYLE_CHANGED], 0, html->engine->insertion_font_style);
4318
4384
}
4319
4385
 
4320
4386
void
4324
4390
        g_return_if_fail (GTK_IS_HTML (html));
4325
4391
 
4326
4392
        if (html_engine_set_color (html->engine, color))
4327
 
                g_signal_emit (html, signals [INSERTION_COLOR_CHANGED], 0, html->engine->insertion_color);
 
4393
                g_signal_emit (html, signals[INSERTION_COLOR_CHANGED], 0, html->engine->insertion_color);
4328
4394
}
4329
4395
 
4330
4396
void
4338
4404
                return;
4339
4405
 
4340
4406
        if (html_engine_toggle_font_style (html->engine, style))
4341
 
                g_signal_emit (html, signals [INSERTION_FONT_STYLE_CHANGED], 0, html->engine->insertion_font_style);
 
4407
                g_signal_emit (html, signals[INSERTION_FONT_STYLE_CHANGED], 0, html->engine->insertion_font_style);
4342
4408
}
4343
4409
 
4344
4410
GtkHTMLParagraphAlignment
4365
4431
        if (html_engine_set_clueflow_style (html->engine, 0, 0, align, 0, NULL,
4366
4432
                                            HTML_ENGINE_SET_CLUEFLOW_ALIGNMENT, HTML_UNDO_UNDO, TRUE)) {
4367
4433
                html->priv->paragraph_alignment = alignment;
4368
 
                g_signal_emit (html,  signals [CURRENT_PARAGRAPH_ALIGNMENT_CHANGED], 0, alignment);
 
4434
                g_signal_emit (html,  signals[CURRENT_PARAGRAPH_ALIGNMENT_CHANGED], 0, alignment);
4369
4435
        }
4370
4436
}
4371
4437
 
4853
4919
 
4854
4920
        if (skip == GTK_HTML_CURSOR_SKIP_NONE) {
4855
4921
                update_primary_selection (html);
4856
 
                g_signal_emit (GTK_HTML (html), signals [CURSOR_CHANGED], 0);
 
4922
                g_signal_emit (GTK_HTML (html), signals[CURSOR_CHANGED], 0);
4857
4923
                return;
4858
4924
        }
4859
4925
 
4899
4965
                }
4900
4966
                break;
4901
4967
        case GTK_HTML_CURSOR_SKIP_PAGE: {
 
4968
                GtkAllocation allocation;
4902
4969
                gint line_height;
4903
4970
 
4904
 
                line_height =  GTK_WIDGET (html)->allocation.height > (3 * get_line_height (html))
 
4971
                gtk_widget_get_allocation (GTK_WIDGET (html), &allocation);
 
4972
                line_height = allocation.height > (3 * get_line_height (html))
4905
4973
                        ? get_line_height (html) : 0;
4906
4974
 
4907
4975
                switch (dir_type) {
4908
4976
                case GTK_DIR_UP:
4909
4977
                case GTK_DIR_LEFT:
4910
4978
                        if ((amount = html_engine_scroll_up (html->engine,
4911
 
                                                             GTK_WIDGET (html)->allocation.height - line_height)) > 0)
 
4979
                                                             allocation.height - line_height)) > 0)
4912
4980
                                scroll_by_amount (html, - amount);
4913
4981
                        break;
4914
4982
                case GTK_DIR_DOWN:
4915
4983
                case GTK_DIR_RIGHT:
4916
4984
                        if ((amount = html_engine_scroll_down (html->engine,
4917
 
                                                               GTK_WIDGET (html)->allocation.height - line_height)) > 0)
 
4985
                                                               allocation.height - line_height)) > 0)
4918
4986
                                scroll_by_amount (html, amount);
4919
4987
                        break;
4920
4988
                default:
4949
5017
        gtk_html_edit_make_cursor_visible (html);
4950
5018
        html_engine_update_selection_active_state (html->engine, html->priv->event_time);
4951
5019
        update_primary_selection (html);
4952
 
        g_signal_emit (GTK_HTML (html), signals [CURSOR_CHANGED], 0);
 
5020
        g_signal_emit (GTK_HTML (html), signals[CURSOR_CHANGED], 0);
4953
5021
}
4954
5022
 
4955
5023
static gboolean
4956
5024
move_selection (GtkHTML *html, GtkHTMLCommandType com_type)
4957
5025
{
 
5026
        GtkAllocation allocation;
4958
5027
        gboolean rv;
4959
5028
        gint amount;
4960
5029
 
4961
5030
        if (!html_engine_get_editable (html->engine) && !html->engine->caret_mode)
4962
5031
                return FALSE;
4963
5032
 
 
5033
        gtk_widget_get_allocation (GTK_WIDGET (html), &allocation);
 
5034
 
4964
5035
        html->priv->cursor_moved = TRUE;
4965
5036
        html->engine->shift_selection = TRUE;
4966
5037
        if (!html->engine->mark)
4999
5070
                rv = html_engine_forward_word (html->engine);
5000
5071
                break;
5001
5072
        case GTK_HTML_COMMAND_MODIFY_SELECTION_PAGEUP:
5002
 
                if ((amount = html_engine_scroll_up (html->engine, GTK_WIDGET (html)->allocation.height)) > 0) {
 
5073
                if ((amount = html_engine_scroll_up (html->engine, allocation.height)) > 0) {
5003
5074
                        scroll_by_amount (html, - amount);
5004
5075
                        rv = TRUE;
5005
5076
                } else
5006
5077
                        rv = FALSE;
5007
5078
                break;
5008
5079
        case GTK_HTML_COMMAND_MODIFY_SELECTION_PAGEDOWN:
5009
 
                if ((amount = html_engine_scroll_down (html->engine, GTK_WIDGET (html)->allocation.height)) > 0) {
 
5080
                if ((amount = html_engine_scroll_down (html->engine, allocation.height)) > 0) {
5010
5081
                        scroll_by_amount (html, amount);
5011
5082
                        rv = TRUE;
5012
5083
                } else
5822
5893
                html_painter_set_widget (html->engine->painter, top_level);
5823
5894
                gtk_html_set_fonts (html, html->engine->painter);
5824
5895
        }
5825
 
        g_signal_emit (top_level, signals [IFRAME_CREATED], 0, html);
 
5896
        g_signal_emit (top_level, signals[IFRAME_CREATED], 0, html);
5826
5897
 
5827
5898
        while (html->iframe_parent) {
5828
5899
                depth++;
6136
6207
                        html_object_remove_child (o->parent, o);
6137
6208
                        html_engine_append_flow (html->engine, o, html_object_get_recursive_length (o));
6138
6209
                }
6139
 
                html_undo_level_end (html->engine->undo);
 
6210
                html_undo_level_end (html->engine->undo, html->engine);
6140
6211
        } else {
6141
6212
                g_return_if_fail (tmp->engine->clue);
6142
6213