ツール ウィンドウの動作を OpenOffice で複製したいと考えています。アプリケーションがフォーカスを失うと、ツール ウィンドウ (ドッキングされていない場合) は非表示になります。
したがって、メイン ウィンドウと別のユーティリティ ウィンドウ ( win_dock
) があります。win_dock
アプリケーションのすべてのウィンドウがフォーカスを失ったときに非表示にし、ウィンドウがフォーカスを得たときに再び表示したいと考えています。
私がしたことは、アプリケーションのすべてのウィンドウの focus-in-event と focus-out-event に接続し、フォーカスのあるウィンドウの数のカウンターを維持することです。このカウンターがゼロになったら非表示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;
}
}
ありがとう。