.TH MOUSE 3
.SH NAME
initmouse, readmouse, closemouse, moveto, cursorswitch, getrect, drawgetrect, menuhit, setcursor \- 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
int		atomouse();
.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)
.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 (3));
programs that wish a more event-driven, single-threaded approach should use
.IR event (3).
.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 (3))
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 (3))
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 (3))
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 (3).
.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 (3),
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 (3)),
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
.SH SOURCE
.B \*9/src/libdraw
.SH SEE ALSO
.IR graphics (3),
.IR draw (3),
.IR event (3),
.IR keyboard (3),
.IR thread (3).
