【问题标题】:xlib prevent close button to exit the applicationxlib 防止关闭按钮退出应用程序
【发布时间】:2018-04-05 05:12:49
【问题描述】:

有没有办法通过单击关闭按钮来防止应用程序退出?以下代码仅隐藏最小化和最大化按钮,但不隐藏关闭按钮...

Atom window_type = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
long value = XInternAtom(display, "_NET_WM_WINDOW_TYPE_TOOLBAR", False);
XChangeProperty(display, window, window_type, XA_ATOM, 32, PropModeReplace, (unsigned char *) &value,1 );

我试图通过 google 搜索有关覆盖 _NET_CLOSE_WINDOW 的信息,但实际上找不到...或从 xprop 中删除 _NET_WM_ACTION_CLOSE 的方法...

【问题讨论】:

  • 顺便说一句,你在编写什么样的应用程序?
  • 没有动机和背景(解释为什么你想阻止应用程序退出,这可能是非常错误的;你想得到通知)你的问题不清楚。请编辑您的问题以改进它并解释您的应用程序是什么(以及为什么要禁用关闭它)
  • 抱歉,不在。我的企业正在生产车间运行树莓派。我想显示一些消息,但不允许用户关闭它。
  • 这是一个糟糕的理由。在某些情况下,用户需要关闭它。也许您想将窗口管理器配置为不允许这样做(但这是一个非常不同的问题)
  • 我不希望每个窗口都被禁用关闭按钮。尤其是这个。

标签: c++ c xlib


【解决方案1】:

阅读ICCCMEWMH。您可能需要数月(或数年)才能了解所有细节(以及与X11X protocols and architectures 的关系)。

理论上你可以在原始 Xlib 中做你想做的事。但是细节太复杂了,你真的应该使用一些工具包,比如QtGTK(生命短暂),或者libSDLSFML。另请参阅this 列表。

在协议和 Xlib 级别上掌握 X11 需要花费大量时间(相关文档有数千页)。你确定愿意花钱吗?

所以原始 X11 级别的编码就像在汇编程序中编码。今天没有人为真正的程序这样做,并且出于类似的原因(abstraction 的级别太低;需要关心的细节太多......)。

请注意,当前的趋势是将 X 替换为 Wayland。你可能需要几年的时间在 X11 中从头开始开发你的东西,当你成功时,X 将变得过时。顺便说一句,Qt 和 GTK 的最新版本了解 Wayland(因此相同的代码可以在 X11 和 Wayland 上运行)。

所以使用一些GUI toolkit。它们是数百万行的怪物软件,其复杂性是有原因的(另外,graphics cards 是当今非常复杂的硬件;另见thisthis)。它们使您能够禁用关闭窗口(因为它们知道所有 ICCCM 和 EWMH 详细信息)。

既然您用 C++ 标记了您的问题,我强烈建议您使用 Qt(或者可能是 SFML)。 documentation of Qt 非常棒。

顺便说一句,您不清楚的问题看起来很奇怪(并且缺乏动机和背景)。似乎您错误地认为您的应用程序是屏幕上唯一的应用程序,这违背了每个windowing system 的理念(本质上是多任务和多窗口,所以多应用程序)。您应该认为您的应用程序与 其他 个应用程序一起工作(例如,对于 copy & paste,如果不考虑 几个 应用程序和 几个 窗口,这是没有意义的涉及)。高级用户可以总是“终止”您的应用程序(例如,使用kill(1)xkill)。相反,您可能希望收到有关窗口关闭的通知(例如,在发生这种情况时显示一些对话框)。你甚至不应该设计一个不可关闭的应用程序(这违反了所有的编码和界面准则)。

【讨论】:

  • 感谢您的支持。我会查看你显示给我的链接。
  • 我强烈推荐使用 Qt(因为你用 C++ 标记了你的问题)
  • 我已经花了好几个月了,但仍然不了解 ICCCM 或 EWMH。几个月也许是乐观的。
  • 比学习 X11 & ICCCM & EWMH 的时间要短得多......而且你的知识(关于 Qt)会更有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
相关资源
最近更新 更多