io.c - sam - An updated version of the sam text editor.
 (HTM) git clone git://vernunftzentrum.de/sam.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       io.c (3057B)
       ---
            1 /* Copyright (c) 1998 Lucent Technologies - All rights reserved. */
            2 #include <u.h>
            3 #include <libg.h>
            4 #include <frame.h>
            5 #include "flayer.h"
            6 #include "samterm.h"
            7 
            8 int cursorfd;
            9 int input;
           10 int got;
           11 int block;
           12 Keystroke   keystroke;
           13 int reshaped;
           14 uint8_t   *hostp;
           15 uint8_t   *hoststop;
           16 uint8_t   *externbase;
           17 uint8_t   *externp;
           18 uint8_t   *externstop;
           19 void    panic(char*);
           20 
           21 void
           22 initio(void){
           23     extern int exfd;
           24 
           25     einit(Emouse|Ekeyboard);
           26     estart(Ehost, 0, 0, false);
           27     if (exfd >= 0)
           28         estart(Eextern, exfd, 8192, true);
           29 }
           30 
           31 void
           32 frgetmouse(void)
           33 {
           34     mouse = emouse();
           35 }
           36 
           37 void
           38 mouseunblock(void)
           39 {
           40     got &= ~Emouse;
           41 }
           42 
           43 void
           44 kbdblock(void)
           45 {       /* ca suffit */
           46     block = Ekeyboard|Eextern;
           47 }
           48 
           49 int
           50 button(int but)
           51 {
           52     frgetmouse();
           53     return mouse.buttons&(1<<(but-1));
           54 }
           55 
           56 void
           57 externload(Event *e)
           58 {
           59     externbase = malloc(e->n);
           60     if(externbase == 0)
           61         return;
           62     memmove(externbase, e->data, e->n);
           63     externp = externbase;
           64     externstop = externbase + e->n;
           65     got |= Eextern;
           66 }
           67 
           68 int
           69 waitforio(void)
           70 {
           71     uint64_t type;
           72     static Event e;
           73 
           74     if(got & ~block)
           75         return got & ~block;
           76     type = eread(~(got|block), &e);
           77     switch(type){
           78     case Ehost:
           79         hostp = e.data;
           80         hoststop = hostp + e.n;
           81         block = 0;
           82         break;
           83     case Eextern:
           84         externload(&e);
           85         break;
           86     case Ekeyboard:
           87         keystroke = e.keystroke;
           88         break;
           89     case Emouse:
           90         mouse = e.mouse;
           91         break;
           92     }
           93     got |= type;
           94     return got; 
           95 }
           96 
           97 int
           98 rcvchar(void)
           99 {
          100     int c;
          101 
          102     if(!(got & Ehost))
          103         return -1;
          104     c = *hostp++;
          105     if(hostp == hoststop)
          106         got &= ~Ehost;
          107     return c;
          108 }
          109 
          110 char*
          111 rcvstring(void)
          112 {
          113     *hoststop = 0;
          114     got &= ~Ehost;
          115     return (char*)hostp;
          116 }
          117 
          118 int
          119 getch(void)
          120 {
          121     int c;
          122 
          123     while((c = rcvchar()) == -1){
          124         block = ~Ehost;
          125         waitforio();
          126         block = 0;
          127     }
          128     return c;
          129 }
          130 
          131 int
          132 externchar(void)
          133 {
          134     wchar_t r;
          135 
          136     loop:
          137     if(got & (Eextern & ~block)){
          138         externp += chartorune(&r, (char*)externp);
          139         if(externp >= externstop){
          140             got &= ~Eextern;
          141             free(externbase);
          142         }
          143         if(r == 0)
          144             goto loop;
          145         return r;
          146     }
          147     return -1;
          148 }
          149 
          150 Keystroke
          151 qpeekc(void)
          152 {
          153     return keystroke;
          154 }
          155 
          156 Keystroke
          157 kbdchar(void)
          158 {
          159     Keystroke k = {0};
          160     static Event e;
          161 
          162     k.c = externchar();
          163     if(k.c > 0)
          164         return k;
          165     if(got & Ekeyboard){
          166         k = keystroke;
          167         memset(&keystroke, 0, sizeof(keystroke));
          168         got &= ~Ekeyboard;
          169         return k;
          170     }
          171     while(ecanread(Eextern)){
          172         eread(Eextern, &e);
          173         externload(&e);
          174         k.c = externchar();
          175         if(k.c > 0)
          176             return k;
          177     }
          178     if(!ecankbd()){
          179         k.c = -1;
          180         return k;
          181     }
          182     return ekbd();
          183 }
          184 
          185 void
          186 ereshaped(Rectangle r)
          187 {
          188     reshaped = 1;
          189 }
          190 
          191 int
          192 RESHAPED(void)
          193 {
          194     if(reshaped){
          195         screen.r = bscreenrect(&screen.clipr);
          196         reshaped = 0;
          197         return 1;
          198     }
          199     return 0;
          200 }
          201 
          202 void
          203 mouseexit(void)
          204 {
          205     exit(EXIT_SUCCESS);
          206 }