2009-11-20 110 views
2

我想在OpenOfice中複製工具窗口的行爲。當應用程序失去焦點時,工具窗口(如果它們沒有停靠)被隱藏。gtk:當應用程序失去焦點時如何隱藏窗口

所以,我有一個主窗口,另一個實用程序窗口(win_dock)。當應用程序的所有窗口失去焦點並且在窗口獲得焦點時再次顯示它時,我想隱藏win_dock

我所做的是我連接到應用程序的所有窗口的焦點事件和焦點事件,並且我維護一個有多少窗口具有焦點的計數器。當此計數器下降到零,我想隱藏win_dock,如果這個計數器是正數一遍,我想表明win_dock

問題是,這種解決方案我永遠不能專注win_dock。因爲當我點擊它時,主窗口會關注焦點,所以它隱藏了仍然沒有獲得焦點的win_dock。儘管如此,重點還是發送到win_dock,窗口重新出現。但與此同時,它失去了重點。

你有更好的解決方案嗎?

這裏是瓦拉源碼:

public class Main 
{ 

    private Gtk.Builder builder; 
    private Gtk.Window win_messages; 
    private Gtk.Window win_dock; 
    private int focus_count = 0; 

    public Main() { 
    builder = new Gtk.Builder(); 
    builder.add_from_file("ui2.glade"); 
    win_messages = builder.get_object("win_messages") as Gtk.Window; 
    win_dock  = builder.get_object("win_dock")  as Gtk.Window; 
    handle_focus(win_messages); 
    handle_focus(win_dock); 
    } 

    public void start(){ 
    win_messages.show_all();  
    //win_dock.show_all(); 
    Gtk.main(); 
    } 

    private void handle_focus(Gtk.Window w) { 
    w.focus_in_event.connect ((w, e) => { 
     stdout.printf("Focus In (%s)\n", w.name); 
     focus_count++; 
     manage_focus(w == win_dock); 
    }); 
    w.focus_out_event.connect((w, e) => { 
     stdout.printf("Focus Out (%s)\n", w.name); 
     focus_count--; 
     manage_focus(w == win_dock); 
    }); 
    } 

    private void manage_focus(bool is_dock){ 
    if(focus_count > 0) { 
     win_dock.show_all(); 
     stdout.printf("Show (focus: %d)\n", focus_count); 
    } else if(is_dock) { 
     win_dock.hide_all(); 
     stdout.printf("Hide (focus: %d, has: %d) dock\n", focus_count, win_dock.is_active ? 1 : 0); 
    } else if(!is_dock) { 
     if(win_dock.is_active) { 
     win_dock.hide_all(); 
     stdout.printf("Hide (focus: %d, has: %d) !dock\n", focus_count, win_dock.is_active ? 1 : 0); 
     } else { 
     stdout.printf("Nop (focus: %d, has: %d) !dock\n", focus_count, win_dock.is_active ? 1 : 0); 
     } 
    } 
    } 

    public static int main (string[] args) 
    { 
    Gtk.init (ref args); 
    Main m = new Main(); 
    m.start(); 

    return 0; 
    } 
} 

感謝。

回答

2

是否有充分的理由讓對話消失?爲主窗口創建win_dock瞬態(win_dock.set_transient_for)是不夠的?

否則,你可以嘗試使用GLib.Idle.add調用manage_focus這將導致
manage_focus運行後,所有的焦點事件回調已經運行。它將擁有正確數量的重點窗口。