如何在X11中取消全屏显示?
解决X11全屏退出问题
直接有效退出代码
要退出全屏模式,只需修改你发送的ClientMessage操作码,保持目标状态为_NET_WM_STATE_FULLSCREEN,将操作类型从**添加(1)改为移除(0)**即可,完整代码如下:
Atom wm_state = XInternAtom(display->display, "_NET_WM_STATE", 1); Atom wm_fullscreen = XInternAtom(display->display, "_NET_WM_STATE_FULLSCREEN", 1); XEvent xev; memset(&xev, 0, sizeof(xev)); xev.type = ClientMessage; xev.xclient.window = display->window; xev.xclient.message_type = wm_state; xev.xclient.format = 32; xev.xclient.data.l[0] = 0; // 关键:0表示移除状态 xev.xclient.data.l[1] = wm_fullscreen; xev.xclient.data.l[2] = 0; XSendEvent(display->display, DefaultRootWindow(display->display), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); XFlush(display->display); // 确保消息立即发送到X服务器
为什么你的尝试无效
你之前替换成_NET_WM_STATE_HIDDEN等原子是错误的逻辑:退出全屏的核心是移除窗口已有的全屏状态,而非替换成其他状态。窗口管理器只会响应针对当前已激活状态的移除操作。
原全屏代码逻辑简要说明
这段代码遵循EWMH窗口管理器规范:
_NET_WM_STATE是用于修改窗口状态的标准原子data.l[0]定义操作类型:- 1 = 添加指定状态(进入全屏)
- 0 = 移除指定状态(退出全屏)
- 2 = 切换指定状态(全屏/非全屏切换)
- 消息发送给根窗口,让窗口管理器处理窗口状态变更(因为窗口管理器负责窗口的布局和状态管理)
内容的提问来源于stack exchange,提问作者Bitenco
相关产品推荐
相关产品推荐

