2012-01-20 19 views
36

當我在GTK(GTK2或GTK3)中創建一個自定義對話框並將其設置爲模態時,我的應用程序的其他窗口的所有輸入都將被忽略。這幾乎總是起作用,但在某些條件下失效。有時GTK模態對話框不是模態---錯誤或特徵?

當我添加一個包含TreeView的ScrolledWindow到我的對話框時,它仍然按照假設的方式工作。 但是,如果我用條目填充TreeView,直到ScrolledWindow開始顯示其滾動條---模式突然丟失,我可以點擊我的其他窗口!

這是我能夠設置的最基本的例子。這是寫在瓦拉,但你會得到的想法:

valac --pkg gtk+-3.0 main.vala 

我失去的東西:

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

與編譯呢?這是行爲嗎?或者它是一個錯誤?如果是這樣,是否有解決方法?

編輯:我調查了一下:當Ubuntu的覆蓋滾動條被卸載時,問題消失。所以它還沒有解決,但我知道我必須報告這...

+0

可能是一個bug。你應該在bugzilla.gnome.org上報告它。 – ptomato

+0

我發現在一個相關的bug報告[快速啓動(https://bugs.launchpad.net/ubuntu/+source/overlay-scrollbar/+bug/903302)讓我們看看當它得到固定... – Simme

+3

看起來就像是一個Ubuntu的錯誤。一直很討厭那些「功能」 –

回答

1

絕對是一個錯誤。發佈錯誤報告和/或升級您的GTK +庫。