- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在编写Xlib
应用程序,我希望窗口居中。我已将XMoveWindow
与(desktopWidth - width) / 2, (desktopHeight - height) / 2
一起使用,并且它大致在正确的位置。
但是,问题在于宽度和高度是客户区域,而不是总区域。我有什么办法可以获取窗口的总面积吗?
我需要使用Xlib
,因为我正在使用Glx
和OpenGL
。我不想使用SDL
,也不想拥有庞大的图形库。
最佳答案
有多种解决方法,具体取决于您执行此操作的原因。前两个由大多数窗口管理器“官方支持”并在规范中进行了描述,然后又归类为易碎的骇客。
语义的
规范鼓励您使用_NET_WM_WINDOW_TYPE而不是设置位置(如果有必要的话)。参见http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html#id2507144
例如,DIALOG类型(或设置了WM_TRANSIENT_FOR提示的窗口)通常将在其父窗口或屏幕上居中,而_NET_WM_WINDOW_TYPE_SPLASH(闪屏)类型通常将在屏幕上居中。 “通常”在这里表示“明智的窗口管理器可能居中,使用奇怪的窗口管理器的人不是您的问题,要让他们受苦”。
(虽然不是您想要的,但同样的提示是_NET_WM_STATE_FULLSCREEN,它避免了手动调整大小/位置以便全屏显示。)
如果语义提示起作用,则希望用于处理定位的窗口管理器代码比任何人可以手工轻松编写的代码都要聪明,例如,它可以处理多头设置。设置适当的语义类型还可以使WM在定位之外的其他方面变得更聪明。
重力
如果规范中没有语义提示可以帮助您,那么您可以手动进行居中。重要的是要注意,窗口管理器被允许忽略手动位置请求,其中一些会被忽略。有些人可能只有在WM_NORMAL_HINTS中设置了USPosition标志时才接受该请求(仅当用户明确要求该位置(例如,使用-geometry命令行选项)时,才应设置此标志)。其他人可能总是忽略该请求。但是,您可能会忽略执行此操作的WM。用户选择使用该WM。
补偿窗口装饰(标题栏等)的方法是使用WM_NORMAL_HINTS的win_gravity字段,该字段最初在ICCCM中(请参阅http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.2.3),但在EWMH中的实现说明中有更好的指定:http://standards.freedesktop.org/wm-spec/latest/ar01s09.html#id2570420
对于WM_NORMAL_HINTS,请参见http://tronche.com/gui/x/xlib/ICC/client-to-window-manager/wm-normal-hints.html#XSizeHints(注意:属性的类型为WM_SIZE_HINTS,属性的名称为WM_NORMAL_HINTS,因此涉及两个不同的原子名称)。
要居中,可以将win_gravity设置为Center,这可以让您定位窗口的中心(包括其装饰)而不是左上角。
win_gravity并不经常使用,并且在某些窗口管理器中可能会出现问题,因为没有人去打扰对其进行编码/测试,但是它应该在更主流的窗口中工作。
更新,可能的困惑点:X协议(protocol)中还有其他“重力”,特别是CreateWindow请求可让您设置“bit_gravity”和“win_gravity”;这些与XSizeHints.win_gravity不同。 CreateWindow重力描述了调整窗口大小时如何处理窗口的内容(像素/子窗口)。
基于猜测装饰大小的技巧
这是一个脆弱的技巧,但是...您可以尝试找出装饰的大小,然后将其合并到您的位置中。
要获取窗户装饰物的大小,一种方法是_NET_FRAME_EXTENTS提示,请参见http://standards.freedesktop.org/wm-spec/latest/ar01s05.html#id2569862
对于较老的窗口管理器(但不希望使用新的合成器,但希望它们支持_NET_FRAME_EXTENTS),窗口装饰是X窗口,因此您可以获取父窗口并查看其大小。
这两种方法的问题在于,在添加装饰之前必须先映射窗口,因此必须进行映射。等待获取MapNotify事件;然后得到装饰尺寸;然后移动窗口。不幸的是,这将导致用户可见的闪烁(窗口将首先出现然后移动)。我认为没有一种方法可以不首先映射就获得窗户装饰的尺寸。
进一步讲到可怕的骇客世界,您可以假设对于映射第一个窗口之后的窗口,装饰将匹配先前映射的窗口。 (并不是说这是一个合理的假设:不同类型的窗户可能具有不同的装饰。)
实现注意事项:请记住,装饰窗口可以随时销毁,这会在您提到该窗口的所有未完成Xlib请求中导致X错误,并且默认情况下退出您的程序。为避免这种情况,请在触摸不属于客户端的窗口时设置X错误处理程序。
覆盖重定向
使用重写重定向是一种具有不良副作用的火箭筒,如果您的目标只是将窗口居中,则根本不是一个好主意。
如果在创建窗口时设置了重写重定向标志,则窗口管理器将无法管理其大小,位置,堆叠顺序,装饰或 map 状态(覆盖了窗口管理器对ConfigureRequest和MapRequest的重定向)。
对于用户将其视为窗口的任何事情,这都是一个非常糟糕的主意。通常用于工具提示和 pop 菜单。如果在窗口上设置了重写重定向,则所有常规的窗口管理UI都将被破坏,堆栈顺序最终将基本上是随机的(窗口将倾向于卡在顶部或底部,或更糟的是陷入无限循环与其他客户重新战斗)。
但是,重写重定向的窗口将没有装饰或不会被WM触摸,因此您可以确保将其居中放置而不会受到干扰。
(如果只希望不进行修饰,请使用SPLASH之类的语义类型或使用“MWM”提示,请不要使用覆盖重定向。)
概要
简短的答案是设置语义提示(如果有的话),否则使用XSizeHints.win_gravity = Center。
您可以看到为什么人们通常在客户端到窗口-经理的交互中使用工具包和SDL ;-)很多古怪的历史包and和极端案例,设置窗口位置仅仅是激动的开始!
关于linux - Xlib中心窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867715/
xlib 还在用吗?我能找到的有用文档是 http://tronche.com/在我看来,它非常过时。谁使用 Xlib? GTK+ 和 QT 是基于它构建的吗?提前致谢,嗯。 最佳答案 是的,像 GT
有谁知道什么是用于 32/24 位图像/像素图的 XLib ZPixmap 格式。它是 RGB(A) 或 BGR(A) 等还是高度依赖于实现? 最佳答案 像素图没有颜色,句号。它们只是像素值的数组。
我是一个全新的 GUI 程序员,经验很少(除了一些 Java 小应用程序)。我正在考虑编写一个需要简单二维图形的小应用程序。我不知道我应该使用 Xlib 还是 cairo 来绘制这些图。 与 cair
我现在对 Xlib 编程有点困惑。几周前我开始使用 dwm(一个轻量级的窗口管理器),我想找一些 Xlib 编程书籍或在线资源来定制 dwm。 然而,在网上谷歌搜索后,我并没有看到很多关于 Xlib
有没有可靠的方法来获得顶部的内部和外部矩形 带有 XCB/Xlib 的级别窗口? (IOW 框架和客户端矩形)。 这是我尝试过的: xcb_get_geometry 始终返回初始尺寸,即使在 窗口被调
我正在创建一个在多个 xsession 中使用多个游标(指针)的系统。我的电脑有多个视频卡用于控制不同的显示器。我想在每个屏幕上有一个不同的光标并控制每个屏幕。每个监视器都是一个不同的 session
例如,foobar:0.1将在名为 foobar 的机器上指定显示 0 的屏幕 1 . 但是Xlib中X服务器的屏幕号和显示号是什么意思呢? 是不是说一个X服务器可以有很多显示器,一个显示器可以有很多
我从各种文档中看到,XCloseDisplay 返回一个整数,我怀疑这是一个错误代码。 我应该如何处理这个值?是错误代码吗?如果是这样,我该如何处理错误? 最佳答案 我查看了源代码(lib/X11/C
我有一个 ARGB 图像数据。我希望将我的窗口图标设置为该数据。经过几个小时的搜索后,我仍然处于起点,手头一无所有。我知道我需要为图像数据创建一个像素图和(可能是)另一个用于掩码的像素图,并使用提示来
我正在学习使用 xlib,但无法获得 XChangeProperty()为我工作。 我有一个简单的程序可以成功显示一个窗口。但调用 XChangeProperty()总是失败,错误代码 error 1
我正在遵循书中的示例,并且我有一个绘制线条的绘图函数。当我将其放置在 XFlush() 之前的事件循环之前时,不会绘制任何线条,但是如果我将其放置在事件循环中,如下所示,则会绘制线条。 while(1
我正在尝试学习如何使用 Cairo 2D drawing library与 xlib 曲面。 我编写了一个允许创建多个窗口的小测试程序。每个函数可能有一个自定义的paint()函数,定期调用该函数以向
我需要检查(在我的 C++ 应用程序中)应用程序的窗口是否被另一个窗口重叠(部分或完全)。我如何使用 xlib 获取此信息? 我尝试获取窗口的 WM_STATE 属性并将其与 NormalState
[已解决 - 提供的示例包含答案!]我正在尝试实现一个以全屏模式启动并且不允许任何用户输入(无论是鼠标还是键盘)的程序,因为它只会在插入 USB 棒或 CD 时对 UDEV 信号使用react。我想防
我有一个可以捕获X窗口并将其作为子窗口托管的应用程序。 它以某种方式实现了一个非常基本的窗口管理器。没有窗口管理器正在运行。 除Java应用程序外,效果很好。 例如,如果Java应用程序具有菜单或弹出
我正在用 c 编写一个应用程序,它将使用 Xlib、GTK。我想创建一个热键来中断应用程序的事件并将其置于休眠状态。 我已经阅读了一些资料,但我相信我不能使用:X抓取键因为窗口管理器正在运行并且已经在
我从文档中不清楚 http://python-xlib.sourceforge.net/doc/html/python-xlib_toc.html 我如何确定性地检查给定的显示输出(例如:HDMI-1
我正在尝试将屏幕复制到位图文件,我找到了这个 write XImage to .bmp file in C线。我尝试了自己提供的代码,但无法使代码正常工作。它可以保存 img 文件,但无法打开它。我在
我正在尝试使用 Xlib 控制 Xterm。为此,我正在制作一个标题奇怪的 Xterm。在我列出所有窗口并检查它们的名称之后。但是有些东西被窃听了,当它们被列出时,我的 Xterm 的名字没有出现。这
我正在使用 c 和 xlib 制作第一个应用程序,到目前为止它进展顺利并且正在做我想做的事!这是一个无边框窗口,在应用启动时会自动全屏显示。 我的应用程序将有一些实用程序,例如桌面上的时钟和当前天气。
我是一名优秀的程序员,十分优秀!