日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

终端模拟器编译c语言,编写你自己的Terminal emulator

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 终端模拟器编译c语言,编写你自己的Terminal emulator 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

安裝開發依賴環境

在apt包管理器系中,使用以下命令安裝

apt install libvte-2.91-dev

介紹

VTE是一個使用GTK構建的一個終端模擬器庫, 能夠處理DPI的更改。很多終端模擬器軟件都基于VTE庫,包括GNOME Terminal, XFCE Terminal, Deepin Terminal,Guake等等。這個庫非常簡潔,你可以很快就寫出來一個自己終端模擬器。

下面就來寫一個例子。

一個簡單的終端

我們先寫一個默認的終端,會使用C語言編寫。另一個可選的是使用Vala。

#include

int

main(int argc, char *argv[])

{

GtkWidget *window, *terminal;

/* 初始化GTK,窗口和terminal */

gtk_init(&argc, &argv);

terminal = vte_terminal_new();

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_title(GTK_WINDOW(window), "myterm");

/* Start a new shell */

gchar **envp = g_get_environ();

gchar **command = (gchar *[]){g_strdup(g_environ_getenv(envp, "SHELL")), NULL };

g_strfreev(envp);

vte_terminal_spawn_async(VTE_TERMINAL(terminal),

VTE_PTY_DEFAULT,

NULL, /* working directory */

command, /* command */

NULL, /* environment */

0, /* spawn flags */

NULL, NULL, /* child setup */

NULL, /* child pid */

-1, /* timeout */

NULL, NULL, NULL);

/* 連接一些信號 */

g_signal_connect(window, "delete-event", gtk_main_quit, NULL);

g_signal_connect(terminal, "child-exited", gtk_main_quit, NULL);

/* 將組件添加到窗口, 然后進入事件循環 */

gtk_container_add(GTK_CONTAINER(window), terminal);

gtk_widget_show_all(window);

gtk_main();

}

使用以下命令進行編譯:

gcc -O2 -Wall $(pkg-config --cflags vte-2.91) term.c -o term $(pkg-config --libs vte-2.91)

然后運行./term

基于VTE的Terminal

更多定制

你可以在VTE文檔更改終端默認特性,下面有三個例子。

顏色配置

使用以下代碼定義自己的顏色

#define CLR_R(x) (((x) & 0xff0000) >> 16)

#define CLR_G(x) (((x) & 0x00ff00) >> 8)

#define CLR_B(x) (((x) & 0x0000ff) >> 0)

#define CLR_16(x) ((double)(x) / 0xff)

#define CLR_GDK(x) (const GdkRGBA){ .red = CLR_16(CLR_R(x)), \

.green = CLR_16(CLR_G(x)), \

.blue = CLR_16(CLR_B(x)), \

.alpha = 0 }

vte_terminal_set_colors(VTE_TERMINAL(terminal),

&CLR_GDK(0xffffff),

&(GdkRGBA){ .alpha = 0.85 },

(const GdkRGBA[]){

CLR_GDK(0x111111),

CLR_GDK(0xd36265),

CLR_GDK(0xaece91),

CLR_GDK(0xe7e18c),

CLR_GDK(0x5297cf),

CLR_GDK(0x963c59),

CLR_GDK(0x5E7175),

CLR_GDK(0xbebebe),

CLR_GDK(0x666666),

CLR_GDK(0xef8171),

CLR_GDK(0xcfefb3),

CLR_GDK(0xfff796),

CLR_GDK(0x74b8ef),

CLR_GDK(0xb85e7b),

CLR_GDK(0xA3BABF),

CLR_GDK(0xffffff)

}, 16);

效果如下

截圖_2020-01-16_16-43-29.png

雜項設置

VTE可以設置很多選項來來改變默認的配置

vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), 0);

vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), FALSE);

vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE);

vte_terminal_set_mouse_autohide(VTE_TERMINAL(terminal), TRUE);

分別可以設置

關閉滾動緩沖

輸出的時候不會自滾動

按鍵時自動滾到末尾

鼠標自動隱藏

改變標題

static gboolean

on_title_changed(GtkWidget *terminal, gpointer user_data)

{

GtkWindow *window = user_data;

gtk_window_set_title(window,

vte_terminal_get_window_title(VTE_TERMINAL(terminal))?:"Terminal");

return TRUE;

}

然后,在main方法里連接信號,讓程序一旦運行就調用改變標題

g_signal_connect(terminal, "window-title-changed",

G_CALLBACK(on_title_changed), GTK_WINDOW(window));

總結

以上是生活随笔為你收集整理的终端模拟器编译c语言,编写你自己的Terminal emulator的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。