summaryrefslogtreecommitdiffstats
path: root/xpa/xtloop.c
diff options
context:
space:
mode:
Diffstat (limited to 'xpa/xtloop.c')
-rw-r--r--xpa/xtloop.c261
1 files changed, 261 insertions, 0 deletions
diff --git a/xpa/xtloop.c b/xpa/xtloop.c
new file mode 100644
index 0000000..f712a9e
--- /dev/null
+++ b/xpa/xtloop.c
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
+ */
+
+#include <xpap.h>
+
+#if HAVE_XT
+
+#include <X11/Intrinsic.h>
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ *
+ * Private Routines and Data
+ *
+ *
+ *----------------------------------------------------------------------------
+ */
+
+/*
+ *
+ * record struct for maintining Xt info in Xt select loop
+ *
+ */
+typedef struct xpaxtrec{
+ int fd;
+ void *client_data;
+ XtInputId id;
+} *XPAXt, XPAXtRec;
+
+/* its such a pain to maintain this, so make it global! */
+static XtAppContext xpa_app=NULL;
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * Routine: XPAXtHandler
+ *
+ * Purpose: handle one request for an xpaset or xpaget
+ *
+ * Return: none
+ *
+ *----------------------------------------------------------------------------
+ */
+#ifdef ANSI_FUNC
+static void
+XPAXtHandler (XtPointer client_data, int *fd, XtInputId *id)
+#else
+static void XPAXtHandler(client_data, fd, id)
+ XtPointer client_data;
+ int *fd;
+ XtInputId *id;
+#endif
+{
+ XPAXt xptr = (XPAXt)client_data;
+ if( (xptr == NULL) || (xptr->client_data == NULL) )
+ return;
+ XPAHandler((XPA)xptr->client_data, xptr->fd);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * Routine: XPAXtEnableOneInput
+ *
+ * Purpose: Enable 1 XPA entry from the Xt event loop
+ *
+ * Results: none
+ *
+ *----------------------------------------------------------------------------
+ */
+#ifdef ANSI_FUNC
+static void
+XPAXtEnableOneInput (void *client_data)
+#else
+static void XPAXtEnableOneInput(client_data)
+ void *client_data;
+#endif
+{
+ XPAXt xptr = (XPAXt)client_data;
+ if( xptr == NULL )
+ return;
+ if( xptr->id != (XtInputId)NULL )
+ return;
+ if( xpa_app == NULL ){
+ xptr->id = XtAddInput(xptr->fd,
+ (XtPointer)XtInputReadMask,
+ (XtInputCallbackProc)XPAXtHandler,
+ (XtPointer)xptr);
+ }
+ else{
+ xptr->id = XtAppAddInput(xpa_app, xptr->fd,
+ (XtPointer)XtInputReadMask,
+ (XtInputCallbackProc)XPAXtHandler,
+ (XtPointer)xptr);
+ }
+}
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * Routine: XPAXtDisableOneInput
+ *
+ * Purpose: Disable 1 XPA entry from the Xt event loop
+ *
+ * Results: none
+ *
+ *----------------------------------------------------------------------------
+ */
+#ifdef ANSI_FUNC
+static void
+XPAXtDisableOneInput (void *client_data)
+#else
+static void XPAXtDisableOneInput(client_data)
+ void *client_data;
+#endif
+{
+ XPAXt xptr = (XPAXt)client_data;
+ if( xptr == NULL )
+ return;
+ if( xptr->id == (XtInputId)NULL )
+ return;
+ XtRemoveInput(xptr->id);
+ xptr->id = (XtInputId)NULL;
+}
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * Routine: XPAXtAddOneInput
+ *
+ * Purpose: Add 1 XPA entry to the Xt event loop
+ *
+ * Results: none
+ *
+ *----------------------------------------------------------------------------
+ */
+#ifdef ANSI_FUNC
+static void *
+XPAXtAddOneInput (void *client_data, int fd)
+#else
+static void *XPAXtAddOneInput(client_data, fd)
+ void *client_data;
+ int fd;
+#endif
+{
+ XPAXt xptr;
+ if( fd < 0 )
+ return(NULL);
+ xptr = (XPAXt)xcalloc(1, sizeof(XPAXtRec));
+ xptr->fd = fd;
+ xptr->client_data = client_data;
+ XPAXtEnableOneInput(xptr);
+ return(xptr);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * Routine: XPAXtDelOneInput
+ *
+ * Purpose: Delete 1 XPA entry from the Xt event loop (called by XPAFree)
+ *
+ * Results: none
+ *
+ *----------------------------------------------------------------------------
+ */
+#ifdef ANSI_FUNC
+static void
+XPAXtDelOneInput (void *client_data)
+#else
+static void XPAXtDelOneInput(client_data)
+ void *client_data;
+#endif
+{
+ XPAXt xptr = (XPAXt)client_data;
+ if( xptr == NULL)
+ return;
+ XPAXtDisableOneInput(xptr);
+ xfree(xptr);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ *
+ * Public Routines and Data
+ *
+ *
+ *----------------------------------------------------------------------------
+ */
+
+/*
+ *----------------------------------------------------------------------------
+ *
+ * Routine: XPAXtAddInput
+ *
+ * Purpose: Add XPA entries to the Xt event loop
+ *
+ * Results: number of xpa entried added
+ *
+ *----------------------------------------------------------------------------
+ */
+#ifdef ANSI_FUNC
+int
+XPAXtAddInput (void *app, XPA xpa)
+#else
+int XPAXtAddInput(app, xpa)
+ void *app;
+ XPA xpa;
+#endif
+{
+ XPA cur;
+ int got=0;
+
+ /* save the app context */
+ if( xpa_app == NULL ){
+ xpa_app = (XtAppContext)app;
+ }
+
+ /* if a specific xpa was specified, just add it */
+ if( xpa != NULL ){
+ /* remove old one */
+ if( xpa->seldel && xpa->selptr ){
+ (xpa->seldel)(xpa->selptr);
+ }
+ /* add new one */
+ xpa->seldel = XPAXtDelOneInput;
+ xpa->seladd = XPAXtAddOneInput;
+ xpa->selon = XPAXtEnableOneInput;
+ xpa->seloff = XPAXtDisableOneInput;
+ xpa->selptr = XPAXtAddOneInput((void *)xpa, xpa->fd);
+ got = 1;
+ }
+ /* otherwise set up all xpa's */
+ else{
+ for(cur=(XPA)XPAListHead(); cur!=NULL; cur=cur->next){
+ /* remove old one */
+ if( cur->seldel && cur->selptr ){
+ (cur->seldel)(cur->selptr);
+ }
+ /* add new one */
+ cur->seldel = XPAXtDelOneInput;
+ cur->seladd = XPAXtAddOneInput;
+ cur->selon = XPAXtEnableOneInput;
+ cur->seloff = XPAXtDisableOneInput;
+ cur->selptr = XPAXtAddOneInput((void *)cur, cur->fd);
+ got++;
+ }
+ }
+ return(got);
+}
+
+int xpa_xt = 1;
+
+#else
+
+int xpa_xt = 0;
+
+#endif