如何在C应用程序中设置X11上的鼠标光标

4

我有一个相当大而且比较老的C应用程序,已经移植到Linux。我负责确保鼠标指针正常工作,但遇到了一些问题。我能够将我们需要的大多数光标转换为使用XFontCursor提供的标准光标,例如:

gCursorTable[waitCurs] = XCreateFontCursor(gDisplay, XC_watch);
...
XDefineCursor(gDisplay, WHostWindow(w), gCursorTable[cursor]);
XFlush(gDisplay);

这对于在 XFontCursor 提供的(有用的)极其有限的光标列表中具有类似物的光标来说是可以的,但还有其他内置主题化光标我想设置。例如,我想在我的应用程序中将光标设置为 bd_double_arrow(它包含在每个光标主题中,并且是窗口的标准对角线调整大小光标),但显然您不能使用 XCreateFontCursor 来实现这一点。这似乎很基础,但我却找不到任何关于如何做到这一点的描述。
我只是想知道其他 X11 应用程序是如何设置光标的,因为它们显然是从全局主题中获取它们,而不仅仅使用 XCreateFontCursor。
2个回答

8
使用主题化光标的最简单方法是使用Xcursor库。
#include <X11/Xcursor/Xcursor.h>
...
Cursor c = XcursorLibraryLoadCursor(dpy, "sb_v_double_arrow");
XDefineCursor (dpy, w, c);

这些名称都是标准光标名称,来自于 X11/cursorfont.h,不包括 XC_。如果主题有额外的光标,比如 bd_double_arrow,也可以使用这些名称(但并非所有主题都有这些额外的光标!)

如果主题没有替代某个核心X光标的内容,该库将回退到核心光标。


我已经能够使用XCreateFontCursor加载所有标准光标名称。虽然我猜这是另一种方式,但它对我没有什么帮助。人们如何使用显示像bd_double_arrow这样的光标,它在每个光标主题中都存在,但不在cursorfont.h中。 - Mordred
抱歉,我忘了提到如果你的主题有的话,你也可以使用非核心光标名称,比如“bd_double_arrow”(我的没有!)请查看更新后的答案。 - n. m.
好的,我在OpenSuse 12.3上尝试了默认的kde主题,但bd_double_arrow没有起作用。他们必须拥有那个光标图像,因为当你将鼠标移到窗口角落时显然会使用它。假设您的解决方案确实有效,是否有任何方法可以找到这些光标的名称? - Mordred
1
默认的KDE主题没有bd_double_arrow。角落调整箭头是size_bdiagsize_fdiag。查看man Xcursor以查看光标图像的搜索位置,有一个很长的列表,我不知道它们在SuSE中的位置。我认为没有API可以列出所有可用的光标名称;要查看是否提供了光标,请尝试加载它。阅读Xcursors的源代码以获得更深入的见解。 - n. m.

0

在该页面上点击一些链接后:尝试使用 XCreatePixmapCursor。从它的描述来看,你可以创建任何你想要的两种颜色的光标。


我不想创建自己的光标,我想使用主题设置的光标。每个光标主题都包括自己的bd_double_arrow(这是您在左上角和右下角获得的对角线大小调整箭头,用于调整窗口大小),我想使用它,以便我的应用程序不会像一个明显的问题一样突出...但我不知道该怎么做。 - Mordred

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