1/***********************************************************
2
3Copyright 1987, 1988, 1994, 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
26Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
27
28                        All Rights Reserved
29
30Permission to use, copy, modify, and distribute this software and its
31documentation for any purpose and without fee is hereby granted,
32provided that the above copyright notice appear in all copies and that
33both that copyright notice and this permission notice appear in
34supporting documentation, and that the name of Digital not be
35used in advertising or publicity pertaining to distribution of the
36software without specific, written prior permission.
37
38DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
39ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
40DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
41ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
42WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
43ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
44SOFTWARE.
45
46******************************************************************/
47
48#ifndef _XtinitialI_h
49#define _XtinitialI_h
50
51/****************************************************************
52 *
53 * Displays
54 *
55 ****************************************************************/
56
57#ifndef X_NOT_POSIX
58#ifdef _POSIX_SOURCE
59#include <limits.h>
60#else
61#define _POSIX_SOURCE
62#include <limits.h>
63#undef _POSIX_SOURCE
64#endif
65#endif
66#ifndef PATH_MAX
67#ifdef WIN32
68#define PATH_MAX 512
69#else
70#include <sys/param.h>
71#endif
72#ifndef PATH_MAX
73#ifdef MAXPATHLEN
74#define PATH_MAX MAXPATHLEN
75#else
76#define PATH_MAX 1024
77#endif
78#endif
79#endif
80
81#include <X11/Xos.h>
82#include <X11/Xpoll.h>
83
84_XFUNCPROTOBEGIN
85
86typedef struct _TimerEventRec {
87        struct timeval        te_timer_value;
88	struct _TimerEventRec *te_next;
89	XtTimerCallbackProc   te_proc;
90	XtAppContext	      app;
91	XtPointer	      te_closure;
92} TimerEventRec;
93
94typedef struct _InputEvent {
95	XtInputCallbackProc   ie_proc;
96	XtPointer	      ie_closure;
97	struct _InputEvent    *ie_next;
98	struct _InputEvent    *ie_oq;
99	XtAppContext	      app;
100	int		      ie_source;
101	XtInputMask	      ie_condition;
102} InputEvent;
103
104typedef struct _SignalEventRec {
105	XtSignalCallbackProc  se_proc;
106	XtPointer	      se_closure;
107	struct _SignalEventRec *se_next;
108	XtAppContext	      app;
109	Boolean		      se_notice;
110} SignalEventRec;
111
112typedef struct _WorkProcRec {
113	XtWorkProc proc;
114	XtPointer closure;
115	struct _WorkProcRec *next;
116	XtAppContext app;
117} WorkProcRec;
118
119
120typedef struct
121{
122#ifndef USE_POLL
123  	fd_set rmask;
124	fd_set wmask;
125	fd_set emask;
126#endif
127	int	nfds;
128} FdStruct;
129
130typedef struct _LangProcRec {
131    XtLanguageProc	proc;
132    XtPointer		closure;
133} LangProcRec;
134
135typedef struct _ProcessContextRec {
136    XtAppContext	defaultAppContext;
137    XtAppContext	appContextList;
138    ConverterTable	globalConverterTable;
139    LangProcRec		globalLangProcRec;
140} ProcessContextRec, *ProcessContext;
141
142typedef struct {
143    char*	start;
144    char*	current;
145    int		bytes_remaining;
146} Heap;
147
148typedef struct _DestroyRec DestroyRec;
149
150
151typedef struct _XtAppStruct {
152    XtAppContext next;		/* link to next app in process context */
153    ProcessContext process;	/* back pointer to our process context */
154    InternalCallbackList destroy_callbacks;
155    Display **list;
156    TimerEventRec *timerQueue;
157    WorkProcRec *workQueue;
158    InputEvent **input_list;
159    InputEvent *outstandingQueue;
160    SignalEventRec *signalQueue;
161    XrmDatabase errorDB;
162    XtErrorMsgHandler errorMsgHandler, warningMsgHandler;
163    XtErrorHandler errorHandler, warningHandler;
164    struct _ActionListRec *action_table;
165    ConverterTable converterTable;
166    unsigned long selectionTimeout;
167    FdStruct fds;
168    short count;			/* num of assigned entries in list */
169    short max;				/* allocate size of list */
170    short last;
171    short input_count;
172    short input_max;			/* elts input_list init'd with */
173    Boolean sync, being_destroyed, error_inited;
174#ifndef NO_IDENTIFY_WINDOWS
175    Boolean identify_windows;		/* debugging hack */
176#endif
177    Heap heap;
178    String * fallback_resources;	/* Set by XtAppSetFallbackResources. */
179    struct _ActionHookRec* action_hook_list;
180    struct _BlockHookRec* block_hook_list;
181    int destroy_list_size;		/* state data for 2-phase destroy */
182    int destroy_count;
183    int dispatch_level;
184    DestroyRec* destroy_list;
185    Widget in_phase2_destroy;
186    LangProcRec langProcRec;
187    struct _TMBindCacheRec * free_bindings;
188    _XtString display_name_tried;
189    Display **dpy_destroy_list;
190    int dpy_destroy_count;
191    Boolean exit_flag;
192    Boolean rebuild_fdlist;
193#ifdef XTHREADS
194    LockPtr lock_info;
195    ThreadAppProc lock;
196    ThreadAppProc unlock;
197    ThreadAppYieldLockProc yield_lock;
198    ThreadAppRestoreLockProc restore_lock;
199    ThreadAppProc free_lock;
200#endif
201} XtAppStruct;
202
203extern void _XtHeapInit(Heap* heap);
204extern void _XtHeapFree(Heap* heap);
205
206#ifdef XTTRACEMEMORY
207
208
209extern char *_XtHeapMalloc(
210    Heap*	/* heap */,
211    Cardinal	/* size */,
212    const char */* file */,
213    int		/* line */
214);
215
216#define _XtHeapAlloc(heap,bytes) _XtHeapMalloc(heap, bytes, __FILE__, __LINE__)
217
218#else /* XTTRACEMEMORY */
219
220extern char* _XtHeapAlloc(
221    Heap*	/* heap */,
222    Cardinal	/* size */
223);
224
225#endif /* XTTRACEMEMORY */
226
227extern void _XtSetDefaultErrorHandlers(
228    XtErrorMsgHandler*	/* errMsg */,
229    XtErrorMsgHandler*	/* warnMsg */,
230    XtErrorHandler*	/* err */,
231    XtErrorHandler*	/* warn */
232);
233
234extern void _XtSetDefaultSelectionTimeout(
235    unsigned long* /* timeout */
236);
237
238extern XtAppContext _XtDefaultAppContext(
239    void
240);
241
242extern ProcessContext _XtGetProcessContext(
243    void
244);
245
246Display *
247_XtAppInit(
248    XtAppContext*	/* app_context_return */,
249    String		/* application_class */,
250    XrmOptionDescRec*	/* options */,
251    Cardinal		/* num_options */,
252    int*		/* argc_in_out */,
253    _XtString**		/* argv_in_out */,
254    String*		/* fallback_resources */
255);
256
257extern void _XtDestroyAppContexts(
258    void
259);
260
261extern void _XtCloseDisplays(
262    XtAppContext	/* app */
263);
264
265extern int _XtAppDestroyCount;
266
267extern int _XtWaitForSomething(
268    XtAppContext	/* app */,
269    _XtBoolean 		/* ignoreEvents */,
270    _XtBoolean 		/* ignoreTimers */,
271    _XtBoolean 		/* ignoreInputs */,
272    _XtBoolean		/* ignoreSignals */,
273    _XtBoolean 		/* block */,
274#ifdef XTHREADS
275    _XtBoolean		/* drop_lock */,
276#endif
277    unsigned long*	/* howlong */
278);
279
280typedef struct _CaseConverterRec *CaseConverterPtr;
281typedef struct _CaseConverterRec {
282    KeySym		start;		/* first KeySym valid in converter */
283    KeySym		stop;		/* last KeySym valid in converter */
284    XtCaseProc		proc;		/* case converter function */
285    CaseConverterPtr	next;		/* next converter record */
286} CaseConverterRec;
287
288typedef struct _ExtensionSelectorRec {
289    XtExtensionSelectProc proc;
290    int min, max;
291    XtPointer client_data;
292} ExtSelectRec;
293
294typedef struct _XtPerDisplayStruct {
295    InternalCallbackList destroy_callbacks;
296    Region region;
297    CaseConverterPtr case_cvt;		/* user-registered case converters */
298    XtKeyProc defaultKeycodeTranslator;
299    XtAppContext appContext;
300    unsigned long keysyms_serial;      /* for tracking MappingNotify events */
301    KeySym *keysyms;                   /* keycode to keysym table */
302    int keysyms_per_keycode;           /* number of keysyms for each keycode*/
303    int min_keycode, max_keycode;      /* range of keycodes */
304    KeySym *modKeysyms;                /* keysym values for modToKeysysm */
305    ModToKeysymTable *modsToKeysyms;   /* modifiers to Keysysms index table*/
306    unsigned char isModifier[32];      /* key-is-modifier-p bit table */
307    KeySym lock_meaning;	       /* Lock modifier meaning */
308    Modifiers mode_switch;	       /* keyboard group modifiers */
309    Modifiers num_lock;		       /* keyboard numlock modifiers */
310    Boolean being_destroyed;
311    Boolean rv;			       /* reverse_video resource */
312    XrmName name;		       /* resolved app name */
313    XrmClass class;		       /* application class */
314    Heap heap;
315    struct _GCrec *GClist;	       /* support for XtGetGC */
316    Drawable **pixmap_tab;             /* ditto for XtGetGC */
317    String language;		       /* XPG language string */
318    XEvent last_event;		       /* last event dispatched */
319    Time last_timestamp;	       /* from last event dispatched */
320    int multi_click_time;	       /* for XtSetMultiClickTime */
321    struct _TMKeyContextRec* tm_context;     /* for XtGetActionKeysym */
322    InternalCallbackList mapping_callbacks;  /* special case for TM */
323    XtPerDisplayInputRec pdi;	       /* state for modal grabs & kbd focus */
324    struct _WWTable *WWtable;	       /* window to widget table */
325    XrmDatabase *per_screen_db;        /* per screen resource databases */
326    XrmDatabase cmd_db;		       /* db from command line, if needed */
327    XrmDatabase server_db;	       /* resource property else .Xdefaults */
328    XtEventDispatchProc* dispatcher_list;
329    ExtSelectRec* ext_select_list;
330    int ext_select_count;
331    Widget hook_object;
332#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
333    Atom rcm_init;			/* ResConfig - initialize */
334    Atom rcm_data;			/* ResConfig - data atom */
335#endif
336} XtPerDisplayStruct, *XtPerDisplay;
337
338typedef struct _PerDisplayTable {
339	Display *dpy;
340	XtPerDisplayStruct perDpy;
341	struct _PerDisplayTable *next;
342} PerDisplayTable, *PerDisplayTablePtr;
343
344extern PerDisplayTablePtr _XtperDisplayList;
345
346extern XtPerDisplay _XtSortPerDisplayList(
347    Display* /* dpy */
348);
349
350extern XtPerDisplay _XtGetPerDisplay(
351    Display*		/* dpy */
352);
353
354extern XtPerDisplayInputRec* _XtGetPerDisplayInput(
355    Display* 		/* dpy */
356);
357
358#if 0
359#ifdef DEBUG
360#define _XtGetPerDisplay(display) \
361    ((_XtperDisplayList != NULL && (_XtperDisplayList->dpy == (display))) \
362     ? &_XtperDisplayList->perDpy \
363     : _XtSortPerDisplayList(display))
364#define _XtGetPerDisplayInput(display) \
365    ((_XtperDisplayList != NULL && (_XtperDisplayList->dpy == (display))) \
366     ? &_XtperDisplayList->perDpy.pdi \
367     : &_XtSortPerDisplayList(display)->pdi)
368#else
369#define _XtGetPerDisplay(display) \
370    ((_XtperDisplayList->dpy == (display)) \
371     ? &_XtperDisplayList->perDpy \
372     : _XtSortPerDisplayList(display))
373#define _XtGetPerDisplayInput(display) \
374    ((_XtperDisplayList->dpy == (display)) \
375     ? &_XtperDisplayList->perDpy.pdi \
376     : &_XtSortPerDisplayList(display)->pdi)
377#endif /*DEBUG*/
378#endif
379
380extern void _XtDisplayInitialize(
381    Display*		/* dpy */,
382    XtPerDisplay	/* pd */,
383    _Xconst char*	/* name */,
384    XrmOptionDescRec*	/* urlist */,
385    Cardinal 		/* num_urs */,
386    int*		/* argc */,
387    _XtString* 		/* argv */
388);
389
390extern void _XtCacheFlushTag(
391    XtAppContext /* app */,
392    XtPointer	 /* tag */
393);
394
395extern void _XtFreeActions(
396    struct _ActionListRec* /* action_table */
397);
398
399extern void _XtDoPhase2Destroy(
400    XtAppContext /* app */,
401    int		 /* dispatch_level */
402);
403
404extern void _XtDoFreeBindings(
405    XtAppContext /* app */
406);
407
408extern void _XtExtensionSelect(
409    Widget /* widget */
410);
411
412#define _XtSafeToDestroy(app) ((app)->dispatch_level == 0)
413
414extern void _XtAllocWWTable(
415    XtPerDisplay pd
416);
417
418extern void _XtFreeWWTable(
419    XtPerDisplay pd
420);
421
422extern String _XtGetUserName(_XtString dest, int len);
423extern XrmDatabase _XtPreparseCommandLine(XrmOptionDescRec *urlist,
424			Cardinal num_urs, int argc, _XtString *argv,
425			String *applName, String *displayName,
426			String *language);
427
428_XFUNCPROTOEND
429
430#endif /* _XtinitialI_h */
431