- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个用 C 编写的小示例程序,它使用 XCB API 打开一个窗口。
严格来说,之后我已经创建了并且显示了窗口,我想(稍后)隐藏窗口。
(显然,在这个特定示例中,我可以删除对 xcb_map_window 的调用,并且窗口将被隐藏,但我想稍后在我的大型应用程序中执行此操作,例如显示/隐藏窗口的切换,注意:我不想最小化它)。
这是示例代码(注意:由于答案,这段代码现在可以工作了):
#include <unistd.h>
#include <stdio.h>
#include <stdbool.h>
#include <xcb/xcb.h>
void set_window_visible(xcb_connection_t* c, xcb_window_t win, bool visible) {
xcb_generic_event_t *event;
if(visible) {
// Map the window on the screen
xcb_map_window (c, win);
// Make sure the map window command is sent
xcb_flush(c);
// Wait for EXPOSE event.
//
// TODO: add timeout in-case X server does not ever send the expose event.
while(event = xcb_wait_for_event(c)) {
bool gotExpose = false;
switch(event->response_type & ~0x80) {
case XCB_EXPOSE:
gotExpose = true;
break;
default:
break; // We don't know the event type, then.
}
free(event);
if(gotExpose) {
break;
}
}
} else {
// Hide the window
xcb_unmap_window(c, win);
// Make sure the unmap window command is sent
xcb_flush(c);
}
}
int main() {
xcb_connection_t *c;
xcb_screen_t *screen;
xcb_window_t win;
xcb_generic_event_t *event;
// Open the connection to the X server
c = xcb_connect (NULL, NULL);
// Get the first screen
screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
// Ask for our window's Id
win = xcb_generate_id(c);
// Create the window
uint32_t mask = XCB_CW_EVENT_MASK;
uint32_t valwin[] = {XCB_EVENT_MASK_EXPOSURE | XCB_BUTTON_PRESS};
xcb_create_window(
c, // Connection
XCB_COPY_FROM_PARENT, // depth (same as root)
win, // window Id
screen->root, // parent window
0, 0, // x, y
150, 150, // width, height
10, // border_width
XCB_WINDOW_CLASS_INPUT_OUTPUT, // class
screen->root_visual, // visual
mask, valwin // masks
);
bool visible = true;
set_window_visible(c, win, true);
while(1) {
sleep(2);
// Toggle visibility
visible = !visible;
set_window_visible(c, win, visible);
printf("Window visible: ");
if(visible) {
printf("true.\n");
} else {
printf("false.\n");
}
}
// pause until Ctrl-C
pause();
return 0;
}
我用它编译和运行:
gcc xcbwindow.c -o xcbwindow -lxcb
./xcbwindow
根据我在 Google 或此处可以找到的任何内容,我所做的一切都是正确的。所以为了澄清,我使用的是 Unity 和 Ubuntu 12.04 LTS:
unity --version 报告:
unity 5.20.0
uname -a 报告:
Linux [redacted] 3.2.0-32-generic #51-Ubuntu SMP Wed Sep 26 21:33:09 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
谁能解释一下我在这段代码中哪里出错了?
编辑:在 xcb_unmap_window() 之后用 flush() 更新了代码;还是不行。
EDIT2:尝试用肉桂 WM 编写代码;仍然不起作用(这不是 Unity 错误)。
EDIT3:这篇文章中更新的代码现在可以使用了。
最佳答案
您的程序运行得太快了。
它映射窗口然后立即取消映射。窗口是顶层的,这意味着请求被重定向到窗口管理器。但是当窗口还没有被映射时,窗口管理器收到了取消映射请求,所以它简单地丢弃了这个请求。在 map 和 unmap 调用之间插入 sleep(3)
并观察。
在实际代码中,您的窗口在发送取消映射请求之前需要至少获得一个公开事件。这保证了它实际上是由窗口管理器映射的。
关于c - XCB:映射一次后窗口不会取消映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19413806/
在 Xlib 中,XWindowAttributes 结构包含一个指向窗口所在屏幕的指针。但是在XCB对应的结构体(xcb_get_window_attributes_reply_t)中,并没有这样的
官方 XCB 文档告诉我们 using OpenGL purely with XCB is impossible : 还必须使用 Xlib。 This post作者 Bart Massey(XCB 的
我正在尝试使用 Qt 和 opencv 运行创建 UI 的脚本。 但是,这是我得到的一个奇怪的错误 python3 dashboard.py QObject::moveToThread: Curren
我想用xcb来说明窗口的伪透明(在窗口背景上复制部分根窗口像素图) 为此,我使用: 根像素图用feh设置然后我启动我的程序(只是代码的一部分): ->初始化连接: xcb_connect() ->创建
我正在使用 rust-xcb 编写应用程序。但是,当我尝试将文件加载到像素图中时,我找不到任何方法来完成它。我还使用 image 库来加载图像文件 (jpg)。 但是我对xcb不熟悉,请问xcb有没有
我已经用 XCB 作为后端(当然是 GLX 的 xlib)编写了一些基本的 OpenGL 应用程序,并且在我编写的每个测试中,当我将鼠标移到窗口上时,它会导致所有输入都得到某种“缓冲”并且仅在一段时间
我一直在尝试弄清楚如何忽略 xcb 事件循环中的重复键,到目前为止我得到了这个: extern xcb_connection_t *connection; // looks like there's
XCB协议(protocol)拦截按键输入的代码是什么? 我在 XCB 文档中找不到任何用于该目的的内容(或者我看不到正确的文档/代码)。我使用 Python,但 C 示例可能有助于理解代码。谢谢。
使用 XCB,我需要将窗口的鼠标指针更改为标准的手形光标(无论这在 Linux 中意味着什么,我都需要一个独立于工具包的解决方案)。 注意:加载“光标”字体并将窗口属性 XCB_CW_CURSOR 更
我有一个用 C 编写的小示例程序,它使用 XCB API 打开一个窗口。 严格来说,之后我已经创建了并且显示了窗口,我想(稍后)隐藏窗口。 (显然,在这个特定示例中,我可以删除对 xcb_map_wi
我正在尝试研究如何在使用 xcb 进行输入时忽略重复的键。 我需要这样的成就: uint32_t mask = XCB_KB_AUTO_REPEAT_MODE; uint32_t values[] =
我正在尝试接收有关任何指针移动的通知。因为我不想作为窗口管理器运行,所以我需要设置 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_POINTE
我正在尝试制作一个非常简单的窗口管理器以供学习之用。我正在使用 C 和 xcb 库。我正在尝试在启动新应用程序时引发事件。 现在,我创建了一个根窗口,我可以在其中接收鼠标和键盘事件。我还在窗口的顶部画
我试图通过一个使用 xcb 库的 C 程序获取已启动 X 应用程序的主窗口列表。根据这个问题,这些窗口似乎是“顶级窗口”:X11: list top level windows 所以我的程序要求 Op
我正在编写一个用于在 xcb 中创建窗口的简约库。 我希望能够创建一个不可调整大小的窗口。我发现,可以通过以下方式向窗口管理器提供提示: xcb_void_cookie_t xcb_change_pr
我正在为 Linux 创建一个屏幕键盘,集成在一个简单的窗口管理器中。我目前正在使用 XCB,现在我想制作假击键。使用 xtest 扩展一切工作正常,除了我无法从我想要放置的键符中获取真正的键码的细节
我使用 Qt 设计器创建了一个应用程序。当我启动我的应用程序时,它抛出此错误: This application failed to start because it could not find o
我正在使用 XCB 编写一个程序,需要检测窗口何时获得或失去焦点。到目前为止,我已经有了这个,但它只是卡在 xcb_wait_for_event 调用上,从未进入循环。我在这里缺少什么来获取根事件?或
有没有人知道如何让我的主线程事件循环看起来像这样: const int MY_CUST_MSG(877); xcb_generic_event_t *event; while (event =
我正在尝试做与 this question 中相同的事情. 到目前为止,我从official documentation了解到xcb_change_property函数。 . 但是下面的代码仍然没有给
我是一名优秀的程序员,十分优秀!