allow specifying the scrollback buffer size. if we don't have <wchar.h>,
authorNalin Dahyabhai <nalin@src.gnome.org>
Thu, 10 Oct 2002 16:57:30 +0000 (16:57 +0000)
committerNalin Dahyabhai <nalin@src.gnome.org>
Thu, 10 Oct 2002 16:57:30 +0000 (16:57 +0000)
* src/vteapp.c, python/vte-demo.py: allow specifying the scrollback buffer size.
* src/vte.c: if we don't have <wchar.h>, typedef wchar_t as a gunichar, not a
long.
* src/buffer.c, src/buffer.h: add.
* src/interpret.c, src/vte.c: use _vte_buffer structures instead of char arrays
with separate lengths.  Use a scratch buffer for holding the results of
conversions.
* src/vte.c: separate the pango and pangox drawing paths so that they're easier
to tweak and compare to each other.
* src/vte.c: ditch the smooth scrolling change, which won't work right anyway
(expose events don't get processed until after we finish processing a
chunk of data unless we explicitly request it, so using a bbox is both
simpler and faster).  Use a mask when creating the cursor we use for
hiding the cursor.
* vte.spec, gnome-pty-helper/Makefile.am: install gnome-pty-helper into the
libexecdir, not pkglibdir (#95085).
* src/vte.c: obey smooth/jump scrolling options, default is jump scroll.
* src/vte.c (vte_font_match): Fix over-aggressive Xft => Fc conversion - need
to call XftDefaultSubstitute to pick up Xft X resources, not
FcDefaultSubstitute.  From otaylor.

17 files changed:
ChangeLog
gnome-pty-helper/Makefile.am
gnome-pty-helper/README
po/cs.po
po/da.po
po/de.po
po/fr.po
po/nl.po
po/no.po
po/pt_BR.po
po/sv.po
po/vi.po
python/vte-demo.py
src/Makefile.am
src/vte.c
src/vteapp.c
vte.spec

index d701397..0522eac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,32 @@
+2002-10-10 nalin
+       * src/vteapp.c, python/vte-demo.py: allow specifying the scrollback
+       buffer size.
+       * src/vte.c: if we don't have <wchar.h>, typedef wchar_t as a gunichar,
+       not a long.
+
+2002-10-09 nalin
+       * src/buffer.c, src/buffer.h: add.
+       * src/interpret.c, src/vte.c: use _vte_buffer structures instead of
+       char arrays with separate lengths.  Use a scratch buffer for holding
+       the results of conversions.
+       * src/vte.c: separate the pango and pangox drawing paths so that they're
+       easier to tweak and compare to each other.
+       * src/vte.c: ditch the smooth scrolling change, which won't work right
+       anyway (expose events don't get processed until after we finish
+       processing a chunk of data unless we explicitly request it, so using a
+       bbox is both simpler and faster).  Use a mask when creating the cursor
+       we use for hiding the cursor.
+
+2002-10-09 nalin
+       * vte.spec, gnome-pty-helper/Makefile.am: install gnome-pty-helper into
+       the libexecdir, not pkglibdir (#95085).
+       * src/vte.c: obey smooth/jump scrolling options, default is jump scroll.
+
+Mon Oct  7 14:53:12 2002  Owen Taylor  <otaylor@redhat.com>
+       * src/vte.c (vte_font_match): Fix over-aggressive 
+       Xft => Fc conversion - need to call XftDefaultSubstitute to pick up Xft
+       X resources, not FcDefaultSubstitute.
+
 2002-10-01  Stanislav Brabec  <sbrabec@suse.cz>
 
        * configure.in: Added cs to ALL_LINGUAS.
index 0094ec3..57cdd7e 100644 (file)
@@ -1,5 +1,4 @@
-vtelibdir = $(libdir)/vte
-vtelib_PROGRAMS = gnome-pty-helper
+libexec_PROGRAMS = gnome-pty-helper
 
 CFLAGS = @CFLAGS@ @GLIB_CFLAGS@
 LDFLAGS = @LDFLAGS@ @GLIB_LIBS@
index a78b57e..b760129 100644 (file)
@@ -1,7 +1,6 @@
 This is some bits from libzvt CVS extracted to make a more-or-less standalone
-gnome-pty-helper kit (except for the default installation directory being
-hard-coded to ${libdir}/vte).  Presumably it is licensed under the LGPL, as
-libzvt itself is.
+gnome-pty-helper kit.  Presumably it is licensed under the LGPL, as libzvt
+itself is.
 
 Note that for utmp/wtmp/lastlog logging to work properly, you *must* ensure
 that gnome-pty-helper is installed with the correct permissions.  By default,
index 1263ba5..063e517 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: vte VERSION\n"
-"POT-Creation-Date: 2002-09-23 04:42+0200\n"
+"POT-Creation-Date: 2002-10-10 11:57-0400\n"
 "PO-Revision-Date: 2002-09-27 00:18+0200\n"
 "Last-Translator: Miloslav Trmac <mitr@volny.cz>\n"
 "Language-Team: Czech <cs@li.org>\n"
@@ -27,71 +27,71 @@ msgstr "Chyba při vytváření signálové roury."
 msgid "Duplicate (%s/%s)!"
 msgstr "Duplikát (%s/%s)!"
 
-#: src/vte.c:1176
+#: src/vte.c:1194
 #, c-format
 msgid "Error compiling regular expression \"%s\"."
 msgstr "Chyba při kompilaci regulárního výrazu \"%s\"."
 
-#: src/vte.c:1646 src/vte.c:1655 src/vte.c:1667 src/vte.c:1685 src/vte.c:1690
-#: src/vte.c:1695
+#: src/vte.c:1664 src/vte.c:1673 src/vte.c:1685 src/vte.c:1703 src/vte.c:1708
+#: src/vte.c:1713
 #, c-format
 msgid "Unable to convert characters from %s to %s."
 msgstr "Nemohu konvertovat znaky z %s do %s."
 
-#: src/vte.c:4894
+#: src/vte.c:4922
 #, c-format
 msgid "Got unexpected (key?) sequence `%s'."
 msgstr "Dostal jsem neočekávanou sekvenci (kláves?) `%s'."
 
-#: src/vte.c:5680
+#: src/vte.c:5705
 #, c-format
 msgid "Character 0x%x is undefined, allocating one column."
 msgstr "Znak 0x%x je nedefinovaný, alokuji jeden sloupec."
 
-#: src/vte.c:5878
+#: src/vte.c:5903
 #, c-format
 msgid "No handler for control sequence `%s' defined."
 msgstr "Nedefinována žádná obsluha pro řídicí sekvenci `%s'."
 
-#: src/vte.c:6519
+#: src/vte.c:6507
 #, c-format
 msgid "Error reading from child: %s."
 msgstr "Chyba při čtení od potomka: %s."
 
-#: src/vte.c:6709
+#: src/vte.c:6671
 #, c-format
 msgid "Error (%s) converting data for child, dropping."
 msgstr "Chyba (%s) při konverzi dat pro potomka, zahazuji je."
 
-#: src/vte.c:8781
+#: src/vte.c:8743
 #, c-format
 msgid "Using fontset \"%s\", which is missing these character sets: %s."
 msgstr "Používám sadu písem \"%s\", které chybí tyto sady znaků: %s."
 
-#: src/vte.c:9321
+#: src/vte.c:9283
 #, c-format
 msgid "Failed to load Xft font pattern \"%s\", falling back to default font."
 msgstr "Nemohu načíst vzor písma Xft \"%s\", používám implicitní písmo."
 
-#: src/vte.c:9333
+#: src/vte.c:9295
 msgid "Failed to load default Xft font."
 msgstr "Nemohu načíst implicitní písmo Xft."
 
-#: src/vte.c:9426
+#: src/vte.c:9388
 #, c-format
 msgid "Failed to load font set \"%s\", falling back to default font."
 msgstr "Nemohu načíst sadu písem \"%s\", používám implicitní písmo."
 
-#: src/vte.c:9438
+#: src/vte.c:9400
 msgid "Failed to load default font, crashing or behaving abnormally."
 msgstr "Nemohu načíst implicitní písmo, padám nebo se chovám nenormálně."
 
-#: src/vte.c:9700
+#: src/vte.c:9663
 #, c-format
 msgid "Error reading PTY size, using defaults: %s."
 msgstr "Chyba při čtení velikosti PTY, používám implicitní: %s."
 
-#: src/vte.c:9736
+#: src/vte.c:9699
 #, c-format
 msgid "Error setting PTY size: %s."
 msgstr "Chyba při nastavování velikosti PTY: %s."
@@ -100,15 +100,15 @@ msgstr "Chyba při nastavování velikosti PTY: %s."
 msgid "Error allocating draw, disabling Xft."
 msgstr "Chyba při alokaci kreslení, zakazuji Xft."
 
-#: src/vte.c:12256
+#: src/vte.c:12257
 msgid "Error allocating context, disabling Pango."
 msgstr "Chyba při alokaci kontextu, zakazuji Pango."
 
-#: src/vte.c:12262
+#: src/vte.c:12263
 msgid "Error allocating layout, disabling Pango."
 msgstr "Chyba při alokaci rozložení, zakazuji Pango."
 
 #. Aaargh.  We're screwed.
-#: src/vte.c:13713
+#: src/vte.c:13719
 msgid "g_iconv_open() failed setting word characters"
 msgstr "g_iconv_open() selhal při nastavování znaků slova"
index 2e00bf3..d73105a 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: vte\n"
-"POT-Creation-Date: 2002-09-11 00:56-0400\n"
+"POT-Creation-Date: 2002-10-10 11:57-0400\n"
 "PO-Revision-Date: 2002-08-13 22:12+0200\n"
 "Last-Translator: Ole Laursen <olau@hardworking.dk>\n"
 "Language-Team: Danish <dansk@klid.dk>\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/pty.c:106
+#: src/pty.c:113
 #, c-format
 msgid "Error adding `%s' to environment, continuing."
 msgstr "Fejl ved tilføjelse af '%s' til miljøet, fortsætter."
@@ -28,95 +28,95 @@ msgstr "Fejl ved oprettelse af signaldatakanal."
 msgid "Duplicate (%s/%s)!"
 msgstr "Optræder mere end én gang (%s/%s)!"
 
-#: src/vte.c:1175
+#: src/vte.c:1194
 #, c-format
 msgid "Error compiling regular expression \"%s\"."
 msgstr "Fejl ved oversættelse af regulært udtryk \"%s\"."
 
-#: src/vte.c:1645 src/vte.c:1654 src/vte.c:1666 src/vte.c:1684 src/vte.c:1689
-#: src/vte.c:1694
+#: src/vte.c:1664 src/vte.c:1673 src/vte.c:1685 src/vte.c:1703 src/vte.c:1708
+#: src/vte.c:1713
 #, c-format
 msgid "Unable to convert characters from %s to %s."
 msgstr "Kunne ikke konvertere tegn fra %s til %s."
 
-#: src/vte.c:4893
+#: src/vte.c:4922
 #, c-format
 msgid "Got unexpected (key?) sequence `%s'."
 msgstr "Modtog uventet (taste-?) sekvens '%s'."
 
-#: src/vte.c:5679
+#: src/vte.c:5705
 #, c-format
 msgid "Character 0x%x is undefined, allocating one column."
 msgstr "Tegn 0x%x er ikke defineret, allokerer en kolonne."
 
-#: src/vte.c:5873
+#: src/vte.c:5903
 #, c-format
 msgid "No handler for control sequence `%s' defined."
 msgstr "Ingen håndtering for kontrolsekvensen '%s' er defineret."
 
-#: src/vte.c:6483
+#: src/vte.c:6507
 #, c-format
 msgid "Error reading from child: %s."
 msgstr "Fejl ved læsning fra underproces: %s."
 
-#: src/vte.c:6673
+#: src/vte.c:6671
 #, c-format
 msgid "Error (%s) converting data for child, dropping."
 msgstr "Fejl (%s) ved konvertering af data for underproces, dropper."
 
-#: src/vte.c:8745
+#: src/vte.c:8743
 #, c-format
 msgid "Using fontset \"%s\", which is missing these character sets: %s."
 msgstr "Bruger skrifttypesættet \"%s\" som mangler disse tegnsæt: %s."
 
-#: src/vte.c:9285
+#: src/vte.c:9283
 #, c-format
 msgid "Failed to load Xft font pattern \"%s\", falling back to default font."
 msgstr ""
 "Kunne ikke indlæse Xft-skrifttypemønstret \"%s\", falder tilbage til "
 "standardskrifttypen."
 
-#: src/vte.c:9297
+#: src/vte.c:9295
 msgid "Failed to load default Xft font."
 msgstr "Kunne ikke indlæse standard-Xft-skrifttypen."
 
-#: src/vte.c:9390
+#: src/vte.c:9388
 #, c-format
 msgid "Failed to load font set \"%s\", falling back to default font."
 msgstr ""
 "Kunne ikke indlæse skrifttypesættet \"%s\", falder tilbage til "
 "standardskrifttypen."
 
-#: src/vte.c:9402
+#: src/vte.c:9400
 msgid "Failed to load default font, crashing or behaving abnormally."
 msgstr ""
 "Kunne ikke indlæse standardskrifttypen; vil nu gå ned eller udvise anormal "
 "adfærd."
 
-#: src/vte.c:9664
+#: src/vte.c:9663
 #, c-format
 msgid "Error reading PTY size, using defaults: %s."
 msgstr "Fejl ved indlæsning af PTY-størrelse, bruger standardværdier: %s."
 
-#: src/vte.c:9700
+#: src/vte.c:9699
 #, c-format
 msgid "Error setting PTY size: %s."
 msgstr "Fejl ved angivelse af PTY-størrelse: %s."
 
-#: src/vte.c:12205
+#: src/vte.c:12249
 msgid "Error allocating draw, disabling Xft."
 msgstr "Fejl ved allokering af tegning, deaktiverer Xft."
 
-#: src/vte.c:12212
+#: src/vte.c:12257
 msgid "Error allocating context, disabling Pango."
 msgstr "Fejl ved allokering af kontekst, deaktiverer Pango."
 
-#: src/vte.c:12218
+#: src/vte.c:12263
 msgid "Error allocating layout, disabling Pango."
 msgstr "Fejl ved allokering af layout, deaktiverer Pango."
 
 #. Aaargh.  We're screwed.
-#: src/vte.c:13669
+#: src/vte.c:13719
 msgid "g_iconv_open() failed setting word characters"
 msgstr "g_iconv_open() kunne ikke angive ordtegn"
 
index 2b0413a..0e71930 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: vte HEAD\n"
-"POT-Creation-Date: 2002-09-11 00:56-0400\n"
+"POT-Creation-Date: 2002-10-10 11:57-0400\n"
 "PO-Revision-Date: 2002-08-07 18:12+0100\n"
 "Last-Translator: Christian Neumair <christian-neumair@web.de>\n"
 "Language-Team: German <gnome-de@gnome.org>\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/pty.c:106
+#: src/pty.c:113
 #, c-format
 msgid "Error adding `%s' to environment, continuing."
 msgstr "Fehler beim Hinzufügen von »%s« zur Umgebung, fortfahren."
@@ -28,96 +28,96 @@ msgstr "Fehler beim Erstellen der Signalweiterleitung."
 msgid "Duplicate (%s/%s)!"
 msgstr "Duplikat (%s/%s)!"
 
-#: src/vte.c:1175
+#: src/vte.c:1194
 #, c-format
 msgid "Error compiling regular expression \"%s\"."
 msgstr "Fehler beim Kompilieren des regulären Ausdrucks »%s«."
 
-#: src/vte.c:1645 src/vte.c:1654 src/vte.c:1666 src/vte.c:1684 src/vte.c:1689
-#: src/vte.c:1694
+#: src/vte.c:1664 src/vte.c:1673 src/vte.c:1685 src/vte.c:1703 src/vte.c:1708
+#: src/vte.c:1713
 #, c-format
 msgid "Unable to convert characters from %s to %s."
 msgstr "Zeichen konnten nicht von %s nach %s konvertiert werden."
 
-#: src/vte.c:4893
+#: src/vte.c:4922
 #, c-format
 msgid "Got unexpected (key?) sequence `%s'."
 msgstr "Unerwartete (Schlüssel?)-Sequenz »%s« erhalten."
 
-#: src/vte.c:5679
+#: src/vte.c:5705
 #, c-format
 msgid "Character 0x%x is undefined, allocating one column."
 msgstr "Zeichen 0x%x ist undefiniert, eine Spalte wird zugewiesen."
 
-#: src/vte.c:5873
+#: src/vte.c:5903
 #, c-format
 msgid "No handler for control sequence `%s' defined."
 msgstr "Kein Handler für Kontrollsequenz »%s« definiert."
 
-#: src/vte.c:6483
+#: src/vte.c:6507
 #, c-format
 msgid "Error reading from child: %s."
 msgstr "Fehler beim Lesen von Kind: %s."
 
-#: src/vte.c:6673
+#: src/vte.c:6671
 #, c-format
 msgid "Error (%s) converting data for child, dropping."
 msgstr "Fehler (%s) beim Konvertieren der Daten für Kind, wird abgebrochen."
 
-#: src/vte.c:8745
+#: src/vte.c:8743
 #, c-format
 msgid "Using fontset \"%s\", which is missing these character sets: %s."
 msgstr ""
 "Schriftsatz »%s« wird verwendet, welchem folgende Zeichensätze fehlen: %s."
 
-#: src/vte.c:9285
+#: src/vte.c:9283
 #, c-format
 msgid "Failed to load Xft font pattern \"%s\", falling back to default font."
 msgstr ""
 "Laden des Xft-Schriftmusters »%s« fehlgeschlagen, Rückfall zur vorgegebenen "
 "Schrift."
 
-#: src/vte.c:9297
+#: src/vte.c:9295
 msgid "Failed to load default Xft font."
 msgstr "Laden der vorgegebenen Xft-Schrift fehlgeschlagen"
 
-#: src/vte.c:9390
+#: src/vte.c:9388
 #, c-format
 msgid "Failed to load font set \"%s\", falling back to default font."
 msgstr ""
 "Laden des Schriftsatzes »%s« fehlgeschlagen, Rückfall zur vorgegebenen "
 "Schrift."
 
-#: src/vte.c:9402
+#: src/vte.c:9400
 msgid "Failed to load default font, crashing or behaving abnormally."
 msgstr ""
 "Laden der vorgebenen Schrift fehlgeschlagen, Absturz oder abnormales "
 "Verhalten."
 
-#: src/vte.c:9664
+#: src/vte.c:9663
 #, c-format
 msgid "Error reading PTY size, using defaults: %s."
 msgstr "Fehler beim Lesen der PTY-Größe, Vorgaben werden verwendet: %s."
 
-#: src/vte.c:9700
+#: src/vte.c:9699
 #, c-format
 msgid "Error setting PTY size: %s."
 msgstr "Fehler beim Festlegen der PTY-Größe: %s."
 
-#: src/vte.c:12205
+#: src/vte.c:12249
 msgid "Error allocating draw, disabling Xft."
 msgstr "Fehler beim Zuweisen der Zeichnung, Xft wird deaktiviert."
 
-#: src/vte.c:12212
+#: src/vte.c:12257
 msgid "Error allocating context, disabling Pango."
 msgstr "Fehler beim Zuweisen des Kontextes, Pango wird deaktiviert."
 
-#: src/vte.c:12218
+#: src/vte.c:12263
 msgid "Error allocating layout, disabling Pango."
 msgstr "Fehler beim Zuweisen des Layouts, Pango wird deaktiviert."
 
 #. Aaargh.  We're screwed.
-#: src/vte.c:13669
+#: src/vte.c:13719
 msgid "g_iconv_open() failed setting word characters"
 msgstr "g_iconv_open() konnte die Zeichen des Wortes nicht festlegen"
 
index 0dfedf3..258feda 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: vte 0.7.0\n"
-"POT-Creation-Date: 2002-09-11 00:56-0400\n"
+"POT-Creation-Date: 2002-10-10 11:57-0400\n"
 "PO-Revision-Date: 2002-08-02 12:01+0200\n"
 "Last-Translator: Laurent RICHARD <kouran@iespana.es>\n"
 "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/pty.c:106
+#: src/pty.c:113
 #, c-format
 msgid "Error adding `%s' to environment, continuing."
 msgstr "Erreur lors de l'ajout de « %s » à l'environnement, ignore."
@@ -27,98 +27,98 @@ msgstr "Erreur lors de la création du signal de tube."
 msgid "Duplicate (%s/%s)!"
 msgstr "Dupliquer (%s/%s) ! "
 
-#: src/vte.c:1175
+#: src/vte.c:1194
 #, c-format
 msgid "Error compiling regular expression \"%s\"."
 msgstr "Erreur lors de la compilation de l'expression régulière « %s »."
 
-#: src/vte.c:1645 src/vte.c:1654 src/vte.c:1666 src/vte.c:1684 src/vte.c:1689
-#: src/vte.c:1694
+#: src/vte.c:1664 src/vte.c:1673 src/vte.c:1685 src/vte.c:1703 src/vte.c:1708
+#: src/vte.c:1713
 #, c-format
 msgid "Unable to convert characters from %s to %s."
 msgstr "Impossible de convertir les caractères %s en %s."
 
-#: src/vte.c:4893
+#: src/vte.c:4922
 #, c-format
 msgid "Got unexpected (key?) sequence `%s'."
 msgstr "Séquence (clé ?) imprévue « %s »."
 
-#: src/vte.c:5679
+#: src/vte.c:5705
 #, c-format
 msgid "Character 0x%x is undefined, allocating one column."
 msgstr "Caractère 0x%x non défini, attribution d'une colonne."
 
-#: src/vte.c:5873
+#: src/vte.c:5903
 #, c-format
 msgid "No handler for control sequence `%s' defined."
 msgstr "Pas de manipulation définie pour la séquence de contrôle « %s »."
 
-#: src/vte.c:6483
+#: src/vte.c:6507
 #, c-format
 msgid "Error reading from child: %s."
 msgstr "Erreur lors de la lecture du fils : « %s »."
 
-#: src/vte.c:6673
+#: src/vte.c:6671
 #, c-format
 msgid "Error (%s) converting data for child, dropping."
 msgstr "Erreur (%s) lors de la conversion de données pour le fils, abandon."
 
-#: src/vte.c:8745
+#: src/vte.c:8743
 #, fuzzy, c-format
 msgid "Using fontset \"%s\", which is missing these character sets: %s."
 msgstr ""
 "Avertissement : utilisation de la police de caractère « %s » dans lequel ces "
 "caractères sont manquants : %s. "
 
-#: src/vte.c:9285
+#: src/vte.c:9283
 #, c-format
 msgid "Failed to load Xft font pattern \"%s\", falling back to default font."
 msgstr ""
 "Échec du chargement du modèle de police Xft « %s », utilisation de la police "
 "par défaut."
 
-#: src/vte.c:9297
+#: src/vte.c:9295
 msgid "Failed to load default Xft font."
 msgstr "Échec du chargement la police Xft par défaut."
 
-#: src/vte.c:9390
+#: src/vte.c:9388
 #, c-format
 msgid "Failed to load font set \"%s\", falling back to default font."
 msgstr ""
 "Échec du chargement du jeu de police « %s », utilisation de la police par "
 "défaut."
 
-#: src/vte.c:9402
+#: src/vte.c:9400
 msgid "Failed to load default font, crashing or behaving abnormally."
 msgstr ""
 "Échec du chargement de la police par défaut, crash ou comportement anormal."
 
-#: src/vte.c:9664
+#: src/vte.c:9663
 #, c-format
 msgid "Error reading PTY size, using defaults: %s."
 msgstr ""
 "Erreur lors de la lecture de la taille PTY, utilisation par défaut : %s."
 
-#: src/vte.c:9700
+#: src/vte.c:9699
 #, c-format
 msgid "Error setting PTY size: %s."
 msgstr "Erreur lors du paramètrage de la taille PTY : « %s »."
 
-#: src/vte.c:12205
+#: src/vte.c:12249
 msgid "Error allocating draw, disabling Xft."
 msgstr "Erreur lors de l'attribution du dessin, désactivation de Xft."
 
-#: src/vte.c:12212
+#: src/vte.c:12257
 msgid "Error allocating context, disabling Pango."
 msgstr "Erreur lors de l'attribution du contexte, désactivation de Pango."
 
-#: src/vte.c:12218
+#: src/vte.c:12263
 msgid "Error allocating layout, disabling Pango."
 msgstr ""
 "Erreur lors de l'attribution de la disposition, désactivation de Pango."
 
 #. Aaargh.  We're screwed.
-#: src/vte.c:13669
+#: src/vte.c:13719
 msgid "g_iconv_open() failed setting word characters"
 msgstr "g_iconv_open() a échoué dans le paramètrage des caractères."
 
index 65552ab..9059507 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: vte\n"
-"POT-Creation-Date: 2002-09-11 00:56-0400\n"
+"POT-Creation-Date: 2002-10-10 11:57-0400\n"
 "PO-Revision-Date: 2002-08-08 20:09+0200\n"
 "Last-Translator: Taco Witte <T.C.Witte@phys.uu.nl>\n"
 "Language-Team: Dutch <vertaling@nl.linux.org>\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/pty.c:106
+#: src/pty.c:113
 #, c-format
 msgid "Error adding `%s' to environment, continuing."
 msgstr "Fout bij toevoegen `%s' aan omgeving. Doorgaan.."
@@ -27,97 +27,97 @@ msgstr "Fout bij maken signaal pijp."
 msgid "Duplicate (%s/%s)!"
 msgstr "Dupliceren (%s/%s)!"
 
-#: src/vte.c:1175
+#: src/vte.c:1194
 #, c-format
 msgid "Error compiling regular expression \"%s\"."
 msgstr "Fout bij samenstellen reguliere uitdrukking \"%s\"."
 
-#: src/vte.c:1645 src/vte.c:1654 src/vte.c:1666 src/vte.c:1684 src/vte.c:1689
-#: src/vte.c:1694
+#: src/vte.c:1664 src/vte.c:1673 src/vte.c:1685 src/vte.c:1703 src/vte.c:1708
+#: src/vte.c:1713
 #, c-format
 msgid "Unable to convert characters from %s to %s."
 msgstr "Kan tekens niet converteren van %s naar %s."
 
-#: src/vte.c:4893
+#: src/vte.c:4922
 #, fuzzy, c-format
 msgid "Got unexpected (key?) sequence `%s'."
 msgstr "Ontvangen: onverwachte (toetsenbord?) combinatie `%s'."
 
-#: src/vte.c:5679
+#: src/vte.c:5705
 #, c-format
 msgid "Character 0x%x is undefined, allocating one column."
 msgstr "Teken 0x%x is ongedefinieerd, wijs één kolom toe."
 
-#: src/vte.c:5873
+#: src/vte.c:5903
 #, fuzzy, c-format
 msgid "No handler for control sequence `%s' defined."
 msgstr "Geen afhandelaar voor controle combinatie `%s' gedefinieerd."
 
-#: src/vte.c:6483
+#: src/vte.c:6507
 #, c-format
 msgid "Error reading from child: %s."
 msgstr "Fout bij lezen van kind: %s."
 
-#: src/vte.c:6673
+#: src/vte.c:6671
 #, c-format
 msgid "Error (%s) converting data for child, dropping."
 msgstr "Fout (%s) bij converteren gegevens voor kind, laat het vallen."
 
-#: src/vte.c:8745
+#: src/vte.c:8743
 #, c-format
 msgid "Using fontset \"%s\", which is missing these character sets: %s."
 msgstr ""
 "Lettertype verzameling \"%s\" wordt gebruikt, maar die mist deze tekensets: %"
 "s."
 
-#: src/vte.c:9285
+#: src/vte.c:9283
 #, c-format
 msgid "Failed to load Xft font pattern \"%s\", falling back to default font."
 msgstr ""
 "Laden Xft lettertype patroon \"%s\" mislukt, val terug op standaard "
 "lettertype."
 
-#: src/vte.c:9297
+#: src/vte.c:9295
 msgid "Failed to load default Xft font."
 msgstr "Laden standaard Xft lettertype mislukt."
 
-#: src/vte.c:9390
+#: src/vte.c:9388
 #, c-format
 msgid "Failed to load font set \"%s\", falling back to default font."
 msgstr ""
 "Fout bij laden lettertype verzameling \"%s\", val terug op standaard "
 "lettertype."
 
-#: src/vte.c:9402
+#: src/vte.c:9400
 msgid "Failed to load default font, crashing or behaving abnormally."
 msgstr ""
 "Fout bij laden standaard lettertype, loop vast of gedraag mezelf abnormaal."
 
-#: src/vte.c:9664
+#: src/vte.c:9663
 #, c-format
 msgid "Error reading PTY size, using defaults: %s."
 msgstr "Fout bij lezen PTY grootte, gebruik standaardwaarden: %s."
 
-#: src/vte.c:9700
+#: src/vte.c:9699
 #, c-format
 msgid "Error setting PTY size: %s."
 msgstr "Fout bij instellen PTY grootte: %s."
 
-#: src/vte.c:12205
+#: src/vte.c:12249
 msgid "Error allocating draw, disabling Xft."
 msgstr "Fout bij toewijzen tekenen, zet Xft uit."
 
-#: src/vte.c:12212
+#: src/vte.c:12257
 msgid "Error allocating context, disabling Pango."
 msgstr "Fout bij toewijzen context, zet Pango uit."
 
-#: src/vte.c:12218
+#: src/vte.c:12263
 #, fuzzy
 msgid "Error allocating layout, disabling Pango."
 msgstr "Fout bij toewijzen layout, zet Pango uit."
 
 #. Aaargh.  We're screwed.
-#: src/vte.c:13669
+#: src/vte.c:13719
 msgid "g_iconv_open() failed setting word characters"
 msgstr "g_iconv_open() niet geslaagd in instellen woordtekens"
 
index f1b0431..1f52926 100644 (file)
--- a/po/no.po
+++ b/po/no.po
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: vte 0.5\n"
-"POT-Creation-Date: 2002-10-05 22:53+0200\n"
+"POT-Creation-Date: 2002-10-10 11:57-0400\n"
 "PO-Revision-Date: 2002-08-25 01:11+0200\n"
 "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
 "Language-Team: Norwegian <no@li.org>\n"
@@ -27,90 +27,90 @@ msgstr "Feil ved oppretting av signalrør."
 msgid "Duplicate (%s/%s)!"
 msgstr "Duplikat (%s/%s)!"
 
-#: src/vte.c:1176
+#: src/vte.c:1194
 #, c-format
 msgid "Error compiling regular expression \"%s\"."
 msgstr "Feil under sammensetting av regulært uttrykk «%s»."
 
-#: src/vte.c:1646 src/vte.c:1655 src/vte.c:1667 src/vte.c:1685 src/vte.c:1690
-#: src/vte.c:1695
+#: src/vte.c:1664 src/vte.c:1673 src/vte.c:1685 src/vte.c:1703 src/vte.c:1708
+#: src/vte.c:1713
 #, c-format
 msgid "Unable to convert characters from %s to %s."
 msgstr "Kan ikke konvertere tegn fra %s til %s."
 
-#: src/vte.c:4894
+#: src/vte.c:4922
 #, c-format
 msgid "Got unexpected (key?) sequence `%s'."
 msgstr "Mottok uventet (nøkkel?) sekvens «%s»."
 
-#: src/vte.c:5680
+#: src/vte.c:5705
 #, c-format
 msgid "Character 0x%x is undefined, allocating one column."
 msgstr "Tegnet 0x%x er udefinert. Allokerer én kolonne."
 
-#: src/vte.c:5878
+#: src/vte.c:5903
 #, c-format
 msgid "No handler for control sequence `%s' defined."
 msgstr "Ingen håndterer definert for kontrollsekvens «%s»."
 
-#: src/vte.c:6519
+#: src/vte.c:6507
 #, c-format
 msgid "Error reading from child: %s."
 msgstr "Feil under lesing fra underprosess: %s."
 
-#: src/vte.c:6709
+#: src/vte.c:6671
 #, c-format
 msgid "Error (%s) converting data for child, dropping."
 msgstr "Feil (%s) ved konvertering av data for underprosess. Hopper over."
 
-#: src/vte.c:8787
+#: src/vte.c:8743
 #, c-format
 msgid "Using fontset \"%s\", which is missing these character sets: %s."
 msgstr "Bruker fontset «%s» som mangler disse tegnsettene: %s"
 
-#: src/vte.c:9327
+#: src/vte.c:9283
 #, c-format
 msgid "Failed to load Xft font pattern \"%s\", falling back to default font."
 msgstr "Feil under lasting av Xft-skriftmønster «%s». Bruker forvalgt skrift."
 
-#: src/vte.c:9339
+#: src/vte.c:9295
 msgid "Failed to load default Xft font."
 msgstr "Feil under lasting av forvalgt Xft-skrift."
 
-#: src/vte.c:9432
+#: src/vte.c:9388
 #, c-format
 msgid "Failed to load font set \"%s\", falling back to default font."
 msgstr "Feil under lasting av fontset «%s». Bruker forvalgt skrift."
 
-#: src/vte.c:9444
+#: src/vte.c:9400
 msgid "Failed to load default font, crashing or behaving abnormally."
 msgstr ""
 "Feil under lasting av forvalgt skrift. Krasj eller abnormal oppførsel kan "
 "ventes."
 
-#: src/vte.c:9706
+#: src/vte.c:9663
 #, c-format
 msgid "Error reading PTY size, using defaults: %s."
 msgstr "Feil under lesing av PTY-størrelse. Bruker forvalg: %s."
 
-#: src/vte.c:9742
+#: src/vte.c:9699
 #, c-format
 msgid "Error setting PTY size: %s."
 msgstr "Feil under setting av PTY-størrelse: %s."
 
-#: src/vte.c:12255
+#: src/vte.c:12249
 msgid "Error allocating draw, disabling Xft."
 msgstr "Feil under allokering av tegning. Deaktiverer Xft."
 
-#: src/vte.c:12262
+#: src/vte.c:12257
 msgid "Error allocating context, disabling Pango."
 msgstr "Feil under allokering av kontekst. Deaktiverer Pango."
 
-#: src/vte.c:12268
+#: src/vte.c:12263
 msgid "Error allocating layout, disabling Pango."
 msgstr "Feil under allokering av «layout». Deaktiverer Pango."
 
 #. Aaargh.  We're screwed.
-#: src/vte.c:13725
+#: src/vte.c:13719
 msgid "g_iconv_open() failed setting word characters"
 msgstr "g_iconv_open() feilet ved setting av ord-tegn"
index 74ecc2f..5ccd4c5 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: 2.0\n"
-"POT-Creation-Date: 2002-09-11 00:56-0400\n"
+"POT-Creation-Date: 2002-10-10 11:57-0400\n"
 "PO-Revision-Date: 2002-08-28 18:13-0300\n"
 "Last-Translator: Alexandre Folle de Menezes <afmenez@terra.com.br>\n"
 "Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/pty.c:106
+#: src/pty.c:113
 #, c-format
 msgid "Error adding `%s' to environment, continuing."
 msgstr "Erro ao adicionar `%s' ao ambiente, continuando."
@@ -28,90 +28,90 @@ msgstr "Erro criando o pipe de sinais."
 msgid "Duplicate (%s/%s)!"
 msgstr "Duplicata (%s/%s)!"
 
-#: src/vte.c:1175
+#: src/vte.c:1194
 #, c-format
 msgid "Error compiling regular expression \"%s\"."
 msgstr "Erro compilando a expressão regular \"%s\"."
 
-#: src/vte.c:1645 src/vte.c:1654 src/vte.c:1666 src/vte.c:1684 src/vte.c:1689
-#: src/vte.c:1694
+#: src/vte.c:1664 src/vte.c:1673 src/vte.c:1685 src/vte.c:1703 src/vte.c:1708
+#: src/vte.c:1713
 #, c-format
 msgid "Unable to convert characters from %s to %s."
 msgstr "Incapaz de converter caracteres de %s para %s."
 
-#: src/vte.c:4893
+#: src/vte.c:4922
 #, c-format
 msgid "Got unexpected (key?) sequence `%s'."
 msgstr "Seqüência (chave?) `%s' inesperada."
 
-#: src/vte.c:5679
+#: src/vte.c:5705
 #, c-format
 msgid "Character 0x%x is undefined, allocating one column."
 msgstr "O caracter 0x%x é indefinido, alocando uma coluna."
 
-#: src/vte.c:5873
+#: src/vte.c:5903
 #, c-format
 msgid "No handler for control sequence `%s' defined."
 msgstr "Nenhum manipulador para seqüência de controle `%s' foi definido."
 
-#: src/vte.c:6483
+#: src/vte.c:6507
 #, c-format
 msgid "Error reading from child: %s."
 msgstr "Erro lendo do filho:  %s."
 
-#: src/vte.c:6673
+#: src/vte.c:6671
 #, c-format
 msgid "Error (%s) converting data for child, dropping."
 msgstr "Erro (%s) convertendo dados para filho, descartando."
 
-#: src/vte.c:8745
+#: src/vte.c:8743
 #, c-format
 msgid "Using fontset \"%s\", which is missing these character sets: %s."
 msgstr ""
 "Usando conjunto de fontes \"%s\", que não tem os seguintes conhuntos de "
 "caracteres: %s."
 
-#: src/vte.c:9285
+#: src/vte.c:9283
 #, c-format
 msgid "Failed to load Xft font pattern \"%s\", falling back to default font."
 msgstr "Falha ao carregar a fonte Xft \"%s\", voltando para a fonte padrão."
 
-#: src/vte.c:9297
+#: src/vte.c:9295
 msgid "Failed to load default Xft font."
 msgstr "Falha ao carregar a fonte Xft padrão."
 
-#: src/vte.c:9390
+#: src/vte.c:9388
 #, c-format
 msgid "Failed to load font set \"%s\", falling back to default font."
 msgstr "Falha ao carregar a fonte \"%s\", voltando para a fonte padrão."
 
-#: src/vte.c:9402
+#: src/vte.c:9400
 msgid "Failed to load default font, crashing or behaving abnormally."
 msgstr "Falha ao carregar a fonte padrão, pendurando ou agindo anormalmente."
 
-#: src/vte.c:9664
+#: src/vte.c:9663
 #, c-format
 msgid "Error reading PTY size, using defaults: %s."
 msgstr "Erro lendo o tamanho PTY, usando padrão: %s."
 
-#: src/vte.c:9700
+#: src/vte.c:9699
 #, c-format
 msgid "Error setting PTY size: %s."
 msgstr "Erro setando o tamanho PTY: %s."
 
-#: src/vte.c:12205
+#: src/vte.c:12249
 msgid "Error allocating draw, disabling Xft."
 msgstr "Erro alocando desenho, desabilitando Xft."
 
-#: src/vte.c:12212
+#: src/vte.c:12257
 msgid "Error allocating context, disabling Pango."
 msgstr "Erro alocando contexto, desabilitando Pango."
 
-#: src/vte.c:12218
+#: src/vte.c:12263
 msgid "Error allocating layout, disabling Pango."
 msgstr "Erro alocando layout, desabilitando Pango."
 
 #. Aaargh.  We're screwed.
-#: src/vte.c:13669
+#: src/vte.c:13719
 msgid "g_iconv_open() failed setting word characters"
 msgstr "g_iconv_open() falhou setando caracteres de palavra"
index 156a6bf..3dcbe93 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: vte\n"
-"POT-Creation-Date: 2002-09-11 00:56-0400\n"
+"POT-Creation-Date: 2002-10-10 11:57-0400\n"
 "PO-Revision-Date: 2002-08-07 20:42+0200\n"
 "Last-Translator: Christian Rose <menthos@menthos.com>\n"
 "Language-Team: Swedish <sv@li.org>\n"
@@ -15,7 +15,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/pty.c:106
+#: src/pty.c:113
 #, c-format
 msgid "Error adding `%s' to environment, continuing."
 msgstr "Fel vid tillägg av \"%s\" till miljön, fortsätter."
@@ -29,96 +29,96 @@ msgstr "Fel vid skapande av signalrör."
 msgid "Duplicate (%s/%s)!"
 msgstr "Dubbel (%s/%s)!"
 
-#: src/vte.c:1175
+#: src/vte.c:1194
 #, c-format
 msgid "Error compiling regular expression \"%s\"."
 msgstr "Fel vid kompilering av reguljärt uttryck \"%s\"."
 
-#: src/vte.c:1645 src/vte.c:1654 src/vte.c:1666 src/vte.c:1684 src/vte.c:1689
-#: src/vte.c:1694
+#: src/vte.c:1664 src/vte.c:1673 src/vte.c:1685 src/vte.c:1703 src/vte.c:1708
+#: src/vte.c:1713
 #, c-format
 msgid "Unable to convert characters from %s to %s."
 msgstr "Kan inte konvertera tecken från %s till %s."
 
-#: src/vte.c:4893
+#: src/vte.c:4922
 #, c-format
 msgid "Got unexpected (key?) sequence `%s'."
 msgstr "Fick oväntad (tangent?)sekvens \"%s\"."
 
-#: src/vte.c:5679
+#: src/vte.c:5705
 #, c-format
 msgid "Character 0x%x is undefined, allocating one column."
 msgstr "Tecknet 0x%x är odefinierat, allokerar en kolumn."
 
-#: src/vte.c:5873
+#: src/vte.c:5903
 #, c-format
 msgid "No handler for control sequence `%s' defined."
 msgstr "Ingen hanterare för kontrollsekvensen \"%s\" är angiven."
 
-#: src/vte.c:6483
+#: src/vte.c:6507
 #, c-format
 msgid "Error reading from child: %s."
 msgstr "Fel vid läsning från barn: %s."
 
-#: src/vte.c:6673
+#: src/vte.c:6671
 #, c-format
 msgid "Error (%s) converting data for child, dropping."
 msgstr "Fel (%s) vid konvertering av data för barn, kastar."
 
-#: src/vte.c:8745
+#: src/vte.c:8743
 #, c-format
 msgid "Using fontset \"%s\", which is missing these character sets: %s."
 msgstr ""
 "Använder typsnittssamlingen \"%s\", som saknar dessa teckensamlingar: %s."
 
-#: src/vte.c:9285
+#: src/vte.c:9283
 #, c-format
 msgid "Failed to load Xft font pattern \"%s\", falling back to default font."
 msgstr ""
 "Misslyckades med att läsa in XFt-typsnittsmönstret \"%s\", använder "
 "standardtypsnittet."
 
-#: src/vte.c:9297
+#: src/vte.c:9295
 msgid "Failed to load default Xft font."
 msgstr "Misslyckades med att läsa in Xft-standardtypsnittet."
 
-#: src/vte.c:9390
+#: src/vte.c:9388
 #, c-format
 msgid "Failed to load font set \"%s\", falling back to default font."
 msgstr ""
 "Misslyckades med att läsa in typsnittssamlingen \"%s\", använder "
 "standardtypsnittet."
 
-#: src/vte.c:9402
+#: src/vte.c:9400
 msgid "Failed to load default font, crashing or behaving abnormally."
 msgstr ""
 "Misslyckades med att läsa in standardtypsnittet, kraschar eller beter sig "
 "onormalt."
 
-#: src/vte.c:9664
+#: src/vte.c:9663
 #, c-format
 msgid "Error reading PTY size, using defaults: %s."
 msgstr "Fel vid läsande av PTY-storlek, använder standardvärden: %s."
 
-#: src/vte.c:9700
+#: src/vte.c:9699
 #, c-format
 msgid "Error setting PTY size: %s."
 msgstr "Fel vid läsande av PTY-storlek: %s."
 
-#: src/vte.c:12205
+#: src/vte.c:12249
 msgid "Error allocating draw, disabling Xft."
 msgstr "Fel vid allokering av ritbar yta, deaktiverar Xft."
 
-#: src/vte.c:12212
+#: src/vte.c:12257
 msgid "Error allocating context, disabling Pango."
 msgstr "Fel vid allokering av sammanhang, deaktiverar Pango."
 
-#: src/vte.c:12218
+#: src/vte.c:12263
 msgid "Error allocating layout, disabling Pango."
 msgstr "Fel vid allokering av layout, deaktiverar Pango."
 
 #. Aaargh.  We're screwed.
-#: src/vte.c:13669
+#: src/vte.c:13719
 msgid "g_iconv_open() failed setting word characters"
 msgstr "g_iconv_open() misslyckades med att ställa in ordtecken"
 
index b798239..7132e12 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: VTE for Gnome 2\n"
-"POT-Creation-Date: 2002-09-11 00:56-0400\n"
+"POT-Creation-Date: 2002-10-10 11:57-0400\n"
 "PO-Revision-Date: 2002-08-24 19:49+0700\n"
 "Last-Translator: Trinh Minh Thanh <tmthanh@linuxmail.org>\n"
 "Language-Team: Gnome-Vi Team <Gnomevi-list@lists.sourceforge.net>\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/pty.c:106
+#: src/pty.c:113
 #, c-format
 msgid "Error adding `%s' to environment, continuing."
 msgstr "Lỗi khi thêm `%s' vào môi trường, tiếp tục."
@@ -28,88 +28,88 @@ msgstr "Lỗi khi tạo signal pipe."
 msgid "Duplicate (%s/%s)!"
 msgstr "Nhân đôi (%s/%s)!"
 
-#: src/vte.c:1175
+#: src/vte.c:1194
 #, c-format
 msgid "Error compiling regular expression \"%s\"."
 msgstr "Lỗi khi biên dịch biểu hiện quy tắc \"%s\"."
 
-#: src/vte.c:1645 src/vte.c:1654 src/vte.c:1666 src/vte.c:1684 src/vte.c:1689
-#: src/vte.c:1694
+#: src/vte.c:1664 src/vte.c:1673 src/vte.c:1685 src/vte.c:1703 src/vte.c:1708
+#: src/vte.c:1713
 #, c-format
 msgid "Unable to convert characters from %s to %s."
 msgstr "Không thể chuyển đổi các ký tự từ %s thành %s."
 
-#: src/vte.c:4893
+#: src/vte.c:4922
 #, c-format
 msgid "Got unexpected (key?) sequence `%s'."
 msgstr "Nhận sequence không mong muốn (key?) `%s'."
 
-#: src/vte.c:5679
+#: src/vte.c:5705
 #, c-format
 msgid "Character 0x%x is undefined, allocating one column."
 msgstr "Ký tự 0x%x không được định nghĩa, dùng một cột."
 
-#: src/vte.c:5873
+#: src/vte.c:5903
 #, c-format
 msgid "No handler for control sequence `%s' defined."
 msgstr "Không có trình quản lý nào được chỉ định cho sequence `%s'."
 
-#: src/vte.c:6483
+#: src/vte.c:6507
 #, c-format
 msgid "Error reading from child: %s."
 msgstr "Lỗi khi đọc từ child: %s."
 
-#: src/vte.c:6673
+#: src/vte.c:6671
 #, c-format
 msgid "Error (%s) converting data for child, dropping."
 msgstr "Lỗi (%s) khi chuyển đổi dữ liệu cho child, bỏ."
 
-#: src/vte.c:8745
+#: src/vte.c:8743
 #, c-format
 msgid "Using fontset \"%s\", which is missing these character sets: %s."
 msgstr "Dùng bộ phông \"%s\" thiếu các bảng mã này: %s."
 
-#: src/vte.c:9285
+#: src/vte.c:9283
 #, c-format
 msgid "Failed to load Xft font pattern \"%s\", falling back to default font."
 msgstr "Không nạp được mẫu phông Xft \"%s\", trở lại với phông mặc định."
 
-#: src/vte.c:9297
+#: src/vte.c:9295
 msgid "Failed to load default Xft font."
 msgstr "Không nạp được phông Xft mặc định."
 
-#: src/vte.c:9390
+#: src/vte.c:9388
 #, c-format
 msgid "Failed to load font set \"%s\", falling back to default font."
 msgstr "Không nạp được bộ phông \"%s\", trở lại với phông mặc định."
 
-#: src/vte.c:9402
+#: src/vte.c:9400
 msgid "Failed to load default font, crashing or behaving abnormally."
 msgstr "Không nạp được phông mặc định, bị crash hay ứng xử bất thường."
 
-#: src/vte.c:9664
+#: src/vte.c:9663
 #, c-format
 msgid "Error reading PTY size, using defaults: %s."
 msgstr "Lỗi khi đọc kích thước PTY, sử dụng mặc định: %s."
 
-#: src/vte.c:9700
+#: src/vte.c:9699
 #, c-format
 msgid "Error setting PTY size: %s."
 msgstr "Lỗi khi lập kích thước PTY: %s."
 
-#: src/vte.c:12205
+#: src/vte.c:12249
 msgid "Error allocating draw, disabling Xft."
 msgstr "Lỗi khi cấp phát draw, tắt Xft."
 
-#: src/vte.c:12212
+#: src/vte.c:12257
 msgid "Error allocating context, disabling Pango."
 msgstr "Lỗi khi cấp phát ngữ cảnh (context), tắt Pango."
 
-#: src/vte.c:12218
+#: src/vte.c:12263
 msgid "Error allocating layout, disabling Pango."
 msgstr "Lỗi khi cấp phát layout, tắt Pango."
 
 #. Aaargh.  We're screwed.
-#: src/vte.c:13669
+#: src/vte.c:13719
 msgid "g_iconv_open() failed setting word characters"
 msgstr "g_iconv_open() không lập được các ký tự cho word"
index 9b8902c..de7ecf1 100755 (executable)
@@ -1,5 +1,6 @@
 #!/usr/bin/python2.2
 import sys
+import string
 import getopt
 import gtk
 import vte
@@ -16,10 +17,11 @@ if __name__ == '__main__':
        command = None
        emulation = "xterm"
        font = "fixed 12"
+       scrollback = 100
        transparent = 0
        visible = 0
        # Let the user override them.
-       (shorts, longs) = getopt.getopt(sys.argv[1:], "B:Tabc:f:t:v", ["background", "transparent", "audible", "blink", "command=", "font=", "terminal=", "visible"])
+       (shorts, longs) = getopt.getopt(sys.argv[1:], "B:Tabc:f:n:t:v", ["background", "transparent", "audible", "blink", "command=", "font=", "scrollback=", "terminal=", "visible"])
        for argpair in (shorts + longs):
                if ((argpair[0] == '-B') or (argpair[0] == '--background')):
                        print "Setting background image to `" + argpair[1] + "'."
@@ -39,6 +41,12 @@ if __name__ == '__main__':
                if ((argpair[0] == '-f') or (argpair[0] == '--font')):
                        print "Setting font to `" + argpair[1] + "'."
                        font = argpair[1]
+               if ((argpair[0] == '-n') or (argpair[0] == '--scrollback')):
+                       scrollback = string.atoi(argpair[1])
+                       if (scrollback == 0):
+                               scrollback = 100
+                       else:
+                               print "Setting scrollback size to `" + str(scrollback) + "'."
                if ((argpair[0] == '-t') or (argpair[0] == '--terminal')):
                        print "Setting terminal type to `" + argpair[1] + "'."
                        emulation = argpair[1]
@@ -54,6 +62,7 @@ if __name__ == '__main__':
        terminal.set_cursor_blinks(blink)
        terminal.set_emulation(emulation)
        terminal.set_font_from_string(font)
+       terminal.set_scrollback_lines(scrollback)
        terminal.set_audible_bell(audible)
        terminal.set_visible_bell(visible)
        terminal.connect("child-exited", child_exited_cb)
index a19bbbb..70bc49f 100644 (file)
@@ -16,6 +16,8 @@ EXTRA_DIST = \
 CFLAGS = @CFLAGS@ @VTE_CFLAGS@ @X_CFLAGS@
 
 libvte_la_SOURCES = \
+       buffer.c \
+       buffer.h \
        caps.c \
        caps.h \
        debug.c \
@@ -56,6 +58,8 @@ vte_LDADD = libvte.la @LIBS@ @VTE_LIBS@ @X_LIBS@
 
 interpret_CFLAGS = @CFLAGS@ @GOBJECT_CFLAGS@ -DINTERPRET_MAIN
 interpret_SOURCES = \
+       buffer.c \
+       buffer.h \
        caps.c \
        caps.h \
        debug.c \
index 127a5c8..158fe06 100644 (file)
--- a/src/vte.c
+++ b/src/vte.c
@@ -45,6 +45,7 @@
 #include <gtk/gtk.h>
 #include <pango/pango.h>
 #include <pango/pangox.h>
+#include "buffer.h"
 #include "caps.h"
 #include "debug.h"
 #include "iso2022.h"
@@ -69,7 +70,7 @@
 #endif
 
 #ifndef HAVE_WINT_T
-typedef long wint_t;
+typedef gunichar wint_t;
 #endif
 
 #ifdef ENABLE_NLS
@@ -108,9 +109,9 @@ typedef long wint_t;
 #define VTE_CHILD_INPUT_PRIORITY       G_PRIORITY_DEFAULT_IDLE
 #define VTE_CHILD_OUTPUT_PRIORITY      G_PRIORITY_HIGH
 #define VTE_FX_PRIORITY                        G_PRIORITY_DEFAULT_IDLE
-#define VTE_PREFER_PANGOX
 #define VTE_REGCOMP_FLAGS              REG_EXTENDED
 #define VTE_REGEXEC_FLAGS              0
+#define VTE_INPUT_CHUNK_SIZE           0x1000
 
 /* The structure we use to hold characters we're supposed to display -- this
  * includes any supported visible attributes. */
@@ -199,17 +200,18 @@ struct _VteTerminalPrivate {
        const char *encoding;           /* the pty's encoding */
        struct _vte_iso2022 *substitutions;
        GIConv incoming_conv;           /* narrow/unichar conversion state */
-       char *incoming;                 /* pending output characters */
-       gsize n_incoming;
+       struct _vte_buffer *incoming;   /* pending output characters */
        gboolean processing;
        gint processing_tag;
 
        /* Output data queue. */
-       char *outgoing;                 /* pending input characters */
-       gsize n_outgoing;
+       struct _vte_buffer *outgoing;   /* pending input characters */
        GIConv outgoing_conv_wide;
        GIConv outgoing_conv_utf8;
 
+       /* IConv buffer. */
+       struct _vte_buffer *conv_buffer;
+
        /* Screen data.  We support the normal screen, and an alternate
         * screen, which seems to be a DEC-specific feature. */
        struct _VteScreen {
@@ -234,6 +236,7 @@ struct _VteTerminalPrivate {
                struct vte_charcell defaults;   /* default characteristics
                                                   for insertion of any new
                                                   characters */
+               struct vte_charcell basic_defaults;
                gboolean status_line;
                GString *status_line_contents;
        } normal_screen, alternate_screen, *screen;
@@ -261,6 +264,7 @@ struct _VteTerminalPrivate {
        gboolean audible_bell;
        gboolean visible_bell;
        gboolean xterm_font_tweak;
+       gboolean smooth_scroll;
        GHashTable *tabstops;
 
        /* Scrolling options. */
@@ -309,9 +313,10 @@ struct _VteTerminalPrivate {
        GTree *fontpaddingl, *fontpaddingr;
        enum VteRenderMethod {
                VteRenderXlib = 0,
-               VteRenderPango = 1,
-               VteRenderXft1 = 2,
-               VteRenderXft2 = 3
+               VteRenderPangoX = 1,
+               VteRenderPango = 2,
+               VteRenderXft1 = 3,
+               VteRenderXft2 = 4
        } render_method;
 #ifdef HAVE_XFT
        XftFont *ftfont;
@@ -365,9 +370,9 @@ static void vte_terminal_setup_background(VteTerminal *terminal,
                                          gboolean refresh_transparent);
 static void vte_terminal_ensure_cursor(VteTerminal *terminal, gboolean current);
 static void vte_terminal_paste(VteTerminal *terminal, GdkAtom board);
-static void vte_terminal_insert_char(GtkWidget *widget, gunichar c,
+static void vte_terminal_insert_char(VteTerminal *terminal, gunichar c,
                                     gboolean force_insert_mode,
-                                    gboolean invalid_cells);
+                                    gboolean invalidate_cells);
 static void vte_sequence_handler_clear_screen(VteTerminal *terminal,
                                              const char *match,
                                              GQuark match_quark,
@@ -453,6 +458,15 @@ vte_new_row_data(void)
        return g_array_new(FALSE, FALSE, sizeof(struct vte_charcell));
 }
 
+/* Allocate a new line of a given size. */
+static GArray *
+vte_new_row_data_sized(size_t length)
+{
+       return g_array_sized_new(FALSE, FALSE,
+                                sizeof(struct vte_charcell), length);
+}
+
+/* Guess at how many columns a character takes up. */
 /* Guess at how many columns a character takes up. */
 static gssize
 vte_unichar_width(gunichar c)
@@ -517,29 +531,34 @@ vte_wc_from_unichar(VteTerminal *terminal, gunichar c)
 #endif
 }
 
-#ifdef VTE_PREFER_PANGOX
-static PangoContext *
-vte_terminal_get_pango_context(VteTerminal *terminal)
-{
-       return pango_x_get_context(GDK_DISPLAY());
-}
-static void
-vte_terminal_maybe_unref_pango_context(VteTerminal *terminal, PangoContext *ctx)
-{
-       g_object_unref(G_OBJECT(ctx));
-}
-#else
+/* Avoid driving myself nuts on the differing semantics of Pango and PangoX. */
 static PangoContext *
 vte_terminal_get_pango_context(VteTerminal *terminal)
 {
-       return gtk_widget_get_pango_context(terminal);
+       switch (terminal->pvt->render_method) {
+       case VteRenderPangoX:
+               return pango_x_get_context(GDK_DISPLAY());
+               break;
+       case VteRenderPango:
+       default:
+               return gtk_widget_get_pango_context(GTK_WIDGET(terminal));
+               break;
+       }
 }
+
 static void
 vte_terminal_maybe_unref_pango_context(VteTerminal *terminal, PangoContext *ctx)
 {
-       /* no-op */
+       switch (terminal->pvt->render_method) {
+       case VteRenderPangoX:
+               g_object_unref(G_OBJECT(ctx));
+               break;
+       case VteRenderPango:
+       default:
+               /* no-op */
+               break;
+       }
 }
-#endif
 
 /* Reset defaults for character insertion. */
 static void
@@ -560,6 +579,7 @@ vte_terminal_set_default_attributes(VteTerminal *terminal)
        terminal->pvt->screen->defaults.blink = 0;
        /* Alternate charset isn't an attribute, though we treat it as one.
         * terminal->pvt->screen->defaults.alternate = 0; */
+       terminal->pvt->screen->basic_defaults = terminal->pvt->screen->defaults;
 }
 
 /* Cause certain cells to be updated. */
@@ -1133,7 +1153,7 @@ vte_terminal_match_contents_refresh(VteTerminal *terminal)
  *
  * Clears the list of regular expressions the terminal uses to highlight text
  * when the user moves the mouse cursor.
- * 
+ *
  */
 void
 vte_terminal_match_clear_all(VteTerminal *terminal)
@@ -1161,7 +1181,7 @@ vte_terminal_match_clear_all(VteTerminal *terminal)
  * Adds a regular expression to the list of matching expressions.  When the
  * user moves the mouse cursor over a section of displayed text which matches
  * this expression, the text will be highlighted.
- * 
+ *
  * Returns: an integer associated with this expression
  */
 int
@@ -1337,11 +1357,11 @@ vte_terminal_match_check_internal(VteTerminal *terminal,
  * regular expressions previously set using vte_terminal_match_add().  If a
  * match exists, the text string is returned and if @tag is not NULL, the number
  * associated with the matched regular expression will be stored in @tag.
- * 
+ *
  * If more than one regular expression has been set with
  * vte_terminal_match_add(), then expressions are checked in the order in
  * which they were added.
- * 
+ *
  * Returns: a string which matches one of the previously set regular
  * expressions, and which must be freed by the caller.
  */
@@ -1615,6 +1635,28 @@ vte_remove_line_internal(VteTerminal *terminal, glong position)
        }
 }
 
+/* Append a single item to a GArray a given number of times. */
+static void
+vte_g_array_append(GArray *array, gpointer array_end,
+                  gpointer item, guint count)
+{
+       long goal, add, added;
+       if (count == 0) {
+               return;
+       }
+       goal = array->len + count;
+
+       g_array_append_val(array, item);
+       added = 1;
+       count--;
+
+       while (array->len < goal) {
+               add = MIN(added, goal - array->len);
+               g_array_append_vals(array, array_end, add);
+               added += add;
+       }
+}
+
 /**
  * vte_terminal_set_encoding:
  * @terminal: a #VteTerminal
@@ -1719,34 +1761,36 @@ vte_terminal_set_encoding(VteTerminal *terminal, const char *codeset)
        terminal->pvt->encoding = g_quark_to_string(encoding_quark);
 
        /* Convert any buffered output bytes. */
-       if ((terminal->pvt->n_outgoing > 0) && (old_codeset != NULL)) {
-               icount = terminal->pvt->n_outgoing;
-               ibuf = terminal->pvt->outgoing;
+       if ((_vte_buffer_length(terminal->pvt->outgoing) > 0) &&
+           (old_codeset != NULL)) {
+               icount = _vte_buffer_length(terminal->pvt->outgoing);
+               ibuf = terminal->pvt->incoming->bytes;
                ocount = icount * VTE_UTF8_BPC + 1;
-               obuf = obufptr = g_malloc(ocount);
+               _vte_buffer_set_minimum_size(terminal->pvt->conv_buffer,
+                                            ocount);
+               obuf = obufptr = terminal->pvt->conv_buffer->bytes;
                conv = g_iconv_open(codeset, old_codeset);
                if (conv != ((GIConv) -1)) {
                        if (g_iconv(conv, &ibuf, &icount, &obuf, &ocount) == -1) {
                                /* Darn, it failed.  Leave it alone. */
-                               g_free(obufptr);
 #ifdef VTE_DEBUG
                                if (_vte_debug_on(VTE_DEBUG_IO)) {
                                        fprintf(stderr, "Error converting %ld "
                                                "pending output bytes (%s) "
                                                "skipping.\n",
-                                               (long) terminal->pvt->n_outgoing,
+                                               (long) _vte_buffer_length(terminal->pvt->outgoing),
                                                strerror(errno));
                                }
 #endif
                        } else {
-                               g_free(terminal->pvt->outgoing);
-                               terminal->pvt->outgoing = obufptr;
-                               terminal->pvt->n_outgoing = obuf - obufptr;
+                               _vte_buffer_clear(terminal->pvt->outgoing);
+                               _vte_buffer_append(terminal->pvt->outgoing,
+                                                  obufptr, obuf - obufptr);
 #ifdef VTE_DEBUG
                                if (_vte_debug_on(VTE_DEBUG_IO)) {
                                        fprintf(stderr, "Converted %ld pending "
                                                "output bytes.\n",
-                                               (long) terminal->pvt->n_outgoing);
+                                               (long) _vte_buffer_length(terminal->pvt->outgoing));
                                }
 #endif
                        }
@@ -2361,7 +2405,7 @@ vte_terminal_ensure_cursor(VteTerminal *terminal, gboolean current)
 {
        GArray *array;
        VteScreen *screen;
-       struct vte_charcell cell, *cells;
+       struct vte_charcell cell;
        gboolean readjust = FALSE;
        long add, i;
 
@@ -2386,31 +2430,31 @@ vte_terminal_ensure_cursor(VteTerminal *terminal, gboolean current)
        if ((array->len <= screen->cursor_current.col) &&
            (array->len < terminal->column_count)) {
                /* Set up defaults we'll use when adding new cells. */
-               cell = screen->defaults;
-               cell.c = ' ';
-               cell.columns = 1;
-               if (!current) {
-                       cell.fore = VTE_DEF_FG;
-                       cell.back = VTE_DEF_BG;
+               if (current) {
+                       cell = screen->defaults;
+               } else {
+                       cell = screen->basic_defaults;
                }
                /* Add enough cells at the end to make sure we have
                 * enough for all visible columns. */
                add = screen->cursor_current.col - array->len;
                if (add > 0) {
-                       cells = g_malloc(sizeof(cell) * add);
-                       cells[0] = cell;
-                       for (i = 1; i < add; i = i * 2) {
-                               memcpy(&cells[i],
-                                      &cells[0],
-                                      sizeof(cell) * MIN(add - i, i));
-                       }
+                       vte_g_array_append(array,
+                                          &g_array_index(array,
+                                                         struct vte_charcell,
+                                                         array->len),
+                                          &cell,
+                                          add);
 #ifdef VTE_DEBUG
                        for (i = 0; i < add; i++) {
-                               g_assert(memcmp(&cells[i], &cell, sizeof(cell)) == 0);
+                               struct vte_charcell *newcell;
+                               newcell = &g_array_index(array,
+                                                        struct vte_charcell,
+                                                        array->len - 1 - i);
+                               g_assert(memcmp(newcell, &cell,
+                                               sizeof(cell)) == 0);
                        }
 #endif
-                       array = g_array_append_vals(array, cells, add);
-                       g_free(cells);
                }
        }
 }
@@ -2600,7 +2644,7 @@ vte_sequence_handler_ic(VteTerminal *terminal,
 
        save = screen->cursor_current;
 
-       vte_terminal_insert_char(GTK_WIDGET(terminal), ' ', TRUE, TRUE);
+       vte_terminal_insert_char(terminal, ' ', TRUE, TRUE);
 
        screen->cursor_current = save;
 }
@@ -3328,14 +3372,16 @@ vte_sequence_handler_vb(VteTerminal *terminal,
 {
        Display *display;
        GdkDrawable *gdrawable;
+       GtkWidget *widget;
        Drawable drawable;
        GC gc;
        gint x_offs, y_offs;
 
-       if (GTK_WIDGET_REALIZED(GTK_WIDGET(terminal))) {
+       widget = GTK_WIDGET(terminal);
+       if (GTK_WIDGET_REALIZED(widget)) {
                /* Fill the screen with the default foreground color, and then
                 * repaint everything, to provide visual bell. */
-               gdk_window_get_internal_paint_info(GTK_WIDGET(terminal)->window,
+               gdk_window_get_internal_paint_info(widget->window,
                                                   &gdrawable,
                                                   &x_offs,
                                                   &y_offs);
@@ -3349,10 +3395,10 @@ vte_sequence_handler_vb(VteTerminal *terminal,
                               x_offs, y_offs,
                               terminal->column_count * terminal->char_width,
                               terminal->row_count * terminal->char_height);
-               gdk_window_process_all_updates();
+               gdk_window_process_updates(widget->window, TRUE);
 
                vte_invalidate_all(terminal);
-               gdk_window_process_all_updates();
+               gdk_window_process_updates(widget->window, TRUE);
        }
 }
 
@@ -3556,7 +3602,7 @@ vte_sequence_handler_clear_screen(VteTerminal *terminal,
                if (i == 0) {
                        initial = _vte_ring_next(screen->row_data);
                }
-               rowdata = vte_new_row_data();
+               rowdata = vte_new_row_data_sized(terminal->column_count);
                _vte_ring_append(screen->row_data, rowdata);
                /* Add new cells until we have enough to fill out the row. */
                while (rowdata->len < terminal->column_count) {
@@ -3681,7 +3727,9 @@ vte_sequence_handler_set_title_internal(VteTerminal *terminal,
                        inbuf_len = vte_unicode_strlen((gunichar*)inbuf) *
                                    sizeof(gunichar);
                        outbuf_len = (inbuf_len * VTE_UTF8_BPC) + 1;
-                       outbuf = outbufptr = g_malloc0(outbuf_len);
+                       _vte_buffer_set_minimum_size(terminal->pvt->conv_buffer,
+                                                    outbuf_len);
+                       outbuf = outbufptr = terminal->pvt->conv_buffer->bytes;
                        if (conv != ((GIConv) -1)) {
                                if (g_iconv(conv, &inbuf, &inbuf_len,
                                            &outbuf, &outbuf_len) == -1) {
@@ -3691,11 +3739,10 @@ vte_sequence_handler_set_title_internal(VteTerminal *terminal,
                                                        "converting %ld title "
                                                        "bytes (%s), "
                                                        "skipping.\n",
-                                                       (long) terminal->pvt->n_outgoing,
+                                                       (long) _vte_buffer_length(terminal->pvt->outgoing),
                                                        strerror(errno));
                                        }
 #endif
-                                       g_free(outbufptr);
                                        outbufptr = NULL;
                                }
                        }
@@ -3705,12 +3752,12 @@ vte_sequence_handler_set_title_internal(VteTerminal *terminal,
                        /* Emit the signal */
                        if (strcmp(signal, "window_title_changed") == 0) {
                                g_free(terminal->window_title);
-                               terminal->window_title = outbufptr;
+                               terminal->window_title = g_strdup(outbufptr);
                                vte_terminal_emit_window_title_changed(terminal);
-                       }
-                       else if (strcmp (signal, "icon_title_changed") == 0) {
+                       } else
+                       if (strcmp(signal, "icon_title_changed") == 0) {
                                g_free (terminal->icon_title);
-                               terminal->icon_title = outbufptr;
+                               terminal->icon_title = g_strdup(outbufptr);
                                vte_terminal_emit_icon_title_changed(terminal);
                        }
                }
@@ -3828,6 +3875,11 @@ vte_sequence_handler_decset_internal(VteTerminal *terminal,
                 GINT_TO_POINTER(VTE_KEYPAD_NORMAL),
                 GINT_TO_POINTER(VTE_KEYPAD_APPLICATION),
                 NULL, NULL,},
+               /* Smooth scroll. */
+               {4, &terminal->pvt->smooth_scroll, NULL, NULL,
+                GINT_TO_POINTER(FALSE),
+                GINT_TO_POINTER(TRUE),
+                NULL, NULL,},
                /* Reverse video. */
                {5, &terminal->pvt->screen->reverse_mode, NULL, NULL,
                 GINT_TO_POINTER(FALSE),
@@ -4585,10 +4637,8 @@ vte_sequence_handler_screen_alignment_test(VteTerminal *terminal,
                        g_array_remove_index(rowdata, rowdata->len - 1);
                }
                /* Fill this row. */
-               cell = screen->defaults;
+               cell = screen->basic_defaults;
                cell.c = 'E';
-               cell.fore = VTE_DEF_FG;
-               cell.back = VTE_DEF_BG;
                cell.columns = 1;
                while (rowdata->len < terminal->column_count) {
                        g_array_append_val(rowdata, cell);
@@ -5640,10 +5690,9 @@ vte_terminal_set_default_colors(VteTerminal *terminal)
 
 /* Insert a single character into the stored data array. */
 static void
-vte_terminal_insert_char(GtkWidget *widget, gunichar c,
-                        gboolean force_insert_mode, gboolean invalid_cells)
+vte_terminal_insert_char(VteTerminal *terminal, gunichar c,
+                        gboolean force_insert_mode, gboolean invalidate_cells)
 {
-       VteTerminal *terminal;
        GArray *array;
        struct vte_charcell cell, *pcell;
        int columns, i;
@@ -5651,8 +5700,6 @@ vte_terminal_insert_char(GtkWidget *widget, gunichar c,
        VteScreen *screen;
        gboolean insert;
 
-       g_return_if_fail(widget != NULL);
-       terminal = VTE_TERMINAL(widget);
        screen = terminal->pvt->screen;
        insert = screen->insert_mode || force_insert_mode;
 
@@ -5764,7 +5811,7 @@ vte_terminal_insert_char(GtkWidget *widget, gunichar c,
                }
 
                /* Signal that this part of the window needs drawing. */
-               if (invalid_cells) {
+               if (invalidate_cells) {
                        if (insert) {
                                vte_invalidate_cells(terminal,
                                                     col,
@@ -6090,11 +6137,12 @@ vte_terminal_process_incoming(gpointer data)
        GValueArray *params = NULL;
        VteTerminal *terminal;
        VteScreen *screen;
-       struct vte_cursor_position cursor, *cursor_ptr, start_cursor, end_cursor;
+       struct vte_cursor_position cursor;
        struct _vte_iso2022 *substitutions;
        gssize substitution_count;
        GtkWidget *widget;
        GdkRectangle rect;
+       GdkPoint bbox_topleft, bbox_bottomright;
        char *ibuf, *obuf, *obufptr, *ubuf, *ubufptr;
        gsize icount, ocount, ucount;
        gunichar *wbuf, c;
@@ -6103,7 +6151,6 @@ vte_terminal_process_incoming(gpointer data)
        GIConv unconv;
        GQuark quark;
        const gunichar *next;
-       gint min_col, max_col;
        gboolean leftovers, modified, again, bottom;
 
        g_return_val_if_fail(GTK_IS_WIDGET(data), FALSE);
@@ -6117,42 +6164,41 @@ vte_terminal_process_incoming(gpointer data)
 #ifdef VTE_DEBUG
        if (_vte_debug_on(VTE_DEBUG_IO)) {
                fprintf(stderr, "Handler processing %d bytes.\n",
-                       terminal->pvt->n_incoming);
+                       _vte_buffer_length(terminal->pvt->incoming));
        }
 #endif
 
        /* We should only be called when there's data to process. */
-       g_assert(terminal->pvt->n_incoming > 0);
+       g_assert(_vte_buffer_length(terminal->pvt->incoming) > 0);
 
        /* Try to convert the data into unicode characters. */
-       ocount = sizeof(gunichar) * terminal->pvt->n_incoming;
-       obuf = obufptr = g_malloc(ocount);
-       icount = terminal->pvt->n_incoming;
-       ibuf = terminal->pvt->incoming;
+       ocount = sizeof(gunichar) * _vte_buffer_length(terminal->pvt->incoming);
+       _vte_buffer_set_minimum_size(terminal->pvt->conv_buffer, ocount);
+       obuf = obufptr = terminal->pvt->conv_buffer->bytes;
+       icount = _vte_buffer_length(terminal->pvt->incoming);
+       ibuf = terminal->pvt->incoming->bytes;
 
        /* Convert the data to unicode characters. */
        if (g_iconv(terminal->pvt->incoming_conv, &ibuf, &icount,
                    &obuf, &ocount) == -1) {
                /* No dice.  Try again when we have more data. */
-               if ((errno == EILSEQ) && (terminal->pvt->n_incoming >= icount)) {
+               if ((errno == EILSEQ) && (_vte_buffer_length(terminal->pvt->incoming) >= icount)) {
                        /* Discard the offending byte. */
-                       start = terminal->pvt->n_incoming - icount;
+                       start = _vte_buffer_length(terminal->pvt->incoming) - icount;
 #ifdef VTE_DEBUG
                        if (_vte_debug_on(VTE_DEBUG_IO)) {
                                fprintf(stderr, "Error converting %ld incoming "
                                        "data bytes: %s, discarding byte %ld "
                                        "(0x%02x) and trying again.\n",
-                                       (long) terminal->pvt->n_incoming,
+                                       (long) _vte_buffer_length(terminal->pvt->incoming),
                                        strerror(errno), start,
-                                       terminal->pvt->incoming[start]);
+                                       terminal->pvt->incoming->bytes[start]);
                        }
 #endif
-                       terminal->pvt->incoming[start] = '?';
-                       /* Try again, before we try anything else. */
-                       g_free(obufptr);
-                       /* To pull this off we add ourselves as a higher
-                        * priority idle handler, and cause this handler to
-                        * be dropped. */
+                       terminal->pvt->incoming->bytes[start] = '?';
+                       /* Try again, before we try anything else.  To pull this
+                        * off we add ourselves as a higher priority idle
+                        * handler, and cause this handler to be dropped. */
                        terminal->pvt->processing_tag =
                                        g_idle_add_full(VTE_INPUT_RETRY_PRIORITY,
                                                        vte_terminal_process_incoming,
@@ -6164,13 +6210,12 @@ vte_terminal_process_incoming(gpointer data)
                if (_vte_debug_on(VTE_DEBUG_IO)) {
                        fprintf(stderr, "Error converting %ld incoming data "
                                "bytes: %s, leaving for later.\n",
-                               (long) terminal->pvt->n_incoming,
+                               (long) _vte_buffer_length(terminal->pvt->incoming),
                                strerror(errno));
                }
 #endif
                terminal->pvt->processing = FALSE;
                terminal->pvt->processing_tag = 0;
-               g_free(obufptr);
                return terminal->pvt->processing;
        }
 
@@ -6203,13 +6248,12 @@ vte_terminal_process_incoming(gpointer data)
        /* Save the current cursor position. */
        screen = terminal->pvt->screen;
        cursor = screen->cursor_current;
-    cursor_ptr = &(screen->cursor_current);
-    start_cursor.row = cursor_ptr->row;
-    start_cursor.col = cursor_ptr->col;
-    end_cursor.row = cursor_ptr->row;
-    end_cursor.col = cursor_ptr->col;
-       min_col = cursor_ptr->col;
-       max_col = cursor_ptr->col;
+
+       /* Estimate how much of the screen we'll need to update. */
+       bbox_topleft.x = cursor.col;
+       bbox_topleft.y = cursor.row;
+       bbox_bottomright.x = cursor.col;
+       bbox_bottomright.y = cursor.row;
 
        /* Try initial substrings. */
        while ((start < wcount) && !leftovers) {
@@ -6226,7 +6270,8 @@ vte_terminal_process_incoming(gpointer data)
                 * points to the first character which isn't part of this
                 * sequence. */
                if ((match != NULL) && (match[0] != '\0')) {
-                       vte_invalidate_cursor_once(terminal);
+                       /* Call the right sequence handler for the requested
+                        * behavior. */
                        vte_terminal_handle_sequence(GTK_WIDGET(terminal),
                                                     match,
                                                     quark,
@@ -6266,37 +6311,9 @@ vte_terminal_process_incoming(gpointer data)
                        }
 #endif
                        if (c != 0) {
-                               if ((cursor_ptr->row == end_cursor.row &&
-                                    cursor_ptr->col == end_cursor.col + 1) ||
-                                   (cursor_ptr->row > end_cursor.row)) {
-
-                                       end_cursor.row = cursor_ptr->row;
-                                       end_cursor.col = cursor_ptr->col;
-
-                                       if (cursor_ptr->col > max_col)
-                                               max_col = cursor_ptr->col;
-                                       else if (cursor_ptr->col < min_col)
-                                               min_col = cursor_ptr->col;
-
-                               } else if (cursor_ptr->row < start_cursor.row ||
-                                          cursor_ptr->row > end_cursor.row ||
-                                          cursor_ptr->col < min_col ||
-                                          cursor_ptr->col > max_col) {
-
-                                       vte_invalidate_cells(terminal, min_col, max_col + 1,
-                                               MIN(start_cursor.row, end_cursor.row),
-                                               MAX(start_cursor.row, end_cursor.row) -
-                                               MIN(start_cursor.row, end_cursor.row) + 1);
-
-                                               start_cursor.row = cursor_ptr->row;
-                                               start_cursor.col = cursor_ptr->col;
-                                               end_cursor.row   = cursor_ptr->row;
-                                               end_cursor.col   = cursor_ptr->col;
-                                               max_col          = cursor_ptr->col;
-                                               min_col          = cursor_ptr->col;
-                               }
-
-                               vte_terminal_insert_char(widget, c, FALSE, FALSE);
+                               /* Insert the character. */
+                               vte_terminal_insert_char(terminal, c,
+                                                        FALSE, FALSE);
                        }
                        modified = TRUE;
                        start++;
@@ -6321,20 +6338,43 @@ vte_terminal_process_incoming(gpointer data)
                                leftovers = TRUE;
                        }
                }
+               /* Add the cell we just moved to the region we need to
+                * refresh for the user. */
+               bbox_topleft.x = MIN(bbox_topleft.x,
+                                    screen->cursor_current.col);
+               bbox_topleft.y = MIN(bbox_topleft.y,
+                                    screen->cursor_current.row);
+               bbox_bottomright.x = MAX(bbox_bottomright.x,
+                                        screen->cursor_current.col);
+               bbox_bottomright.y = MAX(bbox_bottomright.y,
+                                        screen->cursor_current.row);
                /* Free any parameters we don't care about any more. */
                free_params_array(params);
                params = NULL;
        }
 
-       /* Update the screen once after the while loop. */
-       vte_invalidate_cells(terminal, min_col, max_col + 1,
-               MIN(start_cursor.row, end_cursor.row),
-               MAX(start_cursor.row, end_cursor.row) -
-               MIN(start_cursor.row, end_cursor.row) + 1);
+       /* 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, screen->scroll_delta);
+       bbox_bottomright.x = MIN(bbox_bottomright.x,
+                                terminal->column_count - 1);
+       bbox_bottomright.y = MIN(bbox_bottomright.y,
+                                screen->scroll_delta +
+                                terminal->row_count);
+
+       /* Update the screen to draw any modified areas.  This includes
+        * the current location of the cursor, so we won't need to redraw
+        * it below. */
+       vte_invalidate_cells(terminal,
+                            bbox_topleft.x,
+                            bbox_bottomright.x - bbox_topleft.x + 1,
+                            bbox_topleft.y,
+                            bbox_bottomright.y - bbox_topleft.y + 1);
 
        if (leftovers) {
                /* There are leftovers, so convert them back to the terminal's
-                * old encoding and save them for later. */
+                * old encoding and save them for later.  We can't use the
+                * scratch buffer here because it already holds ibuf. */
                unconv = g_iconv_open(encoding, _vte_table_wide_encoding());
                if (unconv != ((GIConv) -1)) {
                        icount = sizeof(gunichar) * (wcount - start);
@@ -6344,12 +6384,10 @@ vte_terminal_process_incoming(gpointer data)
                        if (g_iconv(unconv, &ibuf, &icount,
                                    &ubuf, &ucount) != -1) {
                                /* Store it. */
-                               if (terminal->pvt->incoming) {
-                                       g_free(terminal->pvt->incoming);
-                               }
-                               terminal->pvt->incoming = ubufptr;
-                               terminal->pvt->n_incoming = ubuf - ubufptr;
-                               *ubuf = '\0';
+                               _vte_buffer_clear(terminal->pvt->incoming);
+                               _vte_buffer_append(terminal->pvt->incoming,
+                                                  ubufptr,
+                                                  ubuf - ubufptr);
                                /* If we're doing this because the encoding
                                 * was changed out from under us, we need to
                                 * keep trying to process the incoming data. */
@@ -6365,36 +6403,21 @@ vte_terminal_process_incoming(gpointer data)
                                                strerror(errno));
                                }
 #endif
-                               if (terminal->pvt->incoming) {
-                                       g_free(terminal->pvt->incoming);
-                               }
-                               terminal->pvt->incoming = NULL;
-                               terminal->pvt->n_incoming = 0;
-                               g_free(ubufptr);
+                               _vte_buffer_clear(terminal->pvt->incoming);
                                again = FALSE;
                        }
+                       g_free(ubufptr);
                        g_iconv_close(unconv);
                } else {
                        /* Discard the data, we can't use it. */
-                       if (terminal->pvt->incoming != NULL) {
-                               g_free(terminal->pvt->incoming);
-                       }
-                       terminal->pvt->incoming = NULL;
-                       terminal->pvt->n_incoming = 0;
+                       _vte_buffer_clear(terminal->pvt->incoming);
                        again = FALSE;
                }
        } else {
                /* No leftovers, clean out the data. */
-               terminal->pvt->n_incoming = 0;
-               if (terminal->pvt->incoming != NULL) {
-                       g_free(terminal->pvt->incoming);
-               }
-               terminal->pvt->incoming = NULL;
+               _vte_buffer_clear(terminal->pvt->incoming);
                again = FALSE;
        }
-       if (obufptr != NULL) {
-               g_free(obufptr);
-       }
 
        if (modified) {
                /* Keep the cursor on-screen if we scroll on output, or if
@@ -6404,9 +6427,6 @@ vte_terminal_process_incoming(gpointer data)
                        vte_terminal_scroll_to_bottom(terminal);
                }
 
-               /* The cursor moved, so force it to be redrawn. */
-               vte_invalidate_cursor_once(terminal);
-
                /* Deselect any existing selection. */
                vte_terminal_deselect_all(terminal);
        }
@@ -6438,13 +6458,13 @@ vte_terminal_process_incoming(gpointer data)
 
 #ifdef VTE_DEBUG
        if (_vte_debug_on(VTE_DEBUG_IO)) {
-               fprintf(stderr, "%d bytes left to process.\n",
-                       terminal->pvt->n_incoming);
+               fprintf(stderr, "%ld bytes left to process.\n",
+                       (long) _vte_buffer_length(terminal->pvt->incoming));
        }
 #endif
        /* Decide if we're going to keep on processing data, and if not,
         * note that our source tag is about to become invalid. */
-       terminal->pvt->processing = again && (terminal->pvt->n_incoming > 0);
+       terminal->pvt->processing = again && (_vte_buffer_length(terminal->pvt->incoming) > 0);
        if (terminal->pvt->processing == FALSE) {
                terminal->pvt->processing_tag = 0;
        }
@@ -6468,10 +6488,9 @@ vte_terminal_io_read(GIOChannel *channel,
 {
        VteTerminal *terminal;
        GtkWidget *widget;
-       char *buf;
-       gssize bufsize;
+       char buf[VTE_INPUT_CHUNK_SIZE];
        int bcount, fd;
-       gboolean empty, eof, leave_open = TRUE;
+       gboolean eof, leave_open = TRUE;
 
        g_return_val_if_fail(VTE_IS_TERMINAL(data), TRUE);
        widget = GTK_WIDGET(data);
@@ -6480,19 +6499,10 @@ vte_terminal_io_read(GIOChannel *channel,
        /* Check that the channel is still open. */
        fd = g_io_channel_unix_get_fd(channel);
 
-       /* Allocate a buffer to hold whatever data's available. */
-       bufsize = terminal->pvt->n_incoming + 0x1000;
-       buf = g_malloc0(bufsize);
-       if (terminal->pvt->n_incoming > 0) {
-               memcpy(buf, terminal->pvt->incoming, terminal->pvt->n_incoming);
-       }
-       empty = (terminal->pvt->n_incoming == 0);
-
-       /* Read some more data in from this channel. */
+       /* Read some data in from this channel. */
        bcount = 0;
        if (condition & G_IO_IN) {
-               bcount = read(fd, buf + terminal->pvt->n_incoming,
-                             bufsize - terminal->pvt->n_incoming);
+               bcount = read(fd, buf, sizeof(buf));
        }
        eof = FALSE;
        if (condition & G_IO_HUP) {
@@ -6528,17 +6538,14 @@ vte_terminal_io_read(GIOChannel *channel,
 
        /* If we got data, modify the pending buffer. */
        if (bcount >= 0) {
-               if (terminal->pvt->incoming != NULL) {
-                       g_free(terminal->pvt->incoming);
-               }
-               terminal->pvt->incoming = buf;
-               terminal->pvt->n_incoming += bcount;
+               _vte_buffer_append(terminal->pvt->incoming, buf, bcount);
        } else {
                g_free(buf);
        }
 
        /* If we have data to process, schedule some time to process it. */
-       if (!terminal->pvt->processing && (terminal->pvt->n_incoming > 0)) {
+       if (!terminal->pvt->processing &&
+           (_vte_buffer_length(terminal->pvt->incoming) > 0)) {
 #ifdef VTE_DEBUG
                if (_vte_debug_on(VTE_DEBUG_IO)) {
                        fprintf(stderr, "Queuing handler to process bytes.\n");
@@ -6576,35 +6583,19 @@ vte_terminal_io_read(GIOChannel *channel,
 void
 vte_terminal_feed(VteTerminal *terminal, const char *data, glong length)
 {
-       char *buf;
-       gboolean empty;
-
        /* If length == -1, use the length of the data string. */
        if (length == ((gssize)-1)) {
                length = strlen(data);
        }
 
-       /* Allocate space for old and new data. */
-       buf = g_malloc(terminal->pvt->n_incoming + length + 1);
-       empty = (terminal->pvt->n_incoming == 0);
-
        /* If we got data, modify the pending buffer. */
        if (length >= 0) {
-               if (terminal->pvt->n_incoming > 0) {
-                       memcpy(buf, terminal->pvt->incoming,
-                              terminal->pvt->n_incoming);
-                       g_free(terminal->pvt->incoming);
-               }
-               memcpy(buf + terminal->pvt->n_incoming,
-                      data, length);
-               terminal->pvt->incoming = buf;
-               terminal->pvt->n_incoming += length;
-       } else {
-               g_free(buf);
+               _vte_buffer_append(terminal->pvt->incoming, data, length);
        }
 
-       /* If we didn't have data before, but we do now, process it. */
-       if (!terminal->pvt->processing && (terminal->pvt->n_incoming > 0)) {
+       /* If we didn't have data before, but we do now, start processing it. */
+       if (!terminal->pvt->processing &&
+           (_vte_buffer_length(terminal->pvt->incoming) > 0)) {
 #ifdef VTE_DEBUG
                if (_vte_debug_on(VTE_DEBUG_IO)) {
                        fprintf(stderr, "Queuing handler to process bytes.\n");
@@ -6635,38 +6626,32 @@ vte_terminal_io_write(GIOChannel *channel,
 
        fd = g_io_channel_unix_get_fd(channel);
 
-       count = write(fd, terminal->pvt->outgoing, terminal->pvt->n_outgoing);
+       count = write(fd, terminal->pvt->outgoing->bytes,
+                     _vte_buffer_length(terminal->pvt->outgoing));
        if (count != -1) {
 #ifdef VTE_DEBUG
                if (_vte_debug_on(VTE_DEBUG_IO)) {
                        int i;
                        for (i = 0; i < count; i++) {
                                fprintf(stderr, "Wrote %c%c\n",
-                                       ((guint8)terminal->pvt->outgoing[i]) >= 32 ?
+                                       ((guint8)terminal->pvt->outgoing->bytes[i]) >= 32 ?
                                        ' ' : '^',
-                                       ((guint8)terminal->pvt->outgoing[i]) >= 32 ?
-                                       terminal->pvt->outgoing[i] :
-                                       ((guint8)terminal->pvt->outgoing[i])  + 64);
+                                       ((guint8)terminal->pvt->outgoing->bytes[i]) >= 32 ?
+                                       terminal->pvt->outgoing->bytes[i] :
+                                       ((guint8)terminal->pvt->outgoing->bytes[i])  + 64);
                        }
                }
 #endif
-               memmove(terminal->pvt->outgoing,
-                       terminal->pvt->outgoing + count,
-                       terminal->pvt->n_outgoing - count);
-               terminal->pvt->n_outgoing -= count;
+               _vte_buffer_consume(terminal->pvt->outgoing, count);
        }
 
-       if (terminal->pvt->n_outgoing == 0) {
+       if (_vte_buffer_length(terminal->pvt->outgoing) == 0) {
                if (channel == terminal->pvt->pty_output) {
                        g_io_channel_unref(terminal->pvt->pty_output);
                        terminal->pvt->pty_output = NULL;
                        g_source_remove(terminal->pvt->pty_output_source);
                        terminal->pvt->pty_output_source = -1;
                }
-               if (terminal->pvt->outgoing != NULL) {
-                       g_free(terminal->pvt->outgoing);
-                       terminal->pvt->outgoing = NULL;
-               }
                leave_open = FALSE;
        } else {
                leave_open = TRUE;
@@ -6682,8 +6667,6 @@ vte_terminal_send(VteTerminal *terminal, const char *encoding,
 {
        gssize icount, ocount;
        char *ibuf, *obuf, *obufptr;
-       char *outgoing;
-       gsize n_outgoing;
        GIConv *conv;
 
        g_return_if_fail(VTE_IS_TERMINAL(terminal));
@@ -6703,20 +6686,16 @@ vte_terminal_send(VteTerminal *terminal, const char *encoding,
        icount = length;
        ibuf = (char *) data;
        ocount = ((length + 1) * VTE_UTF8_BPC) + 1;
-       obuf = obufptr = g_malloc0(ocount);
+       _vte_buffer_set_minimum_size(terminal->pvt->conv_buffer, ocount);
+       obuf = obufptr = terminal->pvt->conv_buffer->bytes;
 
        if (g_iconv(*conv, &ibuf, &icount, &obuf, &ocount) == -1) {
                g_warning(_("Error (%s) converting data for child, dropping."),
                          strerror(errno));
        } else {
-               n_outgoing = terminal->pvt->n_outgoing + (obuf - obufptr);
-               outgoing = g_realloc(terminal->pvt->outgoing, n_outgoing);
-               /* Move some data around. */
-               memcpy(outgoing + terminal->pvt->n_outgoing,
-                      obufptr, obuf - obufptr);
-               /* Save the new outgoing buffer. */
-               terminal->pvt->n_outgoing = n_outgoing;
-               terminal->pvt->outgoing = outgoing;
+               /* Add the data to the outgoing buffer. */
+               _vte_buffer_append(terminal->pvt->outgoing,
+                                  obufptr, obuf - obufptr);
                /* If we need to start waiting for the child pty to become
                 * available for writing, set that up here. */
                if (terminal->pvt->pty_output == NULL) {
@@ -6731,7 +6710,6 @@ vte_terminal_send(VteTerminal *terminal, const char *encoding,
                                                    NULL);
                }
        }
-       g_free(obufptr);
        return;
 }
 
@@ -6919,7 +6897,7 @@ vte_terminal_style_changed(GtkWidget *widget, GtkStyle *style, gpointer data)
        }
 }
 
-static struct {
+static const struct {
        gulong keyval;
        char *special;
        char *vt_ctrl_special;
@@ -7385,7 +7363,7 @@ vte_terminal_key_release(GtkWidget *widget, GdkEventKey *event)
  *
  * Checks if a particular character is considered to be part of a word or not,
  * based on the values last passed to vte_terminal_set_word_chars().
- * 
+ *
  * Returns: TRUE if the character is considered to be part of a word
  */
 gboolean
@@ -8285,7 +8263,7 @@ vte_terminal_get_text_range(VteTerminal *terminal,
                                        /* Stuff any saved spaces in. */
                                        while (spaces > 0) {
                                                string = g_string_append_c(string, ' ');
-                                                spaces--;
+                                               spaces--;
                                        }
                                        /* Stuff the character in this cell. */
                                        string = g_string_append_unichar(string, pcell->c);
@@ -8359,7 +8337,7 @@ vte_terminal_get_text(VteTerminal *terminal,
 /**
  * vte_terminal_get_cursor_position:
  * @terminal: a #VteTerminal
- * @column: long which will hold the column 
+ * @column: long which will hold the column
  * @row : long which will hold the row
  *
  * Reads the location of the insertion cursor and returns it.  The row
@@ -9231,7 +9209,7 @@ vte_font_match(VteTerminal *terminal, FcPattern *pattern, FcResult *result)
 
        FcConfigSubstitute(NULL, spec, FcMatchPattern);
        vte_default_substitute(terminal, spec);
-       FcDefaultSubstitute(spec);
+       XftDefaultSubstitute(display, screen, spec);
 
        match = FcFontMatch(NULL, spec, result);
 
@@ -9571,11 +9549,12 @@ vte_terminal_open_font(VteTerminal *terminal)
                break;
 #endif
        case VteRenderPango:
+       case VteRenderPangoX:
                vte_terminal_open_font_pango(terminal);
                break;
        case VteRenderXlib:
-       default:
                vte_terminal_open_font_xlib(terminal);
+               break;
        }
 }
 static void
@@ -10128,15 +10107,14 @@ vte_terminal_init(VteTerminal *terminal, gpointer *klass)
        /* Set up I/O encodings. */
        pvt->encoding = NULL;
        pvt->substitutions = _vte_iso2022_new();
-       pvt->incoming = NULL;
-       pvt->n_incoming = 0;
+       pvt->incoming = _vte_buffer_new();
        pvt->processing = FALSE;
        pvt->processing_tag = 0;
-       pvt->outgoing = NULL;
-       pvt->n_outgoing = 0;
+       pvt->outgoing = _vte_buffer_new();
        pvt->incoming_conv = (GIConv) -1;
        pvt->outgoing_conv_wide = (GIConv) -1;
        pvt->outgoing_conv_utf8 = (GIConv) -1;
+       pvt->conv_buffer = _vte_buffer_new();
        vte_terminal_set_encoding(terminal, NULL);
        g_assert(terminal->pvt->encoding != NULL);
 
@@ -10193,6 +10171,7 @@ vte_terminal_init(VteTerminal *terminal, gpointer *klass)
        pvt->audible_bell = TRUE;
        pvt->visible_bell = FALSE;
        pvt->xterm_font_tweak = FALSE;
+       pvt->smooth_scroll = FALSE;
        pvt->tabstops = NULL;
        vte_terminal_set_default_tabstops(terminal);
 
@@ -10273,6 +10252,12 @@ vte_terminal_init(VteTerminal *terminal, gpointer *klass)
        if ((render_max == VteRenderPango) &&
            (getenv("VTE_USE_PANGO") != NULL)) {
                if (atol(getenv("VTE_USE_PANGO")) == 0) {
+                       render_max = VteRenderPangoX;
+               }
+       }
+       if ((render_max == VteRenderPangoX) &&
+           (getenv("VTE_USE_PANGOX") != NULL)) {
+               if (atol(getenv("VTE_USE_PANGOX")) == 0) {
                        render_max = VteRenderXlib;
                }
        }
@@ -10292,9 +10277,12 @@ vte_terminal_init(VteTerminal *terminal, gpointer *klass)
                case VteRenderPango:
                        fprintf(stderr, "Using Pango.\n");
                        break;
+               case VteRenderPangoX:
+                       fprintf(stderr, "Using PangoX.\n");
+                       break;
                case VteRenderXlib:
-               default:
                        fprintf(stderr, "Using Xlib fonts.\n");
+                       break;
                }
        }
 #endif
@@ -10717,10 +10705,17 @@ vte_terminal_finalize(GObject *object)
 
        /* Discard any pending data. */
        if (terminal->pvt->incoming != NULL) {
-               g_free(terminal->pvt->incoming);
+               _vte_buffer_free(terminal->pvt->incoming);
        }
        terminal->pvt->incoming = NULL;
-       terminal->pvt->n_incoming = 0;
+       if (terminal->pvt->outgoing != NULL) {
+               _vte_buffer_free(terminal->pvt->outgoing);
+       }
+       terminal->pvt->outgoing = NULL;
+       if (terminal->pvt->conv_buffer != NULL) {
+               _vte_buffer_free(terminal->pvt->conv_buffer);
+       }
+       terminal->pvt->conv_buffer = NULL;
 
        /* Stop the child and stop watching for input from the child. */
        if (terminal->pvt->pty_pid > 0) {
@@ -10794,7 +10789,7 @@ vte_terminal_realize(GtkWidget *widget)
 {
        VteTerminal *terminal = NULL;
        GdkWindowAttr attributes;
-       GdkPixmap *pixmap;
+       GdkPixmap *pixmap, *mask;
        GdkColor black = {0,0,0}, color;
        int attributes_mask = 0, i;
 
@@ -10901,10 +10896,12 @@ vte_terminal_realize(GtkWidget *widget)
 
        /* Create our invisible cursor. */
        pixmap = gdk_pixmap_new(widget->window, 1, 1, 1);
+       mask = gdk_pixmap_new(widget->window, 1, 1, 1);
        terminal->pvt->mouse_inviso_cursor =
-               gdk_cursor_new_from_pixmap(pixmap, pixmap,
+               gdk_cursor_new_from_pixmap(pixmap, mask,
                                           &black, &black, 0, 0);
        g_object_unref(G_OBJECT(pixmap));
+       g_object_unref(G_OBJECT(mask));
 
        /* Grab input focus. */
        gtk_widget_grab_focus(widget);
@@ -11670,6 +11667,7 @@ vte_terminal_compute_padding(VteTerminal *terminal, Display *display,
 #endif
        /* Ask Pango. */
        case VteRenderPango:
+       case VteRenderPangoX:
                widget = GTK_WIDGET(terminal);
                layout = pango_layout_new(terminal->pvt->pcontext);
                pango_layout_set_font_description(layout,
@@ -11683,7 +11681,6 @@ vte_terminal_compute_padding(VteTerminal *terminal, Display *display,
                rpad = ((columns * terminal->char_width) - width) - pad;
                break;
        case VteRenderXlib:
-       default:
                /* Ask Xlib. */
                wc = vte_wc_from_unichar(terminal, c);
                XwcTextExtents(terminal->pvt->fontset, &wc, 1,
@@ -11879,12 +11876,6 @@ vte_terminal_draw_cells(VteTerminal *terminal,
                                c = items[i].c ? items[i].c : ' ';
                                columns += g_unichar_iswide(c) ? 2 : 1;
                        }
-#ifdef VTE_PREFER_PANGOX
-                       XSetForeground(display, gc, bg->pixel);
-                       XFillRectangle(display, drawable, gc,
-                                      x, y,
-                                      columns * column_width, row_height);
-#else
                        color.red = terminal->pvt->palette[back].red;
                        color.blue = terminal->pvt->palette[back].blue;
                        color.green = terminal->pvt->palette[back].green;
@@ -11895,7 +11886,41 @@ vte_terminal_draw_cells(VteTerminal *terminal,
                                           TRUE,
                                           x + x_offs, y + y_offs,
                                           columns * column_width, row_height);
+               }
+               /* Draw the text in a monospaced manner. */
+               color.red = terminal->pvt->palette[fore].red;
+               color.blue = terminal->pvt->palette[fore].blue;
+               color.green = terminal->pvt->palette[fore].green;
+               color.pixel = terminal->pvt->palette[fore].pixel;
+               gdk_gc_set_foreground(ggc, &color);
+               for (i = columns = 0; (layout != NULL) && (i < n); i++) {
+                       c = items[i].c ? items[i].c : ' ';
+                       pango_layout_set_text(layout, utf8_buf,
+                                             g_unichar_to_utf8(c, utf8_buf));
+                       gdk_draw_layout(gdrawable, ggc,
+                                       x + (columns * column_width) +
+                                       items[i].xpad + x_offs,
+                                       y + y_offs,
+                                       layout);
+                       columns += g_unichar_iswide(c) ? 2 : 1;
+               }
+               break;
+       case VteRenderPangoX:
+#ifdef VTE_DEBUG
+               if (_vte_debug_on(VTE_DEBUG_MISC) && 0) {
+                       fprintf(stderr, "Rendering with PangoX.\n");
+               }
 #endif
+               /* Draw the background. */
+               if ((back != VTE_DEF_BG) || draw_default_bg) {
+                       for (i = columns = 0; i < n; i++) {
+                               c = items[i].c ? items[i].c : ' ';
+                               columns += g_unichar_iswide(c) ? 2 : 1;
+                       }
+                       XSetForeground(display, gc, bg->pixel);
+                       XFillRectangle(display, drawable, gc,
+                                      x, y,
+                                      columns * column_width, row_height);
                }
                /* Draw the text in a monospaced manner. */
                color.red = terminal->pvt->palette[fore].red;
@@ -11907,7 +11932,6 @@ vte_terminal_draw_cells(VteTerminal *terminal,
                        c = items[i].c ? items[i].c : ' ';
                        pango_layout_set_text(layout, utf8_buf,
                                              g_unichar_to_utf8(c, utf8_buf));
-#ifdef VTE_PREFER_PANGOX
                        XSetForeground(display, gc, fg->pixel);
                        pango_x_render_layout(display,
                                              drawable,
@@ -11916,18 +11940,10 @@ vte_terminal_draw_cells(VteTerminal *terminal,
                                              x + (columns * column_width) +
                                              items[i].xpad,
                                              y);
-#else
-                       gdk_draw_layout(gdrawable, ggc,
-                                       x + (columns * column_width) +
-                                       items[i].xpad + x_offs,
-                                       y + y_offs,
-                                       layout);
-#endif
                        columns += g_unichar_iswide(c) ? 2 : 1;
                }
                break;
        case VteRenderXlib:
-       default:
 #ifdef VTE_DEBUG
                if (_vte_debug_on(VTE_DEBUG_MISC) && 0) {
                        fprintf(stderr, "Rendering with Xlib.\n");
@@ -12258,6 +12274,7 @@ vte_terminal_paint(GtkWidget *widget, GdkRectangle *area)
                break;
 #endif
        case VteRenderPango:
+       case VteRenderPangoX:
                if (terminal->pvt->pcontext == NULL) {
                        g_warning(_("Error allocating context, "
                                    "disabling Pango."));
@@ -12273,7 +12290,6 @@ vte_terminal_paint(GtkWidget *widget, GdkRectangle *area)
                                                  terminal->pvt->fontdesc);
                break;
        case VteRenderXlib:
-       default:
                /* do nothing */
                break;
        }
@@ -13165,7 +13181,7 @@ vte_terminal_setup_background(VteTerminal *terminal,
                        if (prop_data != NULL) {
                                g_free(prop_data);
                        }
-                        gdk_flush();
+                       gdk_flush();
                        gdk_error_trap_pop();
 
                        /* Get rid of any previous snapshot we've got, and
@@ -13301,17 +13317,17 @@ vte_terminal_setup_background(VteTerminal *terminal,
  * @saturation: TRUE if the terminal should fake transparency
  *
  * If a background image has been set using
- * vte_terminal_set_background_image(), 
+ * vte_terminal_set_background_image(),
  * vte_terminal_set_background_image_file(), or
  * vte_terminal_set_background_transparent(), the terminal will adjust the
  * brightness of the image before drawing the image.  To do so, the terminal
  * will create a copy of the background image (or snapshot of the root
  * window) and modify its pixel values.
- * 
+ *
  * If your application intends to create multiple terminal widgets with the
  * same settings, performing this step yourself and just using
  * vte_terminal_set_background_image() will save memory.
- * 
+ *
  */
 void
 vte_terminal_set_background_saturation(VteTerminal *terminal, double saturation)
@@ -13432,7 +13448,7 @@ vte_terminal_filter_property_changes(GdkXEvent *xevent, GdkEvent *event,
  * Sets the terminal's background image to the pixmap stored in the root
  * window, adjusted so that if there are no windows below your application,
  * the widget will appear to be transparent.
- * 
+ *
  */
 void
 vte_terminal_set_background_transparent(VteTerminal *terminal,
@@ -13492,7 +13508,7 @@ vte_terminal_set_background_transparent(VteTerminal *terminal,
  * drawn using the default background color will instead be drawn over the
  * specified image.  If necessary, the image will be tiled to cover the
  * widget's entire visible area.
- * 
+ *
  */
 void
 vte_terminal_set_background_image(VteTerminal *terminal, GdkPixbuf *image)
@@ -13535,7 +13551,7 @@ vte_terminal_set_background_image(VteTerminal *terminal, GdkPixbuf *image)
  * Sets a background image for the widget.  If specified by
  * vte_terminal_set_background_saturation, the terminal will make its
  * in-memory copy of the image darker for its own use.
- * 
+ *
  * This is a convenience wrapper for vte_terminal_set_background_image().
  * If your application intends to create multiple terminal widgets using the
  * same background, performing this step yourself and just using
@@ -13728,7 +13744,8 @@ vte_terminal_set_word_chars(VteTerminal *terminal, const char *spec)
        ilen = strlen(spec);
        ibuf = ibufptr = g_strdup(spec);
        olen = (ilen + 1) * sizeof(gunichar);
-       obuf = obufptr = g_malloc0(sizeof(gunichar) * (strlen(spec) + 1));
+       _vte_buffer_set_minimum_size(terminal->pvt->conv_buffer, olen);
+       obuf = obufptr = terminal->pvt->conv_buffer->bytes;
        wbuf = (gunichar*) obuf;
        wbuf[ilen] = '\0';
        g_iconv(conv, &ibuf, &ilen, &obuf, &olen);
@@ -13779,7 +13796,6 @@ vte_terminal_set_word_chars(VteTerminal *terminal, const char *spec)
                }
        }
        g_free(ibufptr);
-       g_free(obufptr);
 }
 
 /**
@@ -13862,26 +13878,28 @@ vte_terminal_get_mouse_autohide(VteTerminal *terminal)
  * @clear_history: TRUE to empty the terminal's scrollback buffer
  *
  * Resets as much of the terminal's internal state as possible, discarding any
- * unprocessed input data, resetting character attributes, cursor state, 
+ * unprocessed input data, resetting character attributes, cursor state,
  * national character set state, status line, terminal modes (insert/delete),
  * selection state, and encoding.
- * 
+ *
  */
 void
 vte_terminal_reset(VteTerminal *terminal, gboolean full, gboolean clear_history)
 {
        g_return_if_fail(VTE_IS_TERMINAL(terminal));
-       /* Ditch any pending input data. */
-       if (terminal->pvt->incoming) {
-               g_free(terminal->pvt->incoming);
-       }
-       terminal->pvt->incoming = NULL;
-       terminal->pvt->n_incoming = 0;
+       /* Stop processing any of the data we've got backed up. */
        if (terminal->pvt->processing) {
                g_source_remove(terminal->pvt->processing_tag);
                terminal->pvt->processing_tag = 0;
                terminal->pvt->processing = FALSE;
        }
+       /* Clear the input and output buffers. */
+       if (terminal->pvt->incoming != NULL) {
+               _vte_buffer_clear(terminal->pvt->incoming);
+       }
+       if (terminal->pvt->outgoing != NULL) {
+               _vte_buffer_clear(terminal->pvt->outgoing);
+       }
        /* Reset charset substitution state. */
        if (terminal->pvt->substitutions != NULL) {
                _vte_iso2022_free(terminal->pvt->substitutions);
@@ -13889,6 +13907,8 @@ vte_terminal_reset(VteTerminal *terminal, gboolean full, gboolean clear_history)
        terminal->pvt->substitutions = _vte_iso2022_new();
        /* Reset appkeypad state. */
        terminal->pvt->keypad = VTE_KEYPAD_NORMAL;
+       /* Disable smooth scroll. */
+       terminal->pvt->smooth_scroll = FALSE;
        /* Reset saved settings. */
        if (terminal->pvt->dec_saved != NULL) {
                g_hash_table_destroy(terminal->pvt->dec_saved);
@@ -13957,21 +13977,6 @@ vte_terminal_reset(VteTerminal *terminal, gboolean full, gboolean clear_history)
        terminal->pvt->alternate_screen.origin_mode = FALSE;
        terminal->pvt->alternate_screen.reverse_mode = FALSE;
        terminal->pvt->cursor_visible = TRUE;
-       /* Reset the input and output buffers. */
-       if (terminal->pvt->n_incoming > 0) {
-               terminal->pvt->n_incoming = 0;
-       }
-       if (terminal->pvt->incoming != NULL) {
-               g_free(terminal->pvt->incoming);
-               terminal->pvt->incoming = NULL;
-       }
-       if (terminal->pvt->n_outgoing > 0) {
-               terminal->pvt->n_outgoing = 0;
-       }
-       if (terminal->pvt->outgoing != NULL) {
-               g_free(terminal->pvt->outgoing);
-               terminal->pvt->outgoing = NULL;
-       }
        /* Reset the encoding. */
        vte_terminal_set_encoding(terminal, NULL);
        g_assert(terminal->pvt->encoding != NULL);
index 5e738fd..de04177 100644 (file)
@@ -101,6 +101,7 @@ main(int argc, char **argv)
        const char *background = NULL;
        gboolean transparent = FALSE, audible = TRUE, blink = TRUE,
                 debug = FALSE, dingus = FALSE, geometry = TRUE;
+       long lines = 100;
        const char *message = "Launching interactive shell...\r\n";
        const char *font = NULL;
        const char *terminal = NULL;
@@ -120,6 +121,7 @@ main(int argc, char **argv)
                            "[-f font] "
                            "[-g] "
                            "[-h] "
+                           "[-n] "
                            "[-t terminaltype]\n";
        back.red = back.green = back.blue = 0xffff;
        fore.red = fore.green = fore.blue = 0x3000;
@@ -150,7 +152,7 @@ main(int argc, char **argv)
        argv2[i] = NULL;
        g_assert(i < (g_list_length(args) + 2));
        /* Parse some command-line options. */
-       while ((opt = getopt(argc, argv, "B:DTabc:df:ght:")) != -1) {
+       while ((opt = getopt(argc, argv, "B:DTabc:df:ghn:t:")) != -1) {
                switch (opt) {
                        case 'B':
                                background = optarg;
@@ -179,6 +181,12 @@ main(int argc, char **argv)
                        case 'g':
                                geometry = !geometry;
                                break;
+                       case 'n':
+                               lines = atol(optarg);
+                               if (lines == 0) {
+                                       lines = 100;
+                               }
+                               break;
                        case 't':
                                terminal = optarg;
                                break;
@@ -239,7 +247,7 @@ main(int argc, char **argv)
        vte_terminal_set_cursor_blinks(VTE_TERMINAL(widget), blink);
        vte_terminal_set_scroll_on_output(VTE_TERMINAL(widget), FALSE);
        vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(widget), TRUE);
-       vte_terminal_set_scrollback_lines(VTE_TERMINAL(widget), 100);
+       vte_terminal_set_scrollback_lines(VTE_TERMINAL(widget), lines);
        vte_terminal_set_mouse_autohide(VTE_TERMINAL(widget), TRUE);
        if (background != NULL) {
                vte_terminal_set_background_image_file(VTE_TERMINAL(widget),
index 15b5593..8b41706 100644 (file)
--- a/vte.spec
+++ b/vte.spec
@@ -28,7 +28,7 @@ package contains the files needed for building applications using VTE.
 if [ -x %{_bindir}/python2.2 ]; then
        PYTHON=%{_bindir}/python2.2; export PYTHON
 fi
-%configure --enable-shared --enable-static
+%configure --enable-shared --enable-static --libexecdir=%{_libdir}/%{name}
 make
 
 %clean