diff options
author | Nalin Dahyabhai <nalin@src.gnome.org> | 2002-08-20 04:47:32 +0000 |
---|---|---|
committer | Nalin Dahyabhai <nalin@src.gnome.org> | 2002-08-20 04:47:32 +0000 |
commit | 6f7f5de82c2e11d8fbe1e496cd3cd5b2d04a0d2e (patch) | |
tree | 4ec6e8174ecd61d1811e433f48e5ca292c6114d7 | |
parent | 56a7bbf39468f9263a52fdda5e330a61bbdf5810 (diff) | |
download | vte-6f7f5de82c2e11d8fbe1e496cd3cd5b2d04a0d2e.tar.gz |
Load fonts just-in-time to avoid spurious reloads. Don't override the
* src/vte.c: Load fonts just-in-time to avoid spurious reloads. Don't override
the focus_in and focus_out event handlers -- the defaults DTRT.
* src/debug.c, src/debug.h: Add a RING debug class.
* src/iso2022.c: Handle override maps which don't affect the font palette
correctly, resetting at newlines and escape marks. Process bogon data
correctly.
* src/iso2022.txt: Add some sample text.
* src/vte.c: Fixup some fontconfig/Xft mixups. Set the hint style instead of
hinting when reading the GTK hint style setting (spotted by katzj and
otaylor).
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | po/da.po | 42 | ||||
-rw-r--r-- | po/de.po | 62 | ||||
-rw-r--r-- | po/fr.po | 47 | ||||
-rw-r--r-- | po/nl.po | 64 | ||||
-rw-r--r-- | po/sv.po | 42 | ||||
-rw-r--r-- | src/debug.c | 3 | ||||
-rw-r--r-- | src/debug.h | 1 | ||||
-rw-r--r-- | src/interpret.c | 9 | ||||
-rw-r--r-- | src/iso2022.c | 73 | ||||
-rw-r--r-- | src/iso2022.txt | 6 | ||||
-rw-r--r-- | src/ring.c | 10 | ||||
-rw-r--r-- | src/vte.c | 733 | ||||
-rw-r--r-- | vte.spec | 7 |
14 files changed, 647 insertions, 464 deletions
@@ -1,6 +1,16 @@ 2002-08-19 nalin + * src/vte.c: Load fonts just-in-time to avoid spurious reloads. Don't + override the focus_in and focus_out event handlers -- the defaults DTRT. + * src/debug.c, src/debug.h: Add a RING debug class. +2002-08-19 nalin + * src/iso2022.c: Handle override maps which don't affect the font + palette correctly, resetting at newlines and escape marks. Process + bogon data correctly. + * src/iso2022.txt: Add some sample text. +2002-08-19 nalin * src/vte.c: Fixup some fontconfig/Xft mixups. Set the hint style - instead of hinting when reading the GTK hint style setting. + instead of hinting when reading the GTK hint style setting (spotted + by katzj and otaylor). 2002-08-19 nalin * src/vte.h, src/vte.c: Use gssize instead of ssize_t. Perform substitutions while processing. Use PangoX contexts when we're using @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: vte\n" -"POT-Creation-Date: 2002-08-13 22:08+0200\n" +"POT-Creation-Date: 2002-08-20 00:28-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" @@ -28,98 +28,98 @@ msgstr "Fejl ved oprettelse af signaldatakanal." msgid "Duplicate (%s/%s)!" msgstr "Optræder mere end én gang (%s/%s)!" -#: src/vte.c:1080 +#: src/vte.c:1086 #, c-format msgid "Error compiling regular expression \"%s\"." msgstr "Fejl ved oversættelse af regulært udtryk \"%s\"." -#: src/vte.c:1450 src/vte.c:1459 src/vte.c:1471 src/vte.c:1489 src/vte.c:1494 -#: src/vte.c:1499 +#: src/vte.c:1456 src/vte.c:1465 src/vte.c:1477 src/vte.c:1495 src/vte.c:1500 +#: src/vte.c:1505 #, c-format msgid "Unable to convert characters from %s to %s." msgstr "Kunne ikke konvertere tegn fra %s til %s." -#: src/vte.c:4641 +#: src/vte.c:4564 #, c-format msgid "Got unexpected (key?) sequence `%s'." msgstr "Modtog uventet (taste-?) sekvens '%s'." -#: src/vte.c:5373 +#: src/vte.c:5293 #, c-format msgid "Character 0x%x is undefined, allocating one column." msgstr "Tegn 0x%x er ikke defineret, allokerer en kolonne." -#: src/vte.c:5566 +#: src/vte.c:5486 #, c-format msgid "No handler for control sequence `%s' defined." msgstr "Ingen håndtering for kontrolsekvensen '%s' er defineret." -#: src/vte.c:6097 +#: src/vte.c:6039 #, c-format msgid "Error reading from child: %s." msgstr "Fejl ved læsning fra underproces: %s." -#: src/vte.c:6265 +#: src/vte.c:6207 #, c-format msgid "Error (%s) converting data for child, dropping." msgstr "Fejl (%s) ved konvertering af data for underproces, dropper." -#: src/vte.c:8067 +#: src/vte.c:8014 #, 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:8644 +#: src/vte.c:8538 #, 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:8657 +#: src/vte.c:8550 msgid "Failed to load default Xft font." msgstr "Kunne ikke indlæse standard-Xft-skrifttypen." -#: src/vte.c:8700 +#: src/vte.c:8589 msgid "Error allocating Xft font, disabling Xft." msgstr "Fejl ved allokering af Xft-skrifttype, deaktiverer Xft." -#: src/vte.c:8724 +#: src/vte.c:8646 #, 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:8736 +#: src/vte.c:8658 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:8823 +#: src/vte.c:8871 #, 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:8849 +#: src/vte.c:8897 #, c-format msgid "Error setting PTY size: %s." msgstr "Fejl ved angivelse af PTY-størrelse: %s." -#: src/vte.c:11244 +#: src/vte.c:11294 msgid "Error allocating context, disabling Pango." msgstr "Fejl ved allokering af kontekst, deaktiverer Pango." -#: src/vte.c:11250 +#: src/vte.c:11300 msgid "Error allocating layout, disabling Pango." msgstr "Fejl ved allokering af layout, deaktiverer Pango." -#: src/vte.c:11265 +#: src/vte.c:11315 msgid "Error allocating draw, disabling Xft." msgstr "Fejl ved allokering af tegning, deaktiverer Xft." #. Aaargh. We're screwed. -#: src/vte.c:12449 +#: src/vte.c:12499 msgid "g_iconv_open() failed setting word characters" msgstr "g_iconv_open() kunne ikke angive ordtegn" @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: vte HEAD\n" -"POT-Creation-Date: 2002-08-07 15:14+0200\n" +"POT-Creation-Date: 2002-08-20 00:28-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" @@ -28,97 +28,99 @@ msgstr "Fehler beim Erstellen der Signalweiterleitung." msgid "Duplicate (%s/%s)!" msgstr "Duplikat (%s/%s)!" -#: src/vte.c:1060 +#: src/vte.c:1086 #, c-format msgid "Error compiling regular expression \"%s\"." msgstr "Fehler beim Kompilieren des regulären Ausdrucks »%s«." -#: src/vte.c:1431 -#: src/vte.c:1440 -#: src/vte.c:1452 -#: src/vte.c:1470 -#: src/vte.c:1475 -#: src/vte.c:1480 +#: src/vte.c:1456 src/vte.c:1465 src/vte.c:1477 src/vte.c:1495 src/vte.c:1500 +#: src/vte.c:1505 #, c-format msgid "Unable to convert characters from %s to %s." msgstr "Zeichen konnten nicht von %s nach %s konvertiert werden." -#: src/vte.c:4621 +#: src/vte.c:4564 #, c-format msgid "Got unexpected (key?) sequence `%s'." msgstr "Unerwartete (Schlüssel?)-Sequenz »%s« erhalten." -#: src/vte.c:5353 +#: src/vte.c:5293 #, c-format msgid "Character 0x%x is undefined, allocating one column." msgstr "Zeichen 0x%x ist undefiniert, eine Spalte wird zugewiesen." -#: src/vte.c:5544 +#: src/vte.c:5486 #, c-format msgid "No handler for control sequence `%s' defined." msgstr "Kein Handler für Kontrollsequenz »%s« definiert." -#: src/vte.c:6071 +#: src/vte.c:6039 #, c-format msgid "Error reading from child: %s." msgstr "Fehler beim Lesen von Kind: %s." -#: src/vte.c:6239 +#: src/vte.c:6207 #, 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:8046 +#: src/vte.c:8014 #, c-format msgid "Using fontset \"%s\", which is missing these character sets: %s." -msgstr "Schriftsatz »%s« wird verwendet, welchem folgende Zeichensätze fehlen: %s." +msgstr "" +"Schriftsatz »%s« wird verwendet, welchem folgende Zeichensätze fehlen: %s." -#: src/vte.c:8623 +#: src/vte.c:8538 #, 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." +msgstr "" +"Laden des Xft-Schriftmusters »%s« fehlgeschlagen, Rückfall zur vorgegebenen " +"Schrift." -#: src/vte.c:8636 +#: src/vte.c:8550 msgid "Failed to load default Xft font." msgstr "Laden der vorgegebenen Xft-Schrift fehlgeschlagen" -#: src/vte.c:8679 +#: src/vte.c:8589 msgid "Error allocating Xft font, disabling Xft." msgstr "Fehler beim Zuweisen der Xft-Schrift, Xft wird deaktivert." -#: src/vte.c:8703 +#: src/vte.c:8646 #, 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." +msgstr "" +"Laden des Schriftsatzes »%s« fehlgeschlagen, Rückfall zur vorgegebenen " +"Schrift." -#: src/vte.c:8715 +#: src/vte.c:8658 msgid "Failed to load default font, crashing or behaving abnormally." -msgstr "Laden der vorgebenen Schrift fehlgeschlagen, Absturz oder abnormales Verhalten." +msgstr "" +"Laden der vorgebenen Schrift fehlgeschlagen, Absturz oder abnormales " +"Verhalten." -#: src/vte.c:8802 +#: src/vte.c:8871 #, 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:8828 +#: src/vte.c:8897 #, c-format msgid "Error setting PTY size: %s." msgstr "Fehler beim Festlegen der PTY-Größe: %s." -#: src/vte.c:11189 +#: src/vte.c:11294 msgid "Error allocating context, disabling Pango." msgstr "Fehler beim Zuweisen des Kontextes, Pango wird deaktiviert." -#: src/vte.c:11195 +#: src/vte.c:11300 msgid "Error allocating layout, disabling Pango." msgstr "Fehler beim Zuweisen des Layouts, Pango wird deaktiviert." -#: src/vte.c:11210 +#: src/vte.c:11315 msgid "Error allocating draw, disabling Xft." msgstr "Fehler beim Zuweisen der Zeichnung, Xft wird deaktiviert." #. Aaargh. We're screwed. -#: src/vte.c:12373 +#: src/vte.c:12499 msgid "g_iconv_open() failed setting word characters" msgstr "g_iconv_open() konnte die Zeichen des Wortes nicht festlegen" - @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: vte 0.7.0\n" -"POT-Creation-Date: 2002-08-02 12:29+0200\n" +"POT-Creation-Date: 2002-08-20 00:28-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" @@ -27,102 +27,101 @@ msgstr "Erreur lors de la création du signal de tube." msgid "Duplicate (%s/%s)!" msgstr "Dupliquer (%s/%s) ! " -#: src/vte.c:1057 +#: src/vte.c:1086 #, c-format msgid "Error compiling regular expression \"%s\"." msgstr "Erreur lors de la compilation de l'expression régulière « %s »." -#: src/vte.c:1428 src/vte.c:1437 src/vte.c:1447 src/vte.c:1461 src/vte.c:1466 -#: src/vte.c:1471 +#: src/vte.c:1456 src/vte.c:1465 src/vte.c:1477 src/vte.c:1495 src/vte.c:1500 +#: src/vte.c:1505 #, c-format msgid "Unable to convert characters from %s to %s." msgstr "Impossible de convertir les caractères %s en %s." -#: src/vte.c:4601 +#: src/vte.c:4564 #, c-format msgid "Got unexpected (key?) sequence `%s'." msgstr "Séquence (clé ?) imprévue « %s »." -#: src/vte.c:5333 +#: src/vte.c:5293 #, 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:5524 +#: src/vte.c:5486 #, 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:6051 +#: src/vte.c:6039 #, c-format msgid "Error reading from child: %s." msgstr "Erreur lors de la lecture du fils : « %s »." -#: src/vte.c:6219 +#: src/vte.c:6207 #, 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:7982 -#, c-format -msgid "" -"Warning: using fontset \"%s\", which is missing these character sets: %s." +#: src/vte.c:8014 +#, 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:8520 +#: src/vte.c:8538 #, 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:8533 +#: src/vte.c:8550 msgid "Failed to load default Xft font." msgstr "Échec du chargement la police Xft par défaut." -#: src/vte.c:8576 +#: src/vte.c:8589 msgid "Error allocating Xft font, disabling Xft." msgstr "Erreur dans l'attribution de la police Xft, désactivation de Xft." -#: src/vte.c:8600 +#: src/vte.c:8646 #, 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:8612 +#: src/vte.c:8658 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:8695 +#: src/vte.c:8871 #, 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:8721 +#: src/vte.c:8897 #, c-format msgid "Error setting PTY size: %s." msgstr "Erreur lors du paramètrage de la taille PTY : « %s »." -#: src/vte.c:10993 +#: src/vte.c:11294 msgid "Error allocating context, disabling Pango." msgstr "Erreur lors de l'attribution du contexte, désactivation de Pango." -#: src/vte.c:10999 +#: src/vte.c:11300 msgid "Error allocating layout, disabling Pango." msgstr "" "Erreur lors de l'attribution de la disposition, désactivation de Pango." -#: src/vte.c:11011 +#: src/vte.c:11315 msgid "Error allocating draw, disabling Xft." msgstr "Erreur lors de l'attribution du dessin, désactivation de Xft." #. Aaargh. We're screwed. -#: src/vte.c:12162 +#: src/vte.c:12499 msgid "g_iconv_open() failed setting word characters" msgstr "g_iconv_open() a échoué dans le paramètrage des caractères." @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: vte\n" -"POT-Creation-Date: 2002-08-08 16:44+0200\n" +"POT-Creation-Date: 2002-08-20 00:28-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" @@ -27,96 +27,100 @@ msgstr "Fout bij maken signaal pijp." msgid "Duplicate (%s/%s)!" msgstr "Dupliceren (%s/%s)!" -#: src/vte.c:1078 +#: src/vte.c:1086 #, c-format msgid "Error compiling regular expression \"%s\"." msgstr "Fout bij samenstellen reguliere uitdrukking \"%s\"." -#: src/vte.c:1448 src/vte.c:1457 src/vte.c:1469 src/vte.c:1487 src/vte.c:1492 -#: src/vte.c:1497 +#: src/vte.c:1456 src/vte.c:1465 src/vte.c:1477 src/vte.c:1495 src/vte.c:1500 +#: src/vte.c:1505 #, c-format msgid "Unable to convert characters from %s to %s." msgstr "Kan tekens niet converteren van %s naar %s." -#: src/vte.c:4642 -#, c-format -#, fuzzy +#: src/vte.c:4564 +#, fuzzy, c-format msgid "Got unexpected (key?) sequence `%s'." msgstr "Ontvangen: onverwachte (toetsenbord?) combinatie `%s'." -#: src/vte.c:5374 +#: src/vte.c:5293 #, c-format msgid "Character 0x%x is undefined, allocating one column." msgstr "Teken 0x%x is ongedefinieerd, wijs één kolom toe." -#: src/vte.c:5565 -#, c-format -#, fuzzy +#: src/vte.c:5486 +#, fuzzy, c-format msgid "No handler for control sequence `%s' defined." msgstr "Geen afhandelaar voor controle combinatie `%s' gedefinieerd." -#: src/vte.c:6092 +#: src/vte.c:6039 #, c-format msgid "Error reading from child: %s." msgstr "Fout bij lezen van kind: %s." -#: src/vte.c:6260 +#: src/vte.c:6207 #, c-format msgid "Error (%s) converting data for child, dropping." msgstr "Fout (%s) bij converteren gegevens voor kind, laat het vallen." -#: src/vte.c:8062 +#: src/vte.c:8014 #, 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." +msgstr "" +"Lettertype verzameling \"%s\" wordt gebruikt, maar die mist deze tekensets: %" +"s." -#: src/vte.c:8639 +#: src/vte.c:8538 #, 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." +msgstr "" +"Laden Xft lettertype patroon \"%s\" mislukt, val terug op standaard " +"lettertype." -#: src/vte.c:8652 +#: src/vte.c:8550 msgid "Failed to load default Xft font." msgstr "Laden standaard Xft lettertype mislukt." -#: src/vte.c:8695 +#: src/vte.c:8589 msgid "Error allocating Xft font, disabling Xft." msgstr "Fout bij toewijzen Xft lettertype, zet Xft uit." -#: src/vte.c:8719 +#: src/vte.c:8646 #, 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." +msgstr "" +"Fout bij laden lettertype verzameling \"%s\", val terug op standaard " +"lettertype." -#: src/vte.c:8731 +#: src/vte.c:8658 msgid "Failed to load default font, crashing or behaving abnormally." -msgstr "Fout bij laden standaard lettertype, loop vast of gedraag mezelf abnormaal." +msgstr "" +"Fout bij laden standaard lettertype, loop vast of gedraag mezelf abnormaal." -#: src/vte.c:8818 +#: src/vte.c:8871 #, c-format msgid "Error reading PTY size, using defaults: %s." msgstr "Fout bij lezen PTY grootte, gebruik standaardwaarden: %s." -#: src/vte.c:8844 +#: src/vte.c:8897 #, c-format msgid "Error setting PTY size: %s." msgstr "Fout bij instellen PTY grootte: %s." -#: src/vte.c:11230 +#: src/vte.c:11294 msgid "Error allocating context, disabling Pango." msgstr "Fout bij toewijzen context, zet Pango uit." -#: src/vte.c:11236 +#: src/vte.c:11300 #, fuzzy msgid "Error allocating layout, disabling Pango." msgstr "Fout bij toewijzen layout, zet Pango uit." -#: src/vte.c:11251 +#: src/vte.c:11315 msgid "Error allocating draw, disabling Xft." msgstr "Fout bij toewijzen tekenen, zet Xft uit." #. Aaargh. We're screwed. -#: src/vte.c:12433 -#. fuzzy +#: src/vte.c:12499 msgid "g_iconv_open() failed setting word characters" msgstr "g_iconv_open() niet geslaagd in instellen woordtekens" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: vte\n" -"POT-Creation-Date: 2002-08-07 20:40+0200\n" +"POT-Creation-Date: 2002-08-20 00:28-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" @@ -29,100 +29,100 @@ msgstr "Fel vid skapande av signalrör." msgid "Duplicate (%s/%s)!" msgstr "Dubbel (%s/%s)!" -#: src/vte.c:1061 +#: src/vte.c:1086 #, c-format msgid "Error compiling regular expression \"%s\"." msgstr "Fel vid kompilering av reguljärt uttryck \"%s\"." -#: src/vte.c:1432 src/vte.c:1441 src/vte.c:1453 src/vte.c:1471 src/vte.c:1476 -#: src/vte.c:1481 +#: src/vte.c:1456 src/vte.c:1465 src/vte.c:1477 src/vte.c:1495 src/vte.c:1500 +#: src/vte.c:1505 #, c-format msgid "Unable to convert characters from %s to %s." msgstr "Kan inte konvertera tecken från %s till %s." -#: src/vte.c:4622 +#: src/vte.c:4564 #, c-format msgid "Got unexpected (key?) sequence `%s'." msgstr "Fick oväntad (tangent?)sekvens \"%s\"." -#: src/vte.c:5354 +#: src/vte.c:5293 #, c-format msgid "Character 0x%x is undefined, allocating one column." msgstr "Tecknet 0x%x är odefinierat, allokerar en kolumn." -#: src/vte.c:5545 +#: src/vte.c:5486 #, c-format msgid "No handler for control sequence `%s' defined." msgstr "Ingen hanterare för kontrollsekvensen \"%s\" är angiven." -#: src/vte.c:6072 +#: src/vte.c:6039 #, c-format msgid "Error reading from child: %s." msgstr "Fel vid läsning från barn: %s." -#: src/vte.c:6240 +#: src/vte.c:6207 #, c-format msgid "Error (%s) converting data for child, dropping." msgstr "Fel (%s) vid konvertering av data för barn, kastar." -#: src/vte.c:8047 +#: src/vte.c:8014 #, 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:8624 +#: src/vte.c:8538 #, 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:8637 +#: src/vte.c:8550 msgid "Failed to load default Xft font." msgstr "Misslyckades med att läsa in Xft-standardtypsnittet." -#: src/vte.c:8680 +#: src/vte.c:8589 msgid "Error allocating Xft font, disabling Xft." msgstr "Fel vid allokering av Xft-typsnitt, deaktiverar Xft." -#: src/vte.c:8704 +#: src/vte.c:8646 #, 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:8716 +#: src/vte.c:8658 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:8803 +#: src/vte.c:8871 #, 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:8829 +#: src/vte.c:8897 #, c-format msgid "Error setting PTY size: %s." msgstr "Fel vid läsande av PTY-storlek: %s." -#: src/vte.c:11216 +#: src/vte.c:11294 msgid "Error allocating context, disabling Pango." msgstr "Fel vid allokering av sammanhang, deaktiverar Pango." -#: src/vte.c:11222 +#: src/vte.c:11300 msgid "Error allocating layout, disabling Pango." msgstr "Fel vid allokering av layout, deaktiverar Pango." -#: src/vte.c:11237 +#: src/vte.c:11315 msgid "Error allocating draw, disabling Xft." msgstr "Fel vid allokering av ritbar yta, deaktiverar Xft." #. Aaargh. We're screwed. -#: src/vte.c:12400 +#: src/vte.c:12499 msgid "g_iconv_open() failed setting word characters" msgstr "g_iconv_open() misslyckades med att ställa in ordtecken" diff --git a/src/debug.c b/src/debug.c index 3d7734be..91a911a5 100644 --- a/src/debug.c +++ b/src/debug.c @@ -58,6 +58,9 @@ vte_debug_parse_string(const char *string) } else if (g_ascii_strcasecmp(flags[i], "SUBSTITUTION") == 0) { vte_debug_flags |= VTE_DEBUG_SUBSTITUTION; + } else + if (g_ascii_strcasecmp(flags[i], "RING") == 0) { + vte_debug_flags |= VTE_DEBUG_RING; } } g_strfreev(flags); diff --git a/src/debug.h b/src/debug.h index 2b49d0f3..2e77e146 100644 --- a/src/debug.h +++ b/src/debug.h @@ -32,6 +32,7 @@ typedef enum { VTE_DEBUG_SIGNALS = 1 << 5, VTE_DEBUG_SELECTION = 1 << 6, VTE_DEBUG_SUBSTITUTION = 1 << 7, + VTE_DEBUG_RING = 1 << 8, } VteDebugFlags; void vte_debug_parse_string(const char *string); diff --git a/src/interpret.c b/src/interpret.c index 03621961..8eb3141a 100644 --- a/src/interpret.c +++ b/src/interpret.c @@ -120,6 +120,15 @@ main(int argc, char **argv) g_print("%s\n", error->message ? error->message : "?"); g_clear_error(&error); + g_print("Data: "); + for (j = 0; j < array->len; j++) { + if (j > 0) { + g_print(", "); + } + g_print("0x%x", array->data[j]); + } + g_print("\n"); + continue; } tmpsubst = vte_iso2022_copy(substitutions); substlen = vte_iso2022_substitute(tmpsubst, diff --git a/src/iso2022.c b/src/iso2022.c index 1a1493dd..6c039eaf 100644 --- a/src/iso2022.c +++ b/src/iso2022.c @@ -41,7 +41,7 @@ struct vte_iso2022_map { }; struct vte_iso2022 { - int current; + int current, override; gboolean ss2, ss3; gunichar g[4]; }; @@ -238,6 +238,7 @@ vte_iso2022_new(void) struct vte_iso2022 *ret = NULL; ret = g_malloc0(sizeof(struct vte_iso2022)); ret->current = 0; + ret->override = 0; ret->ss2 = FALSE; ret->ss3 = FALSE; ret->g[0] = 'B'; @@ -259,6 +260,7 @@ void vte_iso2022_free(struct vte_iso2022 *p) { p->current = 0; + p->override = 0; p->ss2 = FALSE; p->ss3 = FALSE; p->g[0] = '\0'; @@ -450,11 +452,26 @@ vte_iso2022_substitute(struct vte_iso2022 *outside_state, #endif continue; break; + case '\r': + case '\n': + /* Reset overrides. */ + state.override = '\0'; + goto plain; case '': + /* Reset overrides. */ + state.override = '\0'; /* Begins a control sequence. Make sure there's another * character for us to read. */ if (i + 1 >= length) { g_free(buf); +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_SUBSTITUTION)) { + fprintf(stderr, + "Incomplete specifier: " + "need %d bytes, have " + "%d.\n", 1, length - i); + } +#endif return -1; } switch (instring[i + 1]) { @@ -480,6 +497,14 @@ vte_iso2022_substitute(struct vte_iso2022 *outside_state, /* Designate Gx. Must be another character here. */ if (i + 2 >= length) { g_free(buf); +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_SUBSTITUTION)) { + fprintf(stderr, + "Incomplete specifier: " + "need %d bytes, have " + "%d.\n", 2, length - i); + } +#endif return -1; } /* We only handle maps we recognize. */ @@ -501,6 +526,14 @@ vte_iso2022_substitute(struct vte_iso2022 *outside_state, /* Designate Gx. Must be another character here. */ if (i + 2 >= length) { g_free(buf); +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_SUBSTITUTION)) { + fprintf(stderr, + "Incomplete specifier: " + "need %d bytes, have " + "%d.\n", 2, length - i); + } +#endif return -1; } switch (instring[i + 2]) { @@ -511,6 +544,14 @@ vte_iso2022_substitute(struct vte_iso2022 *outside_state, /* Need another character here. */ if (i + 3 >= length) { g_free(buf); +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_SUBSTITUTION)) { + fprintf(stderr, + "Incomplete specifier: " + "need %d bytes, have " + "%d.\n", 3, length - i); + } +#endif return -1; } g = -1; @@ -545,19 +586,18 @@ vte_iso2022_substitute(struct vte_iso2022 *outside_state, continue; break; default: - /* New designation for G0; we only handle maps - * we recognize. */ + /* Override. */ if (strchr(WIDE_MAPS, instring[i + 2]) == NULL) { continue; } - /* Set G0. */ - state.g[0] = instring[i + 2] + WIDE_FUDGE; + /* Set the current map. */ + state.override = instring[i + 2] + WIDE_FUDGE; i += 2; #ifdef VTE_DEBUG if (vte_debug_on(VTE_DEBUG_SUBSTITUTION)) { fprintf(stderr, - "G0 set to wide `%c'.\n", - state.g[0] - WIDE_FUDGE); + "Override set to wide `%c'.\n", + state.override - WIDE_FUDGE); } #endif continue; @@ -611,8 +651,20 @@ vte_iso2022_substitute(struct vte_iso2022 *outside_state, /* default: fall through */ } + plain: default: + /* Reset override maps. */ + switch (instring[i]) { + case '\n': + case '\r': + case '': + state.override = 0; + break; + } /* Determine which map we should use here. */ + if (state.override != 0) { + current_map = state.override; + } else if (state.ss2) { current_map = state.g[2]; state.ss2 = FALSE; @@ -647,6 +699,13 @@ vte_iso2022_substitute(struct vte_iso2022 *outside_state, } /* We need at least this many characters. */ if (i + chars_per_code > length) { +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_SUBSTITUTION)) { + fprintf(stderr, "Incomplete multibyte sequence " + "at %d: need %d bytes, have %d.\n", + i, chars_per_code, length - i); + } +#endif g_free(buf); return -1; } diff --git a/src/iso2022.txt b/src/iso2022.txt index fe888a16..e67fae91 100644 --- a/src/iso2022.txt +++ b/src/iso2022.txt @@ -3,3 +3,9 @@ # ISO-2022-JP/156: $B$+$J4A;z(B ISO-2022-KR/158: $)C1hD!)B + +# +# Sample text based on XTerm's specs and random other docs. +# +British : (A$(B$ +ISO-2022-JP : (J~(B~ @@ -54,7 +54,7 @@ vte_ring_insert(VteRing *ring, long position, gpointer data) { long point, i; #ifdef VTE_DEBUG - if (vte_debug_on(VTE_DEBUG_MISC)) { + if (vte_debug_on(VTE_DEBUG_RING)) { fprintf(stderr, "Inserting at position %ld.\n", position); fprintf(stderr, " Delta = %ld, Length = %ld, Max = %ld.\n", ring->delta, ring->length, ring->max); @@ -79,7 +79,7 @@ vte_ring_insert(VteRing *ring, long position, gpointer data) ring->length++; } #ifdef VTE_DEBUG - if (vte_debug_on(VTE_DEBUG_MISC)) { + if (vte_debug_on(VTE_DEBUG_RING)) { fprintf(stderr, " Delta = %ld, Length = %ld, " "Max = %ld.\n", ring->delta, ring->length, ring->max); @@ -115,7 +115,7 @@ vte_ring_insert(VteRing *ring, long position, gpointer data) ring->array[position % ring->max] = data; ring->length = MIN(ring->length + 1, ring->max); #ifdef VTE_DEBUG - if (vte_debug_on(VTE_DEBUG_MISC)) { + if (vte_debug_on(VTE_DEBUG_RING)) { fprintf(stderr, " Delta = %ld, Length = %ld, Max = %ld.\n", ring->delta, ring->length, ring->max); } @@ -128,7 +128,7 @@ vte_ring_remove(VteRing *ring, long position, gboolean free) { long i; #ifdef VTE_DEBUG - if (vte_debug_on(VTE_DEBUG_MISC)) { + if (vte_debug_on(VTE_DEBUG_RING)) { fprintf(stderr, "Removing item at position %ld.\n", position); fprintf(stderr, " Delta = %ld, Length = %ld, Max = %ld.\n", ring->delta, ring->length, ring->max); @@ -151,7 +151,7 @@ vte_ring_remove(VteRing *ring, long position, gboolean free) ring->length--; } #ifdef VTE_DEBUG - if (vte_debug_on(VTE_DEBUG_MISC)) { + if (vte_debug_on(VTE_DEBUG_RING)) { fprintf(stderr, " Delta = %ld, Length = %ld, Max = %ld.\n", ring->delta, ring->length, ring->max); } @@ -342,6 +342,7 @@ static void vte_terminal_set_termcap(VteTerminal *terminal, const char *path, gboolean reset); static void vte_terminal_setup_background(VteTerminal *terminal, gboolean refresh_transparent); +static void vte_terminal_ensure_font(VteTerminal *terminal); static void vte_terminal_ensure_cursor(VteTerminal *terminal, gboolean current); static void vte_terminal_insert_char(GtkWidget *widget, gunichar c, gboolean force_insert_mode); @@ -521,6 +522,9 @@ vte_invalidate_cells(VteTerminal *terminal, return; } + /* Ensure that we have font metrics. */ + vte_terminal_ensure_font(terminal); + /* Subtract the scrolling offset from the row start so that the * resulting rectangle is relative to the visible portion of the * buffer. */ @@ -8050,7 +8054,7 @@ xft_slant_from_pango_style (int style) /* Create an Xft pattern from a Pango font description. */ static XftPattern * -xft_pattern_from_pango_font_description(const PangoFontDescription *font_desc) +xft_pattern_from_pango_font_desc(const PangoFontDescription *font_desc) { XftPattern *pattern; const char *family = "mono"; @@ -8104,7 +8108,7 @@ xlfd_from_pango_font_description(GtkWidget *widget, PangoXSubfont *subfont_ids; PangoFontMap *fontmap; int *subfont_charsets, i, count; - char *xlfd = NULL, *tmp, *subfont; + char *xlfd = NULL, *tmp, *subfont, *ret; char **exploded; char *encodings[] = { "iso10646-0", @@ -8201,7 +8205,9 @@ xlfd_from_pango_font_description(GtkWidget *widget, g_free(subfont_charsets); } - return xlfd; + ret = strdup(xlfd); + g_free(xlfd); + return ret; } #ifdef HAVE_XFT @@ -8229,6 +8235,53 @@ vte_compare_direct(gconstpointer a, gconstpointer b) return GPOINTER_TO_INT(a) - GPOINTER_TO_INT(b); } +/* Apply the changed metrics, and queue a resize if need be. */ +static void +vte_terminal_apply_metrics(VteTerminal *terminal, + gint width, gint height, gint ascent, gint descent) +{ + gboolean resize = FALSE, cresize = FALSE; + + /* Sanity check for broken font changes. */ + width = MAX(width, 1); + height = MAX(height, 2); + ascent = MAX(ascent, 1); + descent = MAX(descent, 1); + + /* Change settings, and keep track of when we've changed anything. */ + if (width != terminal->char_width) { + resize = cresize = TRUE; + terminal->char_width = width; + } + if (height != terminal->char_height) { + resize = cresize = TRUE; + terminal->char_height = height; + } + if (ascent != terminal->char_ascent) { + resize = TRUE; + terminal->char_ascent = ascent; + } + if (descent != terminal->char_descent) { + resize = TRUE; + terminal->char_descent = descent; + } + /* Queue a resize if anything's changed. */ + if (resize) { + if (GTK_WIDGET_REALIZED(GTK_WIDGET(terminal))) { + gtk_widget_queue_resize(GTK_WIDGET(terminal)); + } + } + /* Emit a signal that the font changed. */ + if (cresize) { + vte_terminal_emit_char_size_changed(terminal, + terminal->char_width, + terminal->char_height); + } + /* Repaint. */ + vte_invalidate_all(terminal); +} + +#ifdef HAVE_XFT2 /* Handle notification that Xft-related GTK settings have changed by resetting * the font using the new settings. */ static void @@ -8243,7 +8296,6 @@ vte_xft_changed_cb(GtkSettings *settings, GParamSpec *spec, vte_terminal_set_font(terminal, terminal->pvt->fontdesc); } -#ifdef HAVE_XFT2 /* Add default specifiers to the pattern which incorporate the current Xft * settings. */ static void @@ -8399,347 +8451,392 @@ vte_font_match(VteTerminal *terminal, FcPattern *pattern, FcResult *result) } #endif -/* Set the fontset used for rendering text into the widget. */ -void -vte_terminal_set_font(VteTerminal *terminal, - const PangoFontDescription *font_desc) +#ifdef HAVE_XFT +/* Ensure that an Xft font is loaded and metrics are known. */ +static void +vte_terminal_ensure_font_xft(VteTerminal *terminal) { - long width, height, ascent, descent; - GtkWidget *widget; - XFontStruct **font_struct_list, font_struct; - XRectangle ink, logical; - char *xlfds; - char **missing_charset_list = NULL, *def_string = NULL; - int missing_charset_count = 0; - char **font_name_list = NULL; + XftFont *new_font; + XftPattern *pattern; + XftPattern *matched_pattern; + XftResult result; + XGlyphInfo glyph_info; + gint width, height, ascent, descent; gboolean need_destroy = FALSE; + char *name; - g_return_if_fail(terminal != NULL); - g_return_if_fail(VTE_IS_TERMINAL(terminal)); - widget = GTK_WIDGET(terminal); - - /* Choose default font metrics. I like '10x20' as a terminal font. */ - width = 10; - height = 20; - descent = 0; - ascent = height - descent; + /* Simple case -- we already loaded the font. */ + if (terminal->pvt->ftfont != NULL) { + return; + } #ifdef VTE_DEBUG if (vte_debug_on(VTE_DEBUG_MISC)) { - if (font_desc) { - char *tmp; - tmp = pango_font_description_to_string(font_desc); - fprintf(stderr, "Using pango font \"%s\".\n", - tmp); - g_free (tmp); - } else { - fprintf(stderr, "Using default pango font.\n"); - } + fprintf(stderr, "Opening Xft font.\n"); } #endif - if (terminal->pvt->fontpaddingl != NULL) { - g_tree_destroy(terminal->pvt->fontpaddingl); + /* Map the font description to an Xft pattern. */ + pattern = xft_pattern_from_pango_font_desc(terminal->pvt->fontdesc); + + /* Xft is on a lot of crack here - it fills in "result" when it + * feels like it, and leaves it uninitialized the rest of the + * time. Whether it's filled in is impossible to determine + * afaict. We don't care about its value anyhow. */ + result = 0xffff; /* some bogus value to help in debugging */ +#ifdef HAVE_XFT2 + matched_pattern = vte_font_match(terminal, pattern, &result); +#else + matched_pattern = XftFontMatch(GDK_DISPLAY(), + gdk_x11_get_default_screen(), + pattern, &result); +#endif + /* Keep track of whether or not we need to destroy this pattern. */ + if (matched_pattern != NULL) { + need_destroy = TRUE; } - terminal->pvt->fontpaddingl = g_tree_new(vte_compare_direct); - if (terminal->pvt->fontpaddingr != NULL) { - g_tree_destroy(terminal->pvt->fontpaddingr); + +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_MISC)) { + if (matched_pattern != NULL) { + name = vte_unparse_xft_pattern(matched_pattern); + fprintf(stderr, "Matched pattern \"%s\".\n", name); + free(name); + } + switch (result) { + case XftResultMatch: + fprintf(stderr, "matched.\n"); + break; + case XftResultNoMatch: + fprintf(stderr, "no match.\n"); + break; + case XftResultTypeMismatch: + fprintf(stderr, "type mismatch.\n"); + break; + case XftResultNoId: + fprintf(stderr, "no ID.\n"); + break; + default: + fprintf(stderr, "undefined/bogus result.\n"); + break; + } } - terminal->pvt->fontpaddingr = g_tree_new(vte_compare_direct); +#endif - /* Set up an owned font description. */ - if (font_desc != NULL) { - font_desc = - pango_font_description_copy(font_desc); + if (matched_pattern != NULL) { + /* More Xft crackrock - it appears to "adopt" matched_pattern + * as new_font->pattern; whether it does this reliably or not, + * or does another unpredictable bogosity like the "result" + * field above, I don't know. */ + new_font = XftFontOpenPattern(GDK_DISPLAY(), matched_pattern); + need_destroy = FALSE; } else { - gtk_widget_ensure_style(widget); - font_desc = - pango_font_description_copy(widget->style->font_desc); + new_font = NULL; } - /* Save the new font description. */ - if (terminal->pvt->fontdesc != NULL) { - pango_font_description_free(terminal->pvt->fontdesc); + if (new_font == NULL) { + name = vte_unparse_xft_pattern(matched_pattern); + g_warning(_("Failed to load Xft font pattern \"%s\", " + "falling back to default font."), name); + free(name); + /* Try to use the default font. */ + new_font = XftFontOpen(GDK_DISPLAY(), + gdk_x11_get_default_screen(), + XFT_FAMILY, XftTypeString, + "monospace", + XFT_SIZE, XftTypeDouble, 12.0, + 0); } - terminal->pvt->fontdesc = (PangoFontDescription*) font_desc; - - /* If we're not realized yet, then this is all we can do. */ - if (!GTK_WIDGET_REALIZED(widget)) { - return; + if (new_font == NULL) { + g_warning(_("Failed to load default Xft font.")); } - if (terminal->pvt->use_pango) { - /* Try to load the described font. */ - if (font_desc != NULL) { - PangoFont *font = NULL; - PangoFontDescription *desc = NULL; - PangoContext *pcontext = NULL; - PangoFontMetrics *pmetrics = NULL; - PangoLanguage *lang = NULL; - PangoLayout *layout = NULL; - PangoRectangle ink, logical; -#ifdef VTE_PREFER_PANGOX - pcontext = pango_x_get_context(GDK_DISPLAY()); -#else - pcontext = gtk_widget_get_pango_context(widget); -#endif - font = pango_context_load_font(pcontext, font_desc); - if (PANGO_IS_FONT(font)) { - /* We got a font, now reset the description so - * that it describes this font, and read its - * metrics. */ - desc = pango_font_describe(font); - lang = pango_context_get_language(pcontext); - pmetrics = pango_font_get_metrics(font, lang); - g_object_unref(G_OBJECT(font)); - } - /* Pull character cell size info from the metrics. */ - if (pmetrics != NULL) { - ascent = pango_font_metrics_get_ascent(pmetrics) / PANGO_SCALE; - descent = pango_font_metrics_get_descent(pmetrics) / PANGO_SCALE; - width = pango_font_metrics_get_approximate_char_width(pmetrics) / PANGO_SCALE; - height = ascent + descent; - pango_font_metrics_unref(pmetrics); - } - /* Create a layout object to get a width estimate. */ - if ((pcontext != NULL) && (desc != NULL)) { - layout = pango_layout_new(pcontext); - pango_layout_set_font_description(layout, desc); - pango_layout_set_text(layout, - VTE_REPRESENTATIVE_CHARACTERS, - strlen(VTE_REPRESENTATIVE_CHARACTERS)); - pango_layout_get_extents(layout, &ink, - &logical); - width = howmany(logical.width, PANGO_SCALE); - width = howmany(width, strlen(VTE_REPRESENTATIVE_CHARACTERS)); - g_object_unref(G_OBJECT(layout)); - } - /* Remove the actual description. */ - if (desc != NULL) { - pango_font_description_free(desc); - } - } + g_assert(pattern != new_font->pattern); + XftPatternDestroy(pattern); + if (need_destroy) { + XftPatternDestroy(matched_pattern); } -#ifdef HAVE_XFT - if (terminal->pvt->use_xft) { - XftFont *new_font; - XftPattern *pattern; - XftPattern *matched_pattern; - XftResult result; - XGlyphInfo glyph_info; - char *name; - - pattern = xft_pattern_from_pango_font_description(terminal->pvt->fontdesc); - - /* Xft is on a lot of crack here - it fills in "result" when it - * feels like it, and leaves it uninitialized the rest of the - * time. Whether it's filled in is impossible to determine - * afaict. We don't care about its value anyhow. */ - result = 0xffff; /* some bogus value to help in debugging */ -#ifdef HAVE_XFT2 - matched_pattern = vte_font_match(terminal, pattern, &result); -#else - matched_pattern = XftFontMatch(GDK_DISPLAY(), - gdk_x11_get_default_screen(), - pattern, &result); -#endif - if (matched_pattern != NULL) { - need_destroy = TRUE; + if (new_font) { +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_MISC)) { + name = vte_unparse_xft_pattern(new_font->pattern); + fprintf(stderr, "Opened new font `%s'.\n", name); + free(name); } +#endif + terminal->pvt->ftfont = new_font; + } + /* Read the metrics for the new font, if one was loaded. */ + if (terminal->pvt->ftfont != NULL) { + ascent = terminal->pvt->ftfont->ascent; + descent = terminal->pvt->ftfont->descent; + memset(&glyph_info, 0, sizeof(glyph_info)); + XftTextExtents8(GDK_DISPLAY(), terminal->pvt->ftfont, + VTE_REPRESENTATIVE_CHARACTERS, + strlen(VTE_REPRESENTATIVE_CHARACTERS), + &glyph_info); + width = howmany(glyph_info.width, + strlen(VTE_REPRESENTATIVE_CHARACTERS)); + height = MAX(terminal->pvt->ftfont->height, (ascent + descent)); + if (height == 0) { + height = glyph_info.height; + } + vte_terminal_apply_metrics(terminal, + width, height, + ascent, descent); + } else { + g_warning(_("Error allocating Xft font, disabling Xft.")); + terminal->pvt->use_xft = FALSE; + } +} +static void +vte_terminal_close_font_xft(VteTerminal *terminal) +{ + if (terminal->pvt->ftfont != NULL) { #ifdef VTE_DEBUG if (vte_debug_on(VTE_DEBUG_MISC)) { - if (matched_pattern != NULL) { - name = vte_unparse_xft_pattern(matched_pattern); - fprintf(stderr, "Matched pattern \"%s\".\n", - name); - free(name); - } - - switch (result) { - case XftResultMatch: - fprintf(stderr, "matched.\n"); - break; - case XftResultNoMatch: - fprintf(stderr, "no match.\n"); - break; - case XftResultTypeMismatch: - fprintf(stderr, "type mismatch.\n"); - break; - case XftResultNoId: - fprintf(stderr, "no ID.\n"); - break; - default: - fprintf(stderr, "undefined/bogus result.\n"); - break; - } + fprintf(stderr, "Closing Xft font.\n"); } #endif + XftFontClose(GDK_DISPLAY(), terminal->pvt->ftfont); + terminal->pvt->ftfont = NULL; + } +} +#endif - if (matched_pattern != NULL) { - /* More Xft crackrock - it appears to "adopt" - * matched_pattern as new_font->pattern; whether it - * does this reliably or not, or does another - * unpredictable bogosity like the "result" field - * above, I don't know. - */ - new_font = XftFontOpenPattern(GDK_DISPLAY(), - matched_pattern); - need_destroy = FALSE; - } else { - new_font = NULL; - } +/* Ensure that an Xlib font is loaded. */ +static void +vte_terminal_ensure_font_xlib(VteTerminal *terminal) +{ + char *xlfds; + long width, height, ascent, descent; + XFontStruct **font_struct_list, font_struct; + XRectangle ink, logical; + char **missing_charset_list = NULL, *def_string = NULL; + int missing_charset_count = 0; + char **font_name_list = NULL; - if (new_font == NULL) { - name = vte_unparse_xft_pattern(matched_pattern); - g_warning(_("Failed to load Xft font pattern \"%s\", " - "falling back to default font."), name); - free(name); + /* Simple case -- we already loaded the font. */ + if (terminal->pvt->fontset != NULL) { + return; + } - /* Try to use the default font. */ - new_font = XftFontOpen(GDK_DISPLAY(), - gdk_x11_get_default_screen(), - XFT_FAMILY, XftTypeString, - "mono", - XFT_SIZE, XftTypeDouble, 14.0, - 0); +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_MISC)) { + fprintf(stderr, "Opening Xlib font.\n"); + } +#endif + xlfds = xlfd_from_pango_font_description(GTK_WIDGET(terminal), + terminal->pvt->fontdesc); + if (xlfds == NULL) { + xlfds = strdup(VTE_X_FIXED); + } + /* Open the font set. */ + terminal->pvt->fontset = XCreateFontSet(GDK_DISPLAY(), + xlfds, + &missing_charset_list, + &missing_charset_count, + &def_string); + if (terminal->pvt->fontset != NULL) { + vte_terminal_font_complain(xlfds, + missing_charset_list, + missing_charset_count); + } else { + g_warning(_("Failed to load font set \"%s\", " + "falling back to default font."), xlfds); + if (missing_charset_list != NULL) { + XFreeStringList(missing_charset_list); + missing_charset_list = NULL; } - if (new_font == NULL) { - g_warning(_("Failed to load default Xft font.")); + terminal->pvt->fontset = XCreateFontSet(GDK_DISPLAY(), + VTE_X_FIXED, + &missing_charset_list, + &missing_charset_count, + &def_string); + if (terminal->pvt->fontset == NULL) { + g_warning(_("Failed to load default font, " + "crashing or behaving abnormally.")); + } else { + vte_terminal_font_complain(xlfds, + missing_charset_list, + missing_charset_count); } + } + if (missing_charset_list != NULL) { + XFreeStringList(missing_charset_list); + missing_charset_list = NULL; + } + free(xlfds); + xlfds = NULL; + g_return_if_fail(terminal->pvt->fontset != NULL); - g_assert (pattern != new_font->pattern); - XftPatternDestroy (pattern); - if (need_destroy) { - XftPatternDestroy (matched_pattern); + /* Read the font metrics. */ + XmbTextExtents(terminal->pvt->fontset, + VTE_REPRESENTATIVE_CHARACTERS, + strlen(VTE_REPRESENTATIVE_CHARACTERS), + &ink, &logical); + width = logical.width / strlen(VTE_REPRESENTATIVE_CHARACTERS); + height = logical.height; + ascent = height; + descent = 0; + if (XFontsOfFontSet(terminal->pvt->fontset, + &font_struct_list, + &font_name_list)) { + if (font_struct_list) { + if (font_struct_list[0]) { + font_struct = font_struct_list[0][0]; + ascent = font_struct.max_bounds.ascent; + descent = font_struct.max_bounds.descent; + height = ascent + descent; + } } + font_struct_list = NULL; + font_name_list = NULL; + } + xlfds = NULL; - if (new_font) { -#ifdef VTE_DEBUG - if (vte_debug_on(VTE_DEBUG_MISC)) { - name = vte_unparse_xft_pattern(new_font->pattern); - fprintf(stderr, "Opened new font `%s'.\n", name); - free(name); - } -#endif + /* Save the new font metrics. */ + vte_terminal_apply_metrics(terminal, width, height, ascent, descent); +} - /* Dispose of any previously-opened font. */ - if (terminal->pvt->ftfont != NULL) { - XftFontClose(GDK_DISPLAY(), - terminal->pvt->ftfont); - } - terminal->pvt->ftfont = new_font; - } - - /* Read the metrics for the current font. */ - if (terminal->pvt->ftfont != NULL) { - ascent = terminal->pvt->ftfont->ascent; - descent = terminal->pvt->ftfont->descent; - memset(&glyph_info, 0, sizeof(glyph_info)); - XftTextExtents8(GDK_DISPLAY(), terminal->pvt->ftfont, - VTE_REPRESENTATIVE_CHARACTERS, - strlen(VTE_REPRESENTATIVE_CHARACTERS), - &glyph_info); - width = howmany(glyph_info.width, - strlen(VTE_REPRESENTATIVE_CHARACTERS)); - height = MAX(terminal->pvt->ftfont->height, - (ascent + descent)); - if (height == 0) { - height = glyph_info.height; - } - } else { - g_warning(_("Error allocating Xft font, disabling Xft.")); - terminal->pvt->use_xft = FALSE; +/* Free the Xlib font. */ +static void +vte_terminal_close_font_xlib(VteTerminal *terminal) +{ + if (terminal->pvt->fontset != NULL) { +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_MISC)) { + fprintf(stderr, "Closing Xlib font.\n"); } +#endif + XFreeFontSet(GDK_DISPLAY(), terminal->pvt->fontset); + terminal->pvt->fontset = NULL; } +} + +/* Ensure that a Pango font's metrics are known. */ +static void +vte_terminal_read_metrics_pango(VteTerminal *terminal) +{ + PangoFontDescription *desc = NULL; + PangoContext *context = NULL; + PangoFontMetrics *metrics = NULL; + PangoLanguage *lang = NULL; + PangoLayout *layout = NULL; + PangoRectangle ink, logical; + gint height, width, ascent, descent; + +#ifdef VTE_PREFER_PANGOX + context = pango_x_get_context(GDK_DISPLAY()); +#else + context = gtk_widget_get_pango_context(GTK_WIDGET(terminal)); #endif + desc = terminal->pvt->fontdesc; + + /* Load a font using this description and read its metrics to find + * the ascent and descent. */ + if ((context != NULL) && (desc != NULL)) { + lang = pango_context_get_language(context); + metrics = pango_context_get_metrics(context, desc, lang); + ascent = pango_font_metrics_get_ascent(metrics); + descent = pango_font_metrics_get_descent(metrics); + pango_font_metrics_unref(metrics); + metrics = NULL; + + /* Create a layout object to get a width estimate. */ + layout = pango_layout_new(context); + pango_layout_set_font_description(layout, desc); + pango_layout_set_text(layout, + VTE_REPRESENTATIVE_CHARACTERS, + strlen(VTE_REPRESENTATIVE_CHARACTERS)); + pango_layout_get_extents(layout, &ink, &logical); + width = howmany(logical.width, PANGO_SCALE); + width = howmany(width, strlen(VTE_REPRESENTATIVE_CHARACTERS)); + height = howmany(logical.height, PANGO_SCALE); + g_object_unref(G_OBJECT(layout)); + layout = NULL; + + /* Change the metrics. */ + vte_terminal_apply_metrics(terminal, + width, height, + ascent, descent); + } +} +/* Ensure that the font's metrics are known. */ +static void +vte_terminal_ensure_font(VteTerminal *terminal) +{ +#ifdef HAVE_XFT + /* Try to load the Xft font if we can. */ + if (terminal->pvt->use_xft) { + vte_terminal_ensure_font_xft(terminal); + } +#endif + /* Try to load an X fontset. */ if (!terminal->pvt->use_xft && !terminal->pvt->use_pango) { - xlfds = xlfd_from_pango_font_description(GTK_WIDGET(widget), - terminal->pvt->fontdesc); - if (xlfds == NULL) { - xlfds = g_strdup(VTE_X_FIXED); - } - if (terminal->pvt->fontset != NULL) { - XFreeFontSet(GDK_DISPLAY(), terminal->pvt->fontset); - } - terminal->pvt->fontset = XCreateFontSet(GDK_DISPLAY(), - xlfds, - &missing_charset_list, - &missing_charset_count, - &def_string); - if (terminal->pvt->fontset != NULL) { - vte_terminal_font_complain(xlfds, missing_charset_list, - missing_charset_count); - } else { - g_warning(_("Failed to load font set \"%s\", " - "falling back to default font."), xlfds); - if (missing_charset_list != NULL) { - XFreeStringList(missing_charset_list); - missing_charset_list = NULL; - } - terminal->pvt->fontset = XCreateFontSet(GDK_DISPLAY(), - VTE_X_FIXED, - &missing_charset_list, - &missing_charset_count, - &def_string); - if (terminal->pvt->fontset == NULL) { - g_warning(_("Failed to load default font, " - "crashing or behaving abnormally.")); - } else { - vte_terminal_font_complain(xlfds, - missing_charset_list, - missing_charset_count); + vte_terminal_ensure_font_xlib(terminal); + } +} + +/* Set the fontset used for rendering text into the widget. */ +void +vte_terminal_set_font(VteTerminal *terminal, + const PangoFontDescription *font_desc) +{ + GtkWidget *widget; + + g_return_if_fail(terminal != NULL); + g_return_if_fail(VTE_IS_TERMINAL(terminal)); + widget = GTK_WIDGET(terminal); + + /* Destroy the font padding records. */ + if (terminal->pvt->fontpaddingl != NULL) { + g_tree_destroy(terminal->pvt->fontpaddingl); + } + terminal->pvt->fontpaddingl = g_tree_new(vte_compare_direct); + if (terminal->pvt->fontpaddingr != NULL) { + g_tree_destroy(terminal->pvt->fontpaddingr); + } + terminal->pvt->fontpaddingr = g_tree_new(vte_compare_direct); + + /* Create an owned font description. */ + if (font_desc != NULL) { + font_desc = pango_font_description_copy(font_desc); +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_MISC)) { + if (font_desc) { + char *tmp; + tmp = pango_font_description_to_string(font_desc); + fprintf(stderr, "Using pango font \"%s\".\n", tmp); + g_free (tmp); } } - if (missing_charset_list != NULL) { - XFreeStringList(missing_charset_list); - missing_charset_list = NULL; - } - g_return_if_fail(terminal->pvt->fontset != NULL); - /* Read the font metrics. */ - XmbTextExtents(terminal->pvt->fontset, - VTE_REPRESENTATIVE_CHARACTERS, - strlen(VTE_REPRESENTATIVE_CHARACTERS), - &ink, &logical); - width = logical.width / strlen(VTE_REPRESENTATIVE_CHARACTERS); - if (XFontsOfFontSet(terminal->pvt->fontset, - &font_struct_list, - &font_name_list)) { - if (font_struct_list) { - if (font_struct_list[0]) { - font_struct = font_struct_list[0][0]; - ascent = font_struct.max_bounds.ascent; - descent = font_struct.max_bounds.descent; - height = ascent + descent; - } - } - font_struct_list = NULL; - font_name_list = NULL; +#endif + } else { + gtk_widget_ensure_style(widget); + font_desc = + pango_font_description_copy(widget->style->font_desc); +#ifdef VTE_DEBUG + if (vte_debug_on(VTE_DEBUG_MISC)) { + fprintf(stderr, "Using default pango font.\n"); } - xlfds = NULL; +#endif } - /* Sanity check for broken fonts, and save the values. */ - width = MAX(width, 1); - height = MAX(height, 1); - terminal->char_width = width; - terminal->char_height = height; - terminal->char_ascent = ascent; - terminal->char_descent = descent; - - /* Emit a signal that the font changed. */ - vte_terminal_emit_char_size_changed(terminal, - terminal->char_width, - terminal->char_height); - - /* Attempt to resize. */ - if (GTK_WIDGET_REALIZED(widget)) { - gtk_widget_queue_resize(widget); + /* Save the new font description. */ + if (terminal->pvt->fontdesc != NULL) { + pango_font_description_free(terminal->pvt->fontdesc); } + terminal->pvt->fontdesc = (PangoFontDescription*) font_desc; + vte_terminal_read_metrics_pango(terminal); - /* Make sure the entire window gets repainted. */ - vte_invalidate_all(terminal); + /* Free the older fonts. */ +#ifdef HAVE_XFT + vte_terminal_close_font_xft(terminal); +#endif + vte_terminal_close_font_xlib(terminal); } void @@ -9109,19 +9206,6 @@ vte_terminal_init(VteTerminal *terminal, gpointer *klass) #else pctx = gtk_widget_get_pango_context(widget); #endif - metrics = pango_context_get_metrics(pctx, widget->style->font_desc, - pango_context_get_language(pctx)); - if (metrics != NULL) { - terminal->char_width = pango_font_metrics_get_approximate_char_width(metrics) / PANGO_SCALE; - terminal->char_ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE; - terminal->char_descent = pango_font_metrics_get_descent(metrics) / PANGO_SCALE; - pango_font_metrics_unref(metrics); - } else { - terminal->char_width = 10; - terminal->char_ascent = 10; - terminal->char_descent = 5; - } - terminal->char_height = terminal->char_ascent + terminal->char_descent; /* Initialize the default titles. */ terminal->window_title = NULL; @@ -9282,6 +9366,8 @@ vte_terminal_init(VteTerminal *terminal, gpointer *klass) /* The font description. */ pvt->fontdesc = NULL; + vte_terminal_set_font(terminal, NULL); + vte_terminal_ensure_font(terminal); /* Server-side rendering data. Try everything. */ pvt->palette_initialized = FALSE; @@ -9317,6 +9403,7 @@ vte_terminal_init(VteTerminal *terminal, gpointer *klass) } if (getenv("VTE_USE_XFT") != NULL) { pvt->use_xft = (atol(getenv("VTE_USE_XFT")) != 0); + pvt->use_xft2 = pvt->use_xft; } /* This is just for debugging. It will go away. */ if (getenv("VTE_USE_XFT2") != NULL) { @@ -9497,10 +9584,7 @@ vte_terminal_unrealize(GtkWidget *widget) colormap, &terminal->pvt->palette[i].ftcolor); } - if (terminal->pvt->ftfont != NULL) { - XftFontClose(display, terminal->pvt->ftfont); - terminal->pvt->ftfont = NULL; - } + vte_terminal_close_font_xft(terminal); #endif /* Clean up after Pango. */ @@ -9513,6 +9597,9 @@ vte_terminal_unrealize(GtkWidget *widget) terminal->pvt->fontpaddingr = NULL; } + /* Unload an Xlib font if we're using one. */ + vte_terminal_close_font_xlib(terminal); + /* Disconnect any filters which might be watching for X window * pixmap changes. */ if (terminal->pvt->bg_transparent) { @@ -9591,6 +9678,7 @@ vte_terminal_finalize(GObject *object) terminal->pvt->bg_transparent_update_tag = -1; } +#ifdef HAVE_XFT2 /* Disconnect from settings changes. */ if (terminal->pvt->connected_settings) { g_signal_handlers_disconnect_by_func(G_OBJECT(terminal->pvt->connected_settings), @@ -9598,6 +9686,7 @@ vte_terminal_finalize(GObject *object) terminal); terminal->pvt->connected_settings = NULL; } +#endif /* Free the font description. */ if (terminal->pvt->fontdesc != NULL) { @@ -9771,7 +9860,6 @@ vte_terminal_realize(GtkWidget *widget) GdkWindowAttr attributes; GdkPixmap *pixmap; GdkColor black = {0,}, color; - GdkGeometry geometry; int attributes_mask = 0, i; g_return_if_fail(widget != NULL); @@ -9804,11 +9892,6 @@ vte_terminal_realize(GtkWidget *widget) widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); - geometry.base_width = VTE_PAD_WIDTH * 2; - geometry.base_height = VTE_PAD_WIDTH * 2; - gdk_window_set_geometry_hints(widget->window, - &geometry, - GDK_HINT_BASE_SIZE); gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, @@ -10631,6 +10714,8 @@ vte_terminal_compute_padding(VteTerminal *terminal, Display *display, #ifdef HAVE_XFT XGlyphInfo extents; #endif + /* Ensure that we have fonts loaded. */ + vte_terminal_ensure_font(terminal); /* Check how many columns this character uses up. */ columns = g_unichar_iswide(c) ? 2 : 1; #ifdef HAVE_XFT @@ -11569,8 +11654,8 @@ vte_terminal_class_init(VteTerminalClass *klass, gconstpointer data) widget_class->button_press_event = vte_terminal_button_press; widget_class->button_release_event = vte_terminal_button_release; widget_class->motion_notify_event = vte_terminal_motion_notify; - widget_class->focus_in_event = vte_terminal_focus_in; - widget_class->focus_out_event = vte_terminal_focus_out; + /* widget_class->focus_in_event = vte_terminal_focus_in; */ + /* widget_class->focus_out_event = vte_terminal_focus_out; */ widget_class->unrealize = vte_terminal_unrealize; widget_class->size_request = vte_terminal_size_request; widget_class->size_allocate = vte_terminal_size_allocate; @@ -1,5 +1,5 @@ Name: vte -Version: 0.7.4 +Version: 0.8.0 Release: 1 Summary: An experimental terminal emulator. License: LGPL @@ -59,6 +59,11 @@ make install DESTDIR=$RPM_BUILD_ROOT %{_libdir}/pkgconfig/* %changelog +* Tue Aug 20 2002 Nalin Dahyabhai <nalin@redhat.com> 0.8.0-1 +- rework font handling to use just-in-time loading +- handle iso-2022 escape sequences, perhaps as much as they might make sense + in a Unicode environment + * Wed Aug 14 2002 Nalin Dahyabhai <nalin@redhat.com> 0.7.4-1 - handle massive amounts of invalid data better (the /dev/urandom case) - munged up patch from Owen to fix language matching |