【问题标题】:xlib push window to the back of the other windowsxlib 将窗口推到其他窗口的后面
【发布时间】:2020-08-07 00:57:55
【问题描述】:

我正在使用 c 和 xlib 制作第一个应用程序,到目前为止它进展顺利,并且可以做我想做的事!这是一个无边框窗口,在应用启动时会自动全屏显示。

我的应用程序将包含一些实用程序,例如位于桌面上的时钟和当前天气。

所以要做到这一点,我需要能够将我的窗口推到所有其他窗口的后面,并保持在那里。

我的问题是,我怎样才能将窗户推到所有其他打开的窗户后面(最好在 cairo-dock 后面,但不是必需的),并保持在那里?

【问题讨论】:

  • 如果有两个程序想要将它们各自的窗口推到所有其他窗口的后面并保留在那里怎么办?斗争!话虽如此,您可能希望在开始时以及每次收到 StructureNotifyMask 选择的事件时尝试调用 XLowerWindow。
  • 谢谢,这给了我工作的起点。关于windows之间的争吵,我想当我遇到这个问题时,我会想办法解决它

标签: c x11 xlib


【解决方案1】:

创建一个类型为 _NET_WM_WINDOW_TYPE_DESKTOP 的窗口。

怎么样?好吧,它需要一些编码,但以下方法在我的系统上起到了作用:

#include <X11/StringDefs.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>

int main(int argc, char *argv[])
{
  Display *display = XOpenDisplay("");
  Window win = XCreateSimpleWindow(display, XDefaultRootWindow(display), 0, 0, 1920, 1080, 0, 0, WhitePixel(display, DefaultScreen(display)));

  Atom window_type = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
  Atom desktop = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DESKTOP", False);
  XChangeProperty (display, win, window_type, XA_ATOM, 32, PropModeReplace, (unsigned char *) &desktop, 1);

  XClearWindow(display, win);
  XMapWindow(display, win);

  while (1)
  {
    XEvent event;

    XNextEvent(display, &event);
  }

  XUnmapWindow(display, win);
  XCloseDisplay(display);
}

这显示了一个与我现有桌面重叠但位于程序窗口下方的白色窗口;我的 KDE 任务栏仍然可见。

几点说明:

  • 在做 XMapWindow 之前必须设置属性
  • 窗口大小应与您的屏幕大小相匹配(我硬编码了我的值),否则您会收到 BadRequest 错误。

当我终止该程序时,我的旧桌面返回了,但这可能不适用于其他窗口管理器。试试看。

【讨论】:

  • 这看起来可能是我需要的!今晚有空我会试试看:)
  • 做到了!非常感谢! :)
猜你喜欢
  • 2016-04-27
  • 2011-10-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
相关资源
最近更新 更多