1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
|
#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;
uint iq1; /* last input position */
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 */
|