我想在OpenOfice中复制工具窗口的行为。当应用程序失去焦点时,工具窗口(如果它们未停靠)将被隐藏。
所以,我有一个主窗口和另一个实用程序窗口(win_dock
)。我想在应用程序的所有窗口失去焦点时隐藏win_dock
,并在窗口获得焦点时再次显示它。
我所做的是我连接到应用程序的所有窗口的焦点事件和焦点事件,并且我维护了一个有多少窗口具有焦点的计数器。当此计数器降至零时,我想隐藏win_dock
,如果此计数器再次为正,我想显示win_dock
问题在于这个解决方案我永远无法关注win_dock
。因为当我点击它时,主窗口会丢弃焦点,因此它会隐藏仍未获得焦点的win_dock
。然而,焦点事件仍然发送到win_dock
并且窗口再次出现。但与此同时,它已经失去了重点。
你有更好的解决方案吗?
这是Vala源代码:
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;
}
}
感谢。
答案 0 :(得分:2)
是否有充分理由让对话框消失?为主窗口设置win_dock
瞬态(win_dock.set_transient_for
)是否足够?
否则,您可以尝试使用GLib.Idle.add
来致电manage_focus
,这将导致结果
manage_focus
在所有焦点事件回调运行后运行。然后它将具有正确数量的聚焦窗口。