如何在Linux / X11下隐藏鼠标指针?

时间:2009-03-19 00:25:25

标签: linux mouse x11

如何在X11下隐藏鼠标指针?我想使用内置库来执行此操作,而不是像SDL(SDL_ShowCursor(0))或过剩(glutSetCursor(GLUT_CURSOR_NONE))。此外,无论指针位置如何,都应隐藏鼠标指针,而不仅仅是在自己的窗口中。

11 个答案:

答案 0 :(得分:34)

这是description unclutter实用程序如何做到的。

  

Unclutter是一个在X11背景下永久运行的程序   会话。它每隔几次检查一次X11指针(光标)位置   秒,当它发现它没有移动时(没有按钮   按下鼠标,光标不在根窗口中)   它创建一个小的子窗口作为光标所在窗口的子窗口。   新窗口安装一个大小为1x1但掩码为的游标   全0,即不可见的光标。这允许您查看所有文本   例如,xterm或xedit。人为因素会让人同意   应该减少分散注意力。

     

一旦创建,程序就会等待指针离开窗口   然后摧毁它,恢复原来的情况。   按钮事件透明地传递到父窗口。   它们通常会导致光标重新出现,因为主动抓取   当按钮关闭时,程序将进行,所以指针   显然会离开窗户,即使它的x y位置没有变化。

答案 1 :(得分:18)

我宁愿使用更简单的方法:

unclutter -idle 0

你几乎看不到光标,它仍然可用。要禁用鼠标:

rmmod psmouse

或者在/ etc /中的某处永久禁用鼠标模块。请参阅您的分发手册。

答案 2 :(得分:17)

替换unclutter

整理对我来说不起作用,因为它不能很好地与硬件加速表面(例如在解码视频时由intels的VA-API生成的表面)相配合。所以我发现了一个程序,它以一种不那么迂回的方式隐藏了鼠标指针, hhp ,并在C中用最小的依赖关系重写了它,结果是 hhpc < / strong>即可。我这样做是为了避免让haskell编译它,因为hhp有时会停止隐藏鼠标指针。

hhpc ,仅依赖于glibcxlib,因此很容易构建,只需make release。您可以从my repository获取代码和说明。它的内存和CPU效率非常高(因为它几乎没有任何功能)。

答案 3 :(得分:14)

您可以创建和设置不可见的光标主题。这个技巧由maemo使用,因为在触摸屏设备上放置光标是没有意义的。

可悲的是,在运行时更改全局游标主题的能力在X11应用程序和工具包中并不统一。您可以更改服务器资源Xcursor.theme,没有人会注意到(通常只在启动时查询);你可以通知xsettings这似乎只影响Gtk +程序; KDE通过根窗口上的属性进行某种通信;等

至少更改您自己的应用程序的光标就像XDefineCursor一样简单,如果您在根窗口上执行此操作,某些应用程序可能会关注沿。

答案 4 :(得分:14)

我最终使用了像ephemient提到的XDefineCursor。控制应用程序更改了默认的根窗口光标,其他应用程序(在我的控制之下)继承了它。

代码细节如下:

// Hide the cursor

if (NULL==(display=XOpenDisplay(NULL))) 
{
   printf("Unable to open NULL display\n");
   exit(1);
}
window = DefaultRootWindow(display);

Cursor invisibleCursor;
Pixmap bitmapNoData;
XColor black;
static char noData[] = { 0,0,0,0,0,0,0,0 };
black.red = black.green = black.blue = 0;

bitmapNoData = XCreateBitmapFromData(display, window, noData, 8, 8);
invisibleCursor = XCreatePixmapCursor(display, bitmapNoData, bitmapNoData, 
                                     &black, &black, 0, 0);
XDefineCursor(display,window, invisibleCursor);
XFreeCursor(display, invisibleCursor);
XFreePixmap(display, bitmapNoData);

为了隐藏光标然后在我完成之后

// Restore the X left facing cursor
Cursor cursor;
cursor=XCreateFontCursor(display,XC_left_ptr);
XDefineCursor(display, window, cursor);
XFreeCursor(display, cursor);

