Как клонировать GtkWindow с его содержимым? - PullRequest
0 голосов
/ 08 октября 2018

Я использую C и Glade с GTK 3. Я хочу создать простой язык программирования.Я создал основы: редактор кода, окно вывода и т. Д. Но когда пользователь закрыл окно вывода и попытался открыть его снова, это сообщение показало:

(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 голосов
/ 09 октября 2018

Вероятно, вместо того, чтобы клонировать окно, вам нужно убедиться, что оно не разрушено при закрытии, а скрыто.

Попробуйте подключиться к сигналу delete-event и использовать gtk_widget_hide_on_delete() в качествеобработчик сигнала или вызов его в обработчике сигнала.

...