如何在 X11/Xorg 中隐藏鼠标光标 [英] How to hide the mouse cursor in X11/Xorg

查看:43
本文介绍了如何在 X11/Xorg 中隐藏鼠标光标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么下面的X11/Xorg代码在Ubuntu 18.04下没有隐藏鼠标光标?如果这不是这样做的方法,那是什么?是否缺少依赖/库/.dev 包?

Why does the following X11/Xorg code not hide the mouse cursor under Ubuntu 18.04? If this is not the way to do it what is? Is there some missing dependency/library/.dev package?

我的直觉是,这可能是 Ubuntu(或 Debian)X11/Xorg 软件包或类似软件包中的一个错误.这就是 Haxe/Kha 隐藏鼠标以实现跨平台兼容的方式.

My intuition says this may be a bug in Ubuntu's (or Debian) X11/Xorg packages or some such. This is how Haxe/Kha does Mouse hiding in order to be compatible across platforms.

#include <iostream>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>

#include <string>
#include <iostream>

Window window;
void show();

int main()
{
    Display *display;
    XEvent e;
    std::string msg = "Hello, World!";
    int screen;

    display = XOpenDisplay(nullptr);
    if (display == nullptr)
    {
        std::cerr << "Cannot open display\n";
        throw;
    }

    screen = XDefaultScreen(display);
    window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 500, 500, 1,
                                 BlackPixel(display, screen), WhitePixel(display, screen));
    XStoreName(display, window, "Silly Window");
    XSelectInput(display, window, ExposureMask | KeyPressMask );
    XMapWindow(display, window);

    while (true)
    {
        XNextEvent(display, &e);
        if (e.type == Expose)
        {
            std::cout << "Window Exposed!\n";
            XExposeEvent ev = e.xexpose;
            if (ev.window != window) continue;
            XFillRectangle(display, window, DefaultGC(display, screen), 50, 50, 400, 50);
            XDrawString(display, window, DefaultGC(display, screen), 220, 220, msg.c_str(), msg.length());
            XFillRectangle(display, window, DefaultGC(display, screen), 50, 400, 400, 50);
        }
        else if (e.type == KeyPress)
        {
            char buf[128] = {0};
            KeySym keysym;
            int len = XLookupString(&e.xkey, buf, sizeof buf, &keysym, NULL);
            if (keysym == XK_Escape)
            {
                break;
            }
            else if (keysym == XK_space)
            {
                show();
                XAllowEvents(display, SyncBoth, CurrentTime);
            }
        }

    }

    XDestroyWindow(display, window);
    XCloseDisplay(display);
    return 0;
}

bool toggle = false;
void show()
{
    Display* dpy = XOpenDisplay(0);
    if (toggle)
    {
        std::cout << "toggle On\n";
        XUndefineCursor(dpy, window);
    }
    else
    {
        std::cout << "toggle Off\n";
        XColor col;
        char data[1] = {0X00};
        Pixmap blank = XCreateBitmapFromData(dpy, window, data, 1, 1);
        Cursor cursor = XCreatePixmapCursor(dpy, blank, blank, &col, &col, 0, 0);
        XDefineCursor(dpy, window, cursor);
        // XSetWindowAttributes wa;
        // XChangeWindowAttributes(dpy, window, CWCursor, &wa);
        // wa.cursor = cursor;
        XFreePixmap(dpy, blank);
    }
    toggle = !toggle;
}

推荐答案

是的,我可以确认代码确实有效

Yes I can confirm that is code definitely works

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/Xfixes.h>
#include <string>
#include <iostream>

Window window;
void show(Display *dispy);

int main()
{
    Display *display;
    XEvent e;
    std::string msg = "Hello, World!";
    int screen;

    display = XOpenDisplay(nullptr);
    if (display == nullptr)
    {
        std::cerr << "Cannot open display\n";
        throw;
    }

    screen = XDefaultScreen(display);
    window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 500, 500, 1,
                                 BlackPixel(display, screen), WhitePixel(display, screen));
    XStoreName(display, window, "Silly Window");
    XSelectInput(display, window, ExposureMask | KeyPressMask );
    XMapWindow(display, window);

    while (true)
    {
        XNextEvent(display, &e);
        if (e.type == Expose)
        {
            std::cout << "Window Exposed!\n";
            XExposeEvent ev = e.xexpose;
            if (ev.window != window) continue;
            XFillRectangle(display, window, DefaultGC(display, screen), 50, 50, 400, 50);
            XDrawString(display, window, DefaultGC(display, screen), 220, 150, msg.c_str(), msg.length());
            XDrawString(display, window, DefaultGC(display, screen), 220, 220, msg.c_str(), msg.length());
            XDrawString(display, window, DefaultGC(display, screen), 220, 300, msg.c_str(), msg.length());
            XFillRectangle(display, window, DefaultGC(display, screen), 50, 400, 400, 50);
        }
        else if (e.type == KeyPress)
        {
            char buf[128] = {0};
            KeySym keysym;
            XLookupString(&e.xkey, buf, sizeof buf, &keysym, NULL);
            if (keysym == XK_Escape)
            {
                break;
            }
            else if (keysym == XK_space)
            {
                show(display);
                XAllowEvents(display, SyncBoth, CurrentTime);
            }
        }

    }

    XDestroyWindow(display, window);
    XCloseDisplay(display);
    return 0;
}

bool toggle = true;
void show(Display *dpy)
{
    if (toggle)
    {
        std::cout << "toggle On->Off\n";
        XFixesHideCursor(dpy, window);
        XFlush(dpy);
    }
    else
    {
        std::cout << "toggle Off->On\n";
        XFixesShowCursor(dpy, window);
        XFlush(dpy);
    }
    toggle = !toggle;
}

这篇关于如何在 X11/Xorg 中隐藏鼠标光标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