tmouse.c - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
tmouse.c (1750B)
---
     1 #include 
     2 #include 
     3 #include 
     4 #include 
     5 #include 
     6 #include 
     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 }