aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorahze <ahze@FreeBSD.org>2007-04-10 23:35:14 +0800
committerahze <ahze@FreeBSD.org>2007-04-10 23:35:14 +0800
commitb553f4b15a4f0fbe595cb304f6a337eeec10d080 (patch)
tree360da158720a1f29638b431af3a757b3ece6da61
parent746f6340cd8e875f98484195d3e6868ff98d6057 (diff)
downloadfreebsd-ports-gnome-b553f4b15a4f0fbe595cb304f6a337eeec10d080.tar.gz
freebsd-ports-gnome-b553f4b15a4f0fbe595cb304f6a337eeec10d080.tar.zst
freebsd-ports-gnome-b553f4b15a4f0fbe595cb304f6a337eeec10d080.zip
Update to 0.16.1
-rw-r--r--x11-toolkits/vte/Makefile2
-rw-r--r--x11-toolkits/vte/distinfo6
-rw-r--r--x11-toolkits/vte/files/patch-vte_svn2786
3 files changed, 4 insertions, 2790 deletions
diff --git a/x11-toolkits/vte/Makefile b/x11-toolkits/vte/Makefile
index da7597ec6c08..25a752ff18ea 100644
--- a/x11-toolkits/vte/Makefile
+++ b/x11-toolkits/vte/Makefile
@@ -7,7 +7,7 @@
#
PORTNAME= vte
-PORTVERSION= 0.16.0
+PORTVERSION= 0.16.1
PORTREVISION?= 1
CATEGORIES= x11-toolkits gnome
MASTER_SITES= ${MASTER_SITE_GNOME}
diff --git a/x11-toolkits/vte/distinfo b/x11-toolkits/vte/distinfo
index 042506957fc7..c50494d04735 100644
--- a/x11-toolkits/vte/distinfo
+++ b/x11-toolkits/vte/distinfo
@@ -1,3 +1,3 @@
-MD5 (gnome2/vte-0.16.0.tar.bz2) = 6b85967ba75ed574d0e5782697fbc79f
-SHA256 (gnome2/vte-0.16.0.tar.bz2) = 7f71faf8beb686f940f13125ff5fcc142c7b8ccde81cf80c8f278fdf4a0cacec
-SIZE (gnome2/vte-0.16.0.tar.bz2) = 1095254
+MD5 (gnome2/vte-0.16.1.tar.bz2) = ceec938666899c1e67e1ce4dd358c753
+SHA256 (gnome2/vte-0.16.1.tar.bz2) = 6e4dd96d5234f0571bf5456aecb9b8d02e3acaedafac2add07c2728e25bf2a76
+SIZE (gnome2/vte-0.16.1.tar.bz2) = 1097978
diff --git a/x11-toolkits/vte/files/patch-vte_svn b/x11-toolkits/vte/files/patch-vte_svn
deleted file mode 100644
index c18aa06de330..000000000000
--- a/x11-toolkits/vte/files/patch-vte_svn
+++ /dev/null
@@ -1,2786 +0,0 @@
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/cp437.py src/cp437.py
---- ../vte-0.16.0/src/cp437.py Wed Dec 31 19:00:00 1969
-+++ src/cp437.py Fri Mar 23 12:53:52 2007
-@@ -0,0 +1,9 @@
-+#!/usr/bin/python
-+print '%s' % '(U'
-+i = 128
-+while (i < 256):
-+ print "%c" % i,
-+ if ((i % 32) == 31):
-+ print ""
-+ i = i + 1
-+print '%s' % '(B)0*B+B'
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/genwidths.py src/genwidths.py
---- ../vte-0.16.0/src/genwidths.py Wed Dec 31 19:00:00 1969
-+++ src/genwidths.py Fri Mar 23 12:53:52 2007
-@@ -0,0 +1,35 @@
-+#!/usr/bin/python
-+import os, re, string
-+
-+try:
-+ unidata = open("EastAsianWidth.txt", "r")
-+except:
-+ os.system("wget --passive-ftp -c ftp://ftp.unicode.org/Public/UNIDATA/EastAsianWidth.txt")
-+ unidata = open("EastAsianWidth.txt", "r")
-+out = open("uniwidths", "w")
-+ranges = []
-+specifics = []
-+rangere = re.compile("^([0123456789ABCDEF]+)\.\.([0123456789ABCDEF]+);A")
-+specificre = re.compile("^([0123456789ABCDEF]+);A")
-+for line in unidata.readlines():
-+ match = re.match(specificre, line)
-+ if match:
-+ if match.groups().__len__() > 0:
-+ specifics.append(match.groups()[0])
-+ match = re.match(rangere, line)
-+ if match:
-+ if match.groups().__len__() > 1:
-+ ranges.append((match.groups()[0], match.groups()[1]))
-+
-+print >> out, "static const struct {"
-+print >> out, "\tgunichar start, end;"
-+print >> out, "} _vte_iso2022_ambiguous_ranges[] = {"
-+for range in ranges:
-+ print >> out, "\t{0x%x, 0x%x}," % (string.atol(range[0], 16), string.atol(range[1], 16))
-+print >> out, "};"
-+
-+print >> out, "static const gunichar _vte_iso2022_ambiguous_chars[] = {"
-+for specific in specifics:
-+ print >> out, "\t0x%x," % (string.atol(specific, 16))
-+print >> out, "};"
-+
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/marshal.c src/marshal.c
---- ../vte-0.16.0/src/marshal.c Mon Feb 26 16:06:36 2007
-+++ src/marshal.c Wed Dec 31 19:00:00 1969
-@@ -1,203 +0,0 @@
--
--#include <glib-object.h>
--
--
--#ifdef G_ENABLE_DEBUG
--#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)
--#define g_marshal_value_peek_char(v) g_value_get_char (v)
--#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)
--#define g_marshal_value_peek_int(v) g_value_get_int (v)
--#define g_marshal_value_peek_uint(v) g_value_get_uint (v)
--#define g_marshal_value_peek_long(v) g_value_get_long (v)
--#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)
--#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)
--#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)
--#define g_marshal_value_peek_enum(v) g_value_get_enum (v)
--#define g_marshal_value_peek_flags(v) g_value_get_flags (v)
--#define g_marshal_value_peek_float(v) g_value_get_float (v)
--#define g_marshal_value_peek_double(v) g_value_get_double (v)
--#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)
--#define g_marshal_value_peek_param(v) g_value_get_param (v)
--#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)
--#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)
--#define g_marshal_value_peek_object(v) g_value_get_object (v)
--#else /* !G_ENABLE_DEBUG */
--/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
-- * Do not access GValues directly in your code. Instead, use the
-- * g_value_get_*() functions
-- */
--#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int
--#define g_marshal_value_peek_char(v) (v)->data[0].v_int
--#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint
--#define g_marshal_value_peek_int(v) (v)->data[0].v_int
--#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint
--#define g_marshal_value_peek_long(v) (v)->data[0].v_long
--#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong
--#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64
--#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64
--#define g_marshal_value_peek_enum(v) (v)->data[0].v_long
--#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong
--#define g_marshal_value_peek_float(v) (v)->data[0].v_float
--#define g_marshal_value_peek_double(v) (v)->data[0].v_double
--#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer
--#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer
--#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer
--#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer
--#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer
--#endif /* !G_ENABLE_DEBUG */
--
--
--/* VOID:VOID (marshal.list:1) */
--
--/* VOID:STRING (marshal.list:2) */
--
--/* VOID:STRING,UINT (marshal.list:3) */
--void
--_vte_marshal_VOID__STRING_UINT (GClosure *closure,
-- GValue *return_value,
-- guint n_param_values,
-- const GValue *param_values,
-- gpointer invocation_hint,
-- gpointer marshal_data)
--{
-- typedef void (*GMarshalFunc_VOID__STRING_UINT) (gpointer data1,
-- gpointer arg_1,
-- guint arg_2,
-- gpointer data2);
-- register GMarshalFunc_VOID__STRING_UINT callback;
-- register GCClosure *cc = (GCClosure*) closure;
-- register gpointer data1, data2;
--
-- g_return_if_fail (n_param_values == 3);
--
-- if (G_CCLOSURE_SWAP_DATA (closure))
-- {
-- data1 = closure->data;
-- data2 = g_value_peek_pointer (param_values + 0);
-- }
-- else
-- {
-- data1 = g_value_peek_pointer (param_values + 0);
-- data2 = closure->data;
-- }
-- callback = (GMarshalFunc_VOID__STRING_UINT) (marshal_data ? marshal_data : cc->callback);
--
-- callback (data1,
-- g_marshal_value_peek_string (param_values + 1),
-- g_marshal_value_peek_uint (param_values + 2),
-- data2);
--}
--
--/* VOID:INT (marshal.list:4) */
--
--/* VOID:INT,INT (marshal.list:5) */
--void
--_vte_marshal_VOID__INT_INT (GClosure *closure,
-- GValue *return_value,
-- guint n_param_values,
-- const GValue *param_values,
-- gpointer invocation_hint,
-- gpointer marshal_data)
--{
-- typedef void (*GMarshalFunc_VOID__INT_INT) (gpointer data1,
-- gint arg_1,
-- gint arg_2,
-- gpointer data2);
-- register GMarshalFunc_VOID__INT_INT callback;
-- register GCClosure *cc = (GCClosure*) closure;
-- register gpointer data1, data2;
--
-- g_return_if_fail (n_param_values == 3);
--
-- if (G_CCLOSURE_SWAP_DATA (closure))
-- {
-- data1 = closure->data;
-- data2 = g_value_peek_pointer (param_values + 0);
-- }
-- else
-- {
-- data1 = g_value_peek_pointer (param_values + 0);
-- data2 = closure->data;
-- }
-- callback = (GMarshalFunc_VOID__INT_INT) (marshal_data ? marshal_data : cc->callback);
--
-- callback (data1,
-- g_marshal_value_peek_int (param_values + 1),
-- g_marshal_value_peek_int (param_values + 2),
-- data2);
--}
--
--/* VOID:UINT,UINT (marshal.list:6) */
--void
--_vte_marshal_VOID__UINT_UINT (GClosure *closure,
-- GValue *return_value,
-- guint n_param_values,
-- const GValue *param_values,
-- gpointer invocation_hint,
-- gpointer marshal_data)
--{
-- typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1,
-- guint arg_1,
-- guint arg_2,
-- gpointer data2);
-- register GMarshalFunc_VOID__UINT_UINT callback;
-- register GCClosure *cc = (GCClosure*) closure;
-- register gpointer data1, data2;
--
-- g_return_if_fail (n_param_values == 3);
--
-- if (G_CCLOSURE_SWAP_DATA (closure))
-- {
-- data1 = closure->data;
-- data2 = g_value_peek_pointer (param_values + 0);
-- }
-- else
-- {
-- data1 = g_value_peek_pointer (param_values + 0);
-- data2 = closure->data;
-- }
-- callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback);
--
-- callback (data1,
-- g_marshal_value_peek_uint (param_values + 1),
-- g_marshal_value_peek_uint (param_values + 2),
-- data2);
--}
--
--/* VOID:OBJECT,OBJECT (marshal.list:7) */
--void
--_vte_marshal_VOID__OBJECT_OBJECT (GClosure *closure,
-- GValue *return_value,
-- guint n_param_values,
-- const GValue *param_values,
-- gpointer invocation_hint,
-- gpointer marshal_data)
--{
-- typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT) (gpointer data1,
-- gpointer arg_1,
-- gpointer arg_2,
-- gpointer data2);
-- register GMarshalFunc_VOID__OBJECT_OBJECT callback;
-- register GCClosure *cc = (GCClosure*) closure;
-- register gpointer data1, data2;
--
-- g_return_if_fail (n_param_values == 3);
--
-- if (G_CCLOSURE_SWAP_DATA (closure))
-- {
-- data1 = closure->data;
-- data2 = g_value_peek_pointer (param_values + 0);
-- }
-- else
-- {
-- data1 = g_value_peek_pointer (param_values + 0);
-- data2 = closure->data;
-- }
-- callback = (GMarshalFunc_VOID__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback);
--
-- callback (data1,
-- g_marshal_value_peek_object (param_values + 1),
-- g_marshal_value_peek_object (param_values + 2),
-- data2);
--}
--
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/marshal.h src/marshal.h
---- ../vte-0.16.0/src/marshal.h Mon Feb 26 16:06:36 2007
-+++ src/marshal.h Wed Dec 31 19:00:00 1969
-@@ -1,53 +0,0 @@
--
--#ifndef ___vte_marshal_MARSHAL_H__
--#define ___vte_marshal_MARSHAL_H__
--
--#include <glib-object.h>
--
--G_BEGIN_DECLS
--
--/* VOID:VOID (marshal.list:1) */
--#define _vte_marshal_VOID__VOID g_cclosure_marshal_VOID__VOID
--
--/* VOID:STRING (marshal.list:2) */
--#define _vte_marshal_VOID__STRING g_cclosure_marshal_VOID__STRING
--
--/* VOID:STRING,UINT (marshal.list:3) */
--extern void _vte_marshal_VOID__STRING_UINT (GClosure *closure,
-- GValue *return_value,
-- guint n_param_values,
-- const GValue *param_values,
-- gpointer invocation_hint,
-- gpointer marshal_data);
--
--/* VOID:INT (marshal.list:4) */
--#define _vte_marshal_VOID__INT g_cclosure_marshal_VOID__INT
--
--/* VOID:INT,INT (marshal.list:5) */
--extern void _vte_marshal_VOID__INT_INT (GClosure *closure,
-- GValue *return_value,
-- guint n_param_values,
-- const GValue *param_values,
-- gpointer invocation_hint,
-- gpointer marshal_data);
--
--/* VOID:UINT,UINT (marshal.list:6) */
--extern void _vte_marshal_VOID__UINT_UINT (GClosure *closure,
-- GValue *return_value,
-- guint n_param_values,
-- const GValue *param_values,
-- gpointer invocation_hint,
-- gpointer marshal_data);
--
--/* VOID:OBJECT,OBJECT (marshal.list:7) */
--extern void _vte_marshal_VOID__OBJECT_OBJECT (GClosure *closure,
-- GValue *return_value,
-- guint n_param_values,
-- const GValue *param_values,
-- gpointer invocation_hint,
-- gpointer marshal_data);
--
--G_END_DECLS
--
--#endif /* ___vte_marshal_MARSHAL_H__ */
--
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vte-private.h src/vte-private.h
---- ../vte-0.16.0/src/vte-private.h Thu Mar 8 11:47:15 2007
-+++ src/vte-private.h Fri Mar 23 12:53:52 2007
-@@ -95,27 +95,29 @@ G_BEGIN_DECLS
- struct vte_charcell {
- gunichar c; /* The Unicode character. */
-
-- guint32 columns: 2; /* Number of visible columns (as determined
-- by g_unicode_iswide(c)). */
-- guint32 fore: 9; /* Indices in the color palette for the */
-- guint32 back: 9; /* foreground and background of the cell. */
--
-- guint32 fragment: 1; /* The nth fragment of a wide character. */
-- guint32 standout: 1; /* Single-bit attributes. */
-- guint32 underline: 1;
-- guint32 strikethrough: 1;
--
-- guint32 reverse: 1;
-- guint32 blink: 1;
-- guint32 half: 1;
-- guint32 bold: 1;
--
-- guint32 invisible: 1;
-- guint32 protect: 1;
-- guint32 alternate: 1;
-- guint32 empty : 1;
-+ struct vte_charcell_attr {
-+ guint32 columns: 2; /* Number of visible columns
-+ (as determined
-+ by g_unicode_iswide(c)). */
-+ guint32 fore: 9; /* Index into color palette */
-+ guint32 back: 9; /* Index into color palette. */
-+
-+ guint32 fragment: 1; /* A continuation cell. */
-+ guint32 standout: 1; /* Single-bit attributes. */
-+ guint32 underline: 1;
-+ guint32 strikethrough: 1;
-+
-+ guint32 reverse: 1;
-+ guint32 blink: 1;
-+ guint32 half: 1;
-+ guint32 bold: 1;
-+
-+ guint32 invisible: 1;
-+ guint32 protect: 1;
-+ guint32 alternate: 1;
-
-- /* no more bits left. any addition will enlarge the struct */
-+ /* 31 bits */
-+ } attr;
- };
-
- /* A match regex, with a tag. */
-@@ -275,8 +277,8 @@ struct _VteTerminalPrivate {
- gboolean smooth_scroll;
- GHashTable *tabstops;
- gboolean text_modified_flag;
-- glong text_inserted_count;
-- glong text_deleted_count;
-+ gboolean text_inserted_flag;
-+ gboolean text_deleted_flag;
-
- /* Scrolling options. */
- gboolean scroll_background;
-@@ -395,11 +397,9 @@ void _vte_terminal_adjust_adjustments(Vt
- void _vte_terminal_queue_contents_changed(VteTerminal *terminal);
- void _vte_terminal_emit_text_deleted(VteTerminal *terminal);
- void _vte_terminal_emit_text_inserted(VteTerminal *terminal);
--void _vte_terminal_insert_char(VteTerminal *terminal, gunichar c,
-+gboolean _vte_terminal_insert_char(VteTerminal *terminal, gunichar c,
- gboolean force_insert_mode,
-- gboolean invalidate_cells,
-- gboolean paint_cells,
-- gint forced_width);
-+ gboolean invalidate_cells);
- void _vte_terminal_scroll_region(VteTerminal *terminal,
- long row, glong count, glong delta);
- void _vte_terminal_set_default_attributes(VteTerminal *terminal);
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vte.c src/vte.c
---- ../vte-0.16.0/src/vte.c Thu Mar 8 11:47:15 2007
-+++ src/vte.c Fri Mar 23 12:53:53 2007
-@@ -18,6 +18,8 @@
-
- #include "../config.h"
-
-+#include <math.h>
-+
- #include "vte.h"
- #include "vte-private.h"
-
-@@ -78,8 +80,7 @@ static void vte_terminal_match_hilite_up
- static void vte_terminal_match_contents_clear(VteTerminal *terminal);
- static gboolean vte_terminal_background_update(VteTerminal *data);
- static void vte_terminal_queue_background_update(VteTerminal *terminal);
--static void vte_terminal_queue_adjustment_changed(VteTerminal *terminal);
--static gboolean vte_terminal_process_incoming(VteTerminal *terminal);
-+static void vte_terminal_process_incoming(VteTerminal *terminal);
- static void vte_terminal_emit_pending_signals(VteTerminal *terminal);
- static inline gboolean vte_cell_is_selected(VteTerminal *terminal,
- glong col, glong row, gpointer data);
-@@ -245,7 +246,7 @@ vte_free_row_data(gpointer freeing, gpoi
- /* Append a single item to a GArray a given number of times. Centralizing all
- * of the places we do this may let me do something more clever later. */
- static void
--vte_g_array_fill(GArray *array, gpointer item, guint final_size)
-+vte_g_array_fill(GArray *array, gconstpointer item, guint final_size)
- {
- if (array->len >= final_size) {
- return;
-@@ -318,22 +319,21 @@ _vte_terminal_set_default_attributes(Vte
- screen = terminal->pvt->screen;
-
- screen->defaults.c = 0;
-- screen->defaults.columns = 1;
-- screen->defaults.fragment = 0;
-- screen->defaults.empty = 1;
-- screen->defaults.fore = VTE_DEF_FG;
-- screen->defaults.back = VTE_DEF_BG;
-- screen->defaults.reverse = 0;
-- screen->defaults.bold = 0;
-- screen->defaults.invisible = 0;
-- screen->defaults.protect = 0;
-- screen->defaults.standout = 0;
-- screen->defaults.underline = 0;
-- screen->defaults.strikethrough = 0;
-- screen->defaults.half = 0;
-- screen->defaults.blink = 0;
-+ screen->defaults.attr.columns = 1;
-+ screen->defaults.attr.fragment = 0;
-+ screen->defaults.attr.fore = VTE_DEF_FG;
-+ screen->defaults.attr.back = VTE_DEF_BG;
-+ screen->defaults.attr.reverse = 0;
-+ screen->defaults.attr.bold = 0;
-+ screen->defaults.attr.invisible = 0;
-+ screen->defaults.attr.protect = 0;
-+ screen->defaults.attr.standout = 0;
-+ screen->defaults.attr.underline = 0;
-+ screen->defaults.attr.strikethrough = 0;
-+ screen->defaults.attr.half = 0;
-+ screen->defaults.attr.blink = 0;
- /* Alternate charset isn't an attribute, though we treat it as one.
-- * screen->defaults.alternate = 0; */
-+ * screen->defaults.attr.alternate = 0; */
- screen->basic_defaults = screen->defaults;
- screen->color_defaults = screen->defaults;
- screen->fill_defaults = screen->defaults;
-@@ -612,13 +612,13 @@ _vte_invalidate_cell(VteTerminal *termin
- struct vte_charcell *cell;
- cell = _vte_row_data_find_charcell(row_data, col);
- if (cell != NULL) {
-- while (cell->fragment && col> 0) {
-+ while (cell->attr.fragment && col> 0) {
- cell = _vte_row_data_find_charcell(row_data, --col);
- }
-- columns = cell->columns;
-+ columns = cell->attr.columns;
- if (_vte_draw_get_char_width(terminal->pvt->draw,
- cell->c,
-- cell->columns) >
-+ cell->attr.columns) >
- terminal->char_width * columns) {
- columns++;
- }
-@@ -664,17 +664,17 @@ _vte_invalidate_cursor_once(VteTerminal
- cell = vte_terminal_find_charcell(terminal,
- column,
- screen->cursor_current.row);
-- while ((cell != NULL) && (cell->fragment) && (column > 0)) {
-+ while ((cell != NULL) && (cell->attr.fragment) && (column > 0)) {
- column--;
- cell = vte_terminal_find_charcell(terminal,
- column,
- row);
- }
- if (cell != NULL) {
-- columns = cell->columns;
-+ columns = cell->attr.columns;
- if (_vte_draw_get_char_width(terminal->pvt->draw,
- cell->c,
-- cell->columns) >
-+ cell->attr.columns) >
- terminal->char_width * columns) {
- columns++;
- }
-@@ -1613,19 +1613,19 @@ vte_terminal_emit_adjustment_changed(Vte
- }
-
- /* Queue an adjustment-changed signal to be delivered when convenient. */
--static void
-+static inline void
- vte_terminal_queue_adjustment_changed(VteTerminal *terminal)
- {
- terminal->pvt->adjustment_changed_pending = TRUE;
-- vte_terminal_start_processing (terminal);
-+ add_update_timeout (terminal);
- }
--static void
-+static inline void
- vte_terminal_queue_adjustment_value_changed(VteTerminal *terminal, glong v)
- {
- if (v != terminal->pvt->screen->scroll_delta) {
- terminal->pvt->screen->scroll_delta = v;
- terminal->pvt->adjustment_value_changed_pending = TRUE;
-- vte_terminal_start_processing (terminal);
-+ add_update_timeout (terminal);
- }
- }
-
-@@ -1725,8 +1725,6 @@ vte_terminal_scroll_pages(VteTerminal *t
- /* Tell the scrollbar to adjust itself. */
- vte_terminal_queue_adjustment_value_changed (terminal,
- destination);
-- /* Notify viewers that the contents have changed. */
-- _vte_terminal_queue_contents_changed(terminal);
- }
-
- /* Scroll so that the scroll delta is the minimum value. */
-@@ -1855,13 +1853,32 @@ vte_terminal_get_encoding(VteTerminal *t
- return terminal->pvt->encoding;
- }
-
-+static inline VteRowData*
-+vte_terminal_insert_rows (VteTerminal *terminal, guint cnt)
-+{
-+ const VteScreen *screen = terminal->pvt->screen;
-+ VteRowData *old_row, *row;
-+ old_row = terminal->pvt->free_row;
-+ do {
-+ if (old_row) {
-+ row = _vte_reset_row_data (terminal, old_row, FALSE);
-+ } else {
-+ row = _vte_new_row_data_sized (terminal, FALSE);
-+ }
-+ old_row = _vte_ring_append(screen->row_data, row);
-+ } while(--cnt);
-+ terminal->pvt->free_row = old_row;
-+ return row;
-+}
-+
-+
- /* Make sure we have enough rows and columns to hold data at the current
- * cursor position. */
- VteRowData *
- _vte_terminal_ensure_row (VteTerminal *terminal)
- {
- VteRowData *row;
-- VteScreen *screen;
-+ const VteScreen *screen;
- gint delta;
- glong v;
-
-@@ -1875,18 +1892,7 @@ _vte_terminal_ensure_row (VteTerminal *t
- /* Figure out how many rows we need to add. */
- delta = v - _vte_ring_next(screen->row_data) + 1;
- if (delta > 0) {
-- VteRowData *old_row;
--
-- old_row = terminal->pvt->free_row;
-- do {
-- if (old_row) {
-- row = _vte_reset_row_data (terminal, old_row, FALSE);
-- } else {
-- row = _vte_new_row_data_sized (terminal, FALSE);
-- }
-- old_row = _vte_ring_append(screen->row_data, row);
-- } while(--delta);
-- terminal->pvt->free_row = old_row;
-+ row = vte_terminal_insert_rows (terminal, delta);
- _vte_terminal_adjust_adjustments(terminal);
- } else {
- /* Find the row the cursor is in. */
-@@ -1920,18 +1926,7 @@ vte_terminal_ensure_cursor(VteTerminal *
- /* Figure out how many rows we need to add. */
- delta = v - _vte_ring_next(screen->row_data) + 1;
- if (delta > 0) {
-- VteRowData *old_row;
--
-- old_row = terminal->pvt->free_row;
-- do {
-- if (old_row) {
-- row = _vte_reset_row_data (terminal, old_row, FALSE);
-- } else {
-- row = _vte_new_row_data_sized (terminal, FALSE);
-- }
-- old_row = _vte_ring_append(screen->row_data, row);
-- } while(--delta);
-- terminal->pvt->free_row = old_row;
-+ row = vte_terminal_insert_rows (terminal, delta);
- _vte_terminal_adjust_adjustments(terminal);
- } else {
- /* Find the row the cursor is in. */
-@@ -1950,7 +1945,7 @@ vte_terminal_ensure_cursor(VteTerminal *
- }
- v += columns;
- if (G_LIKELY (row->cells->len < v)) { /* expand for character */
-- vte_g_array_fill (row->cells, &screen->color_defaults, v);
-+ g_array_set_size (row->cells, v);
- }
- screen->cursor_current.col = v;
-
-@@ -1969,8 +1964,12 @@ _vte_terminal_update_insert_delta(VteTer
-
- /* The total number of lines. Add one to the cursor offset
- * because it's zero-based. */
-- rows = MAX(_vte_ring_next(terminal->pvt->screen->row_data),
-- terminal->pvt->screen->cursor_current.row + 1);
-+ rows = _vte_ring_next (screen->row_data);
-+ delta = screen->cursor_current.row - rows + 1;
-+ if (G_UNLIKELY (delta > 0)) {
-+ vte_terminal_insert_rows (terminal, delta);
-+ rows = _vte_ring_next (screen->row_data);
-+ }
-
- /* Make sure that the bottom row is visible, and that it's in
- * the buffer (even if it's empty). This usually causes the
-@@ -2444,55 +2443,45 @@ vte_terminal_set_default_colors(VteTermi
- }
-
- /* Insert a single character into the stored data array. */
--void
-+gboolean
- _vte_terminal_insert_char(VteTerminal *terminal, gunichar c,
-- gboolean force_insert_mode, gboolean invalidate_now,
-- gboolean paint_cells, gint forced_width)
-+ gboolean insert, gboolean invalidate_now)
- {
-+ struct vte_charcell_attr attr;
- VteRowData *row;
-- struct vte_charcell cell;
-- int columns, i;
- long col;
-+ int columns, i;
- VteScreen *screen;
-- gboolean insert;
-+ gboolean line_wrapped = FALSE; /* cursor moved before char inserted */
-
- screen = terminal->pvt->screen;
-- insert = screen->insert_mode | force_insert_mode;
-+ insert |= screen->insert_mode;
- invalidate_now |= insert;
-
- /* If we've enabled the special drawing set, map the characters to
- * Unicode. */
-- if (G_UNLIKELY (screen->defaults.alternate)) {
-+ if (G_UNLIKELY (screen->defaults.attr.alternate)) {
- _vte_debug_print(VTE_DEBUG_SUBSTITUTION,
- "Attempting charset substitution"
- "for 0x%04x.\n", c);
- /* See if there's a mapping for it. */
-- cell.c = _vte_iso2022_process_single(terminal->pvt->iso2022,
-- c, '0');
-- if (cell.c != c) {
-- forced_width = _vte_iso2022_get_encoded_width(cell.c);
-- c = cell.c & ~(VTE_ISO2022_ENCODED_WIDTH_MASK);
-- }
-+ c = _vte_iso2022_process_single(terminal->pvt->iso2022, c, '0');
- }
-
- /* If this character is destined for the status line, save it. */
- if (G_UNLIKELY (screen->status_line)) {
- g_string_append_unichar(screen->status_line_contents, c);
- screen->status_line_changed = TRUE;
-- return;
-+ return FALSE;
- }
-
- /* Figure out how many columns this character should occupy. */
-- if (G_LIKELY (forced_width == 0)) {
-- if (VTE_ISO2022_HAS_ENCODED_WIDTH(c)) {
-- columns = _vte_iso2022_get_encoded_width(c);
-- } else {
-- columns = _vte_iso2022_unichar_width(c);
-- }
-+ if (G_UNLIKELY (VTE_ISO2022_HAS_ENCODED_WIDTH(c))) {
-+ columns = _vte_iso2022_get_encoded_width(c);
-+ c &= ~VTE_ISO2022_ENCODED_WIDTH_MASK;
- } else {
-- columns = MIN(forced_width, 1);
-+ columns = _vte_iso2022_unichar_width(c);
- }
-- c &= ~(VTE_ISO2022_ENCODED_WIDTH_MASK);
-
- /* If we're autowrapping here, do it. */
- col = screen->cursor_current.col;
-@@ -2511,6 +2500,7 @@ _vte_terminal_insert_char(VteTerminal *t
- col = screen->cursor_current.col =
- terminal->column_count - columns;
- }
-+ line_wrapped = TRUE;
- }
-
- /* Make sure we have enough rows to hold this data. */
-@@ -2520,76 +2510,56 @@ _vte_terminal_insert_char(VteTerminal *t
- _vte_debug_print(VTE_DEBUG_IO|VTE_DEBUG_PARSE,
- "Inserting %ld '%c' (%d/%d) (%ld+%d, %ld), delta = %ld; ",
- (long)c, c < 256 ? c : ' ',
-- screen->defaults.fore, screen->defaults.back,
-+ screen->defaults.attr.fore,
-+ screen->defaults.attr.back,
- col, columns, (long)screen->cursor_current.row,
- (long)screen->insert_delta);
-
-- /* Make sure we're not getting random stuff past the right
-- * edge of the screen at this point, because the user can't
-- * see it. */
-- i = 0;
-- do {
-- /* If we're in insert mode, insert a new cell here
-- * and use it. */
-+ if (insert) {
-+ g_array_insert_val(row->cells, col,
-+ screen->color_defaults);
-+ }
-+ memcpy (&attr, &screen->defaults.attr, sizeof (attr));
-+ attr.columns = columns;
-+
-+ if (G_UNLIKELY (c == '_' && terminal->pvt->flags.ul)) {
-+ struct vte_charcell *pcell =
-+ &g_array_index (row->cells, struct vte_charcell, col);
-+ /* Handle overstrike-style underlining. */
-+ if (pcell->c != 0) {
-+ /* restore previous contents */
-+ c = pcell->c;
-+ attr.columns = pcell->attr.columns;
-+ attr.fragment = pcell->attr.fragment;
-+
-+ attr.underline = 1;
-+ }
-+ }
-+ g_array_index(row->cells, struct vte_charcell, col).c = c;
-+ g_array_index(row->cells, struct vte_charcell, col).attr = attr;
-+ col++;
-+
-+ /* insert wide-char fragments */
-+ for (i = 1; i < columns; i++) {
-+ attr.fragment = 1;
- if (insert) {
-- cell = screen->color_defaults;
-- g_array_insert_val(row->cells, col, cell);
-- }
-- cell.c = c;
-- cell.columns = columns;
-- if (paint_cells) {
-- cell.fore = screen->defaults.fore;
-- cell.back = screen->defaults.back;
-- }
-- cell.standout = screen->defaults.standout;
-- cell.underline = screen->defaults.underline;
-- cell.strikethrough = screen->defaults.strikethrough;
-- cell.reverse = screen->defaults.reverse;
-- cell.blink = screen->defaults.blink;
-- cell.half = screen->defaults.half;
-- cell.bold = screen->defaults.bold;
-- cell.invisible = screen->defaults.invisible;
-- cell.protect = screen->defaults.protect;
-- cell.alternate = 0;
-- cell.empty = 0;
-- cell.fragment = i != 0;
--
-- if (G_UNLIKELY (i == 0 &&
-- c == '_' &&
-- terminal->pvt->flags.ul)) {
-- struct vte_charcell *pcell =
-- &g_array_index (row->cells, struct vte_charcell, col);
-- /* Handle overstrike-style underlining. */
-- if (pcell->c != 0) {
-- /* restore previous contents */
-- cell.c = pcell->c;
-- cell.columns = pcell->columns;
-- cell.fragment = pcell->fragment;
-- cell.empty = pcell->empty;
--
-- cell.underline = 1;
-- }
-+ g_array_insert_val(row->cells, col,
-+ screen->color_defaults);
- }
-- g_array_index(row->cells, struct vte_charcell, col) = cell;
--
-- /* And take a step to the to the right. */
-+ g_array_index(row->cells, struct vte_charcell, col).c = c;
-+ g_array_index(row->cells, struct vte_charcell, col).attr = attr;
- col++;
-- } while (++i < columns);
-+ }
- if (G_UNLIKELY (row->cells->len > terminal->column_count)) {
- g_array_set_size(row->cells, terminal->column_count);
- }
-
- /* Signal that this part of the window needs drawing. */
-- if (invalidate_now) {
-- if (insert) {
-- _vte_invalidate_cells(terminal,
-- col - columns, terminal->column_count,
-- screen->cursor_current.row, 1);
-- } else {
-- _vte_invalidate_cells(terminal,
-- col - columns, columns,
-- screen->cursor_current.row, 1);
-- }
-+ if (G_UNLIKELY (invalidate_now)) {
-+ _vte_invalidate_cells(terminal,
-+ col - columns,
-+ insert ? terminal->column_count : columns,
-+ screen->cursor_current.row, 1);
- }
-
-
-@@ -2605,11 +2575,12 @@ _vte_terminal_insert_char(VteTerminal *t
- }
-
- /* We added text, so make a note of it. */
-- terminal->pvt->text_inserted_count++;
-+ terminal->pvt->text_inserted_flag = TRUE;
-
- _vte_debug_print(VTE_DEBUG_IO|VTE_DEBUG_PARSE,
- "insertion delta => %ld.\n",
- (long)screen->insert_delta);
-+ return line_wrapped;
- }
-
- static void
-@@ -2730,10 +2701,7 @@ vte_terminal_catch_child_exited(VteReape
- * then flush the buffers in case we're about to run a new
- * command, disconnecting the timeout. */
- if (terminal->pvt->incoming != NULL) {
-- gboolean again;
-- do {
-- again = vte_terminal_process_incoming(terminal);
-- } while (again);
-+ vte_terminal_process_incoming(terminal);
- _vte_incoming_chunks_release (terminal->pvt->incoming);
- terminal->pvt->incoming = NULL;
- terminal->pvt->input_bytes = 0;
-@@ -3042,12 +3010,8 @@ vte_terminal_eof(GIOChannel *channel, Vt
- * disconnecting the timeout. */
- vte_terminal_stop_processing (terminal);
- if (terminal->pvt->incoming) {
-- gboolean again;
-- do {
-- again = vte_terminal_process_incoming(terminal);
-- } while (again);
-+ vte_terminal_process_incoming(terminal);
- terminal->pvt->input_bytes = 0;
-- vte_terminal_emit_pending_signals (terminal);
- }
- g_array_set_size(terminal->pvt->pending, 0);
-
-@@ -3112,29 +3076,23 @@ vte_terminal_emit_pending_text_signals(V
- vte_terminal_emit_text_modified(terminal);
- terminal->pvt->text_modified_flag = FALSE;
- }
-- if (terminal->pvt->text_inserted_count) {
-+ if (terminal->pvt->text_inserted_flag) {
- _vte_debug_print(VTE_DEBUG_SIGNALS,
-- "Emitting buffered `text-inserted' "
-- "(%ld).\n", terminal->pvt->text_inserted_count);
-+ "Emitting buffered `text-inserted'\n");
- _vte_terminal_emit_text_inserted(terminal);
-- terminal->pvt->text_inserted_count = 0;
-+ terminal->pvt->text_inserted_flag = FALSE;
- }
-- if (terminal->pvt->text_deleted_count) {
-+ if (terminal->pvt->text_deleted_flag) {
- _vte_debug_print(VTE_DEBUG_SIGNALS,
-- "Emitting buffered `text-deleted' "
-- "(%ld).\n", terminal->pvt->text_deleted_count);
-+ "Emitting buffered `text-deleted'\n");
- _vte_terminal_emit_text_deleted(terminal);
-- terminal->pvt->text_deleted_count = 0;
-+ terminal->pvt->text_deleted_flag = FALSE;
- }
--
-- terminal->pvt->text_modified_flag = FALSE;
-- terminal->pvt->text_inserted_count = 0;
-- terminal->pvt->text_deleted_count = 0;
- }
-
- /* Process incoming data, first converting it to unicode characters, and then
- * processing control sequences. */
--static gboolean
-+static void
- vte_terminal_process_incoming(VteTerminal *terminal)
- {
- VteScreen *screen;
-@@ -3244,7 +3202,7 @@ skip_chunk:
- bbox_bottomright.x = bbox_bottomright.y = -G_MAXINT;
- bbox_topleft.x = bbox_topleft.y = G_MAXINT;
-
-- while (start < wcount && !leftovers && !again) {
-+ while (start < wcount && !leftovers) {
- const char *match;
- GQuark quark;
- const gunichar *next;
-@@ -3265,10 +3223,10 @@ skip_chunk:
- if ((match != NULL) && (match[0] != '\0')) {
- /* Call the right sequence handler for the requested
- * behavior. */
-- again = vte_terminal_handle_sequence(terminal,
-- match,
-- quark,
-- params);
-+ vte_terminal_handle_sequence(terminal,
-+ match,
-+ quark,
-+ params);
- /* Skip over the proper number of unicode chars. */
- start = (next - wbuf);
- modified = TRUE;
-@@ -3364,9 +3322,36 @@ skip_chunk:
- screen->cursor_current.row);
-
- /* Insert the character. */
-- _vte_terminal_insert_char(terminal, c,
-- FALSE, FALSE,
-- TRUE, 0);
-+ if (G_UNLIKELY (_vte_terminal_insert_char(terminal, c,
-+ FALSE, FALSE))) {
-+ /* line wrapped, correct bbox */
-+ if (invalidated_text &&
-+ (screen->cursor_current.col > bbox_bottomright.x + VTE_CELL_BBOX_SLACK ||
-+ screen->cursor_current.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK ||
-+ screen->cursor_current.row > bbox_bottomright.y + VTE_CELL_BBOX_SLACK ||
-+ screen->cursor_current.row < bbox_topleft.y - VTE_CELL_BBOX_SLACK)) {
-+ /* Clip off any part of the box which isn't already on-screen. */
-+ bbox_topleft.x = MAX(bbox_topleft.x, 0);
-+ bbox_topleft.y = MAX(bbox_topleft.y, delta);
-+ bbox_bottomright.x = MIN(bbox_bottomright.x,
-+ terminal->column_count);
-+ /* lazily apply the +1 to the cursor_row */
-+ bbox_bottomright.y = MIN(bbox_bottomright.y + 1,
-+ delta + terminal->row_count);
-+
-+ _vte_invalidate_cells(terminal,
-+ bbox_topleft.x,
-+ bbox_bottomright.x - bbox_topleft.x,
-+ bbox_topleft.y,
-+ bbox_bottomright.y - bbox_topleft.y);
-+ bbox_bottomright.x = bbox_bottomright.y = -G_MAXINT;
-+ bbox_topleft.x = bbox_topleft.y = G_MAXINT;
-+
-+ }
-+ bbox_topleft.x = MIN(bbox_topleft.x, 0);
-+ bbox_topleft.y = MIN(bbox_topleft.y,
-+ screen->cursor_current.row);
-+ }
- /* Add the cells over which we have moved to the region
- * which we need to refresh for the user. */
- bbox_bottomright.x = MAX(bbox_bottomright.x,
-@@ -3418,23 +3403,6 @@ next_match:
- }
- }
-
-- if (invalidated_text) {
-- /* Clip off any part of the box which isn't already on-screen. */
-- bbox_topleft.x = MAX(bbox_topleft.x, 0);
-- bbox_topleft.y = MAX(bbox_topleft.y, delta);
-- bbox_bottomright.x = MIN(bbox_bottomright.x,
-- terminal->column_count);
-- /* lazily apply the +1 to the cursor_row */
-- bbox_bottomright.y = MIN(bbox_bottomright.y + 1,
-- delta + terminal->row_count);
--
-- _vte_invalidate_cells(terminal,
-- bbox_topleft.x,
-- bbox_bottomright.x - bbox_topleft.x,
-- bbox_topleft.y,
-- bbox_bottomright.y - bbox_topleft.y);
-- }
--
- /* Remove most of the processed characters. */
- if (start < wcount) {
- unichars = g_array_new(FALSE, FALSE, sizeof(gunichar));
-@@ -3450,7 +3418,6 @@ next_match:
- /* If we're out of data, we needn't pause to let the
- * controlling application respond to incoming data, because
- * the main loop is already going to do that. */
-- again = FALSE;
- }
-
- if (modified) {
-@@ -3486,6 +3453,26 @@ next_match:
- _vte_terminal_queue_contents_changed(terminal);
- }
-
-+ vte_terminal_emit_pending_signals (terminal);
-+
-+ if (invalidated_text) {
-+ /* Clip off any part of the box which isn't already on-screen. */
-+ bbox_topleft.x = MAX(bbox_topleft.x, 0);
-+ bbox_topleft.y = MAX(bbox_topleft.y, delta);
-+ bbox_bottomright.x = MIN(bbox_bottomright.x,
-+ terminal->column_count);
-+ /* lazily apply the +1 to the cursor_row */
-+ bbox_bottomright.y = MIN(bbox_bottomright.y + 1,
-+ delta + terminal->row_count);
-+
-+ _vte_invalidate_cells(terminal,
-+ bbox_topleft.x,
-+ bbox_bottomright.x - bbox_topleft.x,
-+ bbox_topleft.y,
-+ bbox_bottomright.y - bbox_topleft.y);
-+ }
-+
-+
- if ((cursor.col != terminal->pvt->screen->cursor_current.col) ||
- (cursor.row != terminal->pvt->screen->cursor_current.row)) {
- /* invalidate the old and new cursor positions */
-@@ -3517,7 +3504,6 @@ next_match:
- (long) unichars->len,
- (long) _vte_incoming_chunks_length(terminal->pvt->incoming),
- _vte_incoming_chunks_count(terminal->pvt->incoming));
-- return again;
- }
-
- static inline void
-@@ -3643,7 +3629,7 @@ out:
- }
-
- return !eof &&
-- (active_terminals ? g_list_length (active_terminals) : 1) *
-+ g_list_length (active_terminals) *
- terminal->pvt->input_bytes < terminal->pvt->max_input_bytes;
- }
-
-@@ -3712,7 +3698,6 @@ vte_terminal_io_write(GIOChannel *channe
- }
-
- if (_vte_buffer_length(terminal->pvt->outgoing) == 0) {
-- _vte_terminal_disconnect_pty_write(terminal);
- leave_open = FALSE;
- } else {
- leave_open = TRUE;
-@@ -3803,9 +3788,7 @@ vte_terminal_send(VteTerminal *terminal,
- _vte_terminal_insert_char(terminal,
- ucs4[i],
- FALSE,
-- TRUE,
-- TRUE,
-- 0);
-+ TRUE);
- }
- g_free(ucs4);
- }
-@@ -4538,7 +4521,7 @@ vte_same_class(VteTerminal *terminal, gl
- {
- struct vte_charcell *pcell = NULL;
- gboolean word_char;
-- if ((pcell = vte_terminal_find_charcell(terminal, acol, arow)) != NULL && !pcell->empty) {
-+ if ((pcell = vte_terminal_find_charcell(terminal, acol, arow)) != NULL && pcell->c != 0) {
- word_char = vte_terminal_is_word_char(terminal, pcell->c);
-
- /* Lets not group non-wordchars together (bug #25290) */
-@@ -4546,7 +4529,7 @@ vte_same_class(VteTerminal *terminal, gl
- return FALSE;
-
- pcell = vte_terminal_find_charcell(terminal, bcol, brow);
-- if (pcell == NULL || pcell->empty) {
-+ if (pcell == NULL || pcell->c == 0) {
- return FALSE;
- }
- if (word_char != vte_terminal_is_word_char(terminal,
-@@ -5197,26 +5180,26 @@ vte_terminal_get_text_range_maybe_wrappe
- /* If it's not part of a multi-column character,
- * and passes the selection criterion, add it to
- * the selection. */
-- if (!pcell->fragment &&
-+ if (!pcell->attr.fragment &&
- is_selected(terminal, col, row, data)) {
- /* Store the attributes of this character. */
-- fore = palette[pcell->fore];
-- back = palette[pcell->back];
-+ fore = palette[pcell->attr.fore];
-+ back = palette[pcell->attr.back];
- attr.fore.red = fore.red;
- attr.fore.green = fore.green;
- attr.fore.blue = fore.blue;
- attr.back.red = back.red;
- attr.back.green = back.green;
- attr.back.blue = back.blue;
-- attr.underline = pcell->underline;
-- attr.strikethrough = pcell->strikethrough;
-+ attr.underline = pcell->attr.underline;
-+ attr.strikethrough = pcell->attr.strikethrough;
-
- /* Store the character. */
- string = g_string_append_unichar(string,
- pcell->c ?
- pcell->c :
- ' ');
-- if (pcell->empty) {
-+ if (pcell->c == 0) {
- last_empty = string->len;
- last_emptycol = col;
- } else {
-@@ -5252,10 +5235,10 @@ vte_terminal_get_text_range_maybe_wrappe
- while ((pcell = _vte_row_data_find_charcell(row_data, col))) {
- col++;
-
-- if (pcell->fragment)
-+ if (pcell->attr.fragment)
- continue;
-
-- if (!pcell->empty)
-+ if (pcell->c != 0)
- break;
- }
- }
-@@ -5502,7 +5485,7 @@ find_start_column (VteTerminal *terminal
- VteRowData *row_data = _vte_terminal_find_row_data (terminal, row);
- if (row_data != NULL) {
- struct vte_charcell *cell = _vte_row_data_find_charcell(row_data, col);
-- while (cell != NULL && cell->fragment && col > 0) {
-+ while (cell != NULL && cell->attr.fragment && col > 0) {
- cell = _vte_row_data_find_charcell(row_data, --col);
- }
- }
-@@ -5515,11 +5498,11 @@ find_end_column (VteTerminal *terminal,
- gint columns = 0;
- if (row_data != NULL) {
- struct vte_charcell *cell = _vte_row_data_find_charcell(row_data, col);
-- while (cell != NULL && cell->fragment && col > 0) {
-+ while (cell != NULL && cell->attr.fragment && col > 0) {
- cell = _vte_row_data_find_charcell(row_data, --col);
- }
- if (cell) {
-- columns = cell->columns - 1;
-+ columns = cell->attr.columns - 1;
- }
- }
- return MIN(col + columns, terminal->column_count);
-@@ -5725,7 +5708,7 @@ vte_terminal_extend_selection(VteTermina
- for (i = 0; i < rowdata->cells->len; i++) {
- cell = &g_array_index(rowdata->cells,
- struct vte_charcell, i);
-- if (!cell->empty)
-+ if (cell->c != 0)
- last_nonempty = i;
- }
- /* Now find the first empty after it. */
-@@ -5759,7 +5742,7 @@ vte_terminal_extend_selection(VteTermina
- for (i = 0; i < rowdata->cells->len; i++) {
- cell = &g_array_index(rowdata->cells,
- struct vte_charcell, i);
-- if (!cell->empty)
-+ if (cell->c != 0)
- last_nonempty = i;
- }
- /* Now find the first empty after it. */
-@@ -7203,11 +7186,20 @@ static void
- vte_terminal_fc_settings_changed(GtkSettings *settings, GParamSpec *spec,
- VteTerminal *terminal)
- {
-+ PangoFontDescription *fontdesc;
-+
- _vte_debug_print(VTE_DEBUG_MISC,
- "Fontconfig setting \"%s\" changed.\n",
- spec->name);
-- vte_terminal_set_font_full(terminal, terminal->pvt->fontdesc,
-+
-+ /* force an update... */
-+ fontdesc = terminal->pvt->fontdesc;
-+ terminal->pvt->fontdesc = NULL;
-+
-+ vte_terminal_set_font_full(terminal, fontdesc,
- terminal->pvt->fontantialias);
-+
-+ pango_font_description_free(fontdesc);
- }
-
- /* Connect to notifications from our settings object that font hints have
-@@ -7627,8 +7619,8 @@ vte_terminal_unrealize(GtkWidget *widget
- terminal->pvt->contents_changed_pending = FALSE;
- terminal->pvt->cursor_moved_pending = FALSE;
- terminal->pvt->text_modified_flag = FALSE;
-- terminal->pvt->text_inserted_count = 0;
-- terminal->pvt->text_deleted_count = 0;
-+ terminal->pvt->text_inserted_flag = FALSE;
-+ terminal->pvt->text_deleted_flag = FALSE;
-
- /* Clear modifiers. */
- terminal->pvt->modifiers = 0;
-@@ -7950,27 +7942,27 @@ vte_terminal_determine_colors(VteTermina
- * reverse colors, else use the defaults. This means that many callers
- * who specify highlight or cursor should also specify reverse. */
- if (cursor && !highlight && terminal->pvt->cursor_color_set) {
-- *fore = cell ? cell->back : VTE_DEF_BG;
-+ *fore = cell ? cell->attr.back : VTE_DEF_BG;
- *back = VTE_CUR_BG;
- } else
- if (highlight && !cursor && terminal->pvt->highlight_color_set) {
-- *fore = cell ? cell->fore : VTE_DEF_FG;
-+ *fore = cell ? cell->attr.fore : VTE_DEF_FG;
- *back = VTE_DEF_HL;
- } else
-- if (reverse ^ ((cell != NULL) && (cell->reverse))) {
-- *fore = cell ? cell->back : VTE_DEF_BG;
-- *back = cell ? cell->fore : VTE_DEF_FG;
-+ if (reverse ^ ((cell != NULL) && (cell->attr.reverse))) {
-+ *fore = cell ? cell->attr.back : VTE_DEF_BG;
-+ *back = cell ? cell->attr.fore : VTE_DEF_FG;
- } else {
-- *fore = cell ? cell->fore : VTE_DEF_FG;
-- *back = cell ? cell->back : VTE_DEF_BG;
-+ *fore = cell ? cell->attr.fore : VTE_DEF_FG;
-+ *back = cell ? cell->attr.back : VTE_DEF_BG;
- }
-
- /* Handle invisible, bold, and standout text by adjusting colors. */
- if (cell) {
-- if (cell->invisible) {
-+ if (cell->attr.invisible) {
- *fore = *back;
- }
-- if (cell->bold) {
-+ if (cell->attr.bold) {
- if (*fore == VTE_DEF_FG) {
- *fore = VTE_BOLD_FG;
- } else
-@@ -7978,7 +7970,7 @@ vte_terminal_determine_colors(VteTermina
- *fore += VTE_COLOR_BRIGHT_OFFSET;
- }
- }
-- if (cell->half) {
-+ if (cell->attr.half) {
- if (*fore == VTE_DEF_FG) {
- *fore = VTE_DIM_FG;
- } else
-@@ -7986,7 +7978,7 @@ vte_terminal_determine_colors(VteTermina
- *fore = corresponding_dim_index[*fore];;
- }
- }
-- if (cell->standout) {
-+ if (cell->attr.standout) {
- if (*back < VTE_LEGACY_COLOR_SET_SIZE) {
- *back += VTE_COLOR_BRIGHT_OFFSET;
- }
-@@ -9117,9 +9109,9 @@ _vte_terminal_fudge_pango_colors(VteTerm
- (props[i].bg.red == 0) &&
- (props[i].bg.green == 0) &&
- (props[i].bg.blue == 0)) {
-- cells[i].fore = terminal->pvt->screen->color_defaults.fore;
-- cells[i].back = terminal->pvt->screen->color_defaults.back;
-- cells[i].reverse = TRUE;
-+ cells[i].attr.fore = terminal->pvt->screen->color_defaults.attr.fore;
-+ cells[i].attr.back = terminal->pvt->screen->color_defaults.attr.back;
-+ cells[i].attr.reverse = TRUE;
- }
- }
- }
-@@ -9143,10 +9135,10 @@ _vte_terminal_apply_pango_attr(VteTermin
- i < attr->end_index && i < n_cells;
- i++) {
- if (attr->klass->type == PANGO_ATTR_FOREGROUND) {
-- cells[i].fore = ival;
-+ cells[i].attr.fore = ival;
- }
- if (attr->klass->type == PANGO_ATTR_BACKGROUND) {
-- cells[i].back = ival;
-+ cells[i].attr.back = ival;
- }
- }
- break;
-@@ -9156,7 +9148,7 @@ _vte_terminal_apply_pango_attr(VteTermin
- for (i = attr->start_index;
- (i < attr->end_index) && (i < n_cells);
- i++) {
-- cells[i].strikethrough = (ival != FALSE);
-+ cells[i].attr.strikethrough = (ival != FALSE);
- }
- break;
- case PANGO_ATTR_UNDERLINE:
-@@ -9165,7 +9157,7 @@ _vte_terminal_apply_pango_attr(VteTermin
- for (i = attr->start_index;
- (i < attr->end_index) && (i < n_cells);
- i++) {
-- cells[i].underline = (ival != PANGO_UNDERLINE_NONE);
-+ cells[i].attr.underline = (ival != PANGO_UNDERLINE_NONE);
- }
- break;
- case PANGO_ATTR_WEIGHT:
-@@ -9174,7 +9166,7 @@ _vte_terminal_apply_pango_attr(VteTermin
- for (i = attr->start_index;
- (i < attr->end_index) && (i < n_cells);
- i++) {
-- cells[i].bold = (ival >= PANGO_WEIGHT_BOLD);
-+ cells[i].attr.bold = (ival >= PANGO_WEIGHT_BOLD);
- }
- break;
- default:
-@@ -9267,9 +9259,9 @@ vte_terminal_draw_cells_with_attributes(
- fore,
- back,
- TRUE, draw_default_bg,
-- cells[j].bold,
-- cells[j].underline,
-- cells[j].strikethrough,
-+ cells[j].attr.bold,
-+ cells[j].attr.underline,
-+ cells[j].attr.strikethrough,
- FALSE, FALSE, column_width, height);
- j += g_unichar_to_utf8(items[i].c, scratch_buf);
- }
-@@ -9332,7 +9324,7 @@ vte_terminal_draw_rows(VteTerminal *term
- if (row_data != NULL) {
- cell = _vte_row_data_find_charcell(row_data, i);
- if (cell != NULL) {
-- while (cell->fragment && i > 0) {
-+ while (cell->attr.fragment && i > 0) {
- cell = _vte_row_data_find_charcell(row_data, --i);
- }
- }
-@@ -9348,14 +9340,14 @@ vte_terminal_draw_rows(VteTerminal *term
- FALSE,
- &fore, &back);
-
-- bold = cell && cell->bold;
-- j = i + (cell ? cell->columns : 1);
-+ bold = cell && cell->attr.bold;
-+ j = i + (cell ? cell->attr.columns : 1);
-
- while (j < end_column){
- /* Don't render fragments of multicolumn characters
- * which have the same attributes as the initial
- * portions. */
-- if (cell != NULL && cell->fragment) {
-+ if (cell != NULL && cell->attr.fragment) {
- j++;
- continue;
- }
-@@ -9373,8 +9365,8 @@ vte_terminal_draw_rows(VteTerminal *term
- if (nback != back) {
- break;
- }
-- bold = cell && cell->bold;
-- j += cell ? cell->columns : 1;
-+ bold = cell && cell->attr.bold;
-+ j += cell ? cell->attr.columns : 1;
- }
- if (back != VTE_DEF_BG) {
- GdkColor color;
-@@ -9467,7 +9459,7 @@ vte_terminal_draw_rows(VteTerminal *term
- if (cell == NULL) {
- goto fg_next_row;
- }
-- while (cell->fragment && i > 0) {
-+ while (cell->attr.fragment && i > 0) {
- cell = _vte_row_data_find_charcell(row_data, --i);
- }
-
-@@ -9480,7 +9472,7 @@ vte_terminal_draw_rows(VteTerminal *term
- }
- while (cell->c == 0 ||
- cell->c == ' ' ||
-- cell->fragment) {
-+ cell->attr.fragment) {
- if (++i >= end_column) {
- goto fg_next_row;
- }
-@@ -9496,9 +9488,9 @@ vte_terminal_draw_rows(VteTerminal *term
- selected,
- FALSE,
- &fore, &back);
-- underline = cell->underline;
-- strikethrough = cell->strikethrough;
-- bold = cell->bold;
-+ underline = cell->attr.underline;
-+ strikethrough = cell->attr.strikethrough;
-+ bold = cell->attr.bold;
- if (terminal->pvt->show_match) {
- hilite = vte_cell_is_between(i, row,
- terminal->pvt->match_start.column,
-@@ -9511,7 +9503,7 @@ vte_terminal_draw_rows(VteTerminal *term
- }
-
- items[0].c = cell->c;
-- items[0].columns = cell->columns;
-+ items[0].columns = cell->attr.columns;
- items[0].x = start_x + i * column_width;
- items[0].y = y;
- j = i + items[0].columns;
-@@ -9541,8 +9533,7 @@ vte_terminal_draw_rows(VteTerminal *term
- if (cell == NULL) {
- break;
- }
-- if (cell->c == 0 ||
-- cell->c == ' '){
-+ if (cell->c == 0 || cell->c == ' '){
- /* only break the run if we
- * are drawing attributes
- */
-@@ -9558,7 +9549,7 @@ vte_terminal_draw_rows(VteTerminal *term
- /* Don't render blank cells or fragments of multicolumn characters
- * which have the same attributes as the initial
- * portions. */
-- if (cell->fragment) {
-+ if (cell->attr.fragment) {
- j++;
- continue;
- }
-@@ -9580,26 +9571,26 @@ vte_terminal_draw_rows(VteTerminal *term
- start_x + j * column_width,
- y,
- column_width,
-- cell->columns,
-+ cell->attr.columns,
- row_height)) {
-
-- j += cell->columns;
-+ j += cell->attr.columns;
- continue;
- }
- }
- if (nfore != fore) {
- break;
- }
-- nbold = cell->bold;
-+ nbold = cell->attr.bold;
- if (nbold != bold) {
- break;
- }
- /* Break up underlined/not-underlined text. */
-- nunderline = cell->underline;
-+ nunderline = cell->attr.underline;
- if (nunderline != underline) {
- break;
- }
-- nstrikethrough = cell->strikethrough;
-+ nstrikethrough = cell->attr.strikethrough;
- if (nstrikethrough != strikethrough) {
- break;
- }
-@@ -9618,7 +9609,7 @@ vte_terminal_draw_rows(VteTerminal *term
- }
- /* Add this cell to the draw list. */
- items[item_count].c = cell->c;
-- items[item_count].columns = cell->columns;
-+ items[item_count].columns = cell->attr.columns;
- items[item_count].x = start_x + j * column_width;
- items[item_count].y = y;
- j += items[item_count].columns;
-@@ -9647,7 +9638,7 @@ vte_terminal_draw_rows(VteTerminal *term
- j = start_column;
- cell = _vte_row_data_find_charcell(row_data, j);
- } while (cell == NULL);
-- while (cell->fragment && j > 0) {
-+ while (cell->attr.fragment && j > 0) {
- cell = _vte_row_data_find_charcell(row_data, --j);
- }
- } while (TRUE);
-@@ -9712,7 +9703,7 @@ vte_terminal_expand_region (VteTerminal
- if (col_stop == terminal->column_count)
- rect.width = terminal->widget.allocation.width;
- else
-- rect.width = col_stop*width;
-+ rect.width = (col_stop + 1)*width;
- rect.width -= rect.x;
- if (row == 0)
- rect.y = 0;
-@@ -9721,7 +9712,7 @@ vte_terminal_expand_region (VteTerminal
- if (row_stop == terminal->row_count)
- rect.height = terminal->widget.allocation.height;
- else
-- rect.height = row_stop*height;
-+ rect.height = (row_stop + 1)*height;
- rect.height -= rect.y;
- gdk_region_union_with_rect(region, &rect);
-
-@@ -9748,16 +9739,14 @@ vte_terminal_paint_area (VteTerminal *te
- height = terminal->char_height;
- delta = screen->scroll_delta;
-
-- /* increase the paint by one pixel on all sides to force the
-- * inclusion of neighbouring cells */
- row = MAX(0, (area->y - VTE_PAD_WIDTH) / height);
-- row_stop = MIN(howmany(area->height + area->y - VTE_PAD_WIDTH, height),
-+ row_stop = MIN((area->height + area->y - VTE_PAD_WIDTH) / height,
- terminal->row_count);
- if (row_stop <= row) {
- return;
- }
- col = MAX(0, (area->x - VTE_PAD_WIDTH) / width);
-- col_stop = MIN(howmany(area->width + area->x - VTE_PAD_WIDTH, width),
-+ col_stop = MIN((area->width + area->x - VTE_PAD_WIDTH) / width,
- terminal->column_count);
- if (col_stop <= col) {
- return;
-@@ -9774,7 +9763,7 @@ vte_terminal_paint_area (VteTerminal *te
- (col_stop - col) * width,
- (row_stop - row) * height);
- if (!GTK_WIDGET_DOUBLE_BUFFERED (terminal) ||
-- _vte_draw_has_background_image (terminal->pvt->draw)) {
-+ _vte_draw_requires_clear (terminal->pvt->draw)) {
- _vte_draw_clear (terminal->pvt->draw,
- area->x, area->y,
- area->width, area->height);
-@@ -9905,28 +9894,23 @@ vte_terminal_paint(GtkWidget *widget, Gd
-
- /* Find the character "under" the cursor. */
- cell = vte_terminal_find_charcell(terminal, col, drow);
-- while ((cell != NULL) && (cell->fragment) && (col > 0)) {
-+ while ((cell != NULL) && (cell->attr.fragment) && (col > 0)) {
- col--;
- cell = vte_terminal_find_charcell(terminal, col, drow);
- }
-
- /* Draw the cursor. */
- item.c = cell ? (cell->c ? cell->c : ' ') : ' ';
-- item.columns = cell ? cell->columns : 1;
-+ item.columns = cell ? cell->attr.columns : 1;
- item.x = col * width;
- item.y = row * height;
- cursor_width = item.columns * width;
- if (cell) {
-- cursor_width = MAX(cursor_width,
-- _vte_draw_get_char_width(terminal->pvt->draw,
-- cell->c,
-- cell->columns));
-- cursor_width += cell->bold; /* pseudo-bolding */
-- }
-- _vte_draw_clear(terminal->pvt->draw,
-- col * width + VTE_PAD_WIDTH,
-- row * height + VTE_PAD_WIDTH,
-- cursor_width, height);
-+ gint cw = _vte_draw_get_char_width (terminal->pvt->draw,
-+ cell->c, cell->attr.columns);
-+ cursor_width = MAX(cursor_width, cw);
-+ cursor_width += cell->attr.bold; /* pseudo-bolding */
-+ }
- selected = vte_cell_is_selected(terminal, col, drow, NULL);
- if (GTK_WIDGET_HAS_FOCUS(terminal)) {
- blink = terminal->pvt->cursor_blink_state ^
-@@ -9951,42 +9935,46 @@ vte_terminal_paint(GtkWidget *widget, Gd
- height,
- &color,
- VTE_DRAW_OPAQUE);
-- }
-- if (!vte_terminal_unichar_is_local_graphic(terminal, item.c) ||
-- !vte_terminal_draw_graphic(terminal,
-- item.c,
-- fore, back,
-- TRUE,
-- item.x,
-- item.y,
-- width,
-- item.columns,
-- height)) {
-- gboolean hilite = FALSE;
-- if (cell && terminal->pvt->show_match) {
-- hilite = vte_cell_is_between(col, row,
-- terminal->pvt->match_start.column,
-- terminal->pvt->match_start.row,
-- terminal->pvt->match_end.column,
-- terminal->pvt->match_end.row,
-- TRUE);
-- }
-- if (cell && cell->c != 0 && cell->c != ' ') {
-- vte_terminal_draw_cells(terminal,
-- &item, 1,
-- fore, back, TRUE, FALSE,
-- cell->bold,
-- cell->underline,
-- cell->strikethrough,
-- hilite,
-- FALSE,
-- width,
-- height);
-+ if (!vte_terminal_unichar_is_local_graphic(terminal, item.c) ||
-+ !vte_terminal_draw_graphic(terminal,
-+ item.c,
-+ fore, back,
-+ TRUE,
-+ item.x,
-+ item.y,
-+ width,
-+ item.columns,
-+ height)) {
-+ gboolean hilite = FALSE;
-+ if (cell && terminal->pvt->show_match) {
-+ hilite = vte_cell_is_between(col, row,
-+ terminal->pvt->match_start.column,
-+ terminal->pvt->match_start.row,
-+ terminal->pvt->match_end.column,
-+ terminal->pvt->match_end.row,
-+ TRUE);
-+ }
-+ if (cell && cell->c != 0 && cell->c != ' ') {
-+ vte_terminal_draw_cells(terminal,
-+ &item, 1,
-+ fore, back, TRUE, FALSE,
-+ cell->attr.bold,
-+ cell->attr.underline,
-+ cell->attr.strikethrough,
-+ hilite,
-+ FALSE,
-+ width,
-+ height);
-+ }
- }
- }
- } else {
- GdkColor color;
- draw_cursor_outline:
-+ _vte_draw_clear(terminal->pvt->draw,
-+ col * width + VTE_PAD_WIDTH,
-+ row * height + VTE_PAD_WIDTH,
-+ cursor_width, height);
- vte_terminal_determine_colors(terminal, cell,
- terminal->pvt->screen->reverse_mode,
- selected,
-@@ -10016,9 +10004,9 @@ draw_cursor_outline:
- vte_terminal_draw_cells(terminal,
- &item, 1,
- fore, back, TRUE, FALSE,
-- cell->bold,
-- cell->underline,
-- cell->strikethrough,
-+ cell->attr.bold,
-+ cell->attr.underline,
-+ cell->attr.strikethrough,
- hilite,
- FALSE,
- width,
-@@ -10086,8 +10074,8 @@ draw_cursor_outline:
- row * height + VTE_PAD_WIDTH,
- width * columns,
- height);
-- fore = screen->defaults.fore;
-- back = screen->defaults.back;
-+ fore = screen->defaults.attr.fore;
-+ back = screen->defaults.attr.back;
- vte_terminal_draw_cells_with_attributes(terminal,
- items, len,
- terminal->pvt->im_preedit_attrs,
-@@ -10104,18 +10092,6 @@ draw_cursor_outline:
- FALSE,
- TRUE,
- width, height);
-- } else
-- if (preedit_cursor == len) {
-- /* Empty cursor at the end. */
-- vte_terminal_draw_cells(terminal,
-- &items[len], 1,
-- back, fore, TRUE, TRUE,
-- FALSE,
-- FALSE,
-- FALSE,
-- FALSE,
-- FALSE,
-- width, height);
- }
- g_free(items);
- }
-@@ -10130,14 +10106,21 @@ static gint
- vte_terminal_expose(GtkWidget *widget, GdkEventExpose *event)
- {
- VteTerminal *terminal = VTE_TERMINAL (widget);
-+ /* Beware the out of order events -
-+ * do not even think about skipping exposes! */
- _vte_debug_print (VTE_DEBUG_WORK, "+");
-- if (terminal->pvt->visibility_state == GDK_VISIBILITY_FULLY_OBSCURED) {
-- return FALSE;
-- }
- _vte_debug_print (VTE_DEBUG_EVENTS, "Expose (%d,%d)x(%d,%d)\n",
- event->area.x, event->area.y,
- event->area.width, event->area.height);
-- if (terminal->pvt->active != NULL && !in_update_timeout) {
-+ if (terminal->pvt->active != NULL &&
-+ update_timeout_tag != VTE_INVALID_SOURCE &&
-+ !in_update_timeout) {
-+ /* fix up a race condition where we schedule a delayed update
-+ * after an 'immediate' invalidate all */
-+ if (terminal->pvt->invalidated_all &&
-+ terminal->pvt->update_regions == NULL) {
-+ terminal->pvt->invalidated_all = FALSE;
-+ }
- /* if we expect to redraw the widget soon,
- * just add this event to the list */
- if (!terminal->pvt->invalidated_all) {
-@@ -10163,6 +10146,7 @@ vte_terminal_scroll(GtkWidget *widget, G
- {
- GtkAdjustment *adj;
- VteTerminal *terminal;
-+ gdouble v;
- glong new_value;
- GdkModifierType modifiers;
- int button;
-@@ -10216,21 +10200,19 @@ vte_terminal_scroll(GtkWidget *widget, G
-
- /* Perform a history scroll. */
- adj = terminal->adjustment;
-- new_value = terminal->pvt->screen->scroll_delta;
--
-+ v = MAX (1., ceil (adj->page_increment / 10.));
- switch (event->direction) {
- case GDK_SCROLL_UP:
-- new_value -= MAX(1, adj->page_increment / 10);
-+ v = -v;
- break;
- case GDK_SCROLL_DOWN:
-- new_value += MAX(1, adj->page_increment / 10);
- break;
- default:
- return FALSE;
- }
--
-- new_value = CLAMP(new_value, adj->lower,
-- MAX (adj->lower, adj->upper - adj->page_size));
-+ v += terminal->pvt->screen->scroll_delta;
-+ new_value = floor (CLAMP (v, adj->lower,
-+ MAX (adj->lower, adj->upper - adj->page_size)));
- vte_terminal_queue_adjustment_value_changed (terminal, new_value);
-
- return TRUE;
-@@ -11530,10 +11512,10 @@ vte_terminal_reset(VteTerminal *terminal
- * it's not a real attribute, but we need to treat it as one here. */
- terminal->pvt->screen = &terminal->pvt->alternate_screen;
- _vte_terminal_set_default_attributes(terminal);
-- terminal->pvt->screen->defaults.alternate = FALSE;
-+ terminal->pvt->screen->defaults.attr.alternate = FALSE;
- terminal->pvt->screen = &terminal->pvt->normal_screen;
- _vte_terminal_set_default_attributes(terminal);
-- terminal->pvt->screen->defaults.alternate = FALSE;
-+ terminal->pvt->screen->defaults.attr.alternate = FALSE;
- /* Clear the scrollback buffers and reset the cursors. */
- if (clear_history) {
- _vte_ring_free(terminal->pvt->normal_screen.row_data, TRUE);
-@@ -12120,11 +12102,8 @@ static void time_process_incoming (VteTe
- {
- gdouble elapsed;
- glong target;
-- gboolean again;
- g_timer_reset (process_timer);
-- do {
-- again = vte_terminal_process_incoming (terminal);
-- } while (again);
-+ vte_terminal_process_incoming (terminal);
- elapsed = g_timer_elapsed (process_timer, NULL) * 1000;
- target = VTE_MAX_PROCESS_TIME / elapsed * terminal->pvt->input_bytes;
- terminal->pvt->max_input_bytes =
-@@ -12174,12 +12153,11 @@ process_timeout (gpointer data)
- active = TRUE;
- if (VTE_MAX_PROCESS_TIME && !multiple_active) {
- time_process_incoming (terminal);
-- } else do {
-- again = vte_terminal_process_incoming(terminal);
-- } while (again);
-+ } else {
-+ vte_terminal_process_incoming(terminal);
-+ }
- terminal->pvt->input_bytes = 0;
- }
-- vte_terminal_emit_pending_signals (terminal);
- if (!active && terminal->pvt->update_regions == NULL) {
- if (terminal->pvt->active != NULL) {
- _vte_debug_print(VTE_DEBUG_TIMEOUT,
-@@ -12292,18 +12270,18 @@ update_repeat_timeout (gpointer data)
- }
- _vte_terminal_enable_input_source (terminal);
- }
-+ if (terminal->pvt->bg_update_pending) {
-+ vte_terminal_background_update (terminal);
-+ }
-+ vte_terminal_emit_adjustment_changed (terminal);
- if (need_processing (terminal)) {
- if (VTE_MAX_PROCESS_TIME && !multiple_active) {
- time_process_incoming (terminal);
-- } else do {
-- again = vte_terminal_process_incoming (terminal);
-- } while (again);
-+ } else {
-+ vte_terminal_process_incoming (terminal);
-+ }
- terminal->pvt->input_bytes = 0;
- }
-- if (terminal->pvt->bg_update_pending) {
-- vte_terminal_background_update (terminal);
-- }
-- vte_terminal_emit_pending_signals (terminal);
-
- again = update_regions (terminal);
- if (!again) {
-@@ -12376,7 +12354,6 @@ update_timeout (gpointer data)
- multiple_active = active_terminals->next != NULL;
- for (l = active_terminals; l != NULL; l = next) {
- VteTerminal *terminal = l->data;
-- gboolean again;
-
- next = g_list_next (l);
-
-@@ -12392,18 +12369,18 @@ update_timeout (gpointer data)
- }
- _vte_terminal_enable_input_source (terminal);
- }
-+ if (terminal->pvt->bg_update_pending) {
-+ vte_terminal_background_update (terminal);
-+ }
-+ vte_terminal_emit_adjustment_changed (terminal);
- if (need_processing (terminal)) {
- if (VTE_MAX_PROCESS_TIME && !multiple_active) {
- time_process_incoming (terminal);
-- } else do {
-- again = vte_terminal_process_incoming (terminal);
-- } while (again);
-+ } else {
-+ vte_terminal_process_incoming (terminal);
-+ }
- terminal->pvt->input_bytes = 0;
- }
-- if (terminal->pvt->bg_update_pending) {
-- vte_terminal_background_update (terminal);
-- }
-- vte_terminal_emit_pending_signals (terminal);
-
- redraw |= update_regions (terminal);
- }
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vtedraw.c src/vtedraw.c
---- ../vte-0.16.0/src/vtedraw.c Thu Mar 8 11:47:15 2007
-+++ src/vtedraw.c Fri Mar 23 12:53:52 2007
-@@ -226,9 +226,9 @@ _vte_draw_set_background_image (struct _
- }
-
- gboolean
--_vte_draw_has_background_image (struct _vte_draw *draw)
-+_vte_draw_requires_clear (struct _vte_draw *draw)
- {
-- return draw->has_background_image;
-+ return draw->requires_clear;
- }
-
- gboolean
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vtedraw.h src/vtedraw.h
---- ../vte-0.16.0/src/vtedraw.h Thu Mar 8 11:47:15 2007
-+++ src/vtedraw.h Fri Mar 23 12:53:52 2007
-@@ -100,7 +100,7 @@ struct _vte_draw {
- GtkWidget *widget;
- gboolean started;
- gint width, height, ascent;
-- gboolean has_background_image;
-+ gboolean requires_clear;
- const struct _vte_draw_impl *impl;
- gpointer impl_data;
- };
-@@ -132,7 +132,7 @@ void _vte_draw_set_background_image(stru
- const char *file,
- const GdkColor *color,
- double saturation);
--gboolean _vte_draw_has_background_image (struct _vte_draw *draw);
-+gboolean _vte_draw_requires_clear (struct _vte_draw *draw);
- gboolean _vte_draw_requires_repaint(struct _vte_draw *draw);
- gboolean _vte_draw_clip(struct _vte_draw *draw, GdkRegion *region);
- void _vte_draw_clear(struct _vte_draw *draw,
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vteft2.c src/vteft2.c
---- ../vte-0.16.0/src/vteft2.c Thu Mar 8 11:47:15 2007
-+++ src/vteft2.c Fri Mar 23 12:53:52 2007
-@@ -164,7 +164,7 @@ _vte_ft2_set_background_image(struct _vt
- g_object_unref(data->pixbuf);
- }
- data->pixbuf = bgpixbuf;
-- draw->has_background_image = bgpixbuf != NULL;
-+ draw->requires_clear = bgpixbuf != NULL;
- }
-
- static void
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vtegl.c src/vtegl.c
---- ../vte-0.16.0/src/vtegl.c Thu Mar 8 11:47:15 2007
-+++ src/vtegl.c Fri Mar 23 12:53:52 2007
-@@ -119,7 +119,6 @@ _vte_gl_create(struct _vte_draw *draw, G
- Display *display;
- GdkScreen *gscreen;
- int screen;
-- gboolean direct;
-
- draw->impl_data = g_slice_new(struct _vte_gl_data);
- data = (struct _vte_gl_data*) draw->impl_data;
-@@ -152,6 +151,7 @@ _vte_gl_create(struct _vte_draw *draw, G
- data->buffer = _vte_buffer_new();
-
- gtk_widget_set_double_buffered(widget, FALSE);
-+ draw->requires_clear = TRUE;
- }
-
- static void
-@@ -263,7 +263,6 @@ _vte_gl_set_background_image(struct _vte
- g_object_unref(data->bgpixbuf);
- }
- data->bgpixbuf = bgpixbuf;
-- draw->has_background_image = bgpixbuf != NULL;
- }
-
- static void
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vtepango.c src/vtepango.c
---- ../vte-0.16.0/src/vtepango.c Thu Mar 8 11:47:15 2007
-+++ src/vtepango.c Fri Mar 23 12:53:52 2007
-@@ -175,13 +175,13 @@ _vte_pango_set_background_image(struct _
- if (data->pixmap != NULL) {
- g_object_unref(data->pixmap);
- }
-- draw->has_background_image = FALSE;
-+ draw->requires_clear = FALSE;
- data->pixmap = NULL;
- data->pixmapw = data->pixmaph = 0;
- if (pixmap) {
- data->pixmap = pixmap;
- gdk_drawable_get_size(pixmap, &data->pixmapw, &data->pixmaph);
-- draw->has_background_image =
-+ draw->requires_clear =
- data->pixmapw > 0 && data->pixmaph > 0;
- }
- }
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vtepangox.c src/vtepangox.c
---- ../vte-0.16.0/src/vtepangox.c Thu Mar 8 11:47:15 2007
-+++ src/vtepangox.c Fri Mar 23 12:53:52 2007
-@@ -208,13 +208,13 @@ _vte_pango_x_set_background_image(struct
- if (data->pixmap != NULL) {
- g_object_unref(data->pixmap);
- }
-- draw->has_background_image = FALSE;
-+ draw->requires_clear = FALSE;
- data->pixmap = NULL;
- data->pixmapw = data->pixmaph = 0;
- if (pixmap != NULL) {
- data->pixmap = pixmap;
- gdk_drawable_get_size(pixmap, &data->pixmapw, &data->pixmaph);
-- draw->has_background_image =
-+ draw->requires_clear =
- data->pixmapw > 0 && data->pixmaph > 0;
- }
- }
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vteseq.c src/vteseq.c
---- ../vte-0.16.0/src/vteseq.c Fri Mar 9 13:19:10 2007
-+++ src/vteseq.c Fri Mar 23 12:53:53 2007
-@@ -341,8 +341,8 @@ vte_sequence_handler_scroll_up_or_down(V
- _vte_terminal_adjust_adjustments(terminal);
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_inserted_count++;
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_inserted_flag = TRUE;
-+ terminal->pvt->text_deleted_flag = TRUE;
-
- return FALSE;
- }
-@@ -719,7 +719,6 @@ vte_sequence_handler_decset_internal(Vte
- /* Reset scrollbars and repaint everything. */
- terminal->adjustment->value =
- terminal->pvt->screen->scroll_delta;
-- terminal->pvt->adjustment_value_changed_pending = TRUE;
- vte_terminal_set_scrollback_lines(terminal,
- terminal->pvt->scrollback_lines);
- _vte_terminal_queue_contents_changed(terminal);
-@@ -862,7 +861,7 @@ vte_sequence_handler_ae(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.alternate = 0;
-+ terminal->pvt->screen->defaults.attr.alternate = 0;
- return FALSE;
- }
-
-@@ -917,7 +916,7 @@ vte_sequence_handler_al(VteTerminal *ter
- _vte_terminal_scroll_region(terminal, start, end - start + 1, param);
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -938,7 +937,7 @@ vte_sequence_handler_as(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.alternate = 1;
-+ terminal->pvt->screen->defaults.attr.alternate = 1;
- return FALSE;
- }
-
-@@ -1042,7 +1041,7 @@ vte_sequence_handler_cb(VteTerminal *ter
- screen->cursor_current.row, 1);
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -1114,7 +1113,7 @@ vte_sequence_handler_cd(VteTerminal *ter
- }
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -1149,7 +1148,7 @@ vte_sequence_handler_ce(VteTerminal *ter
- screen->cursor_current.row, 1);
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -1190,7 +1189,7 @@ vte_sequence_handler_cl(VteTerminal *ter
- vte_sequence_handler_ho(terminal, NULL, 0, NULL);
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -1271,7 +1270,7 @@ vte_sequence_handler_clear_current_line(
- }
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -1314,10 +1313,10 @@ vte_sequence_handler_cs(VteTerminal *ter
- }
- /* Catch garbage. */
- rows = terminal->row_count;
-- if ((start <= 0) || (start >= rows)) {
-+ if (start <= 0 || start >= rows) {
- start = 0;
- }
-- if ((end <= 0) || (end >= rows)) {
-+ if (end <= 0 || end >= rows) {
- end = rows - 1;
- }
- /* Set the right values. */
-@@ -1325,12 +1324,13 @@ vte_sequence_handler_cs(VteTerminal *ter
- screen->scrolling_region.end = end;
- screen->scrolling_restricted = TRUE;
- /* Special case -- run wild, run free. */
-- if ((screen->scrolling_region.start == 0) &&
-- (screen->scrolling_region.end == rows - 1)) {
-+ if (screen->scrolling_region.start == 0 &&
-+ screen->scrolling_region.end == rows - 1) {
- screen->scrolling_restricted = FALSE;
- }
- screen->cursor_current.row = screen->insert_delta + start;
- screen->cursor_current.col = 0;
-+
- return FALSE;
- }
-
-@@ -1486,7 +1486,7 @@ vte_sequence_handler_dc(VteTerminal *ter
- /* Remove the column. */
- if (col < len) {
- g_array_remove_index(rowdata->cells, col);
-- if (screen->fill_defaults.back != VTE_DEF_BG) {
-+ if (screen->fill_defaults.attr.back != VTE_DEF_BG) {
- vte_g_array_fill (rowdata->cells,
- &screen->fill_defaults,
- terminal->column_count);
-@@ -1500,7 +1500,7 @@ vte_sequence_handler_dc(VteTerminal *ter
- }
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -1558,7 +1558,7 @@ vte_sequence_handler_dl(VteTerminal *ter
- _vte_terminal_scroll_region(terminal, start, end - start + 1, -param);
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -1674,7 +1674,7 @@ vte_sequence_handler_ec(VteTerminal *ter
- }
-
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -1749,7 +1749,7 @@ vte_sequence_handler_ic(VteTerminal *ter
-
- save = screen->cursor_current;
-
-- _vte_terminal_insert_char(terminal, ' ', TRUE, TRUE, TRUE, 0);
-+ _vte_terminal_insert_char(terminal, ' ', TRUE, TRUE);
-
- screen->cursor_current = save;
-
-@@ -1887,7 +1887,7 @@ vte_sequence_handler_mb(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.blink = 1;
-+ terminal->pvt->screen->defaults.attr.blink = 1;
- return FALSE;
- }
-
-@@ -1898,8 +1898,8 @@ vte_sequence_handler_md(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.bold = 1;
-- terminal->pvt->screen->defaults.half = 0;
-+ terminal->pvt->screen->defaults.attr.bold = 1;
-+ terminal->pvt->screen->defaults.attr.half = 0;
- return FALSE;
- }
-
-@@ -1921,8 +1921,8 @@ vte_sequence_handler_mh(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.half = 1;
-- terminal->pvt->screen->defaults.bold = 0;
-+ terminal->pvt->screen->defaults.attr.half = 1;
-+ terminal->pvt->screen->defaults.attr.bold = 0;
- return FALSE;
- }
-
-@@ -1933,7 +1933,7 @@ vte_sequence_handler_mk(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.invisible = 1;
-+ terminal->pvt->screen->defaults.attr.invisible = 1;
- return FALSE;
- }
-
-@@ -1944,7 +1944,7 @@ vte_sequence_handler_mp(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.protect = 1;
-+ terminal->pvt->screen->defaults.attr.protect = 1;
- return FALSE;
- }
-
-@@ -1955,7 +1955,7 @@ vte_sequence_handler_mr(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.reverse = 1;
-+ terminal->pvt->screen->defaults.attr.reverse = 1;
- return FALSE;
- }
-
-@@ -2152,7 +2152,7 @@ vte_sequence_handler_se(VteTerminal *ter
- vte_sequence_handler_ue(terminal, match, match_quark, params);
- } else {
- /* Otherwise just set standout mode. */
-- terminal->pvt->screen->defaults.standout = 0;
-+ terminal->pvt->screen->defaults.attr.standout = 0;
- }
-
- g_free(blink);
-@@ -2184,10 +2184,9 @@ vte_sequence_handler_sf(VteTerminal *ter
- start = screen->insert_delta;
- end = start + terminal->row_count - 1;
- }
--
- if (screen->cursor_current.row == end) {
- /* Match xterm and fill to the end of row when scrolling. */
-- if (screen->fill_defaults.back != VTE_DEF_BG) {
-+ if (screen->fill_defaults.attr.back != VTE_DEF_BG) {
- VteRowData *rowdata;
- rowdata = _vte_terminal_ensure_row (terminal);
- vte_g_array_fill (rowdata->cells,
-@@ -2243,7 +2242,7 @@ vte_sequence_handler_sf(VteTerminal *ter
- }
-
- /* Match xterm and fill the new row when scrolling. */
-- if (screen->fill_defaults.back != VTE_DEF_BG) {
-+ if (screen->fill_defaults.attr.back != VTE_DEF_BG) {
- VteRowData *rowdata;
- rowdata = _vte_terminal_ensure_row (terminal);
- vte_g_array_fill (rowdata->cells,
-@@ -2317,7 +2316,7 @@ vte_sequence_handler_so(VteTerminal *ter
- vte_sequence_handler_us(terminal, match, match_quark, params);
- } else {
- /* Otherwise just set standout mode. */
-- terminal->pvt->screen->defaults.standout = 1;
-+ terminal->pvt->screen->defaults.attr.standout = 1;
- }
-
- g_free(blink);
-@@ -2499,7 +2498,7 @@ vte_sequence_handler_uc(VteTerminal *ter
- cell = vte_terminal_find_charcell(terminal,
- column,
- screen->cursor_current.row);
-- while ((cell != NULL) && (cell->fragment) && (column > 0)) {
-+ while ((cell != NULL) && (cell->attr.fragment) && (column > 0)) {
- column--;
- cell = vte_terminal_find_charcell(terminal,
- column,
-@@ -2507,10 +2506,10 @@ vte_sequence_handler_uc(VteTerminal *ter
- }
- if (cell != NULL) {
- /* Set this character to be underlined. */
-- cell->underline = 1;
-+ cell->attr.underline = 1;
- /* Cause the character to be repainted. */
- _vte_invalidate_cells(terminal,
-- column, cell->columns,
-+ column, cell->attr.columns,
- screen->cursor_current.row, 1);
- /* Move the cursor right. */
- vte_sequence_handler_nd(terminal, match, match_quark, params);
-@@ -2529,7 +2528,7 @@ vte_sequence_handler_ue(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.underline = 0;
-+ terminal->pvt->screen->defaults.attr.underline = 0;
- return FALSE;
- }
-
-@@ -2575,7 +2574,7 @@ vte_sequence_handler_us(VteTerminal *ter
- GQuark match_quark,
- GValueArray *params)
- {
-- terminal->pvt->screen->defaults.underline = 1;
-+ terminal->pvt->screen->defaults.attr.underline = 1;
- return FALSE;
- }
-
-@@ -2673,47 +2672,47 @@ vte_sequence_handler_character_attribute
- _vte_terminal_set_default_attributes(terminal);
- break;
- case 1:
-- terminal->pvt->screen->defaults.bold = 1;
-- terminal->pvt->screen->defaults.half = 0;
-+ terminal->pvt->screen->defaults.attr.bold = 1;
-+ terminal->pvt->screen->defaults.attr.half = 0;
- break;
- case 2:
-- terminal->pvt->screen->defaults.half = 1;
-- terminal->pvt->screen->defaults.bold = 0;
-+ terminal->pvt->screen->defaults.attr.half = 1;
-+ terminal->pvt->screen->defaults.attr.bold = 0;
- break;
- case 4:
-- terminal->pvt->screen->defaults.underline = 1;
-+ terminal->pvt->screen->defaults.attr.underline = 1;
- break;
- case 5:
-- terminal->pvt->screen->defaults.blink = 1;
-+ terminal->pvt->screen->defaults.attr.blink = 1;
- break;
- case 7:
-- terminal->pvt->screen->defaults.reverse = 1;
-+ terminal->pvt->screen->defaults.attr.reverse = 1;
- break;
- case 8:
-- terminal->pvt->screen->defaults.invisible = 1;
-+ terminal->pvt->screen->defaults.attr.invisible = 1;
- break;
- case 9:
-- terminal->pvt->screen->defaults.strikethrough = 1;
-+ terminal->pvt->screen->defaults.attr.strikethrough = 1;
- break;
- case 21: /* Error in old versions of linux console. */
- case 22: /* ECMA 48. */
-- terminal->pvt->screen->defaults.bold = 0;
-- terminal->pvt->screen->defaults.half = 0;
-+ terminal->pvt->screen->defaults.attr.bold = 0;
-+ terminal->pvt->screen->defaults.attr.half = 0;
- break;
- case 24:
-- terminal->pvt->screen->defaults.underline = 0;
-+ terminal->pvt->screen->defaults.attr.underline = 0;
- break;
- case 25:
-- terminal->pvt->screen->defaults.blink = 0;
-+ terminal->pvt->screen->defaults.attr.blink = 0;
- break;
- case 27:
-- terminal->pvt->screen->defaults.reverse = 0;
-+ terminal->pvt->screen->defaults.attr.reverse = 0;
- break;
- case 28:
-- terminal->pvt->screen->defaults.invisible = 0;
-+ terminal->pvt->screen->defaults.attr.invisible = 0;
- break;
- case 29:
-- terminal->pvt->screen->defaults.strikethrough = 0;
-+ terminal->pvt->screen->defaults.attr.strikethrough = 0;
- break;
- case 30:
- case 31:
-@@ -2723,7 +2722,7 @@ vte_sequence_handler_character_attribute
- case 35:
- case 36:
- case 37:
-- terminal->pvt->screen->defaults.fore = param - 30;
-+ terminal->pvt->screen->defaults.attr.fore = param - 30;
- break;
- case 38:
- {
-@@ -2737,17 +2736,17 @@ vte_sequence_handler_character_attribute
- break;
- }
- param1 = g_value_get_long(value1);
-- terminal->pvt->screen->defaults.fore = param1;
-+ terminal->pvt->screen->defaults.attr.fore = param1;
- i += 2;
- }
- break;
- }
- case 39:
- /* default foreground, no underscore */
-- terminal->pvt->screen->defaults.fore = VTE_DEF_FG;
-+ terminal->pvt->screen->defaults.attr.fore = VTE_DEF_FG;
- /* By ECMA 48, this underline off has no business
- being here, but the Linux console specifies it. */
-- terminal->pvt->screen->defaults.underline = 0;
-+ terminal->pvt->screen->defaults.attr.underline = 0;
- break;
- case 40:
- case 41:
-@@ -2757,7 +2756,7 @@ vte_sequence_handler_character_attribute
- case 45:
- case 46:
- case 47:
-- terminal->pvt->screen->defaults.back = param - 40;
-+ terminal->pvt->screen->defaults.attr.back = param - 40;
- break;
- case 48:
- {
-@@ -2771,14 +2770,14 @@ vte_sequence_handler_character_attribute
- break;
- }
- param1 = g_value_get_long(value1);
-- terminal->pvt->screen->defaults.back = param1;
-+ terminal->pvt->screen->defaults.attr.back = param1;
- i += 2;
- }
- break;
- }
- case 49:
- /* default background */
-- terminal->pvt->screen->defaults.back = VTE_DEF_BG;
-+ terminal->pvt->screen->defaults.attr.back = VTE_DEF_BG;
- break;
- case 90:
- case 91:
-@@ -2788,7 +2787,7 @@ vte_sequence_handler_character_attribute
- case 95:
- case 96:
- case 97:
-- terminal->pvt->screen->defaults.fore = param - 90 + VTE_COLOR_BRIGHT_OFFSET;
-+ terminal->pvt->screen->defaults.attr.fore = param - 90 + VTE_COLOR_BRIGHT_OFFSET;
- break;
- case 100:
- case 101:
-@@ -2798,7 +2797,7 @@ vte_sequence_handler_character_attribute
- case 105:
- case 106:
- case 107:
-- terminal->pvt->screen->defaults.back = param - 100 + VTE_COLOR_BRIGHT_OFFSET;
-+ terminal->pvt->screen->defaults.attr.back = param - 100 + VTE_COLOR_BRIGHT_OFFSET;
- break;
- }
- }
-@@ -2807,14 +2806,14 @@ vte_sequence_handler_character_attribute
- _vte_terminal_set_default_attributes(terminal);
- }
- /* Save the new colors. */
-- terminal->pvt->screen->color_defaults.fore =
-- terminal->pvt->screen->defaults.fore;
-- terminal->pvt->screen->color_defaults.back =
-- terminal->pvt->screen->defaults.back;
-- terminal->pvt->screen->fill_defaults.fore =
-- terminal->pvt->screen->defaults.fore;
-- terminal->pvt->screen->fill_defaults.back =
-- terminal->pvt->screen->defaults.back;
-+ terminal->pvt->screen->color_defaults.attr.fore =
-+ terminal->pvt->screen->defaults.attr.fore;
-+ terminal->pvt->screen->color_defaults.attr.back =
-+ terminal->pvt->screen->defaults.attr.back;
-+ terminal->pvt->screen->fill_defaults.attr.fore =
-+ terminal->pvt->screen->defaults.attr.fore;
-+ terminal->pvt->screen->fill_defaults.attr.back =
-+ terminal->pvt->screen->defaults.attr.back;
- return FALSE;
- }
-
-@@ -2854,7 +2853,7 @@ vte_sequence_handler_clear_above_current
- }
- }
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -2894,7 +2893,7 @@ vte_sequence_handler_clear_screen(VteTer
- /* Redraw everything. */
- _vte_invalidate_all(terminal);
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -2911,15 +2910,6 @@ vte_sequence_handler_cursor_character_ab
-
- screen = terminal->pvt->screen;
-
-- /* Match xterm and fill to the end of row when moving. */
-- if (screen->fill_defaults.back != VTE_DEF_BG) {
-- VteRowData *rowdata;
-- rowdata = _vte_terminal_ensure_row (terminal);
-- vte_g_array_fill (rowdata->cells,
-- &screen->fill_defaults,
-- terminal->column_count);
-- }
--
- val = 0;
- if ((params != NULL) && (params->n_values > 0)) {
- value = g_value_array_get_nth(params, 0);
-@@ -3292,7 +3282,7 @@ vte_sequence_handler_erase_in_display(Vt
- break;
- }
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return again;
- }
-
-@@ -3337,7 +3327,7 @@ vte_sequence_handler_erase_in_line(VteTe
- break;
- }
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return again;
- }
-
-@@ -3410,7 +3400,7 @@ vte_sequence_handler_insert_lines(VteTer
- /* Adjust the scrollbars if necessary. */
- _vte_terminal_adjust_adjustments(terminal);
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_inserted_count++;
-+ terminal->pvt->text_inserted_flag = TRUE;
- return FALSE;
- }
-
-@@ -3463,7 +3453,7 @@ vte_sequence_handler_delete_lines(VteTer
- /* Adjust the scrollbars if necessary. */
- _vte_terminal_adjust_adjustments(terminal);
- /* We've modified the display. Make a note of it. */
-- terminal->pvt->text_deleted_count++;
-+ terminal->pvt->text_deleted_flag = TRUE;
- return FALSE;
- }
-
-@@ -3688,10 +3678,9 @@ vte_sequence_handler_screen_alignment_te
- }
- _vte_terminal_emit_text_deleted(terminal);
- /* Fill this row. */
-- cell = screen->basic_defaults;
- cell.c = 'E';
-- cell.columns = 1;
-- cell.empty = 0;
-+ memcpy (&cell.attr, &screen->basic_defaults.attr, sizeof (cell.attr));
-+ cell.attr.columns = 1;
- vte_g_array_fill(rowdata->cells, &cell, terminal->column_count);
- _vte_terminal_emit_text_inserted(terminal);
- }
-diff --exclude Makefile.in --exclude *.svn* -rupN ../vte-0.16.0/src/vtexft.c src/vtexft.c
---- ../vte-0.16.0/src/vtexft.c Thu Mar 8 11:47:15 2007
-+++ src/vtexft.c Fri Mar 23 12:53:52 2007
-@@ -39,8 +39,6 @@
- #define FONT_INDEX_FUDGE 1
- #define CHAR_WIDTH_FUDGE 1
-
--#define DPY_FUDGE 1
--
- /* libXft will accept runs up to 1024 glyphs before allocating a temporary
- * array. However, setting this to a large value can cause dramatic slow-downs
- * for some xservers (notably fglrx), see bug 410534.
-@@ -70,7 +68,6 @@ struct _vte_xft_data {
- Visual *visual;
- Colormap colormap;
- XftDraw *draw;
-- GC gc;
- GdkColor color;
- guint16 opacity;
- GdkPixmap *pixmap;
-@@ -344,13 +341,16 @@ static void
- _vte_xft_create (struct _vte_draw *draw, GtkWidget *widget)
- {
- struct _vte_xft_data *data;
-+
- data = g_slice_new0 (struct _vte_xft_data);
- draw->impl_data = data;
-- data->drawable = -1;
-- data->colormap = -1;
-+
- data->opacity = 0xffff;
-+
- data->xpixmap = -1;
- data->pixmapw = data->pixmaph = -1;
-+
-+ data->drawable = -1;
- }
-
- static void
-@@ -381,9 +381,6 @@ _vte_xft_destroy (struct _vte_draw *draw
- if (data->draw != NULL) {
- XftDrawDestroy (data->draw);
- }
-- if (data->gc != NULL) {
-- XFreeGC (data->display, data->gc);
-- }
- g_slice_free (struct _vte_xft_data, data);
- }
-
-@@ -402,8 +399,6 @@ _vte_xft_get_colormap (struct _vte_draw
- static void
- _vte_xft_start (struct _vte_draw *draw)
- {
-- GdkVisual *gvisual;
-- GdkColormap *gcolormap;
- GdkDrawable *drawable;
- GPtrArray *locked_fonts;
- guint i;
-@@ -411,33 +406,31 @@ _vte_xft_start (struct _vte_draw *draw)
- struct _vte_xft_data *data;
- data = (struct _vte_xft_data*) draw->impl_data;
-
-+ gdk_error_trap_push ();
-+
- gdk_window_get_internal_paint_info (draw->widget->window,
- &drawable,
- &data->x_offs,
- &data->y_offs);
--
-- data->display = gdk_x11_drawable_get_xdisplay (drawable);
-- data->drawable = gdk_x11_drawable_get_xid (drawable);
-- gvisual = gdk_drawable_get_visual (drawable);
-- data->visual = gdk_x11_visual_get_xvisual (gvisual);
-- gcolormap = gdk_drawable_get_colormap (drawable);
-- data->colormap = gdk_x11_colormap_get_xcolormap (gcolormap);
--
-- g_assert (data->display == data->font->display);
--
-- gdk_error_trap_push ();
--
-- if (data->draw != NULL) {
-- XftDrawDestroy (data->draw);
-- }
-- data->draw = XftDrawCreate (data->display, data->drawable,
-- data->visual, data->colormap);
-- if (data->gc != NULL) {
-- XFreeGC (data->display, data->gc);
-+ if (data->drawable != gdk_x11_drawable_get_xid (drawable)) {
-+ GdkVisual *gvisual;
-+ GdkColormap *gcolormap;
-+
-+ if (data->draw != NULL) {
-+ XftDrawDestroy (data->draw);
-+ }
-+ data->display = gdk_x11_drawable_get_xdisplay (drawable);
-+ data->drawable = gdk_x11_drawable_get_xid (drawable);
-+ gvisual = gdk_drawable_get_visual (drawable);
-+ data->visual = gdk_x11_visual_get_xvisual (gvisual);
-+ gcolormap = gdk_drawable_get_colormap (drawable);
-+ data->colormap = gdk_x11_colormap_get_xcolormap (gcolormap);
-+ data->draw = XftDrawCreate (data->display, data->drawable,
-+ data->visual, data->colormap);
- }
-- data->gc = XCreateGC (data->display, data->drawable, 0, NULL);
-+ g_assert (data->display == data->font->display);
-
-- locked_fonts = data->locked_fonts [(++data->cur_locked_fonts)&1];
-+ locked_fonts = data->locked_fonts [++data->cur_locked_fonts&1];
- if (locked_fonts != NULL) {
- guint cnt=0;
- for (i = 1; i < locked_fonts->len; i++) {
-@@ -457,16 +450,6 @@ _vte_xft_end (struct _vte_draw *draw)
- struct _vte_xft_data *data;
-
- data = (struct _vte_xft_data*) draw->impl_data;
-- if (data->draw != NULL) {
-- XftDrawDestroy (data->draw);
-- data->draw = NULL;
-- }
-- if (data->gc != NULL) {
-- XFreeGC (data->display, data->gc);
-- data->gc = NULL;
-- }
-- data->drawable = -1;
-- data->x_offs = data->y_offs = 0;
-
- gdk_error_trap_pop ();
- }
-@@ -479,6 +462,9 @@ _vte_xft_set_background_color (struct _v
- data = (struct _vte_xft_data*) draw->impl_data;
- data->color = *color;
- data->opacity = opacity;
-+
-+ draw->requires_clear = opacity != 0xffff
-+ || (data->pixmapw > 0 && data->pixmaph > 0);
- }
-
- static void
-@@ -505,13 +491,13 @@ _vte_xft_set_background_image (struct _v
- if (data->pixmap != NULL) {
- g_object_unref (data->pixmap);
- }
-- draw->has_background_image = FALSE;
-+ draw->requires_clear = data->opacity != 0xffff;
- data->pixmap = NULL;
- if (pixmap != NULL) {
- data->pixmap = pixmap;
- data->xpixmap = gdk_x11_drawable_get_xid (pixmap);
- gdk_drawable_get_size (pixmap, &data->pixmapw, &data->pixmaph);
-- draw->has_background_image =
-+ draw->requires_clear |=
- data->pixmapw > 0 && data->pixmaph > 0;
- }
- }
-@@ -521,25 +507,24 @@ _vte_xft_clip (struct _vte_draw *draw,
- GdkRegion *region)
- {
- struct _vte_xft_data *data = draw->impl_data;
-+ XRectangle stack_rect[16];
-+ XRectangle *xrect;
- GdkRectangle *rect;
- gint i, n;
-
- gdk_region_get_rectangles (region, &rect, &n);
-- if (n>0) {
-- XRectangle *xrect = g_new (XRectangle, n);
-- for (i = 0; i < n; i++) {
-- /* we include the offset here as XftDrawSetClipRectangles () has a
-- * byte-sex bug in its offset parameters. Bug 403159.
-- */
-- xrect[i].x = rect[i].x - data->x_offs;
-- xrect[i].y = rect[i].y - data->y_offs;
-- xrect[i].width = rect[i].width;
-- xrect[i].height = rect[i].height;
-- }
-- XftDrawSetClipRectangles (data->draw,
-- 0, 0, xrect, n);
-- g_free (xrect);
-+ xrect = n > (gint) G_N_ELEMENTS (stack_rect) ?
-+ g_new (XRectangle, n) :
-+ stack_rect;
-+ for (i = 0; i < n; i++) {
-+ xrect[i].x = rect[i].x - data->x_offs;
-+ xrect[i].y = rect[i].y - data->y_offs;
-+ xrect[i].width = rect[i].width;
-+ xrect[i].height = rect[i].height;
- }
-+ XftDrawSetClipRectangles (data->draw, 0, 0, xrect, n);
-+ if (xrect != stack_rect)
-+ g_free (xrect);
- g_free (rect);
- }
-
-@@ -551,6 +536,7 @@ _vte_xft_clear (struct _vte_draw *draw,
- XRenderColor rcolor;
- XftColor ftcolor;
- gint h, w, txstop, tystop, sx, sy, tx, ty;
-+ GC gc;
-
- data = (struct _vte_xft_data*) draw->impl_data;
-
-@@ -580,6 +566,7 @@ _vte_xft_clear (struct _vte_draw *draw,
- tystop = y + height;
-
- /* Flood fill. */
-+ gc = XCreateGC (data->display, data->drawable, 0, NULL);
- sy = (data->scrolly + y) % data->pixmaph;
- while (ty < tystop) {
- h = MIN (data->pixmaph - sy, tystop - ty);
-@@ -590,7 +577,7 @@ _vte_xft_clear (struct _vte_draw *draw,
- XCopyArea (data->display,
- data->xpixmap,
- data->drawable,
-- data->gc,
-+ gc,
- sx, sy,
- w, h,
- tx - data->x_offs, ty - data->y_offs);
-@@ -600,6 +587,7 @@ _vte_xft_clear (struct _vte_draw *draw,
- ty += h;
- sy = 0;
- }
-+ XFreeGC (data->display, gc);
- }
-
- static GPtrArray *
-@@ -791,7 +779,7 @@ _vte_xft_draw_text (struct _vte_draw *dr
- XftColor ftcolor;
- struct _vte_xft_data *data;
- gsize i, j;
-- gint width, y_off, x_off;
-+ gint width, y_off, x_off, char_width;
- XftFont *font, *ft;
- GPtrArray *locked_fonts;
-
-@@ -831,17 +819,21 @@ _vte_xft_draw_text (struct _vte_draw *dr
- * haven't pinned down yet." */
- x_off = -data->x_offs;
- y_off = draw->ascent - data->y_offs;
-+ char_width = draw->width;
- do {
- j = 0;
- do {
-+ gint next_x;
-+
- glyphs[j].glyph = XftCharIndex (data->display,
- font, requests[i].c);
- glyphs[j].x = requests[i].x + x_off;
-+ next_x = requests[i].x + requests[i].columns*char_width;
- width = _vte_xft_char_width (data->font,
- font, requests[i].c, requests[i].columns);
- if (G_UNLIKELY (width != 0)) {
-- width = requests[i].columns * draw->width - width;
-- width = CLAMP (width / 2, 0, draw->width);
-+ width = requests[i].columns*char_width - width;
-+ width = CLAMP (width / 2, 0, char_width);
- glyphs[j].x += width;
- }
- glyphs[j].y = requests[i].y + y_off;
-@@ -857,7 +849,31 @@ _vte_xft_draw_text (struct _vte_draw *dr
- }
- break;
- }
-- } while (j < MAX_RUN_LENGTH && ft == font);
-+ if (j == MAX_RUN_LENGTH || ft != font) {
-+ break;
-+ }
-+
-+ /* check to see if we've skipped over any spaces...
-+ * and reinsert them so as not to break the stream
-+ * unnecessarily - the blank space is less overhead
-+ * than starting a new sequence.
-+ */
-+ if (requests[i].y + y_off == glyphs[j-1].y) {
-+ while (next_x < requests[i].x) {
-+ glyphs[j].glyph = XftCharIndex (
-+ data->display,
-+ font,
-+ ' ');
-+ glyphs[j].x = next_x + x_off;
-+ glyphs[j].y = glyphs[j-1].y;
-+ if (++j == MAX_RUN_LENGTH) {
-+ goto draw;
-+ }
-+ next_x += char_width;
-+ }
-+ }
-+ } while (TRUE);
-+draw:
- XftDrawGlyphSpec (data->draw, &ftcolor, font, glyphs, j);
- font = ft;
- } while (i < n_requests);