Parfois, les boîtes de dialogue modales GTK ne sont pas modales-bug ou fonctionnalité?

Lorsque je crée une boîte de dialogue personnalisée dans GTK ( à la fois, GTK2 ou GTK3) et la définit comme modale, toutes les entrées dans les autres fenêtres de mon application sont ignorées. Cela fonctionne presque toujours, mais il échoue sous certaines conditions.

Lorsque j'ajoute un ScrolledWindow contenant un TreeView à ma boîte de dialogue, cela fonctionne toujours comme supposé. mais si je remplis le TreeView avec des entrées jusqu'à ce que le ScrolledWindow commence à afficher ses barres de défilement - - - la modalité est soudainement perdue et je peux cliquer sur mon autre les fenêtres!

Voici L'exemple le plus basique que j'ai pu mettre en place. C'est écrit en Vala, mais vous aurez l'idée:

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;
}

Compilez-le avec:

valac --pkg gtk+-3.0 main.vala

Est-ce que je manque quelque chose? Ce comportement est-il voulu? Ou est-ce un bug? Si oui, est-il une solution?

EDIT: j'ai étudié un peu plus loin: le problème disparaît lorsque les barres de défilement d'Ubuntu sont désinstallées. Donc, ce n'est pas encore résolu, mais je sais où je dois signaler cela...

37
demandé sur Simme 2012-01-20 15:25:49

1 réponses

Certainement un bug. Publiez un rapport de bogue et / ou mettez à niveau votre GTK+ lib.

2
répondu Michael Slade 2012-04-10 21:56:57