首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在中兴GTK4假终端中运行shell命令

无法在中兴GTK4假终端中运行shell命令
EN

Stack Overflow用户
提问于 2022-05-17 16:06:11
回答 1查看 96关注 0票数 0

我在gtk4 + vte中做了一个小的示例代码,运行一个底部有一个按钮的假终端,在单击按钮时运行一个简单的命令。

main.c

代码语言:javascript
复制
#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;
}

Makefile

代码语言:javascript
复制
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应用程序不是一个问题!

当运行构建的二进制文件时,当我单击带有分段错误的按钮时,程序会崩溃,这可能是因为指针没有正确初始化(根据教程点)。

有人能帮我找出我错过了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-17 20:00:36

我测试了您的代码,我相信我发现了终端命令的主要问题,以及测试时显示的一些警告。首先,从使用"vte_terminal_spawn_async“函数查看其他示例代码开始,字符串集中包含一个结束数组元素"NULL”。因此,而不是下面的代码片段。

代码语言:javascript
复制
char **argv_test[2] = {
    "echo\0",
    "Hello!!\0"
};

您需要添加第三个数组元素,如下面的修改代码片段所示。

代码语言:javascript
复制
char *argv_test[3] = {
    "echo\0", "Hello!!\0", NULL
};

如果您注意到对上述代码片段的另一个小修改,我将字符数组的定义从"char * * argv_test3“修改为"char *argv_test3”。编译器列出了关于不兼容指针引用的警告。而且,当我测试这段代码时,我收到了警告,当单击"Run“按钮时,我无法查看终端。

代码语言:javascript
复制
Gtk-CRITICAL **: 14:49:46.383: gtk_window_set_child: assertion 'GTK_IS_WINDOW (window)' failed

从以前与另一个用户进行的故障排除中,我们确定了滚动窗口的子设置需要使用滚动窗口子引用函数和滚动窗口宏。因此,我修改了滚动窗口子分配如下。

代码语言:javascript
复制
gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrollview1), terminal);

通过进行这些小的修改,可以使用"echo Hello“命令显示终端(我在测试中单击了该按钮两次)。

我相信,如果您尝试对您的代码进行这些小的修改,您将能够查看您的终端和您的编码进展。

致以问候。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72277336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档