Иногда модальные диалоги GTK не являются модальными - ошибка или особенность? - PullRequest
37 голосов
/ 20 января 2012

Когда я создаю пользовательский диалог в GTK ( и GTK2, или GTK3 ) и устанавливаю его как модальный, весь ввод в другие окна моего приложения игнорируется.Это работает почти всегда, но при определенных условиях происходит сбой.

Когда я добавляю ScrolledWindow, содержащее TreeView, в мой диалог, он все еще работает как положено. Но если я заполню TreeView записями, пока ScrolledWindow не начнет отображать полосы прокрутки - модальность внезапно теряется , и я могу нажать на другие мои окна!

Вот наиболееБазовый пример, который я смог создать.Он написан на языке Вала, но вы поймете:

class MyDialog: Gtk.Dialog {

    public MyDialog() {
        this.modal = true;

        var data = new Gtk.ListStore(1, typeof(string)); 

        // increase this number -- the dialog is not modal anymore!
        for (int i=0; i<2; ++i) {
            Gtk.TreeIter current;
            data.append(out current);
            data.set(current, 0, "Lorem Ipsum"); 
        }

        var render = new Gtk.CellRendererText();

        var column = new Gtk.TreeViewColumn();
            column.pack_start(render, true);
            column.add_attribute(render, "text", 0);

        var treeview = new Gtk.TreeView.with_model(data);
            treeview.append_column(column);
            treeview.show();

        var scroll = new Gtk.ScrolledWindow(null, null);
            scroll.set_size_request(100, 100);
            scroll.add(treeview);
            scroll.show();

        (this.get_content_area() as Gtk.Box).add(scroll);
    }
}

int main (string[] args) {
    Gtk.init (ref args);

    var window = new Gtk.Window();

    window.set_default_size(350, 170);
    window.destroy.connect(Gtk.main_quit);

    var button = new Gtk.Button.with_label("Click me!");
    button.clicked.connect(() => {
        var dialog = new MyDialog();
        dialog.set_transient_for(window);
        dialog.run();
        dialog.destroy();
    });

    window.add(button);
    window.show_all();

    Gtk.main();
    return 0;
}

Скомпилируйте его с помощью:

valac --pkg gtk+-3.0 main.vala

Я что-то упустил?Требуется ли такое поведение?Или это ошибка?Если да, есть ли обходной путь?

РЕДАКТИРОВАТЬ: Я исследовал немного дальше: проблема исчезает, когда накладные полосы прокрутки из Ubuntu удалены.Так что это еще не решено, но я знаю, где я должен сообщить об этом ...

1 Ответ

1 голос
/ 11 апреля 2012

Определенно ошибка.Опубликуйте отчет об ошибке и / или обновите ваш GTK + lib.

...