终端模拟器编译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

9f2b987dfba3

基于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);

效果如下

9f2b987dfba3

截图_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));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转:Ubuntu下下载工具安装--uget+aria2

原文地址:http://burner1024.blog.163.com/blog/static/17447800420126191858424/ Windows下的下载工具--迅雷,之所以下载速度快,乃是它能搜索资源、为己所用,而不是仅仅从原始地址这单一资源处下载。Ubuntu下也有类似的工具&…

面向对象之编写一个完整的类

package com.work.cast;public class People {public static void main(String[] args) {People1 pnew People1();p.setName("李白");p.setAge(55);p.setSex(男);p.setHeight(183.5);//p.toString();System.out.println(p);}} class People1{//name age sex heightpr…

c语言写程序轮询是什么意思,单片机轮询按键程序

#include #define uchar unsigned char//按键端口定义sbit io_key_1 P2^0 ;sbit io_key_2 P2^1 ;sbit io_key_3 P2^2 ;sbit io_key_4 P2^3 ;sbit P30 P3^0;sbit P31 P3^1;sbit P32 P3^2;sbit P33 P3^3;//定义长按键的TICK数,以及连_发间隔的TICK数#define KEY_LONG_PER…

转:C#串口编程

本文用来简单介绍一下C#串口编程的知识,主要以实例为内容。 凡是串口设备和计算机交互的时候都用到串口,在C#中我们如何来操作串口呢? 大话串口工作原理 实际串口是用来和外部设备进行交换数据的,我抽象出下面一个图形&#xff0c…

new一个数组

public class Demo {public static void main(String[] args) {Demo1 dnew Demo1();int []arr{1,2,3,4,5};for (int i 0; i < arr.length; i) {System.out.print(arr[i]" ");}System.out.println(arr);d.shuZu(arr);//发送arr并调用shuZu。System.out.println();…

c command语言学例子,乔姆斯基语言学理论发展史研究

乔姆斯基语言学理论发展史研究论文目录内容摘要第1-4 页ABSTRACT第4-5 页中文提要第5-13 页SYNOPSIS第13-24 页Introduction第24-28 页0&#xff0e;1&#xff0e;Chomskys Achievement and Influence第24-25 页0&#xff0e;2&#xff0e; Creativity of Human Language第25-2…

oracle用户权限的管理

概述&#xff1a;创建的新用户是没有任何权限&#xff0c;甚至连登陆数据库的权限都没有。因此对于新创建的用户&#xff0c;需要为其制定 权限。用于给用户赋予权限的命令为grant&#xff0c;会搜权限的命令是revoke 1. 授予权限 a) 只有system和sys用户可以给新…

社团管理信息系统C语言,学生社团信息管理系统.doc

第一章 课题背景1.1开发背景随着校园文化的不断丰富&#xff0c;大学里各种社团越来越多&#xff0c;社团活动也越来越频繁&#xff0c;社员也越来越多&#xff0c;而且大学生退社&#xff0c;入社比较频繁&#xff0c;社团管理就显得非常繁琐而又复杂的的事情&#xff0c;如果…

JavaScript创建命名空间

引入命名空间之前&#xff0c;一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突&#xff0c;在一个公司内部项目组之间可以通过命名预定&#xff08;比如加前缀等&#xff09;解决这个问题&#xff0c;但是把视线放到整个软件开发领域&#xff0c;在当今协作开发…

String类的方法

public class A {public static void main(String[] args) {// TODO Auto-generated method stubStringBuilder sbnew StringBuilder();//长度可变的字符串sb//可以往字符串里添加任何字符串的方法。sb.append("haha");sb.append(s).append("jjjxxx");//链…

android c聊天功能,Android实现简单C/S聊天室应用

Android的网络应用&#xff1a;简单的C/S聊天室&#xff0c;供大家参考&#xff0c;具体内容如下服务器端&#xff1a;提供两个类创建ServerSocket监听的主类:MyServer.java负责处理每个Socket通信的线程类:ServerThread.java客户端&#xff1a;是一个Android应用程序>Multi…

ID生成策略(一)

ID生成策略&#xff1a;主键手工设定很不方便&#xff0c;在我们实际工作中在MySQL里面用自增字段auto increment&#xff0c;在oracel中一般用sequence。所以把表建成auto increment&#xff0c;对于类里面对象的对应的值就不能指定了&#xff0c;得靠程序或数据库自动生成&am…

android tabpageindicator 参数,Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)...

Android现在实现Tab类型的界面方式越来越多&#xff0c;今天就把常见的实现方式给大家来个总结。目前写了&#xff1a;1、传统的ViewPager实现2、FragmentManagerFragment实现3、ViewPagerFragmentPagerAdapter实现4、TabPageIndicatorViewPagerFragmentPagerAdapter1、传统的V…

冒泡与选择排序

public class B {public static void main(String[] args) {// 冒泡排序int[] arr{1,2,34,54,5,3};//从小到大的顺序for (int j 0; j < arr.length-1; j) {//得到4个maxfor (int i 0; i < arr.length-1; i) {//内循环得到一个maxif (arr[i]>arr[i1]) {int carr[i];a…

基于visual Studio2013解决C语言竞赛题之0304整除数

&#xfeff;&#xfeff;&#xfeff;&#xfeff;题目解决代码及点评按照题目要求&#xff0c;判断数值对3和5取模的结果&#xff0c;是否为0#include <stdio.h> #include <stdlib.h> void main() {int a;printf("please input a\n");scanf_s("%d…

android驱动代码,GitHub - rumengsuifeng/AndroidDrivers: Android驱动的代码

1. 创建hardware目录&#xff0c;在该目录下创建HardCor.java文件(参考HelloWorldActivity.java文件)2. 在build.gradle(app路径)文件中添加指定so文件的目录&#xff0c;so文件的源文件是C语言编写的&#xff0c;可以放在任意一个目录&#xff0c;它就是JNI文件3. 如果工程里a…

html的路径

##html的路径 1.绝对路径&#xff1a;在不同的盘符下或者不在同一个盘符下的不同文件夹下的引用 <!--相对路径&#xff1a;1.同一个目录的.html文件和图片&#xff0c;直接引用图片文件名--> <!--2.同一个目录的.html文件和在其目录的文件夹里的图片&#xff0c;要引…

kendo-ui学习笔记——题记

1.Kendo UI基于最新技术HTML5、CSS3和JavaScript标准设计开发。2.官方网址&#xff1a;http://www.kendoui.com/3.API网上查阅英文版网址&#xff1a;http://docs.kendoui.com/api/dataviz/barcode正在使用kendo ui中HTML库进行项目开发&#xff0c;期间遇到过不少的问题&#…