1 
2 #define NHASH (1<<5)
3 #define HASHMASK (NHASH-1)
4 
5 typedef struct Kbdbuf Kbdbuf;
6 typedef struct Mousebuf Mousebuf;
7 typedef struct Tagbuf Tagbuf;
8 
9 typedef struct Client Client;
10 typedef struct ClientImpl ClientImpl;
11 typedef struct DImage DImage;
12 typedef struct DScreen DScreen;
13 typedef struct CScreen CScreen;
14 typedef struct FChar FChar;
15 typedef struct Refresh Refresh;
16 typedef struct Refx Refx;
17 typedef struct DName DName;
18 
19 struct Kbdbuf
20 {
21 	Rune r[256];
22 	int ri;
23 	int wi;
24 	int stall;
25 	int alting;
26 	Rune k[10];
27 	int nk;
28 };
29 
30 struct Mousebuf
31 {
32 	Mouse m[256];
33 	Mouse last;
34 	int ri;
35 	int wi;
36 	int stall;
37 	int resized;
38 };
39 
40 struct Tagbuf
41 {
42 	int t[256];
43 	int ri;
44 	int wi;
45 };
46 
47 struct ClientImpl
48 {
49 	void (*rpc_resizeimg)(Client*);
50 	void (*rpc_resizewindow)(Client*, Rectangle);
51 	void (*rpc_setcursor)(Client*, Cursor*, Cursor2*);
52 	void (*rpc_setlabel)(Client*, char*);
53 	void (*rpc_setmouse)(Client*, Point);
54 	void (*rpc_topwin)(Client*);
55 	void (*rpc_bouncemouse)(Client*, Mouse);
56 	void (*rpc_flush)(Client*, Rectangle);
57 };
58 
59 extern QLock drawlk;
60 
61 struct Client
62 {
63 	int		rfd;
64 
65 	// wfdlk protects writes to wfd, which can be issued from either
66 	// the RPC thread or the graphics thread.
67 	QLock	wfdlk;
68 	int		wfd;
69 	uchar*	mbuf;
70 	int		nmbuf;
71 
72 	char*	wsysid;
73 
74 	// drawlk protects the draw data structures for all clients.
75 	// It can be acquired by an RPC thread or a graphics thread
76 	// but must not be held on one thread while waiting for the other.
77 	/*Ref		r;*/
78 	DImage*		dimage[NHASH];
79 	CScreen*	cscreen;
80 	Refresh*	refresh;
81 	Rendez		refrend;
82 	uchar*		readdata;
83 	int		nreaddata;
84 	int		busy;
85 	int		clientid;
86 	int		slot;
87 	int		refreshme;
88 	int		infoid;
89 	int		op;
90 	int		displaydpi;
91 	int		forcedpi;
92 	int		waste;
93 	Rectangle	flushrect;
94 	Memimage	*screenimage;
95 	DScreen*	dscreen;
96 	int		nname;
97 	DName*		name;
98 	int		namevers;
99 	ClientImpl*	impl;
100 
101 	// Only accessed/modified by the graphics thread.
102 	const void*		view;
103 
104 	// eventlk protects the keyboard and mouse events.
105 	QLock eventlk;
106 	Kbdbuf kbd;
107 	Mousebuf mouse;
108 	Tagbuf kbdtags;
109 	Tagbuf mousetags;
110 	Rectangle mouserect;
111 };
112 
113 struct Refresh
114 {
115 	DImage*		dimage;
116 	Rectangle	r;
117 	Refresh*	next;
118 };
119 
120 struct Refx
121 {
122 	Client*		client;
123 	DImage*		dimage;
124 };
125 
126 struct DName
127 {
128 	char			*name;
129 	Client	*client;
130 	DImage*		dimage;
131 	int			vers;
132 };
133 
134 struct FChar
135 {
136 	int		minx;	/* left edge of bits */
137 	int		maxx;	/* right edge of bits */
138 	uchar		miny;	/* first non-zero scan-line */
139 	uchar		maxy;	/* last non-zero scan-line + 1 */
140 	schar		left;	/* offset of baseline */
141 	uchar		width;	/* width of baseline */
142 };
143 
144 /*
145  * Reference counts in DImages:
146  *	one per open by original client
147  *	one per screen image or fill
148  * 	one per image derived from this one by name
149  */
150 struct DImage
151 {
152 	int		id;
153 	int		ref;
154 	char		*name;
155 	int		vers;
156 	Memimage*	image;
157 	int		ascent;
158 	int		nfchar;
159 	FChar*		fchar;
160 	DScreen*	dscreen;	/* 0 if not a window */
161 	DImage*	fromname;	/* image this one is derived from, by name */
162 	DImage*		next;
163 };
164 
165 struct CScreen
166 {
167 	DScreen*	dscreen;
168 	CScreen*	next;
169 };
170 
171 struct DScreen
172 {
173 	int		id;
174 	int		public;
175 	int		ref;
176 	DImage	*dimage;
177 	DImage	*dfill;
178 	Memscreen*	screen;
179 	Client*		owner;
180 	DScreen*	next;
181 };
182 
183 // For the most part, the graphics driver-specific code in files
184 // like mac-screen.m runs in the graphics library's main thread,
185 // while the RPC service code in srv.c runs on the RPC service thread.
186 // The exceptions in each file, which are called by the other,
187 // are marked with special prefixes: gfx_* indicates code that
188 // is in srv.c but nonetheless runs on the main graphics thread,
189 // while rpc_* indicates code that is in, say, mac-screen.m but
190 // nonetheless runs on the RPC service thread.
191 //
192 // The gfx_* and rpc_* calls typically synchronize with the other
193 // code in the file by acquiring a lock (or running a callback on the
194 // target thread, which amounts to the same thing).
195 // To avoid deadlock, callers of those routines must not hold any locks.
196 
197 // gfx_* routines are called on the graphics thread,
198 // invoked from graphics driver callbacks to do RPC work.
199 // No locks are held on entry.
200 void	gfx_abortcompose(Client*);
201 void	gfx_keystroke(Client*, int);
202 void	gfx_main(void);
203 void	gfx_mousetrack(Client*, int, int, int, uint);
204 void	gfx_replacescreenimage(Client*, Memimage*);
205 void	gfx_mouseresized(Client*);
206 void	gfx_started(void);
207 
208 // rpc_* routines are called on the RPC thread,
209 // invoked by the RPC server code to do graphics work.
210 // No locks are held on entry.
211 Memimage *rpc_attach(Client*, char*, char*);
212 char*	rpc_getsnarf(void);
213 void	rpc_putsnarf(char*);
214 void	rpc_shutdown(void);
215 void	rpc_main(void);
216 
217 // rpc_gfxdrawlock and rpc_gfxdrawunlock
218 // are called around drawing operations to lock and unlock
219 // access to the graphics display, for systems where the
220 // individual memdraw operations use the graphics display (X11, not macOS).
221 void rpc_gfxdrawlock(void);
222 void rpc_gfxdrawunlock(void);
223 
224 // draw* routines are called on the RPC thread,
225 // invoked by the RPC server to do pixel pushing.
226 // No locks are held on entry.
227 int draw_dataread(Client*, void*, int);
228 int draw_datawrite(Client*, void*, int);
229 void draw_initdisplaymemimage(Client*, Memimage*);
230 
231 // utility routines
232 int latin1(Rune*, int);
233 int mouseswap(int);
234 int parsewinsize(char*, Rectangle*, int*);
235 
236 extern Client *client0; // set in single-client mode
237