ไฮไลต์ตำแหน่งเมาส์ปัจจุบัน


18

ฉันใช้การตั้งค่าหน้าจอสองหน้าจอและปิดการใช้งาน trackpad เป็นส่วนใหญ่ (ซึ่งรวมถึงการซ่อน mousepointer) เมื่อฉันเปิดใช้งานแทร็คแพดอีกครั้ง (และแสดงตัวชี้เมาส์อีกครั้ง) ฉันหลงทางว่าตัวชี้เคยอยู่ที่ไหนมาก่อน

ฉันกำลังมองหาเครื่องมือเพื่อเน้นตำแหน่งเมาส์ปัจจุบัน (เช่นวงกลม) เป็นการดีที่นี่จะเป็นคำสั่งเดียวที่กระพริบวงกลมเป็นระยะเวลาสั้น ๆ

ฉันทราบว่า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 เกือบหนึ่งปีต่อมาในที่สุดผมก็มีการดำเนินการไปรอบ ๆ ที่ว่า :-) ผมไม่ได้แก้ไขข้อมูลดังกล่าวข้างต้นดังนั้นจึงสามารถรักษาความเรียบง่ายของผมปรับเปลี่ยนเฉพาะรุ่นที่github.com/Carpetsmoker/find-cursor
Martin Tournoij

@Carpetsmoker ทำงานเหมือนมีเสน่ห์ยอดเยี่ยม! ขอบคุณสำหรับสิ่งนี้ :) ทีนี้ให้มันอัปเดตตำแหน่งเพื่อติดตามเมาส์ ..
gandalf3

1
แอปพลิเคชันแสดงวงกลมแล้วออกจาก @AquariusPower ดังนั้นนั่นเป็นพฤติกรรมที่คาดหวัง วิธีใช้งานคือการจับคู่คีย์ผสมเพื่อเริ่มต้น -fตัวเลือกหมายความว่ามันจะเป็นไปตามเคอร์เซอร์เมาส์ไปรอบ ๆในขณะที่ทำงานแต่ไม่ได้จริงเปลี่ยนที่แนวคิดพื้นฐาน (นี้ไม่สามารถใช้ร่วมกับทั้งหมดผู้จัดการหน้าต่างซึ่งเป็นเหตุผลที่มันเป็นตัวเลือก)
Martin Tournoij

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

มันขึ้นอยู่กับสามสาธารณูปโภคxv, และxwd xdotoolสองอันแรกเป็นXสาธารณูปโภคที่พบบ่อยมากและอันที่สามฉันแน่ใจว่าคุณมีอยู่แล้ว

หลังจากผ่านไปsleepหนึ่งวินาทีให้xdotoolเขียนพิกัดปัจจุบันของเมาส์ไปยัง stdout ใน-shellรูปแบบที่เป็นมิตรกับผู้ใช้เช่น:

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

evalกำหนดตัวแปรเปลือกตามและforห่วงหักครึ่งหนึ่งของขนาดภาพเร็ว ๆ นี้เพื่อจะแสดงจากแต่ละ$Xและ$Y's ค่าหรือถ้าค่าอย่างใดอย่างหนึ่งคือน้อยกว่า 25 ชุดให้พวกเขา 0

xwdดัมพ์หน้าต่างรูทบนไพพ์ไปxvที่ซึ่งครอบรอบตำแหน่งเมาส์เป็นขนาดภาพ 50x50 และแสดงค่าลบของภาพภายใต้เคอร์เซอร์เมาส์ปัจจุบันในหน้าต่างเล็ก ๆ น้อย ๆ จะประดับตกแต่งตัวจัดการหน้าต่างใด ๆ

ผลลัพธ์ที่ได้คือสิ่งนี้:

findmouse

... แม้ว่าฉันเดาว่าเคอร์เซอร์เมาส์จะไม่ปรากฏในภาพหน้าจอ แม้ว่าฉันจะมั่นใจได้ว่ามันถูกกว่ากล่องสีขาวตรงนั้นเมื่อฉันถ่ายรูป

