将X11光标设置为箭头。

3

我在调用XCreateWindow()时尝试了以下操作:

unsigned long ctt_attribute_mask = CWWinGravity | CWCursor;

ctt_attributes->win_gravity = NorthEastGravity;
ctt_attributes->cursor = XC_arrow;

ctt_window = XCreateWindow(dpy, parent, ctt_xpos, ctt_ypos,
             ctt_xy_size, ctt_xy_size, ctt_border,
             ctt_depth, ctt_class, ctt_visual,
             ctt_attribute_mask, ctt_attributes);

这将创建一个窗口,但当鼠标悬停在窗口上时,它不会影响指针。
我想在鼠标出现在我的窗口上时使用用户桌面环境的标准指针光标。
需要Xlib,因为这是一个与工具包无关的程序。 ETA: 可以查看源文件中第35行开始的create_ctt_window获得更多上下文信息。
2个回答

5
  1. ctt_attributes->cursor = XCreateFontCursor(dpy, XC_arrow);
  2. 这不是桌面环境的标准指针光标,而是X11使用的相当丑陋的位图光标。如果您想要主题化的光标,请使用libXcursor。我对此没有经验。

有趣,感谢指向libXcursor的指针。现在我只需要弄清楚如何使用它。在其man页面中列出的API似乎不起作用;即使对于光标主题目录中存在的主题名称,char *XcursorGetTheme(Display *dpy)也会返回NULL,而Cursor XcursorLibraryLoadCursor(Display *dpy, const char *name)似乎也没有实际作用。当然,我可能做错了什么。看来当涉及到低级别的X11编程时,我是个倒霉蛋。 :) - Michael Trausch
1
啊哈。原来libXcursor无法发现显示器上正在使用的鼠标主题。我必须以WM/DE相关的方式从底层WM和/或DE中发现它。这样就没有可移植性了... - Michael Trausch

2
这里是《Xlib编程手册》第1卷第182页的例子。
#include <X11/cursorfont.h>
int cursor_shape = XC_arrow;
Window window;
Cursor cursor;
cursor = XCreateFontCursor(display, cursor_shape);
XDefineCursor(display, window, cursor);
/* Now cursor will appear when pointer is in window */ 

所以看起来n.m.是正确的。您需要调用XCreateFontCursor将XC_arrow(它只是一个指定光标在字体编码向量中位置的整数)转换为光标资源。我认为光标资源也只是一个整数。这就是为什么你没有编译错误。但确实存在类型不匹配的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接