Display.c revision a3bd7f05
1444c061aSmrg/***********************************************************
2249c3046SmrgCopyright (c) 1993, Oracle and/or its affiliates. All rights reserved.
31477040fSmrg
41477040fSmrgPermission is hereby granted, free of charge, to any person obtaining a
51477040fSmrgcopy of this software and associated documentation files (the "Software"),
61477040fSmrgto deal in the Software without restriction, including without limitation
71477040fSmrgthe rights to use, copy, modify, merge, publish, distribute, sublicense,
81477040fSmrgand/or sell copies of the Software, and to permit persons to whom the
91477040fSmrgSoftware is furnished to do so, subject to the following conditions:
101477040fSmrg
111477040fSmrgThe above copyright notice and this permission notice (including the next
121477040fSmrgparagraph) shall be included in all copies or substantial portions of the
131477040fSmrgSoftware.
141477040fSmrg
151477040fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
161477040fSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
171477040fSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
181477040fSmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
191477040fSmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
201477040fSmrgFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
211477040fSmrgDEALINGS IN THE SOFTWARE.
221477040fSmrg
231477040fSmrgCopyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
24444c061aSmrg
25444c061aSmrg                        All Rights Reserved
26444c061aSmrg
27444c061aSmrgPermission to use, copy, modify, and distribute this software and its
28444c061aSmrgdocumentation for any purpose and without fee is hereby granted,
29444c061aSmrgprovided that the above copyright notice appear in all copies and that
30444c061aSmrgboth that copyright notice and this permission notice appear in
311477040fSmrgsupporting documentation, and that the name of Digital not be
32444c061aSmrgused in advertising or publicity pertaining to distribution of the
33444c061aSmrgsoftware without specific, written prior permission.
34444c061aSmrg
35444c061aSmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
36444c061aSmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
37444c061aSmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
38444c061aSmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
39444c061aSmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
40444c061aSmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
41444c061aSmrgSOFTWARE.
42444c061aSmrg
43444c061aSmrg******************************************************************/
44444c061aSmrg
45444c061aSmrg/*
46444c061aSmrg
47444c061aSmrgCopyright 1987, 1988, 1998  The Open Group
48444c061aSmrg
49444c061aSmrgPermission to use, copy, modify, distribute, and sell this software and its
50444c061aSmrgdocumentation for any purpose is hereby granted without fee, provided that
51444c061aSmrgthe above copyright notice appear in all copies and that both that
52444c061aSmrgcopyright notice and this permission notice appear in supporting
53444c061aSmrgdocumentation.
54444c061aSmrg
55444c061aSmrgThe above copyright notice and this permission notice shall be included in
56444c061aSmrgall copies or substantial portions of the Software.
57444c061aSmrg
58444c061aSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
59444c061aSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60444c061aSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
61444c061aSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
62444c061aSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
63444c061aSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
64444c061aSmrg
65444c061aSmrgExcept as contained in this notice, the name of The Open Group shall not be
66444c061aSmrgused in advertising or otherwise to promote the sale, use or other dealings
67444c061aSmrgin this Software without prior written authorization from The Open Group.
68444c061aSmrg
69444c061aSmrg*/
70444c061aSmrg
71444c061aSmrg#ifdef HAVE_CONFIG_H
72444c061aSmrg#include <config.h>
73444c061aSmrg#endif
74444c061aSmrg#include "IntrinsicI.h"
75444c061aSmrg#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
76444c061aSmrg#include "ResConfigP.h"
77444c061aSmrg#endif
78444c061aSmrg
79444c061aSmrg#include <stdlib.h>
80444c061aSmrg
81444c061aSmrg#ifdef XTHREADS
82a3bd7f05Smrgvoid (*_XtProcessLock) (void) = NULL;
83a3bd7f05Smrgvoid (*_XtProcessUnlock) (void) = NULL;
84a3bd7f05Smrgvoid (*_XtInitAppLock) (XtAppContext) = NULL;
85444c061aSmrg#endif
86444c061aSmrg
870568f49bSmrgstatic _Xconst _XtString XtNnoPerDisplay = "noPerDisplay";
88444c061aSmrg
89a3bd7f05SmrgProcessContext
90a3bd7f05Smrg_XtGetProcessContext(void)
91444c061aSmrg{
92444c061aSmrg    static ProcessContextRec processContextRec = {
93a3bd7f05Smrg        (XtAppContext) NULL,
94a3bd7f05Smrg        (XtAppContext) NULL,
95a3bd7f05Smrg        (ConverterTable) NULL,
96a3bd7f05Smrg        {(XtLanguageProc) NULL, (XtPointer) NULL}
97444c061aSmrg    };
98444c061aSmrg
99444c061aSmrg    return &processContextRec;
100444c061aSmrg}
101444c061aSmrg
102a3bd7f05SmrgXtAppContext
103a3bd7f05Smrg_XtDefaultAppContext(void)
104444c061aSmrg{
105444c061aSmrg    ProcessContext process = _XtGetProcessContext();
106444c061aSmrg    XtAppContext app;
107444c061aSmrg
108444c061aSmrg    LOCK_PROCESS;
109444c061aSmrg    if (process->defaultAppContext == NULL) {
110a3bd7f05Smrg        process->defaultAppContext = XtCreateApplicationContext();
111444c061aSmrg    }
112444c061aSmrg    app = process->defaultAppContext;
113444c061aSmrg    UNLOCK_PROCESS;
114444c061aSmrg    return app;
115444c061aSmrg}
116444c061aSmrg
117a3bd7f05Smrgstatic void
118a3bd7f05SmrgAddToAppContext(Display *d, XtAppContext app)
119444c061aSmrg{
120444c061aSmrg#define DISPLAYS_TO_ADD 4
121444c061aSmrg
122a3bd7f05Smrg    if (app->count >= app->max) {
123a3bd7f05Smrg        app->max = (short) (app->max + DISPLAYS_TO_ADD);
124a3bd7f05Smrg        app->list = (Display **) XtRealloc((char *) app->list,
125a3bd7f05Smrg                                           (Cardinal) (((size_t) app->max) *
126a3bd7f05Smrg                                                       sizeof(Display *)));
127a3bd7f05Smrg    }
128444c061aSmrg
129a3bd7f05Smrg    app->list[app->count++] = d;
130a3bd7f05Smrg    app->rebuild_fdlist = TRUE;
1310568f49bSmrg#ifdef USE_POLL
132a3bd7f05Smrg    app->fds.nfds++;
1330568f49bSmrg#else
134a3bd7f05Smrg    if (ConnectionNumber(d) + 1 > app->fds.nfds) {
135a3bd7f05Smrg        app->fds.nfds = ConnectionNumber(d) + 1;
136a3bd7f05Smrg    }
137444c061aSmrg#endif
138444c061aSmrg#undef DISPLAYS_TO_ADD
139444c061aSmrg}
140444c061aSmrg
141a3bd7f05Smrgstatic void
142a3bd7f05SmrgXtDeleteFromAppContext(Display *d, register XtAppContext app)
143444c061aSmrg{
144a3bd7f05Smrg    register int i;
145a3bd7f05Smrg
146a3bd7f05Smrg    for (i = 0; i < app->count; i++)
147a3bd7f05Smrg        if (app->list[i] == d)
148a3bd7f05Smrg            break;
149a3bd7f05Smrg
150a3bd7f05Smrg    if (i < app->count) {
151a3bd7f05Smrg        if (i <= app->last && app->last > 0)
152a3bd7f05Smrg            app->last--;
153a3bd7f05Smrg        for (i++; i < app->count; i++)
154a3bd7f05Smrg            app->list[i - 1] = app->list[i];
155a3bd7f05Smrg        app->count--;
156a3bd7f05Smrg    }
157a3bd7f05Smrg    app->rebuild_fdlist = TRUE;
1580568f49bSmrg#ifdef USE_POLL
159a3bd7f05Smrg    app->fds.nfds--;
1600568f49bSmrg#else
161a3bd7f05Smrg    if ((ConnectionNumber(d) + 1) == app->fds.nfds)
162a3bd7f05Smrg        app->fds.nfds--;
163a3bd7f05Smrg    else                        /* Unnecessary, just to be fool-proof */
164a3bd7f05Smrg        FD_CLR(ConnectionNumber(d), &app->fds.rmask);
165444c061aSmrg#endif
166444c061aSmrg}
167444c061aSmrg
168a3bd7f05Smrgstatic XtPerDisplay
169a3bd7f05SmrgNewPerDisplay(Display *dpy)
170444c061aSmrg{
171a3bd7f05Smrg    PerDisplayTablePtr pd;
172a3bd7f05Smrg
173a3bd7f05Smrg    pd = XtNew(PerDisplayTable);
174a3bd7f05Smrg
175a3bd7f05Smrg    LOCK_PROCESS;
176a3bd7f05Smrg    pd->dpy = dpy;
177a3bd7f05Smrg    pd->next = _XtperDisplayList;
178a3bd7f05Smrg    _XtperDisplayList = pd;
179a3bd7f05Smrg    UNLOCK_PROCESS;
180a3bd7f05Smrg    return &(pd->perDpy);
181444c061aSmrg}
182444c061aSmrg
183a3bd7f05Smrgstatic XtPerDisplay
184a3bd7f05SmrgInitPerDisplay(Display *dpy,
185a3bd7f05Smrg               XtAppContext app,
186a3bd7f05Smrg               _Xconst char *name,
187a3bd7f05Smrg               _Xconst char *classname)
188444c061aSmrg{
189444c061aSmrg    XtPerDisplay pd;
190444c061aSmrg
191444c061aSmrg    AddToAppContext(dpy, app);
192444c061aSmrg
193444c061aSmrg    pd = NewPerDisplay(dpy);
194444c061aSmrg    _XtHeapInit(&pd->heap);
195444c061aSmrg    pd->destroy_callbacks = NULL;
196444c061aSmrg    pd->region = XCreateRegion();
197444c061aSmrg    pd->case_cvt = NULL;
198444c061aSmrg    pd->defaultKeycodeTranslator = XtTranslateKey;
199444c061aSmrg    pd->keysyms_serial = 0;
200444c061aSmrg    pd->keysyms = NULL;
201444c061aSmrg    XDisplayKeycodes(dpy, &pd->min_keycode, &pd->max_keycode);
202444c061aSmrg    pd->modKeysyms = NULL;
203444c061aSmrg    pd->modsToKeysyms = NULL;
204444c061aSmrg    pd->appContext = app;
205444c061aSmrg    pd->name = XrmStringToName(name);
206444c061aSmrg    pd->class = XrmStringToClass(classname);
207444c061aSmrg    pd->being_destroyed = False;
208444c061aSmrg    pd->GClist = NULL;
209444c061aSmrg    pd->pixmap_tab = NULL;
210444c061aSmrg    pd->language = NULL;
211444c061aSmrg    pd->rv = False;
212444c061aSmrg    pd->last_event.xany.serial = 0;
213444c061aSmrg    pd->last_timestamp = 0;
214444c061aSmrg    _XtAllocTMContext(pd);
215444c061aSmrg    pd->mapping_callbacks = NULL;
216444c061aSmrg
217444c061aSmrg    pd->pdi.grabList = NULL;
218444c061aSmrg    pd->pdi.trace = NULL;
219444c061aSmrg    pd->pdi.traceDepth = 0;
220444c061aSmrg    pd->pdi.traceMax = 0;
221444c061aSmrg    pd->pdi.focusWidget = NULL;
222444c061aSmrg    pd->pdi.activatingKey = 0;
223444c061aSmrg    pd->pdi.keyboard.grabType = XtNoServerGrab;
224a3bd7f05Smrg    pd->pdi.pointer.grabType = XtNoServerGrab;
225a3bd7f05Smrg
226444c061aSmrg    _XtAllocWWTable(pd);
227a3bd7f05Smrg    pd->per_screen_db = (XrmDatabase *) __XtCalloc((Cardinal) ScreenCount(dpy),
228a3bd7f05Smrg                                                   (Cardinal)
229a3bd7f05Smrg                                                   sizeof(XrmDatabase));
230a3bd7f05Smrg    pd->cmd_db = (XrmDatabase) NULL;
231a3bd7f05Smrg    pd->server_db = (XrmDatabase) NULL;
232444c061aSmrg    pd->dispatcher_list = NULL;
233444c061aSmrg    pd->ext_select_list = NULL;
234444c061aSmrg    pd->ext_select_count = 0;
235444c061aSmrg    pd->hook_object = NULL;
236444c061aSmrg#if 0
237444c061aSmrg    pd->hook_object = _XtCreate("hooks", "Hooks", hookObjectClass,
238a3bd7f05Smrg                                (Widget) NULL,
239a3bd7f05Smrg                                (Screen *) DefaultScreenOfDisplay(dpy),
240a3bd7f05Smrg                                (ArgList) NULL, 0, (XtTypedArgList) NULL, 0,
241a3bd7f05Smrg                                (ConstraintWidgetClass) NULL);
242444c061aSmrg#endif
243444c061aSmrg
244444c061aSmrg#ifndef X_NO_RESOURCE_CONFIGURATION_MANAGEMENT
245a3bd7f05Smrg    pd->rcm_init = XInternAtom(dpy, RCM_INIT, 0);
246a3bd7f05Smrg    pd->rcm_data = XInternAtom(dpy, RCM_DATA, 0);
247444c061aSmrg#endif
248444c061aSmrg
249444c061aSmrg    return pd;
250444c061aSmrg}
251444c061aSmrg
252a3bd7f05Smrg#define THIS_FUNC "XtOpenDisplay"
253a3bd7f05SmrgDisplay *
254a3bd7f05SmrgXtOpenDisplay(XtAppContext app,
255a3bd7f05Smrg              _Xconst _XtString displayName,
256a3bd7f05Smrg              _Xconst _XtString applName,
257a3bd7f05Smrg              _Xconst _XtString className,
258a3bd7f05Smrg              XrmOptionDescRec *urlist,
259a3bd7f05Smrg              Cardinal num_urs,
260a3bd7f05Smrg              int *argc,
261a3bd7f05Smrg              _XtString *argv)
262444c061aSmrg{
263a3bd7f05Smrg    Display *d;
264a3bd7f05Smrg    XrmDatabase db = NULL;
265a3bd7f05Smrg    String language = NULL;
266a3bd7f05Smrg
267a3bd7f05Smrg    LOCK_APP(app);
268a3bd7f05Smrg    LOCK_PROCESS;
269a3bd7f05Smrg    /* parse the command line for name, display, and/or language */
270a3bd7f05Smrg    db = _XtPreparseCommandLine(urlist, num_urs, *argc, argv,
271a3bd7f05Smrg                                (String *) &applName,
272a3bd7f05Smrg                                (String *) (displayName ? NULL : &displayName),
273a3bd7f05Smrg                                (app->process->globalLangProcRec.proc ?
274a3bd7f05Smrg                                 &language : NULL));
275a3bd7f05Smrg    UNLOCK_PROCESS;
276a3bd7f05Smrg    d = XOpenDisplay(displayName);
277a3bd7f05Smrg    if (d != NULL) {
278a3bd7f05Smrg        if (ScreenCount(d) <= 0) {
279a3bd7f05Smrg            XtErrorMsg("nullDisplay",
280a3bd7f05Smrg                       THIS_FUNC, XtCXtToolkitError,
281a3bd7f05Smrg                       THIS_FUNC " requires a non-NULL display",
282a3bd7f05Smrg                       NULL, NULL);
283a3bd7f05Smrg        }
284a3bd7f05Smrg        if (DefaultScreen(d) < 0 || DefaultScreen(d) >= ScreenCount(d)) {
285a3bd7f05Smrg            XtWarningMsg("nullDisplay",
286a3bd7f05Smrg                         THIS_FUNC, XtCXtToolkitError,
287a3bd7f05Smrg                         THIS_FUNC " default screen is invalid (ignoring)",
288a3bd7f05Smrg                         NULL, NULL);
289a3bd7f05Smrg            DefaultScreen(d) = 0;
290a3bd7f05Smrg        }
291a3bd7f05Smrg    }
292a3bd7f05Smrg
293a3bd7f05Smrg    if (!applName && !(applName = getenv("RESOURCE_NAME"))) {
294a3bd7f05Smrg        if (*argc > 0 && argv[0] && *argv[0]) {
295444c061aSmrg#ifdef WIN32
296a3bd7f05Smrg            char *ptr = strrchr(argv[0], '\\');
297444c061aSmrg#else
298a3bd7f05Smrg            char *ptr = strrchr(argv[0], '/');
299444c061aSmrg#endif
300444c061aSmrg
301a3bd7f05Smrg            if (ptr)
302a3bd7f05Smrg                applName = ++ptr;
303a3bd7f05Smrg            else
304a3bd7f05Smrg                applName = argv[0];
305a3bd7f05Smrg        }
306a3bd7f05Smrg        else
307a3bd7f05Smrg            applName = "main";
308a3bd7f05Smrg    }
309a3bd7f05Smrg
310a3bd7f05Smrg    if (d) {
311a3bd7f05Smrg        XtPerDisplay pd;
312a3bd7f05Smrg
313a3bd7f05Smrg        pd = InitPerDisplay(d, app, applName, className);
314a3bd7f05Smrg        pd->language = language;
315a3bd7f05Smrg        _XtDisplayInitialize(d, pd, applName, urlist, num_urs, argc, argv);
316a3bd7f05Smrg    }
317a3bd7f05Smrg    else {
318a3bd7f05Smrg        int len;
319a3bd7f05Smrg
320a3bd7f05Smrg        displayName = XDisplayName(displayName);
321a3bd7f05Smrg        len = (int) strlen(displayName);
322a3bd7f05Smrg        app->display_name_tried = (_XtString) __XtMalloc((Cardinal) (len + 1));
323a3bd7f05Smrg        strncpy((char *) app->display_name_tried, displayName,
324a3bd7f05Smrg                (size_t) (len + 1));
325a3bd7f05Smrg        app->display_name_tried[len] = '\0';
326a3bd7f05Smrg    }
327a3bd7f05Smrg    if (db)
328a3bd7f05Smrg        XrmDestroyDatabase(db);
329a3bd7f05Smrg    UNLOCK_APP(app);
330a3bd7f05Smrg    return d;
331444c061aSmrg}
332444c061aSmrg
333444c061aSmrgDisplay *
334a3bd7f05Smrg_XtAppInit(XtAppContext *app_context_return,
335a3bd7f05Smrg           String application_class,
336a3bd7f05Smrg           XrmOptionDescRec *options,
337a3bd7f05Smrg           Cardinal num_options,
338a3bd7f05Smrg           int *argc_in_out,
339a3bd7f05Smrg           _XtString **argv_in_out,
340a3bd7f05Smrg           String *fallback_resources)
341444c061aSmrg{
3420568f49bSmrg    _XtString *saved_argv;
343444c061aSmrg    int i;
344444c061aSmrg    Display *dpy;
345444c061aSmrg
346a3bd7f05Smrg    /*
347a3bd7f05Smrg     * Save away argv and argc so we can set the properties later
348a3bd7f05Smrg     */
3490568f49bSmrg    saved_argv = (_XtString *)
350a3bd7f05Smrg        __XtMalloc((Cardinal)
351a3bd7f05Smrg                   ((size_t) (*argc_in_out + 1) * sizeof(_XtString)));
352444c061aSmrg
353a3bd7f05Smrg    for (i = 0; i < *argc_in_out; i++)
354a3bd7f05Smrg        saved_argv[i] = (*argv_in_out)[i];
355a3bd7f05Smrg    saved_argv[i] = NULL;       /* NULL terminate that sucker. */
356444c061aSmrg
357444c061aSmrg    *app_context_return = XtCreateApplicationContext();
358444c061aSmrg
359444c061aSmrg    LOCK_APP((*app_context_return));
360a3bd7f05Smrg    if (fallback_resources)     /* save a procedure call */
361a3bd7f05Smrg        XtAppSetFallbackResources(*app_context_return, fallback_resources);
362444c061aSmrg
3630568f49bSmrg    dpy = XtOpenDisplay(*app_context_return, NULL, NULL,
364a3bd7f05Smrg                        application_class,
365a3bd7f05Smrg                        options, num_options, argc_in_out, *argv_in_out);
366444c061aSmrg
367444c061aSmrg    if (!dpy) {
368a3bd7f05Smrg        String param = (*app_context_return)->display_name_tried;
369a3bd7f05Smrg        Cardinal param_count = 1;
370a3bd7f05Smrg
371a3bd7f05Smrg        XtErrorMsg("invalidDisplay", "xtInitialize", XtCXtToolkitError,
372444c061aSmrg                   "Can't open display: %s", &param, &param_count);
373a3bd7f05Smrg        XtFree((char *) (*app_context_return)->display_name_tried);
374444c061aSmrg    }
375444c061aSmrg    *argv_in_out = saved_argv;
376444c061aSmrg    UNLOCK_APP((*app_context_return));
377444c061aSmrg    return dpy;
378444c061aSmrg}
379444c061aSmrg
380444c061aSmrgvoid
381a3bd7f05SmrgXtDisplayInitialize(XtAppContext app,
382a3bd7f05Smrg                    Display *dpy,
383a3bd7f05Smrg                    _Xconst _XtString name,
384a3bd7f05Smrg                    _Xconst _XtString classname,
385a3bd7f05Smrg                    XrmOptionDescRec *urlist,
386a3bd7f05Smrg                    Cardinal num_urs,
387a3bd7f05Smrg                    int *argc,
388a3bd7f05Smrg                    _XtString *argv)
389444c061aSmrg{
390444c061aSmrg    XtPerDisplay pd;
3912265a131Smrg    XrmDatabase db = NULL;
392444c061aSmrg
393444c061aSmrg    LOCK_APP(app);
394444c061aSmrg    pd = InitPerDisplay(dpy, app, name, classname);
395444c061aSmrg    LOCK_PROCESS;
396444c061aSmrg    if (app->process->globalLangProcRec.proc)
397a3bd7f05Smrg        /* pre-parse the command line for the language resource */
398a3bd7f05Smrg        db = _XtPreparseCommandLine(urlist, num_urs, *argc, argv, NULL, NULL,
399a3bd7f05Smrg                                    &pd->language);
400444c061aSmrg    UNLOCK_PROCESS;
401444c061aSmrg    _XtDisplayInitialize(dpy, pd, name, urlist, num_urs, argc, argv);
402a3bd7f05Smrg    if (db)
403a3bd7f05Smrg        XrmDestroyDatabase(db);
404444c061aSmrg    UNLOCK_APP(app);
405444c061aSmrg}
406444c061aSmrg
407a3bd7f05SmrgXtAppContext
408a3bd7f05SmrgXtCreateApplicationContext(void)
409444c061aSmrg{
410a3bd7f05Smrg    XtAppContext app = XtNew(XtAppStruct);
411a3bd7f05Smrg
412444c061aSmrg#ifdef XTHREADS
413a3bd7f05Smrg    app->lock_info = NULL;
414a3bd7f05Smrg    app->lock = NULL;
415a3bd7f05Smrg    app->unlock = NULL;
416a3bd7f05Smrg    app->yield_lock = NULL;
417a3bd7f05Smrg    app->restore_lock = NULL;
418a3bd7f05Smrg    app->free_lock = NULL;
419444c061aSmrg#endif
420a3bd7f05Smrg    INIT_APP_LOCK(app);
421a3bd7f05Smrg    LOCK_APP(app);
422a3bd7f05Smrg    LOCK_PROCESS;
423a3bd7f05Smrg    app->process = _XtGetProcessContext();
424a3bd7f05Smrg    app->next = app->process->appContextList;
425a3bd7f05Smrg    app->process->appContextList = app;
426a3bd7f05Smrg    app->langProcRec.proc = app->process->globalLangProcRec.proc;
427a3bd7f05Smrg    app->langProcRec.closure = app->process->globalLangProcRec.closure;
428a3bd7f05Smrg    app->destroy_callbacks = NULL;
429a3bd7f05Smrg    app->list = NULL;
430a3bd7f05Smrg    app->count = app->max = app->last = 0;
431a3bd7f05Smrg    app->timerQueue = NULL;
432a3bd7f05Smrg    app->workQueue = NULL;
433a3bd7f05Smrg    app->signalQueue = NULL;
434a3bd7f05Smrg    app->input_list = NULL;
435a3bd7f05Smrg    app->outstandingQueue = NULL;
436a3bd7f05Smrg    app->errorDB = NULL;
437a3bd7f05Smrg    _XtSetDefaultErrorHandlers(&app->errorMsgHandler,
438a3bd7f05Smrg                               &app->warningMsgHandler, &app->errorHandler,
439a3bd7f05Smrg                               &app->warningHandler);
440a3bd7f05Smrg    app->action_table = NULL;
441a3bd7f05Smrg    _XtSetDefaultSelectionTimeout(&app->selectionTimeout);
442a3bd7f05Smrg    _XtSetDefaultConverterTable(&app->converterTable);
443a3bd7f05Smrg    app->sync = app->being_destroyed = app->error_inited = FALSE;
444a3bd7f05Smrg    app->in_phase2_destroy = NULL;
445444c061aSmrg#ifndef USE_POLL
446a3bd7f05Smrg    FD_ZERO(&app->fds.rmask);
447a3bd7f05Smrg    FD_ZERO(&app->fds.wmask);
448a3bd7f05Smrg    FD_ZERO(&app->fds.emask);
449444c061aSmrg#endif
450a3bd7f05Smrg    app->fds.nfds = 0;
451a3bd7f05Smrg    app->input_count = app->input_max = 0;
452a3bd7f05Smrg    _XtHeapInit(&app->heap);
453a3bd7f05Smrg    app->fallback_resources = NULL;
454a3bd7f05Smrg    _XtPopupInitialize(app);
455a3bd7f05Smrg    app->action_hook_list = NULL;
456a3bd7f05Smrg    app->block_hook_list = NULL;
457a3bd7f05Smrg    app->destroy_list_size = app->destroy_count = app->dispatch_level = 0;
458a3bd7f05Smrg    app->destroy_list = NULL;
459444c061aSmrg#ifndef NO_IDENTIFY_WINDOWS
460a3bd7f05Smrg    app->identify_windows = False;
461444c061aSmrg#endif
462a3bd7f05Smrg    app->free_bindings = NULL;
463a3bd7f05Smrg    app->display_name_tried = NULL;
464a3bd7f05Smrg    app->dpy_destroy_count = 0;
465a3bd7f05Smrg    app->dpy_destroy_list = NULL;
466a3bd7f05Smrg    app->exit_flag = FALSE;
467a3bd7f05Smrg    app->rebuild_fdlist = TRUE;
468a3bd7f05Smrg    UNLOCK_PROCESS;
469a3bd7f05Smrg    UNLOCK_APP(app);
470a3bd7f05Smrg    return app;
471444c061aSmrg}
472444c061aSmrg
473a3bd7f05Smrgvoid
474a3bd7f05SmrgXtAppSetExitFlag(XtAppContext app)
475444c061aSmrg{
476444c061aSmrg    LOCK_APP(app);
477444c061aSmrg    app->exit_flag = TRUE;
478444c061aSmrg    UNLOCK_APP(app);
479444c061aSmrg}
480444c061aSmrg
481a3bd7f05SmrgBoolean
482a3bd7f05SmrgXtAppGetExitFlag(XtAppContext app)
483444c061aSmrg{
484444c061aSmrg    Boolean retval;
485a3bd7f05Smrg
486444c061aSmrg    LOCK_APP(app);
487444c061aSmrg    retval = app->exit_flag;
488444c061aSmrg    UNLOCK_APP(app);
489444c061aSmrg    return retval;
490444c061aSmrg}
491444c061aSmrg
492a3bd7f05Smrgstatic void
493a3bd7f05SmrgDestroyAppContext(XtAppContext app)
494444c061aSmrg{
495a3bd7f05Smrg    XtAppContext *prev_app;
496a3bd7f05Smrg
497a3bd7f05Smrg    prev_app = &app->process->appContextList;
498a3bd7f05Smrg    while (app->count-- > 0)
499a3bd7f05Smrg        XtCloseDisplay(app->list[app->count]);
500a3bd7f05Smrg    if (app->list != NULL)
501a3bd7f05Smrg        XtFree((char *) app->list);
502a3bd7f05Smrg    _XtFreeConverterTable(app->converterTable);
503a3bd7f05Smrg    _XtCacheFlushTag(app, (XtPointer) &app->heap);
504a3bd7f05Smrg    _XtFreeActions(app->action_table);
505a3bd7f05Smrg    if (app->destroy_callbacks != NULL) {
506a3bd7f05Smrg        XtCallCallbackList((Widget) NULL,
507a3bd7f05Smrg                           (XtCallbackList) app->destroy_callbacks,
508a3bd7f05Smrg                           (XtPointer) app);
509a3bd7f05Smrg        _XtRemoveAllCallbacks(&app->destroy_callbacks);
510a3bd7f05Smrg    }
511a3bd7f05Smrg    while (app->timerQueue)
512a3bd7f05Smrg        XtRemoveTimeOut((XtIntervalId) app->timerQueue);
513a3bd7f05Smrg    while (app->workQueue)
514a3bd7f05Smrg        XtRemoveWorkProc((XtWorkProcId) app->workQueue);
515a3bd7f05Smrg    while (app->signalQueue)
516a3bd7f05Smrg        XtRemoveSignal((XtSignalId) app->signalQueue);
517a3bd7f05Smrg    if (app->input_list)
518a3bd7f05Smrg        _XtRemoveAllInputs(app);
519a3bd7f05Smrg    XtFree((char *) app->destroy_list);
520a3bd7f05Smrg    _XtHeapFree(&app->heap);
521a3bd7f05Smrg    while (*prev_app != app)
522a3bd7f05Smrg        prev_app = &(*prev_app)->next;
523a3bd7f05Smrg    *prev_app = app->next;
524a3bd7f05Smrg    if (app->process->defaultAppContext == app)
525a3bd7f05Smrg        app->process->defaultAppContext = NULL;
526a3bd7f05Smrg    if (app->free_bindings)
527a3bd7f05Smrg        _XtDoFreeBindings(app);
528a3bd7f05Smrg    FREE_APP_LOCK(app);
529a3bd7f05Smrg    XtFree((char *) app);
530444c061aSmrg}
531444c061aSmrg
532a3bd7f05Smrgstatic XtAppContext *appDestroyList = NULL;
533444c061aSmrgint _XtAppDestroyCount = 0;
534444c061aSmrg
535a3bd7f05Smrgvoid
536a3bd7f05SmrgXtDestroyApplicationContext(XtAppContext app)
537444c061aSmrg{
538a3bd7f05Smrg    LOCK_APP(app);
539a3bd7f05Smrg    if (app->being_destroyed) {
540a3bd7f05Smrg        UNLOCK_APP(app);
541a3bd7f05Smrg        return;
542a3bd7f05Smrg    }
543a3bd7f05Smrg
544a3bd7f05Smrg    if (_XtSafeToDestroy(app)) {
545a3bd7f05Smrg        LOCK_PROCESS;
546a3bd7f05Smrg        DestroyAppContext(app);
547a3bd7f05Smrg        UNLOCK_PROCESS;
548a3bd7f05Smrg    }
549a3bd7f05Smrg    else {
550a3bd7f05Smrg        app->being_destroyed = TRUE;
551a3bd7f05Smrg        LOCK_PROCESS;
552a3bd7f05Smrg        _XtAppDestroyCount++;
553a3bd7f05Smrg        appDestroyList =
554a3bd7f05Smrg            (XtAppContext *) XtRealloc((char *) appDestroyList,
555a3bd7f05Smrg                                       (unsigned) ((size_t) _XtAppDestroyCount *
556a3bd7f05Smrg                                                   sizeof(XtAppContext)));
557a3bd7f05Smrg        appDestroyList[_XtAppDestroyCount - 1] = app;
558a3bd7f05Smrg        UNLOCK_PROCESS;
559a3bd7f05Smrg        UNLOCK_APP(app);
560a3bd7f05Smrg    }
561444c061aSmrg}
562444c061aSmrg
563a3bd7f05Smrgvoid
564a3bd7f05Smrg_XtDestroyAppContexts(void)
565444c061aSmrg{
566a3bd7f05Smrg    int i, ii;
567a3bd7f05Smrg    XtAppContext apps[8];
568a3bd7f05Smrg    XtAppContext *pApps;
569a3bd7f05Smrg
570a3bd7f05Smrg    pApps =
571a3bd7f05Smrg        XtStackAlloc(sizeof(XtAppContext) * (size_t) _XtAppDestroyCount, apps);
572a3bd7f05Smrg
573a3bd7f05Smrg    for (i = ii = 0; i < _XtAppDestroyCount; i++) {
574a3bd7f05Smrg        if (_XtSafeToDestroy(appDestroyList[i]))
575a3bd7f05Smrg            DestroyAppContext(appDestroyList[i]);
576a3bd7f05Smrg        else
577a3bd7f05Smrg            pApps[ii++] = appDestroyList[i];
578a3bd7f05Smrg    }
579a3bd7f05Smrg    _XtAppDestroyCount = ii;
580a3bd7f05Smrg    if (_XtAppDestroyCount == 0) {
581a3bd7f05Smrg        XtFree((char *) appDestroyList);
582a3bd7f05Smrg        appDestroyList = NULL;
583a3bd7f05Smrg    }
584a3bd7f05Smrg    else {
585a3bd7f05Smrg        for (i = 0; i < ii; i++)
586a3bd7f05Smrg            appDestroyList[i] = pApps[i];
587a3bd7f05Smrg    }
588a3bd7f05Smrg    XtStackFree((XtPointer) pApps, apps);
589444c061aSmrg}
590444c061aSmrg
591a3bd7f05SmrgXrmDatabase
592a3bd7f05SmrgXtDatabase(Display *dpy)
593444c061aSmrg{
594444c061aSmrg    XrmDatabase retval;
595a3bd7f05Smrg
596444c061aSmrg    DPY_TO_APPCON(dpy);
597444c061aSmrg
598444c061aSmrg    LOCK_APP(app);
599444c061aSmrg    retval = XrmGetDatabase(dpy);
600444c061aSmrg    UNLOCK_APP(app);
601444c061aSmrg    return retval;
602444c061aSmrg}
603444c061aSmrg
604444c061aSmrgPerDisplayTablePtr _XtperDisplayList = NULL;
605444c061aSmrg
606a3bd7f05SmrgXtPerDisplay
607a3bd7f05Smrg_XtSortPerDisplayList(Display *dpy)
608444c061aSmrg{
609a3bd7f05Smrg    register PerDisplayTablePtr pd, opd = NULL;
610a3bd7f05Smrg    XtPerDisplay result = NULL;
611a3bd7f05Smrg
612a3bd7f05Smrg    LOCK_PROCESS;
613a3bd7f05Smrg    for (pd = _XtperDisplayList; pd != NULL && pd->dpy != dpy; pd = pd->next) {
614a3bd7f05Smrg        opd = pd;
615a3bd7f05Smrg    }
616a3bd7f05Smrg
617a3bd7f05Smrg    if (pd == NULL) {
618a3bd7f05Smrg        XtErrorMsg(XtNnoPerDisplay, "getPerDisplay", XtCXtToolkitError,
619a3bd7f05Smrg                   "Couldn't find per display information", NULL, NULL);
620a3bd7f05Smrg    }
621a3bd7f05Smrg    else {
622a3bd7f05Smrg        if (pd != _XtperDisplayList) {  /* move it to the front */
623a3bd7f05Smrg            /* opd points to the previous one... */
624a3bd7f05Smrg
625a3bd7f05Smrg            opd->next = pd->next;
626a3bd7f05Smrg            pd->next = _XtperDisplayList;
627a3bd7f05Smrg            _XtperDisplayList = pd;
628a3bd7f05Smrg        }
629a3bd7f05Smrg        result = &(pd->perDpy);
630a3bd7f05Smrg    }
631a3bd7f05Smrg    UNLOCK_PROCESS;
632a3bd7f05Smrg    return result;
633444c061aSmrg}
634444c061aSmrg
635a3bd7f05SmrgXtAppContext
636a3bd7f05SmrgXtDisplayToApplicationContext(Display *dpy)
637444c061aSmrg{
638a3bd7f05Smrg    XtAppContext retval;
639444c061aSmrg
640a3bd7f05Smrg    retval = _XtGetPerDisplay(dpy)->appContext;
641a3bd7f05Smrg    return retval;
642444c061aSmrg}
643444c061aSmrg
644a3bd7f05Smrgstatic void
645a3bd7f05SmrgCloseDisplay(Display *dpy)
646444c061aSmrg{
647a3bd7f05Smrg    register XtPerDisplay xtpd = NULL;
648a3bd7f05Smrg    register PerDisplayTablePtr pd, opd = NULL;
649a3bd7f05Smrg    XrmDatabase db;
650a3bd7f05Smrg
651a3bd7f05Smrg    XtDestroyWidget(XtHooksOfDisplay(dpy));
652a3bd7f05Smrg
653a3bd7f05Smrg    LOCK_PROCESS;
654a3bd7f05Smrg    for (pd = _XtperDisplayList; pd != NULL && pd->dpy != dpy; pd = pd->next) {
655a3bd7f05Smrg        opd = pd;
656a3bd7f05Smrg    }
657a3bd7f05Smrg
658a3bd7f05Smrg    if (pd == NULL) {
659a3bd7f05Smrg        XtErrorMsg(XtNnoPerDisplay, "closeDisplay", XtCXtToolkitError,
660a3bd7f05Smrg                   "Couldn't find per display information", NULL, NULL);
661a3bd7f05Smrg    }
662a3bd7f05Smrg    else {
663a3bd7f05Smrg
664a3bd7f05Smrg        if (pd == _XtperDisplayList)
665a3bd7f05Smrg            _XtperDisplayList = pd->next;
666a3bd7f05Smrg        else
667a3bd7f05Smrg            opd->next = pd->next;
668a3bd7f05Smrg
669a3bd7f05Smrg        xtpd = &(pd->perDpy);
670a3bd7f05Smrg    }
671a3bd7f05Smrg
672a3bd7f05Smrg    if (xtpd != NULL) {
673a3bd7f05Smrg        int i;
674a3bd7f05Smrg
675a3bd7f05Smrg        if (xtpd->destroy_callbacks != NULL) {
676a3bd7f05Smrg            XtCallCallbackList((Widget) NULL,
677a3bd7f05Smrg                               (XtCallbackList) xtpd->destroy_callbacks,
678a3bd7f05Smrg                               (XtPointer) xtpd);
679a3bd7f05Smrg            _XtRemoveAllCallbacks(&xtpd->destroy_callbacks);
680a3bd7f05Smrg        }
681a3bd7f05Smrg        if (xtpd->mapping_callbacks != NULL)
682a3bd7f05Smrg            _XtRemoveAllCallbacks(&xtpd->mapping_callbacks);
683a3bd7f05Smrg        XtDeleteFromAppContext(dpy, xtpd->appContext);
684a3bd7f05Smrg        if (xtpd->keysyms)
685a3bd7f05Smrg            XFree((char *) xtpd->keysyms);
686a3bd7f05Smrg        XtFree((char *) xtpd->modKeysyms);
687a3bd7f05Smrg        XtFree((char *) xtpd->modsToKeysyms);
688a3bd7f05Smrg        xtpd->keysyms_per_keycode = 0;
689a3bd7f05Smrg        xtpd->being_destroyed = FALSE;
690a3bd7f05Smrg        xtpd->keysyms = NULL;
691a3bd7f05Smrg        xtpd->modKeysyms = NULL;
692a3bd7f05Smrg        xtpd->modsToKeysyms = NULL;
693a3bd7f05Smrg        XDestroyRegion(xtpd->region);
694a3bd7f05Smrg        _XtCacheFlushTag(xtpd->appContext, (XtPointer) &xtpd->heap);
695a3bd7f05Smrg        _XtGClistFree(dpy, xtpd);
696a3bd7f05Smrg        XtFree((char *) xtpd->pdi.trace);
697a3bd7f05Smrg        _XtHeapFree(&xtpd->heap);
698a3bd7f05Smrg        _XtFreeWWTable(xtpd);
699a3bd7f05Smrg        xtpd->per_screen_db[DefaultScreen(dpy)] = (XrmDatabase) NULL;
700a3bd7f05Smrg        for (i = ScreenCount(dpy); --i >= 0;) {
701a3bd7f05Smrg            db = xtpd->per_screen_db[i];
702a3bd7f05Smrg            if (db)
703a3bd7f05Smrg                XrmDestroyDatabase(db);
704444c061aSmrg        }
705a3bd7f05Smrg        XtFree((char *) xtpd->per_screen_db);
706a3bd7f05Smrg        if ((db = XrmGetDatabase(dpy)))
707a3bd7f05Smrg            XrmDestroyDatabase(db);
708a3bd7f05Smrg        if (xtpd->cmd_db)
709a3bd7f05Smrg            XrmDestroyDatabase(xtpd->cmd_db);
710a3bd7f05Smrg        if (xtpd->server_db)
711a3bd7f05Smrg            XrmDestroyDatabase(xtpd->server_db);
712a3bd7f05Smrg        XtFree((_XtString) xtpd->language);
713a3bd7f05Smrg        if (xtpd->dispatcher_list != NULL)
714a3bd7f05Smrg            XtFree((char *) xtpd->dispatcher_list);
715a3bd7f05Smrg        if (xtpd->ext_select_list != NULL)
716a3bd7f05Smrg            XtFree((char *) xtpd->ext_select_list);
717a3bd7f05Smrg    }
718a3bd7f05Smrg    XtFree((char *) pd);
719a3bd7f05Smrg    XrmSetDatabase(dpy, (XrmDatabase) NULL);
720a3bd7f05Smrg    XCloseDisplay(dpy);
721a3bd7f05Smrg    UNLOCK_PROCESS;
722444c061aSmrg}
723444c061aSmrg
724a3bd7f05Smrgvoid
725a3bd7f05SmrgXtCloseDisplay(Display *dpy)
726444c061aSmrg{
727a3bd7f05Smrg    XtPerDisplay pd;
728a3bd7f05Smrg    XtAppContext app = XtDisplayToApplicationContext(dpy);
729a3bd7f05Smrg
730a3bd7f05Smrg    LOCK_APP(app);
731a3bd7f05Smrg    pd = _XtGetPerDisplay(dpy);
732a3bd7f05Smrg    if (pd->being_destroyed) {
733a3bd7f05Smrg        UNLOCK_APP(app);
734a3bd7f05Smrg        return;
735a3bd7f05Smrg    }
736a3bd7f05Smrg
737a3bd7f05Smrg    if (_XtSafeToDestroy(app))
738a3bd7f05Smrg        CloseDisplay(dpy);
739a3bd7f05Smrg    else {
740a3bd7f05Smrg        pd->being_destroyed = TRUE;
741a3bd7f05Smrg        app->dpy_destroy_count++;
742a3bd7f05Smrg        app->dpy_destroy_list = (Display **)
743a3bd7f05Smrg            XtRealloc((char *) app->dpy_destroy_list,
744a3bd7f05Smrg                      (Cardinal) ((size_t) app->dpy_destroy_count *
745a3bd7f05Smrg                                  sizeof(Display *)));
746a3bd7f05Smrg        app->dpy_destroy_list[app->dpy_destroy_count - 1] = dpy;
747a3bd7f05Smrg    }
748a3bd7f05Smrg    UNLOCK_APP(app);
749444c061aSmrg}
750444c061aSmrg
751a3bd7f05Smrgvoid
752a3bd7f05Smrg_XtCloseDisplays(XtAppContext app)
753444c061aSmrg{
754a3bd7f05Smrg    int i;
755a3bd7f05Smrg
756a3bd7f05Smrg    LOCK_APP(app);
757a3bd7f05Smrg    for (i = 0; i < app->dpy_destroy_count; i++) {
758a3bd7f05Smrg        CloseDisplay(app->dpy_destroy_list[i]);
759a3bd7f05Smrg    }
760a3bd7f05Smrg    app->dpy_destroy_count = 0;
761a3bd7f05Smrg    XtFree((char *) app->dpy_destroy_list);
762a3bd7f05Smrg    app->dpy_destroy_list = NULL;
763a3bd7f05Smrg    UNLOCK_APP(app);
764444c061aSmrg}
765444c061aSmrg
766a3bd7f05SmrgXtAppContext
767a3bd7f05SmrgXtWidgetToApplicationContext(Widget w)
768444c061aSmrg{
769a3bd7f05Smrg    XtAppContext retval;
770444c061aSmrg
771a3bd7f05Smrg    retval = _XtGetPerDisplay(XtDisplayOfObject(w))->appContext;
772a3bd7f05Smrg    return retval;
773444c061aSmrg}
774444c061aSmrg
775a3bd7f05Smrgvoid
776a3bd7f05SmrgXtGetApplicationNameAndClass(Display *dpy,
777a3bd7f05Smrg                             String *name_return,
778a3bd7f05Smrg                             String *class_return)
779444c061aSmrg{
780444c061aSmrg    XtPerDisplay pd;
781444c061aSmrg
782444c061aSmrg    pd = _XtGetPerDisplay(dpy);
783444c061aSmrg    *name_return = XrmQuarkToString(pd->name);
784444c061aSmrg    *class_return = XrmQuarkToString(pd->class);
785444c061aSmrg}
786444c061aSmrg
787a3bd7f05SmrgXtPerDisplay
788a3bd7f05Smrg_XtGetPerDisplay(Display *display)
789444c061aSmrg{
790444c061aSmrg    XtPerDisplay retval;
791444c061aSmrg
792444c061aSmrg    LOCK_PROCESS;
793a3bd7f05Smrg    retval = ((_XtperDisplayList != NULL && _XtperDisplayList->dpy == display)
794a3bd7f05Smrg              ? &_XtperDisplayList->perDpy : _XtSortPerDisplayList(display));
795a3bd7f05Smrg
796444c061aSmrg    UNLOCK_PROCESS;
797444c061aSmrg    return retval;
798444c061aSmrg}
799444c061aSmrg
800a3bd7f05SmrgXtPerDisplayInputRec *
801a3bd7f05Smrg_XtGetPerDisplayInput(Display *display)
802444c061aSmrg{
803a3bd7f05Smrg    XtPerDisplayInputRec *retval;
804a3bd7f05Smrg
805444c061aSmrg    LOCK_PROCESS;
806a3bd7f05Smrg    retval = ((_XtperDisplayList != NULL && _XtperDisplayList->dpy == display)
807a3bd7f05Smrg              ? &_XtperDisplayList->perDpy.pdi
808a3bd7f05Smrg              : &_XtSortPerDisplayList(display)->pdi);
809444c061aSmrg    UNLOCK_PROCESS;
810444c061aSmrg    return retval;
811444c061aSmrg}
812444c061aSmrg
813a3bd7f05Smrgvoid
814a3bd7f05SmrgXtGetDisplays(XtAppContext app_context,
815a3bd7f05Smrg              Display ***dpy_return,
816a3bd7f05Smrg              Cardinal *num_dpy_return)
817444c061aSmrg{
818444c061aSmrg    int ii;
819a3bd7f05Smrg
820444c061aSmrg    LOCK_APP(app_context);
821a3bd7f05Smrg    *num_dpy_return = (Cardinal) app_context->count;
822a3bd7f05Smrg    *dpy_return = (Display **)
823a3bd7f05Smrg        __XtMalloc((Cardinal)
824a3bd7f05Smrg                   ((size_t) app_context->count * sizeof(Display *)));
825444c061aSmrg    for (ii = 0; ii < app_context->count; ii++)
826a3bd7f05Smrg        (*dpy_return)[ii] = app_context->list[ii];
827444c061aSmrg    UNLOCK_APP(app_context);
828444c061aSmrg}
829