【问题标题】:How to control X11 app level window stacking?如何控制 X11 应用级窗口堆叠?
【发布时间】:2017-06-25 21:24:17
【问题描述】:

有没有办法在 X11 中有 2 个窗口,符合以下条件:

  • 第二个窗口始终位于第一个窗口的顶部
  • 第二个窗口不位于其他应用程序窗口的顶部
  • 切换窗口时不闪烁
  • 两个窗口都必须是顶级窗口(彼此之间没有父窗口)并且不能阻塞

使第二个模态几乎可以工作,但它阻止了第一个,这是不希望的。

【问题讨论】:

  • 看起来像 XY 问题。你想达到什么目的?
  • 我正在 Qt 中编写一个应用程序,我希望主应用程序窗口始终位于任何后续窗口之后,但我仍然希望将这些附加窗口视为常规窗口(而不是让它们隐藏例如,当我在 Gnome 中显示所有窗口时),但由于 Qt 没有监听 X11 事件的方法,我想知道如何在 X11 中做到这一点。
  • 这些都不需要。在 Qt 中,您只需创建一个非模态 QDialog 小部件。

标签: x11 ewmh


【解决方案1】:

这是在 Qt 中通过创建非模态 QDialog 小部件来实现此目的的方法。

#include <QObject>
#include <QApplication>
#include <QPushButton>
#include <QDialog>

int main(int argc, char **argv)
{
    QApplication a(argc, argv);

    QPushButton p1("moo", 0);

    QDialog d1(&p1);
    QPushButton p2("roo", &d1);

    QDialog d2(&p1);
    QPushButton p3("goo", &d2);

    QObject::connect(&p1, &QPushButton::clicked, [&](){p2.setText("w00t!");});
    QObject::connect(&p2, &QPushButton::clicked, [&](){p1.setText("n00t!");});
    QObject::connect(&p3, &QPushButton::clicked, [&](){p1.setText("eh?"); p2.setText("meh!");});

    p1.resize(400, 400);
    p2.resize(200, 200);
    p3.resize(200, 200);

    p1.show();
    p2.show();
    p3.show();
    d1.show();
    d2.show();

    return a.exec();
}

据我所知,您的所有条件都已满足。

【讨论】:

  • 感谢您的回答,但是,由于对话框是按钮下的父项(第 4 个条件),当“显示所有窗口”操作在 gnome 上运行时它们会被隐藏(例如),可以'不要被最小化/最大化并且(据我所知)不能很好地单独移动到其他工作区/桌面
  • 我正在寻找的行为的工作示例可以通过打开 gimp 然后单击 File-->New 来重现。这会打开一个独立的窗口,但也永远不会落后于主窗口,也不会阻塞主窗口(非模态)
  • 它不是 X11 意义上的双亲,它是一个完全不同的“暂时双亲”。我不确定您写的其他内容,我认为它们对我有用,但我需要检查它们(目前无法使用机器)。敬请关注。我的机器上的 gimo 对话框也无法最小化。
  • @Martin 在我的机器上,这些对话框可以最小化(到一个常见的任务栏条目)和最大化,没有一个是隐藏的,并且都可以移动到其他桌面。当主窗口被最小化、恢复或移动到另一个桌面时,它们会被最小化、恢复或移动。不过我正在使用 KDE。
  • @Martin OTOH 在我的机器上 gimp 文件 ---> 新窗口根本不像你描述的那样工作。从属窗口不会停留在任何东西之上,也不能最大化。它确实有自己的任务栏条目。也许这是一个 GIMP 错误(我使用的是不稳定版本)。文件 ---> 打开窗口的行为与我的示例一样完全
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多