TH MOUSE 2
SH NAME
initmouse, readmouse, closemouse, moveto, getrect, drawgetrect, menuhit, setcursor, enter \- mouse control
SH SYNOPSIS
nf
B
#include <u.h>
B
#include <libc.h>
B
#include <draw.h>
B
#include <thread.h>
B
#include <mouse.h>
B
#include <cursor.h>
PP
B
Mousectl        *initmouse(char *file, Image *i)
PP
B
int             readmouse(Mousectl *mc)
PP
B
void            closemouse(Mousectl *mc)
PP
B
void            moveto(Mousectl *mc, Point pt)
PP
B
void            setcursor(Mousectl *mc, Cursor *c)
PP
B
Rectangle       getrect(int but, Mousectl *mc)
PP
B
void            drawgetrect(Rectangle r, int up)
PP
B
int             menuhit(int but, Mousectl *mc, Menu *menu, Screen *scr)
PP
B
int             enter(char *ask, char *buf, int len,
B
                       Mousectl *mc, Keyboardctl *kc, Screen *scr)
fi
SH DESCRIPTION
These functions access and control a mouse in a multi-threaded environment.
They use the message-passing
B Channel
interface in the threads library
(see
IR thread (2));
programs that wish a more event-driven, single-threaded approach should use
IR event (2).
PP
The state of the mouse is recorded in a structure,
BR Mouse ,
defined in
BR <mouse.h> :
IP
EX
ta 6n +\w'Rectangle 'u +\w'buttons;   'u
typedef struct Mouse Mouse;
struct Mouse
{
       int     buttons;        /* bit array: LMR=124 */
       Point   xy;
       ulong   msec;
};
EE
PP
The
B Point
B xy
records the position of the cursor,
B buttons
the state of the buttons (three bits representing, from bit 0 up, the buttons from left to right,
0 if the button is released, 1 if it is pressed),
and
BR msec ,
a millisecond time stamp.
PP
The routine
B initmouse
returns a structure through which one may access the mouse:
IP
EX
typedef struct Mousectl Mousectl;
struct Mousectl
{
       Mouse;
       Channel *c;     /* chan(Mouse)[16] */
       Channel *resizec;       /* chan(int)[2] */

       char    *file;
       int     mfd;            /* to mouse file */
       int     cfd;            /* to cursor file */
       int     pid;            /* of slave proc */
       Image*  image;  /* of associated window/display */
};
EE
PP
The arguments to
I initmouse
are a
I file
naming the device file connected to the mouse and an
I Image
(see
IR draw (2))
on which the mouse will be visible.
Typically the file is
nil,
which requests the default
BR /dev/mouse ;
and the image is the window in which the program is running, held in the variable
B screen
after a call to
IR initdraw .
PP
Once the
B Mousectl
is set up,
mouse motion will be reported by messages of type
B Mouse
sent on the
B Channel
BR Mousectl.c .
Typically, a message will be sent every time a read of
B /dev/mouse
succeeds, which is every time the state of the mouse changes.
PP
When the window is resized, a message is sent on
BR Mousectl.resizec .
The actual value sent may be discarded; the receipt of the message
tells the program that it should call
B getwindow
(see
IR graphics (2))
to reconnect to the window.
PP
I Readmouse
updates the
B Mouse
structure held in the
BR Mousectl ,
blocking if the state has not changed since the last
I readmouse
or message sent on the channel.
It calls
B flushimage
(see
IR graphics (2))
before blocking, so any buffered graphics requests are displayed.
PP
I Closemouse
closes the file descriptors associated with the mouse, kills the slave processes,
and frees the
B Mousectl
structure.
PP
I Moveto
moves the mouse cursor on the display to the position specified by
IR pt .
PP
I Setcursor
sets the image of the cursor to that specified by
IR c .
If
I c
is nil, the cursor is set to the default.
The format of the cursor data is spelled out in
B <cursor.h>
and described in
IR graphics (2).
PP
I Getrect
returns the dimensions of a rectangle swept by the user, using the mouse,
in the manner
IR rio (1)
or
IR sam (1)
uses to create a new window.
The
I but
argument specifies which button the user must press to sweep the window;
any other button press cancels the action.
The returned rectangle is all zeros if the user cancels.
PP
I Getrect
uses successive calls to
I drawgetrect
to maintain the red rectangle showing the sweep-in-progress.
The rectangle to be drawn is specified by
I rc
and the
I up
parameter says whether to draw (1) or erase (0) the rectangle.
PP
I Menuhit
provides a simple menu mechanism.
It uses a
B Menu
structure defined in
BR <mouse.h> :
IP
EX
typedef struct Menu Menu;
struct Menu
{
       char    **item;
       char    *(*gen)(int);
       int     lasthit;
};
EE
PP
IR Menuhit
behaves the same as its namesake
I emenuhit
described in
IR event (2),
with two exceptions.
First, it uses a
B Mousectl
to access the mouse rather than using the event interface;
and second,
it creates the menu as a true window on the
B Screen
I scr
(see
IR window (2)),
permitting the menu to be displayed in parallel with other activities on the display.
If
I scr
is null,
I menuhit
behaves like
IR emenuhit ,
creating backing store for the menu, writing the menu directly on the display, and
restoring the display when the menu is removed.
PP
I Enter
is a multithreded version of the
I eenter
function described in
IR event (2).
Like
I menuhit,
it has a optional
B scr
argument to create a window. Keyboard input is read from the channel in the
B Keyboardctl *kc
argument (see
IR keyboard (2)).
PP
SH SOURCE
B /sys/src/libdraw
SH SEE ALSO
IR graphics (2),
IR draw (2),
IR event (2),
IR keyboard (2),
IR thread (2).