草庐IT

linux - Xlib中心窗口

coder 2023-06-17 原文

我正在编写Xlib应用程序,我希望窗口居中。我已将XMoveWindow(desktopWidth - width) / 2, (desktopHeight - height) / 2一起使用,并且它大致在正确的位置。

但是,问题在于宽度和高度是客户区域,而不是总区域。我有什么办法可以获取窗口的总面积吗?

我需要使用Xlib,因为我正在使用GlxOpenGL。我不想使用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/

有关linux - Xlib中心窗口的更多相关文章

  1. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  2. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  3. Linux磁盘分区中物理卷(PV)、卷组(VG)、逻辑卷(LV)创建和(LVM)管理 - 2

    文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分

  4. ruby - 如何在 Ruby 中获取 linux 系统信息 - 2

    如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack

  5. ruby - rbenv:在 Linux Mint 上找不到 gem 命令 - 2

    我在LinuxMint17.2上。我最近使用apt-getpurgeruby​​删除了ruby​​。然后我安装了rbenv然后rbenvinstall2.3.0所以现在,~/.rbenv/versions/2.3.0/bin/ruby存在。但是现在,我无法执行geminstallrubocop。我明白了:$geminstallrubocoprbenv:gem:commandnotfoundThe`gem'commandexistsintheseRubyversions:2.3.0但是我可以~/.rbenv/versions/2.3.0/bin/geminstallrubocop。但是,

  6. ruby - 在 Linux 上编译 Ruby 1.9.2 所需的先决条件? - 2

    我是Ruby和RoR的新手。我有一个带有Ubuntu镜像的干净Linode实例,我想从源代码编译Ruby而不是使用apt-get。我已经在谷歌上搜索了执行此操作的说明,但经过一些尝试后,当我尝试运行一些教程示例时,我不断收到有关缺少zlib和其他一些包的错误。任何人都可以给我详细的说明(或链接),教我如何在从源代码编译Ruby之前安装必要的必备包吗?我的目的是编译Ruby的最新稳定版本,然后安装Rubygems和Rails。提前感谢您的帮助!!! 最佳答案 Thisblogpost涵盖从源代码编译ruby​​所需的包和安装过程;它引

  7. Linux网络编程必备的POSIX API的细节 - 2

    目录POSIXAPI大集合五元组三次握手的过程,内核协议栈分析listen函数DDOS攻击,洪水攻击DDOS攻击的应对措施数据发送 怎么保证顺序?如何保证包地顺序到达(序号+确认应答机制+重传)TCP断开连接的过程问题1.大量的CLOSE_WAIT+FIN_WAIT2是为啥?time_wait状态存在的原因?POSIXAPI大集合五元组(sip,sport,dip,dport,protocol)三次握手的过程,内核协议栈分析内核协议栈中是有内核数据结构的.  我们send/write数据,都是先发送到内核协议栈中,然后由内核协议栈封装发送到物理介质中传输到对端的对端的接收过程也是经有内核协议栈

  8. Linux export 命令及如何删除export设置的环境变量 - 2

    背景:Linuxexport命令用于设置或显示环境变量。在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅限于该次登陆操作。语法:export[-fnp][变量名称]=[变量设置值]参数说明:-f 代表[变量名称]中为函数名称。-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。-p 列出所有的shell赋予程序的环境变量。实例:列出当前所有的环境变量#export-p//列出当前的环境变量值定义环境变量赋值#exportMYENV=7//定义环境变量并赋值添加环境变量:默认保存在

  9. Linux操作系统CentOS7安装Nginx[详细版] - 2

    Nginx安装1.官网下载Nginx2.使用XShell和Xftp将压缩包上传到Linux虚拟机中3.解压文件nginx-1.20.2.tar.gz4.配置nginx5.启动nginx6.拓展(修改端口和常用命令)(一)修改nginx端口(二)常用命令1.官网下载Nginxhttp://nginx.org/en/download.html这里我下载的是1.20.2版本,大家按需下载对应稳定版即可2.使用XShell和Xftp将压缩包上传到Linux虚拟机中没有XShell可以参考《Linux操作系统CentOS7连接XShell》3.解压文件nginx-1.20.2.tar.gz1)检查是否存

  10. 【Linux】初识Linux --指令Ⅰ - 2

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。目录1.ls显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目录下1.cd-回到上一次待的工作空间2.cd..返回上一层目录1.相对路径:cd../aurora2.绝对路径:cd/home/aurora/lesson1/aurora3.cd~进入用户家目录4.cd/进入root目录4.mkdir-新建目录5.rmdir/rm-删除1.rmdir删除空文件夹2.rm删除1.rm-f2.rm-i3.rm-r1.ls显示当前目

随机推荐