#define STACK 32768
#undef Borderwidth
#define Borderwidth 0
#undef TRUE /* OS X */
#undef FALSE
typedef struct Consreadmesg Consreadmesg;
typedef struct Conswritemesg Conswritemesg;
typedef struct Stringpair Stringpair;
typedef struct Dirtab Dirtab;
typedef struct Mouseinfo Mouseinfo;
typedef struct Mousereadmesg Mousereadmesg;
typedef struct Mousestate Mousestate;
typedef struct Timer Timer;
typedef struct Wctlmesg Wctlmesg;
typedef struct Window Window;
enum
{
Selborder = 0, /* border of selected window */
Unselborder = 0, /* border of unselected window */
Scrollwid = 12, /* width of scroll bar */
Scrollgap = 4, /* gap right of scroll bar */
BIG = 3, /* factor by which window dimension can exceed screen */
TRUE = 1,
FALSE = 0,
};
enum
{
Kscrolloneup = KF|0x20,
Kscrollonedown = KF|0x21,
};
enum /* control messages */
{
Wakeup,
Reshaped,
Moved,
Refresh,
Movemouse,
Rawon,
Rawoff,
Holdon,
Holdoff,
Deleted,
Exited,
};
struct Wctlmesg
{
int type;
Rectangle r;
Image *image;
};
struct Conswritemesg
{
Channel *cw; /* chan(Stringpair) */
};
struct Consreadmesg
{
Channel *c1; /* chan(tuple(char*, int) == Stringpair) */
Channel *c2; /* chan(tuple(char*, int) == Stringpair) */
};
struct Mousereadmesg
{
Channel *cm; /* chan(Mouse) */
};
struct Stringpair /* rune and nrune or byte and nbyte */
{
void *s;
int ns;
};
struct Mousestate
{
Mouse m;
ulong counter; /* serial no. of mouse event */
};
struct Mouseinfo
{
Mousestate queue[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 */
uchar qfull; /* filled the queue; no more recording until client comes back */
};
struct Window
{
Ref ref;
QLock lk;
Frame f;
Image *i;
Mousectl mc;
Mouseinfo mouse;
Channel *ck; /* chan(Rune[10]) */
Channel *cctl; /* chan(Wctlmesg)[20] */
Channel *conswrite; /* chan(Conswritemesg) */
Channel *consread; /* chan(Consreadmesg) */
Channel *mouseread; /* chan(Mousereadmesg) */
Channel *wctlread; /* chan(Consreadmesg) */
uint nr; /* number of runes in window */
uint maxr; /* number of runes allocated in r */
Rune *r;
uint nraw;
Rune *raw;
uint org;
uint q0;
uint q1;
uint qh;
int id;
char name[32];
uint namecount;
Rectangle scrollr;
/*
* Rio once used originwindow, so screenr could be different from i->r.
* Now they're always the same but the code doesn't assume so.
*/
Rectangle screenr; /* screen coordinates of window */
int resized;
int wctlready;
Rectangle lastsr;
int topped;
int notefd;
uchar scrolling;
Cursor cursor;
Cursor *cursorp;
uchar holding;
uchar rawing;
uchar ctlopen;
uchar wctlopen;
uchar deleted;
uchar mouseopen;
char *label;
int pid;
char *dir;
};
int winborder(Window*, Point);
void winctl(void*);
void winshell(void*);
Window* wlookid(int);
Window* wmk(Image*, Mousectl*, Channel*, Channel*, int);
Window* wpointto(Point);
Window* wtop(Point);
void wtopme(Window*);
void wbottomme(Window*);
char* wcontents(Window*, int*);
int wbswidth(Window*, Rune);
int wclickmatch(Window*, int, int, int, uint*);
int wclose(Window*);
int wctlmesg(Window*, int, Rectangle, Image*);
int wctlmesg(Window*, int, Rectangle, Image*);
uint wbacknl(Window*, uint, uint);
uint winsert(Window*, Rune*, int, uint);
void waddraw(Window*, Rune*, int);
void wborder(Window*, int);
void wclosewin(Window*);
void wcurrent(Window*);
void wcut(Window*);
void wdelete(Window*, uint, uint);
void wdoubleclick(Window*, uint*, uint*);
void wfill(Window*);
void wframescroll(Window*, int);
void wkeyctl(Window*, Rune);
void wmousectl(Window*);
void wmovemouse(Window*, Point);
void wpaste(Window*);
void wplumb(Window*);
void wrefresh(Window*, Rectangle);
void wrepaint(Window*);
void wresize(Window*, Image*, int);
void wscrdraw(Window*);
void wscroll(Window*, int);
void wselect(Window*);
void wsendctlmesg(Window*, int, Rectangle, Image*);
void wsetcursor(Window*, int);
void wsetname(Window*);
void wsetorigin(Window*, uint, int);
void wsetpid(Window*, int, int);
void wsetselect(Window*, uint, uint);
void wshow(Window*, uint);
void wsnarf(Window*);
void wscrsleep(Window*, uint);
void wsetcols(Window*);
void deletetimeoutproc(void*);
struct Timer
{
int dt;
int cancel;
Channel *c; /* chan(int) */
Timer *next;
};
#ifndef Extern
#define Extern extern
#endif
Extern Font *font;
Extern Mousectl *mousectl;
Extern Mouse *mouse;
Extern Keyboardctl *keyboardctl;
Extern Display *display;
Extern Image *view;
Extern Screen *wscreen;
Extern Cursor boxcursor;
Extern Cursor crosscursor;
Extern Cursor sightcursor;
Extern Cursor whitearrow;
Extern Cursor query;
Extern Cursor *corners[9];
Extern Image *background;
Extern Image *lightgrey;
Extern Image *red;
Extern Window **window;
Extern Window *wkeyboard; /* window of simulated keyboard */
Extern int nwindow;
Extern int snarffd;
Extern Window *input;
Extern QLock all; /* BUG */
Extern Window *hidden[100];
Extern int nhidden;
Extern int nsnarf;
Extern Rune* snarf;
Extern int scrolling;
Extern int maxtab;
Extern Channel* winclosechan;
Extern Channel* deletechan;
Extern char *startdir;
Extern int sweeping;
Extern int wctlfd;
Extern int errorshouldabort;
Extern int menuing; /* menu action is pending; waiting for window to be indicated */
Extern int snarfversion; /* updated each time it is written */
Extern int messagesize; /* negotiated in 9P version setup */
Extern int nlook; /* look buffer */
Extern Rune *look;
|