我在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(¶m_start, ¶m_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;
}
}
}
答案 0 :(得分:0)
可能想要的不是克隆窗口,而是确保关闭时不破坏窗口,而是隐藏窗口。
尝试连接到delete-event
信号并将gtk_widget_hide_on_delete()
用作信号处理程序,或在信号处理程序中调用它。