想在手机日常使用过程中,方便的了解系统进程信息,于是下了一个vte到broncho手机上,顺便了解了一下终端模拟器的实现方式。
vte 是一个提供终端模拟功能的软件包,包含了一个动态库libvte和应用程序vte。libvte是功能实现的主体,能构造出一个实现模拟器功能的 gtkwidget,并提供了一些接口用来设置字体相关信息,背景,输入法选择菜单,终端模拟类型,字符编码等等;vte是一个对libvte简单的包装,把这个控件放到一个gtkwindow里。
通过调用vte_terminal_fork_command,可以让vte控件fork 出一个子进程来执行调用者指定的命令,并创建一对伪终端用于vte控件和子进程通信,vte控件使用master端,子进程使用slave端。函数具体过程如下:调用_vte_pty_open,最终通过 master = open("/dev/ptmx",O_RDWR | O_NOCTTY),获得master端,然后通过ptsname(master)) 获得slave端在/dev/pts/下的具体文件名,由此获得一对伪终端,并创建子进程。子进程通过setsid(); setpgid(0, 0); 创建一个新的会话期,并成为该会话期进程组组长,然后打开slave端,使之成为子进程的控制终端。然后就执行 vte_terminal_fork_command指定的命令。如果命令为空,vte控件就用该用户的默认shell命令代替,比如"/bin /sh"。
还可以通过vte_terminal_feed_child给已经创建好子进程发送字符串,对于执行shell命令的子进程就会试图解析执行该字符串命令;其实vte控件内部对捕获的用户输入字符串经过处理解析后也是通过vte_terminal_feed_child发送给子进程的,调用路径如下:vte_terminal_feed_child-》vte_terminal_io_write-》write,最后write 的文件描述符就是上面获取的master端。
vte放到broncho平台上主要的问题就是和输入法配合的问题,在focus_in事件的默认处理函数中增加:
/* <broncho> { */
GtkIMMulticontext *context = GTK_IM_MULTICONTEXT (terminal->pvt->im_context);
if (GTK_IS_IM_MULTICONTEXT (context) && context->slave)
{
g_object_set_data (G_OBJECT (context->slave), "focus_widget", (gpointer)widget);
}
/* <broncho> } */
在vte_terminal_realize中增加:
/* <broncho> {*/
if(gtk_widget_is_focus(GTK_WIDGET(terminal)))
{
GtkWidget* window = gtk_widget_get_toplevel(terminal);
gdk_window_set_has_ime(window->window, TRUE);
}
/* <broncho> }*/
从而适应broncho平台的输入法。
另外一点,有些命令需要使用root权限,但是busybox默认su 这个applet需要root权限才能执行,可以chmod +s /bin/busybox来增加S权限。
VTE终端模拟器介绍
最新推荐文章于 2022-10-22 23:51:07 发布