如何克隆GtkWindow及其内容?

时间:2018-10-08 16:23:28

标签: c gtk3 glade

我在GTK 3中使用C和Glade。我想创建一种简单的编程语言。我创建了基础知识:代码编辑器,输出窗口等。但是当用户关闭输出窗口并尝试重新打开时,此消息显示:

(ltc:3443): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GObject'
(ltc:3443): GLib-GObject-CRITICAL **: g_object_class_list_properties: assertion 'G_IS_OBJECT_CLASS (class)' failed

这是代码执行的事件处理程序:

void on_exec_code() {
    gtk_widget_show(execWindow);

    execute(buffer, output, NULL);
}

如何克隆窗口?我尝试了简单的GObject克隆算法,但没有克隆窗口内容。

这是代码执行功能(带有调试功能):

#define DEBUG_OUT(id, text) printf("DEBUG %s: %s\n", id, text);

...

void execute(GtkTextBuffer* code, GtkTextBuffer* output, gchar* currentInput) {
    gtk_text_buffer_get_start_iter(code, &iter);
    while (!gtk_text_iter_is_end(&iter)) {
        gtk_text_iter_forward_cursor_position(&iter);
        token_start = iter;
        gtk_text_iter_forward_word_end(&iter);
        token_end = iter;
        token = gtk_text_iter_get_text(&token_start, &token_end);

        gtk_text_iter_forward_word_end(&iter);
        gtk_text_iter_backward_word_start(&iter);
        param_start = iter;
        gtk_text_iter_forward_line(&iter);
        param_end = iter;
        param = gtk_text_iter_get_text(&param_start, &param_end);

        DEBUG_OUT("token", token);
        DEBUG_OUT("parameter", param);

        if (!strcmp(token, "print")) {
            gtk_text_buffer_get_end_iter(output, &helper);
            gtk_text_buffer_insert(output, &helper, param, strlen(param));
        }
        else if(!strcmp(token, "get")) {
            if(currentInput != NULL) {
                /* ... */
            }
            else return;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

可能想要的不是克隆窗口,而是确保关闭时不破坏窗口,而是隐藏窗口。

尝试连接到delete-event信号并将gtk_widget_hide_on_delete()用作信号处理程序,或在信号处理程序中调用它。