現在のマウス位置を強調表示する


18

デュアルスクリーンセットアップを実行していますが、ほとんどの場合トラックパッドが無効になっています(マウスポインターの非表示を含む)。トラックパッドを再度有効にすると(およびマウスポインターが再び表示されます)、ポインターの前の位置がわかりません。

現在のマウス位置を強調表示するツールを探しています(例:円で)。理想的には、これは単一のコマンドが短時間円を点滅させることです。

xdotool現在の位置を見つけることができることは承知していますが、強調表示はありません。また、key-monこの機能は提供していません。そのcairo composition managerような機能を提供するものも読んだことがありますが、これを実現するためのより小さなツールがあるのではないかと思っています。

そのようなツールがない場合:提供されるデータを使用してカーソルの周りにそのような円を表示する最も簡単な方法は何 xdotool getmouselocationですか?

これが関連する場合:私はデスクトップ環境を使用せず、xmonadウィンドウマネージャーのみを使用します 。

回答:


18

私のようなもののMikeserv賢のための答え、それがどの『盗み』ウィンドウにフォーカスを作成するという欠点があり、離れてクリックする必要があります。また、私はそれが取る見つけるだけで「滑らかな」経験のために遅すぎるわずかである0.2〜0.3秒、約:開始するにはあまりにも長い間、わずか。

私はついにXLibを掘り起こし、これを行うための基本的なCプログラムをまとめました。視覚効果は、Windows(XP)が(メモリから)持っているものとほぼ同じです。あまり美しくありませんが、動作します;-)フォーカスを「盗む」ことはなく、ほぼ瞬時に開始し、「スルー」をクリックできます。

ここに画像の説明を入力してください

でコンパイルできますcc find-cursor.c -o find-cursor -lX11 -lXext -lXfixes。サイズや速度などを変更するために微調整できる変数が上部にあります。

これをプログラムとしてhttp://code.arp242.net/find-cursorでリリースしました。このバージョンを使用することをお勧めします。これには、以下のスクリプトにはないいくつかの改善点があります(コマンドライン引数やウィンドウを「スルー」する機能など)。その単純さのために、私は以下をそのままにしました。

/*
 * http://code.arp242.net/find-cursor
 * Copyright © 2015 Martin Tournoij <martin@arp242.net>
 * See below for full copyright
 */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>


// Some variables you can play with :-)
int size = 220;
int step = 40;
int speed = 400;
int line_width = 2;
char color_name[] = "black";


int main(int argc, char* argv[]) {
    // Setup display and such
    char *display_name = getenv("DISPLAY");
    if (!display_name) {
        fprintf(stderr, "%s: cannot connect to X server '%s'\n", argv[0], display_name);
        exit(1);
    }

    Display *display = XOpenDisplay(display_name);
    int screen = DefaultScreen(display);

    // Get the mouse cursor position
    int win_x, win_y, root_x, root_y = 0;
    unsigned int mask = 0;
    Window child_win, root_win;
    XQueryPointer(display, XRootWindow(display, screen),
        &child_win, &root_win,
        &root_x, &root_y, &win_x, &win_y, &mask);

    // Create a window at the mouse position
    XSetWindowAttributes window_attr;
    window_attr.override_redirect = 1;
    Window window = XCreateWindow(display, XRootWindow(display, screen),
        root_x - size/2, root_y - size/2,   // x, y position
        size, size,                         // width, height
        0,                                  // border width
        DefaultDepth(display, screen),      // depth
        CopyFromParent,                     // class
        DefaultVisual(display, screen),     // visual
        CWOverrideRedirect,                 // valuemask
        &window_attr                        // attributes
    );
    XMapWindow(display, window);
    XStoreName(display, window, "find-cursor");

    XClassHint *class = XAllocClassHint();
    class->res_name = "find-cursor";
    class->res_class = "find-cursor";
    XSetClassHint(display, window, class);
    XFree(class);

    // Keep the window on top
    XEvent e;
    memset(&e, 0, sizeof(e));
    e.xclient.type = ClientMessage;
    e.xclient.message_type = XInternAtom(display, "_NET_WM_STATE", False);
    e.xclient.display = display;
    e.xclient.window = window;
    e.xclient.format = 32;
    e.xclient.data.l[0] = 1;
    e.xclient.data.l[1] = XInternAtom(display, "_NET_WM_STATE_STAYS_ON_TOP", False);
    XSendEvent(display, XRootWindow(display, screen), False, SubstructureRedirectMask, &e);

    XRaiseWindow(display, window);
    XFlush(display);

    // Prepare to draw on this window
    XGCValues values = { .graphics_exposures = False };
    unsigned long valuemask = 0;
    GC gc = XCreateGC(display, window, valuemask, &values);

    Colormap colormap = DefaultColormap(display, screen);
    XColor color;
    XAllocNamedColor(display, colormap, color_name, &color, &color);
    XSetForeground(display, gc, color.pixel);
    XSetLineAttributes(display, gc, line_width, LineSolid, CapButt, JoinBevel);

    // Draw the circles
    for (int i=1; i<=size; i+=step) { 
        XDrawArc(display, window, gc,
            size/2 - i/2, size/2 - i/2,   // x, y position
            i, i,                         // Size
            0, 360 * 64);                 // Make it a full circle

        XSync(display, False);
        usleep(speed * 100);
    }
    XFreeGC(display, gc);
    XCloseDisplay(display);
}


