38 votes

Parfois les dialogues modaux de GTK ne sont pas modaux --- bogue ou fonctionnalité ?

Lorsque je crée un dialogue personnalisé dans GTK ( les deux, GTK2 ou GTK3 ) et que je l'ai configuré pour qu'il soit modal, toutes les entrées dans les autres fenêtres de mon application sont ignorées. Cela fonctionne presque toujours, mais échoue dans certaines conditions.

Lorsque j'ajoute une ScrolledWindow contenant un TreeView à ma boîte de dialogue, cela fonctionne toujours comme prévu. Mais si je remplis le TreeView d'entrées jusqu'à ce que la ScrolledWindow commence à afficher ses barres de défilement --- la modalité est soudainement perdue. et je peux cliquer sur mes autres Windows !

Voici l'exemple le plus basique que j'ai pu mettre en place. Il 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 j'ai manqué quelque chose ? Ce comportement est-il souhaité ? Ou s'agit-il d'un bogue ? Si c'est le cas, existe-t-il une solution de contournement ?

EDITAR: J'ai enquêté un peu plus loin : Le problème disparaît lorsque les barres de défilement superposées d'Ubuntu sont désinstallées. Le problème n'est donc pas encore résolu, mais je sais où je dois le signaler...

1voto

Michael Slade Points 9128

C'est définitivement un bug. Postez un rapport de bogue et/ou mettez à jour votre librairie GTK+.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X