如何使用Xlib设置“箭头+手表”鼠标光标?

3
我注意到,使用XCreateFontCursor然后使用光标代码XC_watch(150)调用XDefineCursor实际上将光标设置为默认的系统动画沙漏光标,而不是丑陋的Xlib光标。
对我来说,这表明某些系统(窗口管理器?)拦截了xlib调用并透明地更改了光标。
但是,如果在XLib常量中未定义“箭头+沙漏”光标,我该如何以这种方式设置光标?
2个回答

1
你需要的是称为“光标主题”的东西(它扩展了X光标字体的内容,但不总是兼容的)。以下是一些讨论: 这是用户级别(您可以查看动画光标)。Xcursor库由X服务器使用,以覆盖旧的位图光标行为,提供颜色和其他有趣的图像相关功能。文档... 贫乏, 实际上需要其他开发人员通过阅读源代码获取大部分信息(就像我在xterm中所做的那样-寻找"XCursor")。
这是指向源代码的指针:

http://cgit.freedesktop.org/xorg/lib/libXcursor/


也许我没有解释清楚。我正在编写程序,并使用xlib创建窗口和其他GUI对象。所以,问题是如何在我的程序中使用这个光标?而不是如何设置系统鼠标光标主题。 - johnfound
正如@patthoyts所指出的,有一个Xcursor库(由X服务器使用)可以完成这项工作。在我指出的顶层,提到了动画光标的使用方式,你需要理解它的用法。 - Thomas Dickey
我应该明白通过 XLib 设置“箭头+沙漏”光标是不可能实现的,我应该使用调用 XCursor 库来代替吗? - johnfound
这可能有效(但你必须研究该库的源代码以查看如何做到这一点,因为文档无法帮助)。 - Thomas Dickey

1

光标形状定义(数字)与光标主题提供的图像之间存在映射关系。这似乎是由Xcursor处理的。查看Xcursor.h文件时,有以下注释:

/*
 * This is the function called by Xlib when attempting to
 * load cursors from XCreateGlyphCursor.  The interface must
 * not change as Xlib loads 'libXcursor.so' instead of
 * a specific major version
 */
这段文字表明XcursorTryShapeCursor函数参与了将对XCreateFontCursor的调用转换为要加载的图像文件。因此,用于满足Xlib调用的图标文件由Xcursor提供的图标主题进行管理。XcursorSetTheme可用于选择替代光标主题,但除非已安装原始丑陋的X11光标作为主题,否则无法通过此方式获取内置光标。然而,Xcursor手册提到XCURSOR_PATH环境变量。如果将其设置为没有光标主题的路径,则所有内容都会默认为内置丑陋的光标。例如:env XCURSOR_PATH=/tmp ./test_application

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