[英]Can't run shell command in VTE GTK4 Fake Terminal
我在 gtk4 + vte 中制作了一个小示例代码来运行一个底部带有按钮的假终端,以便在单击按钮时运行一个简单的命令。
主程序
#include <gtk/gtk.h>
#include <vte/vte.h>
#define WINDOW_HEIGHT 400
#define WINDOW_WIDTH 600
GtkApplication *app;
GtkWidget *window, *terminal, *grid, *scrollview1,*button;
int status;
void run_button(void){
char **argv_test[2] = {
"echo\0",
"Hello!!\0"
};
// can't run this command in fake terminal!
vte_terminal_spawn_async(VTE_TERMINAL(terminal),VTE_PTY_NO_HELPER,NULL,argv_test,NULL,G_SPAWN_SEARCH_PATH,NULL,NULL,NULL,2000,NULL,NULL,NULL);
}
void window_renderer(GtkApplication *app, gpointer user_data) {
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window),"My terminal");
gtk_window_set_default_size (GTK_WINDOW(window), WINDOW_WIDTH, WINDOW_HEIGHT);
grid = gtk_grid_new();
gtk_window_set_child(GTK_WINDOW(window), grid);
gtk_widget_set_vexpand(grid,TRUE);
gtk_widget_set_hexpand(grid,TRUE);
scrollview1 = gtk_scrolled_window_new();
gtk_grid_attach(GTK_GRID(grid), scrollview1, 0, 0, 1, 1);
gtk_widget_set_size_request(GTK_WIDGET(scrollview1),WINDOW_WIDTH,WINDOW_HEIGHT);
button = gtk_button_new_with_label("Run!");
gtk_grid_attach(GTK_GRID(grid), button, 0, 1, 1, 1);
g_signal_connect(button,"clicked", G_CALLBACK(run_button), NULL);
terminal = vte_terminal_new();
gtk_window_set_child(GTK_WINDOW(scrollview1), terminal);
gtk_widget_show(window);
}
int main(int argc, char **argv)
{
app = gtk_application_new(NULL, G_APPLICATION_FLAGS_NONE);
g_signal_connect(app,"activate", G_CALLBACK(window_renderer), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
生成文件
CFLAGS += -Wall
CFLAGS += `pkg-config --cflags gtk4 vte-2.91-gtk4`
LIBS += `pkg-config --libs gtk4 vte-2.91-gtk4`
.PHONY: all clean
all: main
main:main.c
gcc $(CFLAGS) main.c -o main $(LIBS)
clean:
rm main
我已经编译了 VTE(用于 gtk4)和 gtk4 开发包,构建 gtk4 应用程序不是问题!
运行构建的二进制文件时,当我单击带有分段错误的按钮时程序崩溃,可能是因为指针未正确初始化(根据教程点)。
有人可以帮我找出我错过了什么吗?
我测试了你的代码,我相信我发现了你的终端命令的主要问题以及我测试时显示的一些警告。 首先,通过使用“vte_terminal_spawn_async”函数查看其他示例代码,字符串集包含一个结束数组元素“NULL”。 所以而不是下面的代码片段。
char **argv_test[2] = {
"echo\0",
"Hello!!\0"
};
您需要添加第三个数组元素,如下面的修订代码片段所示。
char *argv_test[3] = {
"echo\0", "Hello!!\0", NULL
};
如果您注意到上述代码片段的另一个小修改,我将字符数组的定义从“char ** argv_test[3]”修改为“char *argv_test[3]”。 编译器列出了有关不兼容指针引用的警告。 此外,当我测试此代码时,我收到警告,并且在单击“运行”按钮时无法查看终端。
Gtk-CRITICAL **: 14:49:46.383: gtk_window_set_child: assertion 'GTK_IS_WINDOW (window)' failed
从之前与另一个用户进行的一些故障排除中,我们确定滚动窗口的子设置需要使用滚动窗口子引用函数以及滚动窗口宏。 所以我修改了滚动窗口子赋值如下。
gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrollview1), terminal);
进行这些小修改会导致使用“echo Hello”命令显示终端(我在测试中单击了两次该按钮)。
我相信,如果您尝试对代码进行这些小修改,您将能够查看您的终端并在编码方面取得进展。
问候。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.