标签: xlib

Xlib和Firefox的行为

我正在尝试创建一个小窗口管理器(只是为了好玩),但我在处理由Firefox创建的窗口时遇到问题(只有该应用程序,其他应用程序工作正常)

问题是,在我启动Firefox后,添加我的装饰,它似乎工作正常,但如果我尝试单击菜单按钮,则不会出现(子)窗口.

似乎发生的是,在单击之后,会使用以下值触发ClientMessage事件:

Data: (null)
Data: _NET_WM_STATE_HIDDEN
Data: (null)
Data: (null)
Data: (null)
Run Code Online (Sandbox Code Playgroud)

现在的问题是我不知道如何显示窗口,哪个窗口.我尝试过:

  • XRaiseWindow
  • XMapWindow
  • 我试图获得瞬态窗口并显示它

但没有成功.我不明白的是,如果此客户端消息是由菜单子窗口生成的.

我应该如何显示_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)

c x11 xlib

61
推荐指数
1
解决办法
1360
查看次数

如何有效地确定多边形是凸的,非凸的还是复杂的?

从手册页XFillPolygon:

  • 如果shape复杂的,则路径可以自相交.请注意,路径中的连续重合点不会被视为自相交.

  • 如果shapeConvex,对于多边形内的每对点,连接它们的线段不与路径相交.如果客户端知道,指定Convex可以提高性能.如果为非凸的路径指定Convex,则图形结果未定义.

  • 如果shapeNonconvex,则路径不会自相交,但形状不是完全凸的.如果客户端知道,指定Nonconvex而不是Complex可以提高性能.如果为自相交路径指定Nonconvex,则图形结果未定义.

我遇到填充性能问题XFillPolygon,正如手册页所示,我想要采取的第一步是指定多边形的正确形状.我目前正在使用Complex来保证安全.

是否有一种有效的算法来确定多边形(由一系列坐标定义)是凸的,非凸的还是复杂的?

algorithm geometry polygon xlib computational-geometry

45
推荐指数
4
解决办法
7万
查看次数

如何优雅地退出X11事件循环?

我找到的几乎每个教程都告诉我为我的事件循环执行此操作:

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)

c linux x11 xlib

39
推荐指数
2
解决办法
1万
查看次数

为什么XGrabKey会产生额外的焦点和焦点事件?

有没有人知道一个xlib函数来捕获一个按键事件而不会失去原始焦点?如何摆脱它?

(或"使用XGrabKey()而不产生抓取式焦点"?)

(或"如何摆脱系统级别的NotifyGrab和NotifyUngrab焦点事件?)

XGrabKey将失去对关键按下和恢复焦点的关注.

而且我想捕获按键而不将其泄漏到原始窗口(正如XGrabKey可以做到的那样).

参考文献:

  1. ...... XGrabKey将窃取焦点... https://bugs.launchpad.net/gtkhotkey/+bug/390552/comments/8

  2. ...程序接受控制以响应键组合做某事.同时,该程序暂时关注... 在XGrabKey(董事会)期间,发现哪个窗口已经集中

  3. ... XGrabKeyboard函数主动抓取键盘控制并生成FocusIn和FocusOut事件...... http://www.x.org/archive/X11R6.8.0/doc/XGrabKeyboard.3.html#toc3

  4. ...我无法看到提供metacity当前桌面变换行为的方法(同时更改和显示弹出对话框),而不会在窗口上引起Grab类型的焦点... https://mail.gnome .ORG /档案馆/ WM说明列表/ 2007-月/ msg00000.html

  5. ...全屏模式不应退出使用NotifyGrab的FocusOut事件... https://bugzilla.mozilla.org/show_bug.cgi?id=578265

  6. 抓住键盘不允许改变焦点... 抓住键盘不允许改变焦点

  7. Grabs生成的焦点事件(XGrabKeyboard的主动抓取和XGrabKey的被动抓取) http://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html#Focus_Events_Generated_by_Grabs

  8. XGrabKey源代码:http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/GrKey.c 也许我们可以修改它来摆脱焦点事件?

  9. 有"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

python linux x11 xlib

37
推荐指数
4
解决办法
3343
查看次数

全局热键X11/Xlib

我的目标是让一个程序在后台休眠,但可以由用户通过一些"热键"激活.从挖掘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)

x11 hotkeys xlib

28
推荐指数
3
解决办法
1万
查看次数

如何退出阻止xlib的XNextEvent

在windows下,GUI线程通常调用GetMessage来等待消息,当另一个线程使用PoseMessage将消息放入队列时,GUI线程将返回GetMessage(退出阻塞).

有没有人能告诉我,当我在XWindows下使用XNextEvent等待事件时,如何在另一个线程中"唤醒"GUI线程.有没有像我可以使用的PoseMessage这样的API?

c x11 user-interface xlib

26
推荐指数
3
解决办法
1万
查看次数

使用X时减少输入延迟

我最近一直在阅读一些关于输入延迟的文章:

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)

c++ xlib

24
推荐指数
1
解决办法
492
查看次数

如何使用xlib正确截取屏幕截图?

我正在尝试捕获屏幕图像以用于截屏.因此我需要一个快速的解决方案,并且不能依赖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)

c c++ screenshot xlib cimg

23
推荐指数
2
解决办法
1万
查看次数

与xlib链接需要做什么?

我正在使用GCC,我需要添加哪些开关才能与Xlib链接?搜索之后,我能找到的只是-lX11,但那给了我ld: library not found for -lX11

我正在使用mac(10.6),但我不喜欢Mac特有的任何东西.

c x11 gcc xlib

22
推荐指数
3
解决办法
2万
查看次数

你如何用pip安装Python Xlib?

"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?

python pip xlib

17
推荐指数
1
解决办法
1万
查看次数