我正在尝试创建一个小窗口管理器(只是为了好玩),但我在处理由Firefox创建的窗口时遇到问题(只有该应用程序,其他应用程序工作正常)
问题是,在我启动Firefox后,添加我的装饰,它似乎工作正常,但如果我尝试单击菜单按钮,则不会出现(子)窗口.
似乎发生的是,在单击之后,会使用以下值触发ClientMessage事件:
Data: (null)
Data: _NET_WM_STATE_HIDDEN
Data: (null)
Data: (null)
Data: (null)
Run Code Online (Sandbox Code Playgroud)
现在的问题是我不知道如何显示窗口,哪个窗口.我尝试过:
但没有成功.我不明白的是,如果此客户端消息是由菜单子窗口生成的.
我应该如何显示_NET_WM_STATE_HIDDEN中的窗口?
另一个奇怪的问题是,在收到ClientMessage后,我总是收到2个UnMapNotify事件.
我还有另一个问题,如果我想显示"文件,编辑"菜单(在Firefox中显示,如果我没记错,当你按下Alt键时).
也许Firefox创建了一个窗口树?
这是我处理事件的循环:
while(1){
XNextEvent(display, &local_event);
switch(local_event.type){
case ConfigureNotify:
configure_notify_handler(local_event, display);
break;
case MotionNotify:
motion_handler(local_event, display);
break;
case CreateNotify:
cur_win = local_event.xcreatewindow.window;
char *window_name;
XFetchName(display, cur_win, &window_name);
printf("Window name: %s\n", window_name);
if(window_name!=NULL){
if(!strcmp(window_name, "Parent")){
printf("Adding borders\n");
XSetWindowBorderWidth(display, cur_win, BORDER_WIDTH);
}
XFree(window_name);
}
break;
case MapNotify:
map_notify_handler(local_event,display, infos);
break;
case UnmapNotify:
printf("UnMapNotify\n");
break;
case DestroyNotify:
printf("Destroy Event\n");
destroy_notify_handler(local_event,display);
break;
case ButtonPress: …Run Code Online (Sandbox Code Playgroud) 从手册页XFillPolygon:
如果
shape是复杂的,则路径可以自相交.请注意,路径中的连续重合点不会被视为自相交.如果
shape是Convex,对于多边形内的每对点,连接它们的线段不与路径相交.如果客户端知道,指定Convex可以提高性能.如果为非凸的路径指定Convex,则图形结果未定义.如果
shape是Nonconvex,则路径不会自相交,但形状不是完全凸的.如果客户端知道,指定Nonconvex而不是Complex可以提高性能.如果为自相交路径指定Nonconvex,则图形结果未定义.
我遇到填充性能问题XFillPolygon,正如手册页所示,我想要采取的第一步是指定多边形的正确形状.我目前正在使用Complex来保证安全.
是否有一种有效的算法来确定多边形(由一系列坐标定义)是凸的,非凸的还是复杂的?
我找到的几乎每个教程都告诉我为我的事件循环执行此操作:
XEvent event;
while (true)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,单击X关闭程序将导致此消息.
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 10 requests (10 known processed) with 0 events remaining.
Run Code Online (Sandbox Code Playgroud)
对我来说,这些例子建议使用无限循环确实很奇怪.这听起来并不自然,我的其他X11程序也不这样做.所以我四处搜寻.我发现了如何捕获窗口关闭事件.
Atom wmDeleteMessage = XInternAtom(mDisplay, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, window, &wmDeleteMessage, 1);
XEvent event;
bool running = true;
while (running)
{
XNextEvent(display, &event);
switch (event.type)
{
case Expose:
printf("Expose\n");
break;
case ClientMessage:
if (event.xclient.data.l[0] == wmDeleteMessage)
running = false; …Run Code Online (Sandbox Code Playgroud) 有没有人知道一个xlib函数来捕获一个按键事件而不会失去原始焦点?如何摆脱它?
(或"使用XGrabKey()而不产生抓取式焦点"?)
(或"如何摆脱系统级别的NotifyGrab和NotifyUngrab焦点事件?)
XGrabKey将失去对关键按下和恢复焦点的关注.
而且我想捕获按键而不将其泄漏到原始窗口(正如XGrabKey可以做到的那样).
参考文献:
...... XGrabKey将窃取焦点... https://bugs.launchpad.net/gtkhotkey/+bug/390552/comments/8
...程序接受控制以响应键组合做某事.同时,该程序暂时关注... 在XGrabKey(董事会)期间,发现哪个窗口已经集中
... XGrabKeyboard函数主动抓取键盘控制并生成FocusIn和FocusOut事件...... http://www.x.org/archive/X11R6.8.0/doc/XGrabKeyboard.3.html#toc3
...我无法看到提供metacity当前桌面变换行为的方法(同时更改和显示弹出对话框),而不会在窗口上引起Grab类型的焦点... https://mail.gnome .ORG /档案馆/ WM说明列表/ 2007-月/ msg00000.html
...全屏模式不应退出使用NotifyGrab的FocusOut事件... https://bugzilla.mozilla.org/show_bug.cgi?id=578265
抓住键盘不允许改变焦点... 抓住键盘不允许改变焦点
Grabs生成的焦点事件(XGrabKeyboard的主动抓取和XGrabKey的被动抓取) http://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html#Focus_Events_Generated_by_Grabs
XGrabKey源代码:http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/GrKey.c 也许我们可以修改它来摆脱焦点事件?
有"DoFocusEvents(keybd,oldWin,grab-> window,NotifyGrab);" 在ActivateKeyboardGrab()中:http: //cgit.freedesktop.org/xorg/xserver/tree/dix/events.c
我正在为按键组合(和鼠标移动)地图软件写一次按键:https://code.google.com/p/diyism-myboard/
我已经在Windows中使用RegisterHotKey()和UnRegisterHotKey()实现了它:https://code.google.com/p/diyism-myboard/downloads/detail? name = MyBoard.pas
我想通过XGrabKey()和XUngrabKey()将其迁移到Linux:https://code.google.com/p/diyism-myboard/downloads/detail? name = myboard.py
我创造了10美元的赏金来解决这个问题.我们需要更多的支持者才能获得赏金. https://www.bountysource.com/issues/1072081-right-button-menu-flashes-while-jkli-keys-move-the-mouse-pointer
我的目标是让一个程序在后台休眠,但可以由用户通过一些"热键"激活.从挖掘Xlib手册和Xlib O'reilly手册开始,我认为正确的方法是使用XGrabKey.但是我对这个过程的理解是不正确的,因为简单的概念证明不起作用.
我的理解是,如果我叫XGrabKey与根窗口作为grab_window和owner_events假,每当我的热键按下事件,然后将发送只到根窗口.如果我然后从根窗口选择KeyPress事件,然后侦听X事件,我应该在按下热键时获得按键事件.我在下面粘贴了一个最小的例子.
我期望的是,当程序运行时,无论哪个窗口有焦点,如果按下Ctrl + Shift + K,我的程序应输出"热键被按下!" 在控制台中,然后终止.
此外,我的理解是,如果XGrabKey失败,默认错误处理程序将显示一条消息,因为它不是我假设调用成功.
显然,我的理解在某种程度上是有缺陷的.谁能指出我正确的方向?
#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
using namespace std;
int main()
{
Display* dpy = XOpenDisplay(0);
Window root = DefaultRootWindow(dpy);
XEvent ev;
unsigned int modifiers = ControlMask | ShiftMask;
int keycode = XKeysymToKeycode(dpy,XK_Y);
Window grab_window = root;
Bool owner_events = False;
int pointer_mode = GrabModeAsync;
int keyboard_mode = GrabModeAsync;
XGrabKey(dpy, keycode, modifiers, grab_window, owner_events, pointer_mode,
keyboard_mode);
XSelectInput(dpy, root, KeyPressMask );
while(true)
{
bool shouldQuit = false;
XNextEvent(dpy, …Run Code Online (Sandbox Code Playgroud) 在windows下,GUI线程通常调用GetMessage来等待消息,当另一个线程使用PoseMessage将消息放入队列时,GUI线程将返回GetMessage(退出阻塞).
有没有人能告诉我,当我在XWindows下使用XNextEvent等待事件时,如何在另一个线程中"唤醒"GUI线程.有没有像我可以使用的PoseMessage这样的API?
我最近一直在阅读一些关于输入延迟的文章:
https://danluu.com/term-latency/
https://pavelfatin.com/typing-with-pleasure/
我一直在努力改善我的小文本编辑器的用户体验.我正在使用SDL来汇集输入并创建窗口,但决定删除它并执行我自己的X实现.应用程序启动已经改进,但输入延迟并没有那么多.是否有任何特定的技术可以改善我的应用程序从X中获取鼠标和键盘数据的方式?或者我应该放弃并强迫Wayland?
我已经考虑运行我XNextEvent例行()在一个单独的线程循环,但真正这样做的唯一的解决办法?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#include <GL/glx.h>
#include <GL/glext.h>
#include <GL/glu.h>
Display *dpy;
Window root, win;
GLint att[] = {GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None};
XVisualInfo *vi;
Colormap cmap;
XSetWindowAttributes swa;
XWindowAttributes wa;
XEvent xev;
Mask mask;
float TimeCounter, LastFrameTimeCounter, DT, prevTime = 0.0, FPS;
struct timeval tv, tv0;
int Frame = 1, FramesPerFPS;
void CreateWindow() {
if ((dpy = XOpenDisplay(NULL)) == NULL) …Run Code Online (Sandbox Code Playgroud) 我正在尝试捕获屏幕图像以用于截屏.因此我需要一个快速的解决方案,并且不能依赖shell程序,如import或xwd.
这是我到目前为止编写的代码,但是它失败并且给了我一个垃圾图像,它似乎只是显示了奇怪颜色的几个图像的片段.
http://s9.postimage.org/dqnkgkwr1/blah.png
关于我做错了什么的任何想法?
#include <X11/Xlib.h>
#include <X11/X.h>
#include <cstdio>
#include <CImg.h>
using namespace cimg_library;
int main()
{
Display *display = XOpenDisplay(NULL);
Window root = DefaultRootWindow(display);
XWindowAttributes gwa;
XGetWindowAttributes(display, root, &gwa);
int width = gwa.width;
int height = gwa.height;
XImage *image = XGetImage(display,root, 0,0 , width,height,AllPlanes, ZPixmap);
unsigned char *array = new unsigned char[width * height * 3];
unsigned long red_mask = image->red_mask;
unsigned long green_mask = image->green_mask;
unsigned long blue_mask = image->blue_mask;
for (int x = 0; x < …Run Code Online (Sandbox Code Playgroud) 我正在使用GCC,我需要添加哪些开关才能与Xlib链接?搜索之后,我能找到的只是-lX11,但那给了我ld: library not found for -lX11
我正在使用mac(10.6),但我不喜欢Mac特有的任何东西.
"Python Xlib"(http://pypi.python.org/pypi/Python%20Xlib)是一个用于处理xlib的低级python库.我通过apt安装在我的Ubuntu Linux机器上,即sudo aptitude install python-xlib.但是可以pip在virtualenv中安装吗?我正在编写一个使用xlib的软件包,并希望能够install_requires在我的脑中包含一行setup.py.
由于包是PyPI上(并出现在的成绩pip search xlib),我想pip install …下面的包名,但没有工作:python\ xlib,python-xlib,Python Xlib,Python-Xlib,Python%20Xlib,但没有奏效.`是否可以用pip安装python xlib?