Sorot posisi mouse saat ini

18

Saya menjalankan pengaturan layar ganda dan trackpad saya dinonaktifkan sebagian besar waktu (yang termasuk menyembunyikan mousepointer). Ketika saya mengaktifkan kembali trackpad (dan menampilkan pointer mouse lagi), saya kehilangan track di mana pointer itu sebelumnya.

Saya mencari alat untuk menyorot posisi mouse saat ini (misalnya dengan lingkaran). Idealnya ini adalah perintah tunggal yang mem-flash lingkaran untuk waktu yang singkat.

Saya sadar bahwa xdotooldapat menemukan posisi saat ini, namun tidak ada penyorotan; juga, key-montidak menyediakan fungsi ini. Saya juga membaca yang cairo composition managermenyediakan fungsionalitas seperti itu, namun saya bertanya-tanya apakah ada alat yang lebih kecil untuk mencapai ini.

Jika tidak ada alat seperti itu: Apa cara termudah untuk menampilkan lingkaran sedemikian di sekitar kursor menggunakan data yang disediakan oleh xdotool getmouselocation ?

Dalam hal ini relevan: Saya tidak menggunakan lingkungan desktop, hanya xmonadmanajer jendela.

deshtop
sumber

Jawaban:

18

Sementara saya suka jawaban Mikeserv untuk kepintaran, ada kekurangannya yaitu akan membuat jendela yang "mencuri" fokus dan harus diklik. Saya juga merasa hanya perlu sedikit terlalu lama untuk memulai: sekitar 0,2 hingga 0,3 detik, yang hanya sedikit terlalu lambat untuk pengalaman "mulus".

Saya akhirnya berhasil menggali ke dalam XLib, dan bersama-sama memecahkan program C dasar untuk melakukan ini. Efek visual kira-kira mirip dengan apa yang dimiliki Windows (XP) (dari memori). Itu tidak terlalu indah, tetapi bekerja ;-) Ini tidak "mencuri" fokus, dimulai hampir seketika, dan Anda dapat mengklik "melalui" itu.

masukkan deskripsi gambar di sini

Anda dapat mengompilasinya dengan cc find-cursor.c -o find-cursor -lX11 -lXext -lXfixes. Ada beberapa variabel di bagian atas yang dapat Anda atur untuk mengubah ukuran, kecepatan, dll.

Saya merilis ini sebagai program di http://code.arp242.net/find-cursor . Saya sarankan Anda menggunakan versi ini, karena memiliki beberapa perbaikan yang tidak dimiliki skrip di bawah ini (seperti argumen commandline dan kemampuan untuk mengklik "melalui" jendela). Saya telah meninggalkan di bawah apa adanya karena kesederhanaannya.

/*
 * http://code.arp242.net/find-cursor
 * Copyright © 2015 Martin Tournoij <[email protected]>
 * 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.
 */
Martin Tournoij
sumber
Betapa mudahnya untuk mengubah ini menjadi jendela berbentuk dengan lubang di tengah untuk acara tikus untuk melalui? Saya mencoba untuk mengubah contoh Anda menjadi sesuatu seperti apa yang dicari OP di sini , tetapi tidak memiliki pengalaman dengan xlib, saya akhirnya kehilangan harapan ..
gandalf3
FTR: Cara mengompilasinya di Ubuntu: askubuntu.com/q/801252/31300
Grzegorz Wierzowiecki
@ gandalf3 Hampir setahun kemudian saya akhirnya berhasil mengimplementasikannya :-) Saya tidak memodifikasi cuplikan di atas sehingga dapat mempertahankan kesederhanaannya, saya hanya memodifikasi versi di github.com/Carpetsmoker/find-cursor .
Martin Tournoij
@Carpetsmoker Bekerja seperti pesona, brilian! Terima kasih untuk ini :) Sekarang perbarui posisi untuk mengikuti mouse ..
gandalf3
1
Aplikasi menunjukkan lingkaran dan kemudian keluar dari @AquariusPower, jadi itulah perilaku yang diharapkan. Cara menggunakannya adalah memetakan kombinasi tombol untuk memulainya. The -fberarti pilihan itu akan mengikuti kursor mouse di sekitar saat menjalankan , tetapi tidak benar-benar mengubah konsep dasar (ini tidak kompatibel dengan semua window manager, yang mengapa itu adalah pilihan).
Martin Tournoij
6

