Home | History | Annotate | Line # | Download | only in Xmu
      1 /*
      2 
      3 Copyright 1989, 1998  The Open Group
      4 
      5 Permission to use, copy, modify, distribute, and sell this software and its
      6 documentation for any purpose is hereby granted without fee, provided that
      7 the above copyright notice appear in all copies and that both that
      8 copyright notice and this permission notice appear in supporting
      9 documentation.
     10 
     11 The above copyright notice and this permission notice shall be included in
     12 all copies or substantial portions of the Software.
     13 
     14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
     17 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     18 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     19 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     20 
     21 Except as contained in this notice, the name of The Open Group shall not be
     22 used in advertising or otherwise to promote the sale, use or other dealings
     23 in 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 
    294 typedef enum {
    295   SendWidgetTree = 0,
    296 	       SetValues      = 1,
    297 	       GetResources   = 2,
    298 	       GetGeometry    = 3,
    299 	       FindChild      = 4,
    300 	       GetValues      = 5
    301 } EditresCommand;
    302 
    303 typedef enum {
    304   NormalResource     = 0,
    305   ConstraintResource = 1
    306 } ResourceType;
    307 
    308 /*
    309  * The type of a resource identifier
    310  */
    311 typedef unsigned char ResIdent;
    312 
    313 typedef enum {
    314   PartialSuccess   = 0,
    315   Failure	   = 1,
    316   ProtocolMismatch = 2
    317 } EditResError;
    318 
    319 typedef struct _WidgetInfo {
    320     unsigned short num_widgets;
    321   unsigned long *ids;
    322     Widget real_widget;
    323 } WidgetInfo;
    324 
    325 typedef 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 
    335 void _XEditResPutString8
    336 (
    337  ProtocolStream		*stream,
    338  _Xconst char		*str
    339  );
    340 
    341 void _XEditResPut8
    342 (
    343  ProtocolStream		*stream,
    344  unsigned int		value
    345  );
    346 
    347 void _XEditResPut16
    348 (
    349  ProtocolStream		*stream,
    350  unsigned int		value
    351  );
    352 
    353 void _XEditResPut32
    354 (
    355  ProtocolStream		*stream,
    356  unsigned long		value
    357  );
    358 
    359 void _XEditResPutWidgetInfo
    360 (
    361  ProtocolStream		*stream,
    362  WidgetInfo		*info
    363  );
    364 
    365 void _XEditResResetStream
    366 (
    367  ProtocolStream		*stream
    368  );
    369 
    370 Bool _XEditResGet8
    371 (
    372  ProtocolStream		*stream,
    373  unsigned char		*value
    374  );
    375 
    376 Bool _XEditResGet16
    377 (
    378  ProtocolStream		*stream,
    379  unsigned short		*value
    380  );
    381 
    382 Bool _XEditResGetSigned16
    383 (
    384  ProtocolStream		*stream,
    385  short			*value
    386  );
    387 
    388 Bool _XEditResGet32
    389 (
    390  ProtocolStream		*stream,
    391  unsigned long		*value
    392  );
    393 
    394 Bool _XEditResGetString8
    395 (
    396  ProtocolStream		*stream,
    397  char			**str
    398  );
    399 
    400 Bool _XEditResGetWidgetInfo
    401 (
    402  ProtocolStream		*stream,
    403  WidgetInfo		*info
    404  );
    405 
    406 _XFUNCPROTOEND
    407