Captain has asked for the wisdom of the Perl Monks concerning the following question:

I am looking to write a bit of perl that I can run in the background to interface with a GPI trigger for broadcast television gear.
Essentially, I need a script that will sit and listen for a mouse click from /dev/ttyS0 and then act appropriately.

I don't need to listen for any other mouse data or generate any kind of GUI stuff, just detect the click.

As a bonus, if the mouse button is held down, it would be nice to be able to detect that it's being held down, and also detect when the button is released.

I've seen a fair number of pointers to things like Perl/tk in reference to mouse detection within a GUI framework, but I am hoping there may be a bare-bones way to do it with less overhead. I've also looked at Device::SerialPort but I didn't see anything that I thought I could apply to listening for a mouse.

Any clever thoughts would be greatly appreciated.
Any dull thoughts would be welcome, too.

Replies are listed 'Best First'.
Re: Detecting Mouse Clicks (GPI Trigger)
by cheshirecat (Sexton) on Jan 04, 2002 at 05:33 UTC
    If you're running on Linux, I would take a look at GPM
    It's a console based program that can handle lots of different types of mice

    I've used it to detect the movement of a mousewheel and pipe text commands to an MP3 player
    Let me know if you want to go into more detail

    cheshire cat :)

Re: Detecting Mouse Clicks (GPI Trigger)
by derby (Abbot) on Jan 04, 2002 at 19:46 UTC
    Captain,

    In addition to GPM, if your interested in doing some c coding (and you're on linux), you could wrap parts of svgalib with inline. There is a Linux::Svgalib on CPAN but I don't think the author encapsulated the mouse api.

    update: just for fun here's a simple inline script that uses svgalib to capture and report on mouse clicks. caveat hackour - your mouse inits may be different, you need to run as root, need to run on console (may drastically interfere with X), etc, etc, etc ...

    #!/usr/bin/perl use Inline C => DATA => LIBS => '-lvga'; mouse_start(); mouse_loop(); __END__ __C__ #include <vga.h> #include <vgamouse.h> int mouse_start( ) { vga_init(); vga_setmousesupport(1); mouse_init("/dev/mouse", MOUSE_IMPS2, MOUSE_DEFAULTSAMPLERATE); } int mouse_loop( ) { int button, leftpressed, middlepressed, rightpressed; leftpressed = middlepressed = rightpressed = 0; for (;;) { mouse_update(); button = mouse_getbutton(); if (button & MOUSE_LEFTBUTTON) { if (!leftpressed) { printf( "LEFT PRESSED!\n" ); leftpressed = 1; } } else leftpressed = 0; if (button & MOUSE_MIDDLEBUTTON) { if (!middlepressed) { printf( "MIDDLE PRESSED!\n" ); middlepressed = 1; } } else middlepressed = 0; if (button & MOUSE_RIGHTBUTTON) { if (!rightpressed) { printf( "RIGHT PRESSED!\n" ); rightpressed = 1; } } else rightpressed = 0; } }

    -derby