Berikut ini mungkin akan bekerja untuk Anda:

#!/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

Hal ini tergantung pada tiga utilitas xv, xwddan xdotool. Dua yang pertama adalah Xutilitas yang sangat umum , dan yang ketiga saya cukup yakin Anda sudah memilikinya.

Setelah sleepsatu detik, xdotooltulis koordinat mouse saat ini ke stdout dalam -shellformat ramah-eval seperti:

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

evalmenetapkan variabel shell sesuai, dan forlingkaran mengurangi setengah dari ukuran segera-to-be-gambar yang ditampilkan ini dari masing-masing $Xdan $Ynilai-nilai 's atau, jika salah nilai kurang dari 25, set mereka untuk 0.

xwdmembuang jendela root ke atas pipa xv, yang memotong di sekitar lokasi mouse ke ukuran gambar 50x50 dan menampilkan negatif gambar di bawah kursor mouse saat ini di jendela kecil tanpa dekorasi jendela.

Hasil akhirnya adalah seperti ini:

findmouse

... meskipun saya kira kursor mouse saya tidak muncul di tangkapan layar. Tapi yakinlah, itu tepat di atas kotak putih di sana ketika saya mengambil gambar.

Anda dapat melihat dalam gambar bagaimana saya juga menulisnya sebagai fungsi shell dan melatar belakanginya. Ini terutama karena alasan itu ada sleepdi sana sama sekali - menekan RETURNtombol akan menggulir terminal jika Anda sudah di bawah, dan xwdcukup cepat untuk mengambil gambar layarnya sebelum terminal digulir - yang akan mengimbangi saya negatif dalam gambar sedikit dan saya tidak menyukainya.

Bagaimanapun, karena xvdijalankan dengan kedua sakelar -viewonlydan -quitsakelar, ia akan menghilang segera setelah tombol mouse diklik atau tombol keyboard ditekan - tetapi akan tetap ada sampai Anda melakukannya.

Tidak diragukan lagi Anda bisa melakukan banyak hal rumit dengan ImageMagickatau bahkan xvsendirian juga - tapi saya hanya melakukan sedikit kotak negatif di bawah kursor mouse. Anda dapat menemukan xvdokumen di sini dan dokumen untuk xwddi man xwd.

mikeserv
sumber
1
Ini terlihat bagus, kecuali kenyataan bahwa distro saya (debian) tidak menyediakan xv. Jika mungkin saya ingin menghindari kompilasi xvsendiri dan biarkan aptmenangani manajemen paket.
Deshtop
1
@ dektop - inilah repo, jika Anda menginginkannya. Anda juga mungkin dapat melakukan hal serupa dengan displayutilitas ImageMagick . Dan tentu saja selalu ada feh. Saya tidak fehmenginstal pada saat menulis itu, dan, meskipun saya mencoba sekali atau dua kali, saya tidak dapat dengan mudah mencari cara untuk displaymembuka tanpa batas jendela yang rusak.
mikeserv
Terima kasih untuk repo, namun saya agak berhati-hati dengan repositori tidak resmi. Saya akan melihat apakah saya dapat menggunakan ImageMagick
deshtop
1
@toptop - Anda mungkin bisa. Paling tidak Anda dapat mengonfigurasi untuk xmonad tidak menghiasi displayjendela yang akan diluncurkan ini - atau Anda dapat meluncurkan displayseperti yang -iconicdigunakan xdotooluntuk menghapus dekorasi dan menghapuskan (atau apa pun namanya) itu.
mikeserv
ini kedengarannya sangat menarik, tetapi xvsepertinya no go di ubuntu 14.04 (tidak dikompilasi meskipun semua deps disediakan), dan displaymembuka jendela besar, dan saya belum tahu bagaimana menggunakannya fehhanya memindai semua file di rumah saya (jalan saat ini) mencari gambar, lucu .. hehe adalah seorang cataloguer.
Aquarius Power