2009-11-20 54 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运行后,所有的焦点事件回调已经运行。它将拥有正确数量的重点窗口。

相关问题