首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gtk:当应用程序失去焦点时如何隐藏窗口

gtk:当应用程序失去焦点时如何隐藏窗口
EN

Stack Overflow用户
提问于 2009-11-20 12:36:10
回答 1查看 2.2K关注 0票数 2

我想在OpenOfice中复制工具窗口的行为。当应用程序失去焦点时,工具窗口(如果没有停靠)将被隐藏。

因此,我有一个主窗口和另一个实用程序窗口(win_dock)。当应用程序的所有窗口都失去焦点时,我想隐藏win_dock,如果窗口获得焦点,则再次显示它。

我所做的是连接到应用程序的所有窗口的焦点事件和焦点事件,并维护有多少窗口有焦点的计数器。当这个计数器降到零时,我想隐藏win_dock,如果这个计数器再次为正,我想显示win_dock

问题在于,对于这个解决方案,我永远无法聚焦win_dock。因为当我单击它时,主窗口会删除焦点,因此它会隐藏仍未获得焦点的win_dock。尽管如此,事件焦点仍被发送到win_dock,窗口再次出现。但与此同时,它已经失去了焦点。

你有更好的解决方案吗?

下面是Vala源代码:

代码语言:javascript
复制
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;
  }
}

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2009-11-20 18:40:38

有充分的理由让对话消失吗?对主窗口进行win_dock瞬态(win_dock.set_transient_for)不就足够了吗?

否则,您可以尝试使用GLib.Idle.add调用manage_focus,这将导致

在运行了所有焦点事件回调之后,manage_focus运行。然后,它将有正确数目的焦点窗口。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1770198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档