1/*
2
3Copyright 1989, 1998  The Open Group
4
5Permission to use, copy, modify, distribute, and sell this software and its
6documentation for any purpose is hereby granted without fee, provided that
7the above copyright notice appear in all copies and that both that
8copyright notice and this permission notice appear in supporting
9documentation.
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21Except as contained in this notice, the name of The Open Group shall not be
22used in advertising or otherwise to promote the sale, use or other dealings
23in this Software without prior written authorization from The Open Group.
24
25*/
26
27/*
28 * Author:  Chris D. Peterson, MIT X Consortium
29 */
30
31/************************************************************
32
33		The Editres Protocol
34
35
36  The Client message sent to the application is:
37
38  ATOM = "ResEditor" 		--- RES_EDITOR_NAME
39
40  FORMAT = 32                   --- RES_EDIT_SEND_EVENT_FORMAT
41
42  l[0] = timestamp
43  l[1] = command atom name
44  l[2] = ident of command
45  l[3] = protocol version number to use
46
47
48
49  The binary protocol has the following format:
50
51	Card8:		8-bit unsigned integer
52	Card16:		16-bit unsigned integer
53	Card32:		32-bit unsigned integer
54	Int16:		16-bit signed integer
55	Window:		32-bit value
56	Widget:		32-bit value
57	String8:        ListOfCard8
58
59	[a][b][c] represent an exclusive list of choices.
60
61	All widgets are passed as a list of widgets, containing the
62	full instance heirarchy of this widget.  The hierarchy is ordered
63	from parent to child.  Thus the first element of each list is
64	the root of the widget tree (this makes verifying that the widget
65	still exists, MUCH faster).
66
67	ListOfFoo comprises a list of things in the following format:
68
69	number:			Card16
70	<number> things:	????
71
72  This is a synchronous protocol, every request MUST be followed by a
73  reply.
74
75  Request:
76
77	Serial Number:	Card8
78	Op Code:	Card8 -	{ SendWidgetTree = 0,
79				  SetValues = 1,
80				  GetResources = 2,
81				  GetGeometry = 3,
82				  FindChild = 4,
83				  GetValues = 5 }
84	Length:		Card32
85	Data:
86
87   Reply:
88
89	Serial Number:	Card8
90	Type:		Card8 - { Formatted = 0,
91	                          Unformatted = 1,
92				  ProtocolMismatch = 2
93				}
94	Length:		Card32
95
96
97   Byte Order:
98
99	All Fields are MSB -> LSB
100
101    Data:
102
103    	Formatted:
104
105        	The data contains the reply information for the request as
106		specified below if the reply type is "Formatted".  The return
107		values for the other reply types are shown below.
108
109        Unformatted:
110
111		Message:	String8
112
113	ProtocolMismatch:
114
115		RequestedVersion:   	Card8
116
117------------------------------------------------------------
118
119   SendWidgetTree:
120
121	--->
122
123	Number of Entries:	Card16
124	Entry:
125		widget:		ListOfWidgets
126		name:		String8
127		class:		String8
128		window:		Card32
129         	toolkit:        String8
130
131        SendWidgetTree returns the toolkit type, and a fully specified list
132        of widgets for each widget in the tree.  This is enough information
133        to completely reconstruct the entire widget hierarchy.
134
135	The window return value contains the Xid of the window currently
136	used by this widget.  If the widget is unrealized then 0 is returned,
137	and if widget is a non-windowed object a value of 2 is returned.
138
139   SetValues:
140
141	name:	String8
142	type:	String8
143	value:  String8
144	Number of Entries:	Card16
145	Entry:
146		widget:		ListOfWidgets
147
148	--->
149
150	Number of Entries:	Card16
151	Entry:
152		widget:		ListOfWidgets
153		message:	String8
154
155	SetValues will allow the same resource to be set on a number of
156	widgets.  This function will return an error message if the SetValues
157	request caused an Xt error.
158
159  GetValues:
160
161        names:                ListOfString8
162        widget:               Widget
163
164        --->
165	novalues:             ListOfCard16
166	values:               ListOfString8
167
168        GetValues will allow a number of resource values to be read
169        on a particular widget.  The request specifies the names of
170	the resources wanted and the widget id these resources are
171	from.  The reply returns a list of indices from the requests
172	name list of resources for which a value can not be returned.
173	It also returns a list of returned values, in the order of the
174        requests names list, skipping those indices present in novalues.
175
176   GetResources:
177
178	Number of Entries:	Card16
179	Entry
180		widget:		ListOfWidgets:
181
182	---->
183
184	Number of Entries:	Card16
185	Entry
186		Widget:			ListOfWidgets:
187		Error:			Bool
188
189		[ Message:		String 8 ]
190		[ Number of Resources:	Card16
191		Resource:
192			Kind:	{normal, constraint}
193			Name:	String8
194			Class:	String8
195			Type:	String8 ]
196
197	GetResources retrieves the kind, name, class, and type for every
198	widget passed to it.  If an error occurred with the resource fetch
199	Error will be set to True for the given widget and a message
200	is returned rather than the resource info.
201
202  GetGeometry:
203
204	Number of Entries:	Card16
205	Entry
206		Widget:		ListOfWidgets:
207
208	---->
209
210	Number of Entries:	Card16
211	Entry
212		Widget:			ListOfWidgets:
213		Error:			Bool
214
215		[ message:		String 8 ]
216		[ mapped:       Boolean
217		  X: 		Int16
218		  Y:  		Int16
219		  Width: 	Card16
220	      	  Height:	Card16
221		  BorderWidth:	Card16 ]
222
223	GetGeometry retrieves the mapping state, x, y, width, height
224	and border width for each widget specified.  If an error occurred
225	with the geometry fetch "Error" will be set to True for the given
226	widget and a message is returned rather than the geometry info.
227	X an Y correspond to the root coordinates of the upper left corner
228	of the widget (outside the window border).
229
230  FindChild:
231
232	Widget:		ListOfWidgets
233	X:		Int16
234	Y:		Int16
235
236	--->
237
238	Widget:		ListOfWidgets
239
240	FindChild returns a descendent of the widget specified that
241	is at the root coordinates specified.
242
243	NOTE:
244
245	The returned widget is undefined if the point is contained in
246	two or more mapped widgets, or in two overlapping Rect objs.
247
248  GetValues:
249
250        names:                ListOfString8
251        widget:               Widget
252
253        --->
254
255	values:               ListOfString8
256
257        GetValues will allow a number of resource values to be read
258        on a particular widget.  Currently only InterViews 3.0.1 Styles
259	and their attributes are supported.  In addition, the current
260	user interface  only supports the return of 1 resource.  The ability
261	to specify and return multiple resources is defined for future editres
262	interfaces where some or all of a widgets resource values are returned
263	and displayed at once.
264
265
266************************************************************/
267
268#include <X11/Intrinsic.h>
269#include <X11/Xfuncproto.h>
270
271#define XER_NBBY 8		/* number of bits in a byte */
272#define BYTE_MASK 255
273
274#define HEADER_SIZE 6
275
276#define EDITRES_IS_OBJECT 2
277#define EDITRES_IS_UNREALIZED 0
278
279/*
280 * Format for atoms
281 */
282#define EDITRES_FORMAT             8
283#define EDITRES_SEND_EVENT_FORMAT 32
284
285/*
286 * Atoms
287 */
288#define EDITRES_NAME         "Editres"
289#define EDITRES_COMMAND_ATOM "EditresCommand"
290#define EDITRES_COMM_ATOM    "EditresComm"
291#define EDITRES_CLIENT_VALUE "EditresClientVal"
292#define EDITRES_PROTOCOL_ATOM "EditresProtocol"
293
294typedef enum {
295  SendWidgetTree = 0,
296	       SetValues      = 1,
297	       GetResources   = 2,
298	       GetGeometry    = 3,
299	       FindChild      = 4,
300	       GetValues      = 5
301} EditresCommand;
302
303typedef enum {
304  NormalResource     = 0,
305  ConstraintResource = 1
306} ResourceType;
307
308/*
309 * The type of a resource identifier
310 */
311typedef unsigned char ResIdent;
312
313typedef enum {
314  PartialSuccess   = 0,
315  Failure	   = 1,
316  ProtocolMismatch = 2
317} EditResError;
318
319typedef struct _WidgetInfo {
320    unsigned short num_widgets;
321  unsigned long *ids;
322    Widget real_widget;
323} WidgetInfo;
324
325typedef struct _ProtocolStream {
326    unsigned long size, alloc;
327    unsigned char *real_top, *top, *current;
328} ProtocolStream;
329
330/************************************************************
331 * Function definitions for reading and writing protocol requests
332 ************************************************************/
333_XFUNCPROTOBEGIN
334
335void _XEditResPutString8
336(
337 ProtocolStream		*stream,
338 _Xconst char		*str
339 );
340
341void _XEditResPut8
342(
343 ProtocolStream		*stream,
344 unsigned int		value
345 );
346
347void _XEditResPut16
348(
349 ProtocolStream		*stream,
350 unsigned int		value
351 );
352
353void _XEditResPut32
354(
355 ProtocolStream		*stream,
356 unsigned long		value
357 );
358
359void _XEditResPutWidgetInfo
360(
361 ProtocolStream		*stream,
362 WidgetInfo		*info
363 );
364
365void _XEditResResetStream
366(
367 ProtocolStream		*stream
368 );
369
370Bool _XEditResGet8
371(
372 ProtocolStream		*stream,
373 unsigned char		*value
374 );
375
376Bool _XEditResGet16
377(
378 ProtocolStream		*stream,
379 unsigned short		*value
380 );
381
382Bool _XEditResGetSigned16
383(
384 ProtocolStream		*stream,
385 short			*value
386 );
387
388Bool _XEditResGet32
389(
390 ProtocolStream		*stream,
391 unsigned long		*value
392 );
393
394Bool _XEditResGetString8
395(
396 ProtocolStream		*stream,
397 char			**str
398 );
399
400Bool _XEditResGetWidgetInfo
401(
402 ProtocolStream		*stream,
403 WidgetInfo		*info
404 );
405
406_XFUNCPROTOEND
407