คุณสามารถเห็นในภาพว่าฉันเขียนมันเป็นฟังก์ชั่นของเปลือกหอยและทำให้มันเป็นพื้นหลังได้อย่างไร มันเป็นเหตุผลหลักที่มีอยู่sleepในนั้น - กดปุ่มRETURNจะเลื่อนขั้วถ้าคุณอยู่ที่ด้านล่างและxwdเร็วพอที่จะจับภาพของหน้าจอก่อนที่เทอร์มินัลเลื่อน - ซึ่งจะชดเชยของฉัน ลบภาพเล็กน้อยและฉันไม่ชอบมัน

อย่างไรก็ตามเนื่องจากxvทำงานด้วยทั้ง-viewonlyและ-quitสวิตช์มันจะหายไปทันทีที่คลิกเมาส์ปุ่มหรือกดแป้นคีย์บอร์ด - แต่จะยังคงอยู่จนกว่าคุณจะทำเช่นนั้น

ไม่ต้องสงสัยเลยว่าคุณสามารถทำสิ่งต่าง ๆ ที่ซับซ้อนมากขึ้นด้วยImageMagickหรือแม้กระทั่งxvคนเดียวเช่นกัน - แต่ฉันเพิ่งทำกล่องลบเล็ก ๆ น้อย ๆ ใต้เคอร์เซอร์ของเมาส์ คุณสามารถค้นหาxvเอกสารที่นี่และเอกสารสำหรับในxwdman xwd


1
นี้ดูดียกเว้นความจริงที่ว่า distro ของฉัน (เดเบียน) xvไม่ได้ให้ ถ้าเป็นไปได้ฉันต้องการหลีกเลี่ยงการรวบรวมxvด้วยตัวเองและaptจัดการการจัดการแพคเกจ
deshtop

1
@deshtop - นี่คือ repo ถ้าคุณต้องการ คุณสามารถทำสิ่งที่คล้ายกันได้ด้วยdisplayยูทิลิตี้ImageMagick fehและแน่นอนมีอยู่เสมอ ฉันไม่ได้fehติดตั้งในขณะที่เขียนขึ้นและถึงแม้ว่าฉันพยายามหนึ่งครั้งหรือสองครั้งฉันก็ไม่สามารถคิดได้อย่างง่ายดายว่าจะdisplayเปิดอย่างไร
mikeserv

ขอบคุณสำหรับ repo แต่ฉันค่อนข้างระมัดระวังกับที่เก็บของที่ไม่เป็นทางการ ฉันจะดูว่าฉันสามารถใช้ ImageMagick ได้หรือไม่
deshtop

1
@deshtop - คุณน่าจะทำได้ อย่างน้อยที่สุดคุณสามารถกำหนดค่าxmonad ได้ในการตกแต่งdisplayหน้าต่างว่าเรื่องนี้จะเปิดตัว - หรืออื่น ๆ คุณสามารถเปิดdisplayเป็น-iconicแล้วใช้xdotoolที่จะเอาของประดับตกแต่งและuniconify (หรือสิ่งที่เรียกว่า)มัน
mikeserv

นี่ฟังดูน่าสนใจจริงๆ แต่xvดูเหมือนว่าจะไม่ได้ทำใน Ubuntu 14.04 (มันไม่ได้รวบรวมแม้จะมีการจัดเก็บทั้งหมด) และdisplayกำลังเปิดหน้าต่างขนาดใหญ่และฉันก็ไม่รู้ว่าจะใช้งานfehอย่างไรแค่สแกนไฟล์ทั้งหมดในบ้านของฉัน (เส้นทางปัจจุบัน) กำลังมองหารูปภาพตลก ๆ .. ฮิฮิเป็นผู้ดำเนินรายการ
กุมภ์กุมภ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.