簡體   English   中英

使用 C++ 更改終端字體大小

[英]Change Terminal Font Size with C++

我正在 C++ (在 Ubuntu 11.04 中)中做一個有趣的小項目,並且該程序是基於文本的(全部在 Gnome 終端中)。 我正在使用 ncurses 庫來更改字體顏色,但我也想在終端上打印不同大小的文本,但不知道如何使用 ncurses 來做到這一點。 有沒有辦法做到這一點(也許使用 ncurses,或使用不同的庫)? 理想情況下,我希望它獨立於終端,但如果它是一個僅適用於 Gnome 或僅適用於 Ubuntu 或其他類似限制的解決方案,那總比沒有好!

一如既往地感謝您的幫助。


我已經嘗試過 Keith Thompson 的建議,但無法讓它發揮作用。 這是我的代碼:

cout << "\x1b]50;" << "10x20" << "\a" << flush;
cout << "test";

它只是顯示為終端首選項中指定的相同字體大小。 我正在使用:GNOME Terminal 2.32.1,如果有幫助的話!

至少對於xterm ,您可以通過打印轉義序列來更改當前字體。 語法是ESCAPE ] 50; FONTNAME BEL ESCAPE ] 50; FONTNAME BEL

這是我用於此的腳本(的縮寫版本); 我稱之為xfont (真正的有更多的錯誤檢查):

#!/usr/bin/perl

use strict;
use warnings;

print "\e]50;@ARGV\a";

我不知道還有哪些其他終端仿真器能識別這個序列。 特別是,我發現它在screen下不起作用,即使screen session 位於xterm window 中。

請注意,您必須指定字體的名稱"10x20""9x15" ),而不是其大小。

編輯:我應該更加注意標簽。 在 C++ 中,它將類似於:

std::cout << "\x1b]50;" << font_name << "\a" << std::flush;

更新:使用xterm ,如果您使用的是 TrueType fonts,這將不起作用。 此外,Dúthomhas 在評論中建議:

我知道這是舊的,但所有 terminfo 字符串都應使用putp() [或 tputs( tputs() ] 打印,即使在 C++ 中也是如此。

putp( (std::string{ "\33]50;" } + font_name + "\a").c_str() );

你能做的最好的就是使用粗體字。 終端模擬真實的基於文本的終端,因此它不會同時支持不同的 fonts。

ncurses 不會更改字體大小,但會使用視頻屬性(粗體、斜體)在字體內操作styles 一些終端有記錄的方式來改變他們的字體大小,這會影響整個 window (使其對 ncurses “不可見”)。

如前所述,xterm 具有設置字體的功能,該功能記錄在XTerm Control Sequences操作系統命令部分:

        Ps = 5 0  ⇒  Set Font to Pt.  These controls may be disabled
      using the allowFontOps resource.  If Pt begins with a "#",
      index in the font menu, relative (if the next character is a
      plus or minus sign) or absolute.  A number is expected but not
      required after the sign (the default is the current entry for
      relative, zero for absolute indexing).

      The same rule (plus or minus sign, optional number) is used
      when querying the font.  The remainder of Pt is ignored.

      A font can be specified after a "#" index expression, by
      adding a space and then the font specifier.

      If the TrueType Fonts menu entry is set (the renderFont
      resource), then this control sets/queries the faceName
      resource.

手冊頁將faceName 記錄為字體系列名稱。 雖然可以嘗試將像素大小屬性添加到其中,但它可能不起作用。 但是改變faceName是可行的(假設你選擇了 TrueType 字體),例如,在我當前的機器上使用這個腳本:

#!/bin/bash
setfont() {
read -p "$1:"
printf '\033]50;%s\007' "$1"
read -p "done!"
}
setfont "Bitstream Charter"
setfont "URW Gothic L"

我使用fc-list獲得了這些名稱。 類似的腳本適用於 bitmap fonts,使用xlsfonts找到的名稱。 對於 bitmap fonts,有字體別名,例如9x1510x2012x24 ,但這些只是為xlsfonts可能有一千個結果的少數組合定義的。 為此,請閱讀X 邏輯字體描述約定文檔。 順便說一句,那些有用的字體別名在任何地方都沒有系統地記錄。

那只會改變字符的外觀,可能不會改變大小 但是閱讀文檔,可以(使用改編自rxvt的功能)使用數字來逐步完成字體菜單上的設置。 該腳本對我有用,將字體向上更改一、兩次、向下更改二(恢復為默認值)、向上更改四(到設置結束),然后返回:

#!/bin/bash
changesize() {
read -p "$1:"
printf '\033]50;#%s\007' "$1"
read -p "done!"
}
changesize +1
changesize +1
changesize -2
changesize +4
changesize -4

因為這使用不是來自終端數據庫的控制序列,所以程序中的coutprintf是合適的。 您應該將putp用於來自終端數據庫的字符串,因為它們可以包含由putp解釋的填充信息(並且在直接打印到終端時不會有用)。 相反,一些隨機控制序列看起來可能會混淆putp

填充記錄在terminfo(5)中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM