我想在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;
}
}
感謝。