|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Copyright 1989, 1998 The Open Group
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Permission to use, copy, modify, distribute, and sell this software and its
|
|
Packit Service |
2b1f13 |
documentation for any purpose is hereby granted without fee, provided that
|
|
Packit Service |
2b1f13 |
the above copyright notice appear in all copies and that both that
|
|
Packit Service |
2b1f13 |
copyright notice and this permission notice appear in supporting
|
|
Packit Service |
2b1f13 |
documentation.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
The above copyright notice and this permission notice shall be included in
|
|
Packit Service |
2b1f13 |
all copies or substantial portions of the Software.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
Packit Service |
2b1f13 |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
Packit Service |
2b1f13 |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
Packit Service |
2b1f13 |
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
Packit Service |
2b1f13 |
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit Service |
2b1f13 |
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Except as contained in this notice, the name of The Open Group shall not be
|
|
Packit Service |
2b1f13 |
used in advertising or otherwise to promote the sale, use or other dealings
|
|
Packit Service |
2b1f13 |
in this Software without prior written authorization from The Open Group.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* Author: Jim Fulton, MIT X Consortium
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
2b1f13 |
#include <config.h>
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#include <stdio.h>
|
|
Packit Service |
2b1f13 |
#include <X11/Xlib.h>
|
|
Packit Service |
2b1f13 |
#include <stdlib.h>
|
|
Packit Service |
2b1f13 |
#include <X11/Xmu/DisplayQue.h>
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* Prototypes
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
static int _DQCloseDisplay(Display*, XPointer);
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#define CallCloseCallback(q,e) (void) (*((q)->closefunc)) ((q), (e))
|
|
Packit Service |
2b1f13 |
#define CallFreeCallback(q) (void) (*((q)->freefunc)) ((q))
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* XmuDQCreate - create a display queue
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
XmuDisplayQueue *
|
|
Packit Service |
2b1f13 |
XmuDQCreate(XmuCloseDisplayQueueProc closefunc,
|
|
Packit Service |
2b1f13 |
XmuFreeDisplayQueueProc freefunc,
|
|
Packit Service |
2b1f13 |
XPointer data)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
XmuDisplayQueue *q = (XmuDisplayQueue *) malloc (sizeof (XmuDisplayQueue));
|
|
Packit Service |
2b1f13 |
if (q) {
|
|
Packit Service |
2b1f13 |
q->nentries = 0;
|
|
Packit Service |
2b1f13 |
q->head = q->tail = NULL;
|
|
Packit Service |
2b1f13 |
q->closefunc = closefunc;
|
|
Packit Service |
2b1f13 |
q->freefunc = freefunc;
|
|
Packit Service |
2b1f13 |
q->data = data;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
return q;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* XmuDQDestroy - free all storage associated with this display queue,
|
|
Packit Service |
2b1f13 |
* optionally invoking the close callbacks.
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Bool
|
|
Packit Service |
2b1f13 |
XmuDQDestroy(XmuDisplayQueue *q, Bool docallbacks)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
XmuDisplayQueueEntry *e = q->head;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
while (e) {
|
|
Packit Service |
2b1f13 |
XmuDisplayQueueEntry *nexte = e->next;
|
|
Packit Service |
2b1f13 |
if (docallbacks && q->closefunc) CallCloseCallback (q, e);
|
|
Packit Service |
2b1f13 |
free ((char *) e);
|
|
Packit Service |
2b1f13 |
e = nexte;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
free ((char *) q);
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* XmuDQLookupDisplay - finds the indicated display on the given queue
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
XmuDisplayQueueEntry *
|
|
Packit Service |
2b1f13 |
XmuDQLookupDisplay(XmuDisplayQueue *q, Display *dpy)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
XmuDisplayQueueEntry *e;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
for (e = q->head; e; e = e->next) {
|
|
Packit Service |
2b1f13 |
if (e->display == dpy) return e;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
return NULL;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* XmuDQAddDisplay - add the specified display to the queue; set data as a
|
|
Packit Service |
2b1f13 |
* convenience. Does not ensure that dpy hasn't already been added.
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
XmuDisplayQueueEntry *
|
|
Packit Service |
2b1f13 |
XmuDQAddDisplay(XmuDisplayQueue *q, Display *dpy, XPointer data)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
XmuDisplayQueueEntry *e;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
if (!(e = (XmuDisplayQueueEntry *) malloc (sizeof (XmuDisplayQueueEntry)))) {
|
|
Packit Service |
2b1f13 |
return NULL;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (!(e->closehook = XmuAddCloseDisplayHook (dpy, _DQCloseDisplay,
|
|
Packit Service |
2b1f13 |
(XPointer) q))) {
|
|
Packit Service |
2b1f13 |
free ((char *) e);
|
|
Packit Service |
2b1f13 |
return NULL;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
e->display = dpy;
|
|
Packit Service |
2b1f13 |
e->next = NULL;
|
|
Packit Service |
2b1f13 |
e->data = data;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
if (q->tail) {
|
|
Packit Service |
2b1f13 |
q->tail->next = e;
|
|
Packit Service |
2b1f13 |
e->prev = q->tail;
|
|
Packit Service |
2b1f13 |
} else {
|
|
Packit Service |
2b1f13 |
q->head = e;
|
|
Packit Service |
2b1f13 |
e->prev = NULL;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
q->tail = e;
|
|
Packit Service |
2b1f13 |
q->nentries++;
|
|
Packit Service |
2b1f13 |
return e;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* XmuDQRemoveDisplay - remove the specified display from the queue
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
Bool
|
|
Packit Service |
2b1f13 |
XmuDQRemoveDisplay(XmuDisplayQueue *q, Display *dpy)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
XmuDisplayQueueEntry *e;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
for (e = q->head; e; e = e->next) {
|
|
Packit Service |
2b1f13 |
if (e->display == dpy) {
|
|
Packit Service |
2b1f13 |
if (q->head == e)
|
|
Packit Service |
2b1f13 |
q->head = e->next; /* if at head, then bump head */
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
e->prev->next = e->next; /* else splice out */
|
|
Packit Service |
2b1f13 |
if (q->tail == e)
|
|
Packit Service |
2b1f13 |
q->tail = e->prev; /* if at tail, then bump tail */
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
e->next->prev = e->prev; /* else splice out */
|
|
Packit Service |
2b1f13 |
(void) XmuRemoveCloseDisplayHook (dpy, e->closehook,
|
|
Packit Service |
2b1f13 |
_DQCloseDisplay, (XPointer) q);
|
|
Packit Service |
2b1f13 |
free ((char *) e);
|
|
Packit Service |
2b1f13 |
q->nentries--;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
return False;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*****************************************************************************
|
|
Packit Service |
2b1f13 |
* private functions *
|
|
Packit Service |
2b1f13 |
*****************************************************************************/
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* _DQCloseDisplay - upcalled from CloseHook to notify this queue; remove the
|
|
Packit Service |
2b1f13 |
* display when finished
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
static int
|
|
Packit Service |
2b1f13 |
_DQCloseDisplay(Display *dpy, XPointer arg)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
XmuDisplayQueue *q = (XmuDisplayQueue *) arg;
|
|
Packit Service |
2b1f13 |
XmuDisplayQueueEntry *e;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
for (e = q->head; e; e = e->next) {
|
|
Packit Service |
2b1f13 |
if (e->display == dpy) {
|
|
Packit Service |
2b1f13 |
if (q->closefunc) CallCloseCallback (q, e);
|
|
Packit Service |
2b1f13 |
(void) XmuDQRemoveDisplay (q, dpy);
|
|
Packit Service |
2b1f13 |
if (q->nentries == 0 && q->freefunc) CallFreeCallback (q);
|
|
Packit Service |
2b1f13 |
return 1;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
return 0;
|
|
Packit Service |
2b1f13 |
}
|