【发布时间】:2019-02-06 22:00:02
【问题描述】:
为什么下面的X11/Xorg代码在Ubuntu 18.04下没有隐藏鼠标光标?如果这不是这样做的方法,那是什么?是否缺少一些依赖/库/.dev 包?
我的直觉说这可能是 Ubuntu(或 Debian)X11/Xorg 软件包或类似软件包中的错误。这就是 Haxe/Kha 隐藏鼠标以便跨平台兼容的方式。
#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;
}
【问题讨论】:
-
目前最好的方法是使用 Xfixes 扩展。如果您想查看示例,请查看 Github 上的 unclutter-xfixes(免责声明:这是我的项目)。
-
好的,会调查的...
-
进一步补充,如果鼠标离开根窗口,我希望鼠标光标再次出现,如果它被隐藏,则在再次进入根窗口时消失。除了必须对它进行编程之外,还有什么简单的方法可以做到这一点,但它并不漂亮。
标签: ubuntu x11 xorg ubuntu-18.04 mouse-cursor