90 lines
1.5 KiB
C
90 lines
1.5 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include <draw.h>
|
|
#include <thread.h>
|
|
#include <cursor.h>
|
|
#include <mouse.h>
|
|
|
|
void
|
|
moveto(Mousectl *mc, Point pt)
|
|
{
|
|
_displaymoveto(mc->display, pt);
|
|
mc->m.xy = pt;
|
|
}
|
|
|
|
void
|
|
closemouse(Mousectl *mc)
|
|
{
|
|
if(mc == nil)
|
|
return;
|
|
|
|
/* postnote(PNPROC, mc->pid, "kill"); */
|
|
|
|
do; while(nbrecv(mc->c, &mc->m) > 0);
|
|
chanfree(mc->c);
|
|
chanfree(mc->resizec);
|
|
free(mc);
|
|
}
|
|
|
|
int
|
|
readmouse(Mousectl *mc)
|
|
{
|
|
if(mc->display)
|
|
flushimage(mc->display, 1);
|
|
if(recv(mc->c, &mc->m) < 0){
|
|
fprint(2, "readmouse: %r\n");
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static
|
|
void
|
|
_ioproc(void *arg)
|
|
{
|
|
int one, resized;
|
|
Mouse m;
|
|
Mousectl *mc;
|
|
|
|
mc = arg;
|
|
threadsetname("mouseproc");
|
|
memset(&m, 0, sizeof m);
|
|
one = 1;
|
|
resized = 0;
|
|
for(;;){
|
|
if(_displayrdmouse(mc->display, &m, &resized) < 0)
|
|
threadexitsall("mouse read error");
|
|
if(resized)
|
|
send(mc->resizec, &one);
|
|
send(mc->c, &m);
|
|
/*
|
|
* mc->m is updated after send so it doesn't have wrong value if we block during send.
|
|
* This means that programs should receive into mc->Mouse (see readmouse() above) if
|
|
* they want full synchrony.
|
|
*/
|
|
mc->m = m;
|
|
}
|
|
}
|
|
|
|
Mousectl*
|
|
initmouse(char *file, Image *i)
|
|
{
|
|
Mousectl *mc;
|
|
|
|
mc = mallocz(sizeof(Mousectl), 1);
|
|
if(i)
|
|
mc->display = i->display;
|
|
mc->c = chancreate(sizeof(Mouse), 0);
|
|
chansetname(mc->c, "mousec");
|
|
mc->resizec = chancreate(sizeof(int), 2);
|
|
chansetname(mc->resizec, "resizec");
|
|
proccreate(_ioproc, mc, 32*1024);
|
|
return mc;
|
|
}
|
|
|
|
void
|
|
setcursor(Mousectl *mc, Cursor *c)
|
|
{
|
|
_displaycursor(mc->display, c);
|
|
}
|
|
|