/*
 *  The MIT License (MIT)
 * 
 *  Copyright © 2015 Martin Tournoij
 * 
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to
 *  deal in the Software without restriction, including without limitation the
 *  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 *  sell copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 * 
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 * 
 *  The software is provided "as is", without warranty of any kind, express or
 *  implied, including but not limited to the warranties of merchantability,
 *  fitness for a particular purpose and noninfringement. In no event shall the
 *  authors or copyright holders be liable for any claim, damages or other
 *  liability, whether in an action of contract, tort or otherwise, arising
 *  from, out of or in connection with the software or the use or other dealings
 *  in the software.
 */

どのように簡単にそれがにこれを回すことであろう形の窓付きのマウスイベントが通過するために真ん中に穴?私はあなたの例をOPが探しているもののようなものに変えようとしましたが、xlibの経験がなかったので、私は絶望的に失われました
。– gandalf3

FTR:Ubuntuでコンパイルする方法:askubuntu.com/q/801252/31300
Grzegorz Wierzowiecki

@ gandalf3ほぼ1年後、私はついにそれを実装することにたどり着きました:-)上記のスニペットを変更せず、そのシンプルさを維持できるようにしました
マーティントゥルノイ

@Carpetsmokerは、まるで魅力のように機能します!これに感謝します:)今、マウスを追跡するために位置を更新します
。.-gandalf3

1
アプリケーションは円を表示してから@AquariusPowerを終了するため、これは予想される動作です。これを使用する方法は、キーの組み合わせをマップして開始することです。この-fオプションは、実行中にマウスカーソルに追従することを意味しますが、実際にはその基本概念を変更しません(これはすべてのウィンドウマネージャーと互換性がないため、オプションです)。
マーティントゥルノイ

6

以下はおそらくあなたのために働くでしょう:

#!/bin/sh
unset X Y; sleep 1
eval "$(xdotool getmouselocation -shell 2>/dev/null)"
for n in X Y; do  : "$(($n-=$n>25?25:$n))"; done
xwd -root -silent |
xv -    -crop "$X" "$Y" 50 50 \
        -geometry "50x50+$X+$Y" \
        -nodecor -viewonly -rv -quit

これは3つのユーティリティに依存しxvxwdxdotool。最初の2つは非常に一般的なXユーティリティであり、3つ目は既にお持ちであることを確信しています。

sleep1秒後にxdotool、マウスの現在の座標を次の-shellような評価しやすい形式で標準出力に書き込みます。

X=[num]
Y=[num]
windowID=[num]

evalセットシェル従って変数、forのそれぞれからすぐツー・表示する画像の大きさのループ減算半分$X$Yの値または、いずれかの値が25未満であれば、それらを0に設定します。

xwdルートウィンドウをにパイプでダンプしますxv。これは、マウスの位置を50x50の画像サイズに切り取り、現在のマウスカーソルの下に、ウィンドウマネージャーの装飾がない小さなウィンドウに画像のネガを表示します。

最終結果は次のようになります。

Findmouse

...マウスカーソルがスクリーンショットに表示されないと思いますが。でも安心してください。写真を撮ったとき、白い箱のすぐ上にありました。

シェル関数としてどのように作成し、バックグラウンド化したかを画像で確認できます。それは主にそのためですsleep- RETURNすでに下にいる場合はキーを押すと端末がスクロールし、端末がスクロールするxwd前に画面の画像を取得するのに十分な速さでした-これは私のオフセットです画像で少し否定的で、私はそれが好きではなかった。

とにかく、とスイッチのxv両方で実行されるため、マウスボタンがクリックされるかキーボードキーが押されるとすぐに消えますが、どちらかを行うまで残ります。-viewonly-quit

間違いなく、あなたはもっと精巧なことを単独で、ImageMagickまたはxv単独で行うこともできますが、私はマウスカーソルの下に小さなネガティブボックスを作成しました。あなたは見つけることができるxvここにドキュメントやドキュメントのためxwdではman xwd


1
これは、私のディストリビューション(debian)が提供していないという事実を除いて、良さそうxvです。可能であればxv、自分でコンパイルするのを避けapt、パッケージ管理を処理したいと思います。
-deshtop

1
@deshtop-必要に応じてここにレポがあります。ImageMagick displayユーティリティを使用して同様のことを行うこともできます。そしてもちろん、常にありfehます。それをfeh書いた時点ではインストールしていなかったので、一度か二度試しましたが、display窓枠付きの枠なしで開く方法を簡単に理解できませんでした。
mikeserv

リポジトリに感謝しますが、非公式リポジトリには少し慎重です。ImageMagickを使用できるかどうかを確認します
-deshtop

1
@deshtop-おそらくできます。少なくとも、これが起動するウィンドウを装飾しxmonad ないように構成することができますdisplay-または、そのように起動displayして装飾を削除し、アイコン化しないでください -iconicxdotool
mikeserv

これは本当に面白いように聞こえますxvが、ubuntu 14.04(すべての依存関係が提供されたにもかかわらずコンパイルされませんでした)には行かないようでdisplay、大きなウィンドウを開いてfehいます。 (現在のパス)写真を探している、面白い.. heheはカタログ作成者です。
アクエリアスパワー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.