250 lines
4.8 KiB
Text
250 lines
4.8 KiB
Text
|
.TH MOUSE 2
|
||
|
.SH NAME
|
||
|
initmouse, readmouse, closemouse, moveto, 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 (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
|
||
|
.SH SOURCE
|
||
|
.B /sys/src/libdraw
|
||
|
.SH SEE ALSO
|
||
|
.IR graphics (2),
|
||
|
.IR draw (2),
|
||
|
.IR event (2),
|
||
|
.IR keyboard (2),
|
||
|
.IR thread (2).
|