恢复X的左手光标(因为它是根窗口,我不希望它保持不可见。我不确定,但我也可以使用

XUndefineCursor(display, window);

答案 5 :(得分:13)

Xorg 1.7及更高版本有一个-no-cursor选项。 https://www.x.org/wiki/AdvancedTopicsFAQ/

xinit -- -nocursorstartx -- -nocursor可以正常工作。

答案 6 :(得分:6)

使用xbanish! #&#34;在键入&#34;时消除鼠标光标! 从

开始
  

xbanish&amp;

并享受!

答案 7 :(得分:4)

这是我的解决方案。它把光标放在你看不到的地方(在我的情况下,在左下角) - 然后,它会禁用鼠标,所以你不能移动它。

注意您可以解析xrandr中的数据,或者在登录环境中将数据放入环境中,然后使用它;这样,您就不必对其进行硬编码。但是,至于我,我从不改变我的屏幕分辨率,所以768可以:)

setmouse () {
   DISPLAY=":0" xinput $1 `DISPLAY=":0" xinput | grep Mouse |
           tr -d " " | tr "\t" " " |
           cut -d" " -f2 | cut -d"=" -f2`
}

offmouse () {
   DISPLAY=":0" xdotool mousemove 0 768 # use xrandr to find out
   setmouse disable
}

onmouse () {
   setmouse enable
}

答案 8 :(得分:4)

好吧!

我想这篇文章可能会变得有点旧,但如果我发现的内容可以帮助我们中的某些人,我肯定要在这里发帖;)

我发现自己是一个干净简单的解决方案,工作正常,没有使用“xcb”(对于我试图实现的目标,它是一个小工程过度工程(..)

所以:

你需要的只是“xsetroot”命令,带有适当的参数/参数:

- &GT;要隐藏鼠标光标,你需要一个额外的小文件(我称之为“blnk_ptr.xbm”)

此文件的内容:

#define blnk_ptr_width 1
#define blnk_ptr_height 1
#define blnk_ptr_x_hot 0
#define blnk_ptr_y_hot 0
static unsigned char blnk_ptr_bits[] = {
   0x00 };

然后,我们可以使用以下两个命令:

- &GT;隐藏鼠标指针光标:

xsetroot -cursor blnk_ptr.xbm blnk_ptr.xbm

- &GT;再次显示鼠标指针光标:

xsetroot -cursor_name left_ptr

(你可以使用除“left_ptr”之外的鼠标指针光标,但是这个光标似乎可以在* nix系统中广泛使用(..)

Btw-&GT;我还不知道如何使用xsetroot获取系统当前使用的指针的名称 - &gt;我想我会像往常那样挖掘它,但我很高兴有人知道如何给我答案(这很好;)

享受? ; P

答案 9 :(得分:0)

有一个名为Fixes的X11扩展,它具有一个可以用来隐藏光标的功能。该功能的优点在于,它将向X服务器发送一条消息,该消息隐藏了精灵。没有技巧(即,从像素图看不见的光标),并且据我所知,它可以在整个屏幕上正常工作。

update UserSettings
set Setting=REPLACE(convert(varchar(max),Setting),'<string>Report - 1</string>','<string>Report - One</string>')
where convert(varchar(max),Setting) like '%<string>Report - 1</string>%'

来源: How to hide the mouse cursor in X11/Xorg

答案 10 :(得分:0)

源代码,xtoggle.c

#include <signal.h>
#include <X11/extensions/Xfixes.h>

Display               *display;
volatile sig_atomic_t breakout = 0;

void toggle_cursor(int x) { breakout = x; }

int main(void) {
    int      hidden = 0;
    struct   sigaction act;
    sigset_t mask;

    if (!(display = XOpenDisplay(NULL))) { return(1); }
    act.sa_handler = toggle_cursor;
    sigaction(SIGUSR1, &act, NULL);
    sigemptyset(&mask);
    while (1) {
        if (hidden) { XFixesShowCursor(display, DefaultRootWindow(display)); } 
        else        { XFixesHideCursor(display, DefaultRootWindow(display)); }
        XFlush(display);
        hidden = !hidden;
        breakout = 0;
        while (!breakout) { sigsuspend(&mask); }
    }
    return(0);
}
  • 取决于 Xfixes。在 Debian/Ubuntu 上,

    apt install libxfixes-dev
    
  • 编译并在后台执行,

    cc xtoggle.c -lX11 -lXfixes -o xtoggle
    ./xtoggle &
    
  • 通过向光标发送 USR1 信号来切换光标可见性,

    pkill -USR1 -x xtoggle
    
  • 可能有用的练习:使用 XWarpPointer 移动 隐藏时不可见的鼠标指针。