ref: f09a60d8cd60d2ec193b0315bfe0d7fd74b23406
dir: /inc.h/
#include <u.h> #include <libc.h> #include <draw.h> #include <thread.h> #include <keyboard.h> #include <mouse.h> #include <cursor.h> #include <frame.h> #include <fcall.h> #include <9p.h> #include <complete.h> #include <plumb.h> typedef uchar bool; enum { FALSE = 0, TRUE = 1, BIG = 3 }; #define ALT(c, v, t) (Alt){ c, v, t, nil, nil, 0 } #define CTRL(c) ((c)&0x1F) extern Rune *snarf; extern int nsnarf; extern int snarfversion; extern int snarffd; enum { MAXSNARF = 100*1024 }; void putsnarf(void); void getsnarf(void); void setsnarf(char *s, int ns); typedef struct Text Text; struct Text { Frame; Rectangle scrollr, lastsr; Image *i; Rune *r; uint nr; uint maxr; uint org; /* start of Frame's text */ uint q0, q1; /* selection */ uint qh; /* host point, output here */ /* not entirely happy with this in here */ bool rawmode; Rune *raw; int nraw; int posx; }; void xinit(Text *x, Rectangle textr, Rectangle scrollr, Font *ft, Image *b, Image **cols); void xsetrects(Text *x, Rectangle textr, Rectangle scrollr); void xclear(Text *x); void xredraw(Text *x); uint xinsert(Text *x, Rune *r, int n, uint q0); void xfill(Text *x); void xdelete(Text *x, uint q0, uint q1); void xsetselect(Text *x, uint q0, uint q1); void xselect(Text *x, Mousectl *mc); void xscrdraw(Text *x); void xscroll(Text *x, Mousectl *mc, int but); void xscrolln(Text *x, int n); void xtickupdn(Text *x, int d); void xshow(Text *x, uint q0); void xplacetick(Text *x, uint q); void xtype(Text *x, Rune r); int xninput(Text *x); void xaddraw(Text *x, Rune *r, int nr); void xlook(Text *x); void xsnarf(Text *x); void xcut(Text *x); void xpaste(Text *x); void xsend(Text *x); int xplumb(Text *w, char *dir, int maxsize); void freescrtemps(void); enum { // NCOL is defined by libframe, add more after it TITLE = NCOL, LTITLE, TITLEHOLD, LTITLEHOLD, PALETEXT, HOLDTEXT, PALEHOLDTEXT, NumColors }; extern Image *colors[NumColors]; extern Screen *wscreen; extern Mousectl *mctl; extern int scrolling; extern char *startdir; extern int shiftdown; extern int gotscreen; extern int servekbd; extern Cursor whitearrow; extern Cursor *cursor; void setcursoroverride(Cursor *c, int ov); void setcursornormal(Cursor *c); typedef struct RuneConvBuf RuneConvBuf; struct RuneConvBuf { char *buf; int maxbuf; // allocated size int nb; // size int n; // filled }; typedef struct Stringpair Stringpair; struct Stringpair /* rune and nrune or byte and nbyte */ { void *s; int ns; }; typedef struct Mousestate Mousestate; struct Mousestate { Mouse; ulong counter; /* serial no. of mouse event */ }; typedef struct Mousequeue Mousequeue; struct Mousequeue { Mousestate q[16]; int ri; /* read index into queue */ int wi; /* write index */ ulong counter; /* serial no. of last mouse event we received */ ulong lastcounter; /* serial no. of last mouse event sent to client */ int lastb; /* last button state we received */ bool full; /* filled the queue; no more recording until client comes back */ }; typedef struct Kbdqueue Kbdqueue; struct Kbdqueue { char *q[32]; int ri; int wi; bool full; }; enum { Closed, Resized, Moved, Deleted, Refresh, Holdon, Holdoff, Rawon, Rawoff, Wakeup }; typedef struct Window Window; struct Window { Ref; bool deleted; bool hidden; Window *lower; Window *higher; Image *img; int id; char name[32]; int namecount; char *label; bool noborder; Rectangle contrect; int notefd; char *dir; Text text; Rectangle scrollr; Rectangle textr; int holdmode; bool scrolling; bool wctlready; bool wctlopen; Mousectl mc; Mousequeue mq; int mouseopen; int resized; Cursor *cursorp; Cursor cursor; Channel *kbd; Kbdqueue kq; bool consctlopen; bool kbdopen; Channel *gone; /* window gone */ Channel *ctl; /* Wctlmesg */ /* channels to xreqs */ Channel *conswrite; Channel *consread; Channel *kbdread; Channel *mouseread; Channel *wctlread; Channel *complete; }; extern Window *bottomwin, *topwin; extern Window *windows[1000]; // TMP extern int nwindows; extern Window *hidden[1000]; extern int nhidden; extern Window *focused, *cursorwin; void wdecor(Window *w); void wresize(Window *w, Rectangle r); Window *wcreate(Rectangle r, bool hidden, bool scrolling); int wrelease(Window *w); void wsendmsg(Window *w, int type); Window *wfind(int id); Window *wpointto(Point pt); void wsetcursor(Window *w); void wsetlabel(Window *w, char *label); void wsetname(Window *w); void wsetpid(Window *w, int pid, int dolabel); void wmove(Window *w, Point pos); void wraise(Window *w); void wlower(Window *w); void wfocus(Window *w); int whide(Window *w); int wunhide(Window *w); void wsethold(Window *w, int hold); void wmovemouse(Window *w, Point pt); void wtype(Window *w, Rune r); int wincmd(Window *w, int pid, char *dir, char **argv); typedef struct Wctlcmd Wctlcmd; struct Wctlcmd { int cmd; Rectangle r; char *args; int pid; int id; bool hidden; bool scrolling; char *dir; char *error; }; Wctlcmd parsewctl(char *s, Rectangle r); char *writewctl(Window *w, char *data); enum{ Tapon = 'b', Tapoff = 'e', Tapfocus = 'z', }; extern Channel *ctltap; /* open/close */ extern Channel *resptap; /* open/close err */ extern Channel *fromtap; /* input from kbd tap program to window */ extern Channel *totap; /* our keyboard input to tap program */ extern Channel *wintap; /* tell the tapthread which Window to send to */ Rectangle newrect(void); extern Srv fsys; void fs(void); int fsmount(int id); #define runemalloc(n) malloc((n)*sizeof(Rune)) #define runerealloc(a, n) realloc(a, (n)*sizeof(Rune)) #define runemove(a, b, n) memmove(a, b, (n)*sizeof(Rune)) #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) void panic(char *s); void *emalloc(ulong size); void *erealloc(void *p, ulong size); char *estrdup(char *s); int handlebs(Stringpair *pair); void cnvsize(RuneConvBuf *cnv, int nb); int r2bfill(RuneConvBuf *cnv, Rune *rp, int nr); void r2bfinish(RuneConvBuf *cnv, Stringpair *pair); Stringpair b2r(RuneConvBuf *cnv); typedef struct Timer Timer; struct Timer { int dt; int cancel; Channel *c; /* chan(int) */ Timer *next; }; void timerinit(void); Timer *timerstart(int dt); void timerstop(Timer *t); void timercancel(Timer *t);