tmouse.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tmouse.c (1750B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <draw.h>
            4 #include <thread.h>
            5 #include <cursor.h>
            6 #include <mouse.h>
            7 
            8 void
            9 moveto(Mousectl *mc, Point pt)
           10 {
           11         _displaymoveto(mc->display, pt);
           12         mc->m.xy = pt;
           13 }
           14 
           15 void
           16 closemouse(Mousectl *mc)
           17 {
           18         if(mc == nil)
           19                 return;
           20 
           21 /*        postnote(PNPROC, mc->pid, "kill"); */
           22 
           23         do; while(nbrecv(mc->c, &mc->m) > 0);
           24         chanfree(mc->c);
           25         chanfree(mc->resizec);
           26         free(mc);
           27 }
           28 
           29 int
           30 readmouse(Mousectl *mc)
           31 {
           32         if(mc->display)
           33                 flushimage(mc->display, 1);
           34         if(recv(mc->c, &mc->m) < 0){
           35                 fprint(2, "readmouse: %r\n");
           36                 return -1;
           37         }
           38         return 0;
           39 }
           40 
           41 static
           42 void
           43 _ioproc(void *arg)
           44 {
           45         int one, resized;
           46         Mouse m;
           47         Mousectl *mc;
           48 
           49         mc = arg;
           50         threadsetname("mouseproc");
           51         memset(&m, 0, sizeof m);
           52         one = 1;
           53         resized = 0;
           54         for(;;){
           55                 if(_displayrdmouse(mc->display, &m, &resized) < 0) {
           56                         if(postnote(PNPROC, getpid(), "hangup") < 0)
           57                                 fprint(2, "postnote: %r\n");
           58                         sleep(10*1000);
           59                         threadexitsall("mouse read error");
           60                 }
           61                 if(resized)
           62                         send(mc->resizec, &one);
           63                 send(mc->c, &m);
           64                 /*
           65                  * mc->m is updated after send so it doesn't have wrong value if we block during send.
           66                  * This means that programs should receive into mc->Mouse (see readmouse() above) if
           67                  * they want full synchrony.
           68                  */
           69                 mc->m = m;
           70         }
           71 }
           72 
           73 Mousectl*
           74 initmouse(char *file, Image *i)
           75 {
           76         Mousectl *mc;
           77 
           78         mc = mallocz(sizeof(Mousectl), 1);
           79         if(i)
           80                 mc->display = i->display;
           81         mc->c = chancreate(sizeof(Mouse), 0);
           82         chansetname(mc->c, "mousec");
           83         mc->resizec = chancreate(sizeof(int), 2);
           84         chansetname(mc->resizec, "resizec");
           85         proccreate(_ioproc, mc, 32*1024);
           86         return mc;
           87 }
           88 
           89 void
           90 setcursor(Mousectl *mc, Cursor *c)
           91 {
           92         _displaycursor(mc->display, c, nil);
           93 }
           94 
           95 void
           96 setcursor2(Mousectl *mc, Cursor *c, Cursor2 *c2)
           97 {
           98         _displaycursor(mc->display, c, c2);
           99 }