1 #define STACK 32768
2 #undef Borderwidth
3 #define Borderwidth 0
4 
5 #undef TRUE	/* OS X */
6 #undef FALSE
7 
8 typedef	struct	Consreadmesg Consreadmesg;
9 typedef	struct	Conswritemesg Conswritemesg;
10 typedef	struct	Stringpair Stringpair;
11 typedef	struct	Dirtab Dirtab;
12 typedef	struct	Mouseinfo	Mouseinfo;
13 typedef	struct	Mousereadmesg Mousereadmesg;
14 typedef	struct	Mousestate	Mousestate;
15 typedef	struct	Timer Timer;
16 typedef	struct	Wctlmesg Wctlmesg;
17 typedef	struct	Window Window;
18 
19 enum
20 {
21 	Selborder		= 0,		/* border of selected window */
22 	Unselborder	= 0,		/* border of unselected window */
23 	Scrollwid 		= 12,		/* width of scroll bar */
24 	Scrollgap 		= 4,		/* gap right of scroll bar */
25 	BIG			= 3,		/* factor by which window dimension can exceed screen */
26 	TRUE		= 1,
27 	FALSE		= 0
28 };
29 
30 enum
31 {
32 	Kscrolloneup = KF|0x20,
33 	Kscrollonedown = KF|0x21
34 };
35 
36 enum	/* control messages */
37 {
38 	Wakeup,
39 	Reshaped,
40 	Moved,
41 	Refresh,
42 	Movemouse,
43 	Rawon,
44 	Rawoff,
45 	Holdon,
46 	Holdoff,
47 	Deleted,
48 	Exited
49 };
50 
51 struct Wctlmesg
52 {
53 	int		type;
54 	Rectangle	r;
55 	Image	*image;
56 };
57 
58 struct Conswritemesg
59 {
60 	Channel	*cw;		/* chan(Stringpair) */
61 };
62 
63 struct Consreadmesg
64 {
65 	Channel	*c1;		/* chan(tuple(char*, int) == Stringpair) */
66 	Channel	*c2;		/* chan(tuple(char*, int) == Stringpair) */
67 };
68 
69 struct Mousereadmesg
70 {
71 	Channel	*cm;		/* chan(Mouse) */
72 };
73 
74 struct Stringpair	/* rune and nrune or byte and nbyte */
75 {
76 	void		*s;
77 	int		ns;
78 };
79 
80 struct Mousestate
81 {
82 	Mouse	m;
83 	ulong	counter;	/* serial no. of mouse event */
84 };
85 
86 struct Mouseinfo
87 {
88 	Mousestate	queue[16];
89 	int	ri;	/* read index into queue */
90 	int	wi;	/* write index */
91 	ulong	counter;	/* serial no. of last mouse event we received */
92 	ulong	lastcounter;	/* serial no. of last mouse event sent to client */
93 	int	lastb;	/* last button state we received */
94 	uchar	qfull;	/* filled the queue; no more recording until client comes back */
95 };
96 
97 struct Window
98 {
99 	Ref	ref;
100 	QLock	lk;
101 	Frame	f;
102 	Image		*i;
103 	Mousectl		mc;
104 	Mouseinfo	mouse;
105 	Channel		*ck;			/* chan(Rune[10]) */
106 	Channel		*cctl;		/* chan(Wctlmesg)[20] */
107 	Channel		*conswrite;	/* chan(Conswritemesg) */
108 	Channel		*consread;	/* chan(Consreadmesg) */
109 	Channel		*mouseread;	/* chan(Mousereadmesg) */
110 	Channel		*wctlread;		/* chan(Consreadmesg) */
111 	uint			nr;			/* number of runes in window */
112 	uint			maxr;		/* number of runes allocated in r */
113 	Rune			*r;
114 	uint			nraw;
115 	Rune			*raw;
116 	uint			org;
117 	uint			q0;
118 	uint			q1;
119 	uint			qh;
120 	uint			iq1;			/* last input position */
121 	int			id;
122 	char			name[32];
123 	uint			namecount;
124 	Rectangle		scrollr;
125 	/*
126 	 * Rio once used originwindow, so screenr could be different from i->r.
127 	 * Now they're always the same but the code doesn't assume so.
128 	*/
129 	Rectangle		screenr;	/* screen coordinates of window */
130 	int			resized;
131 	int			wctlready;
132 	Rectangle		lastsr;
133 	int			topped;
134 	int			notefd;
135 	uchar		scrolling;
136 	Cursor		cursor;
137 	Cursor		*cursorp;
138 	uchar		holding;
139 	uchar		rawing;
140 	uchar		ctlopen;
141 	uchar		wctlopen;
142 	uchar		deleted;
143 	uchar		mouseopen;
144 	char			*label;
145 	int			pid;
146 	char			*dir;
147 };
148 
149 int		winborder(Window*, Point);
150 void		winctl(void*);
151 void		winshell(void*);
152 Window*	wlookid(int);
153 Window*	wmk(Image*, Mousectl*, Channel*, Channel*, int);
154 Window*	wpointto(Point);
155 Window*	wtop(Point);
156 void		wtopme(Window*);
157 void		wbottomme(Window*);
158 char*	wcontents(Window*, int*);
159 int		wbswidth(Window*, Rune);
160 int		wclickmatch(Window*, int, int, int, uint*);
161 int		wclose(Window*);
162 int		wctlmesg(Window*, int, Rectangle, Image*);
163 int		wctlmesg(Window*, int, Rectangle, Image*);
164 uint		wbacknl(Window*, uint, uint);
165 uint		winsert(Window*, Rune*, int, uint);
166 void		waddraw(Window*, Rune*, int);
167 void		wborder(Window*, int);
168 void		wclosewin(Window*);
169 void		wcurrent(Window*);
170 void		wcut(Window*);
171 void		wdelete(Window*, uint, uint);
172 void		wdoubleclick(Window*, uint*, uint*);
173 void		wfill(Window*);
174 void		wframescroll(Window*, int);
175 void		wkeyctl(Window*, Rune);
176 void		wmousectl(Window*);
177 void		wmovemouse(Window*, Point);
178 void		wpaste(Window*);
179 void		wplumb(Window*);
180 void		wlook(Window*);
181 void		wrefresh(Window*, Rectangle);
182 void		wrepaint(Window*);
183 void		wresize(Window*, Image*, int);
184 void		wscrdraw(Window*);
185 void		wscroll(Window*, int);
186 void		wselect(Window*);
187 void		wsendctlmesg(Window*, int, Rectangle, Image*);
188 void		wsetcursor(Window*, int);
189 void		wsetname(Window*);
190 void		wsetorigin(Window*, uint, int);
191 void		wsetpid(Window*, int, int);
192 void		wsetselect(Window*, uint, uint);
193 void		wshow(Window*, uint);
194 void		wsnarf(Window*);
195 void 		wscrsleep(Window*, uint);
196 void		wsetcols(Window*);
197 
198 void		deletetimeoutproc(void*);
199 
200 struct Timer
201 {
202 	int		dt;
203 	int		cancel;
204 	Channel	*c;	/* chan(int) */
205 	Timer	*next;
206 };
207 
208 #ifndef Extern
209 #define Extern extern
210 #endif
211 
212 Extern	Font		*font;
213 Extern	Mousectl	*mousectl;
214 Extern	Mouse	*mouse;
215 Extern	Keyboardctl	*keyboardctl;
216 Extern	Display	*display;
217 Extern	Image	*view;
218 Extern	Screen	*wscreen;
219 Extern	Cursor	boxcursor;
220 Extern	Cursor	crosscursor;
221 Extern	Cursor	sightcursor;
222 Extern	Cursor	whitearrow;
223 Extern	Cursor	query;
224 Extern	Cursor	*corners[9];
225 Extern	Image	*background;
226 Extern	Image	*lightgrey;
227 Extern	Image	*red;
228 Extern	Window	**window;
229 Extern	Window	*wkeyboard;	/* window of simulated keyboard */
230 Extern	int		nwindow;
231 Extern	int		snarffd;
232 Extern	Window	*input;
233 Extern	QLock	all;			/* BUG */
234 Extern	Window	*hidden[100];
235 Extern	int		nhidden;
236 Extern	int		nsnarf;
237 Extern	Rune*	snarf;
238 Extern	int		scrolling;
239 Extern	int		maxtab;
240 Extern	Channel*	winclosechan;
241 Extern	Channel*	deletechan;
242 Extern	char		*startdir;
243 Extern	int		sweeping;
244 Extern	int		wctlfd;
245 Extern	int		errorshouldabort;
246 Extern	int		menuing;		/* menu action is pending; waiting for window to be indicated */
247 Extern	int		snarfversion;	/* updated each time it is written */
248 Extern	int		messagesize;		/* negotiated in 9P version setup */
249