2

ツール ウィンドウの動作を 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;
  }
}

ありがとう。

4

1 に答える 1

2

ダイアログを非表示にする正当な理由はありますか? メインウィンドウはwin_dockトランジェント( )にすればいいのではないですか?win_dock.set_transient_for

それ以外の場合は、すべてのフォーカス イベント コールバックが実行された後に実行さGLib.Idle.addれる呼び出しmanage_focusを使用してみてください。これにより、フォーカスされたウィンドウの正しい数が得られます。
manage_focus

于 2009-11-20T18:40:38.170 に答える