This is send_command.c in view mode; [Download] [Up]
#if ( !defined(lint) && !defined(SABER))
static char PCN_rcsid[] = "$Header: /ufs/comp/carl/PCN/IF/Xpert/RCS/send_command.c,v 1.16 1992/01/23 03:05:52 carl Exp $";
#endif
/******************************************************************************
* *
* Copyright (C) The Aerospace Corporation 1991 *
* *
* This software was developed by The Aerospace Corporation as a *
* research endeavor for the United States Air Force *
* Space Systems Division. The current version of the Gauge *
* computer program is available for release to you for *
* educational and research purposes only. It is not *
* to be used for commercial purposes. *
* *
* In addition, the following conditions shall apply. *
* *
* 1) The computer software and documentation were designed to *
* satisfy internal Aerospace requirements only. *
* The software is provided ``as is,'' and The Aerospace Corporation *
* makes no warranty, expressed or implied, as to it accuracy, *
* functioning, or fitness for a particular purpose. *
* *
* 2) The Aerospace Corporation and its personnel are not *
* responsible for providing technical support or general assistance *
* with respect to the software. *
* *
* 3) Neither The Aerospace Corporation nor its personnel shall be *
* liable for claims, losses, or damages arising out of or connected *
* with the use of this software. *
* Your sole and exclusive remedy shall be to request a replacement *
* copy of the program. *
* *
******************************************************************************/
#include <stdio.h>
#include <sys/param.h>
#include <Xsw/Xsw.h>
#ifdef next040
/* Steve Tuecke, 11/30/92 -- This is a hack to get around the X11R5
* installation on the Argonne MCS NeXTs.
*/
#define X_NOT_POSIX
#endif
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#ifndef EPOCH
#define EPOCH "epoch"
#endif
#ifndef INITFILE
#define INITFILE "xpcn-init.el"
#endif
struct s_message {
String message;
struct s_message *next;
void (*notify)();
Widget w;
XtPointer client_data, call_data;
};
static int EditFound = 0;
static Window editWindow = (Window) NULL;
static Atom cmdProp, ackProp;
static int OkToSend = 1;
static struct s_message *CmdHead = NULL;
static struct s_message *CmdTail = NULL;
static struct s_message *PendingCmd = NULL;
String PCNAck;
/* ARGSUSED */
void
XpcnAckAction(w, event, params, num_params)
Widget w;
XEvent *event;
String *params;
int num_params;
{
Display *dpy = XtDisplay(w);
if (PendingCmd != NULL) {
Atom actual_type;
int actual_format;
unsigned long nitems;
unsigned long bytes_after;
unsigned char *value;
XGetWindowProperty(dpy, XtWindow(XswTopWidget()), ackProp, 0, 8,
False, AnyPropertyType, &actual_type,
&actual_format, &nitems, &bytes_after,
&value);
XtFree(PCNAck);
PCNAck = (String) value;
if (PendingCmd->notify != NULL)
(PendingCmd->notify)(PendingCmd->w,
PendingCmd->client_data,
PendingCmd->call_data);
XtFree(PendingCmd->message);
XtFree((char *) PendingCmd);
PendingCmd = NULL;
}
if (CmdHead != NULL) {
XChangeProperty(dpy, editWindow,
cmdProp, XA_STRING, 8,
PropModeReplace,
(unsigned char *) CmdHead->message, strlen(CmdHead->message)+1);
PendingCmd = CmdHead;
CmdHead = CmdHead->next;
if (CmdHead == NULL) CmdTail = NULL;
}
else
OkToSend = 1;
}
void PCNAckOk(w,text,call_data)
Widget w;
String text;
XtPointer call_data;
{
if (strcmp(PCNAck,"OK")) {
XtWarning(text);
XBell(XtDisplay(XswTopWidget()),0);
}
}
Window get_edit_window(dpy, key, create)
Display *dpy;
char *key;
int create;
{
Window editWindow;
Window get_edit_window1();
Atom editProp;
Atom actual_type;
int actual_format;
unsigned long nitems;
unsigned long bytes_after;
unsigned char *value;
editProp = XInternAtom(dpy, "XPCN_EDIT",False);
/* Make sure that there are no hangers on */
XGetWindowProperty(dpy, RootWindow(dpy,DefaultScreen(dpy)),
editProp, 0, 8,
True, AnyPropertyType, &actual_type,
&actual_format, &nitems, &bytes_after,
&value);
editWindow =
get_edit_window1(dpy, RootWindow (dpy, DefaultScreen(dpy)),
editProp, key);
if (editWindow != (Window) NULL)
EditFound = 1;
if (create == False)
return editWindow;
if (editWindow == (Window) NULL) {
if (fork() == 0) {
char *epoch = EPOCH;
char *initfile = INITFILE;
execl(epoch,epoch,
"-l",initfile,
"-class","Xpcn",
(char *) NULL);
} else {
do {
sleep(1);
XGetWindowProperty(dpy, RootWindow(dpy,DefaultScreen(dpy)),
editProp, 0, 8,
True, AnyPropertyType, &actual_type,
&actual_format, &nitems, &bytes_after,
&value);
} while (actual_type == None);
editWindow = *((Window *) value);
XFree((char *) value);
}
}
else
EditFound = 1;
return editWindow;
}
Window get_edit_window1 (dpy, w, prop, key)
Display *dpy;
Window w;
Atom prop;
char *key;
{
Window root, parent;
unsigned int nchildren;
Window *children = NULL;
int n;
Atom actual_type;
int actual_format;
unsigned long nitems;
unsigned long bytes_after;
unsigned char *value;
XGetWindowProperty(dpy, w, prop, 0, 8,
False, AnyPropertyType, &actual_type,
&actual_format, &nitems, &bytes_after,
&value);
if (actual_type != None) {
/* Don't use key for now */
/* if (!strcmp(value,key)) { */
XFree((char *) value);
return w;
/* } */
}
if (XQueryTree (dpy, w, &root, &parent, &children, &nchildren)) {
w = (Window) NULL;
for (n = 0; n < nchildren && w == (Window) NULL; n++)
w = get_edit_window1(dpy, children[n],prop, key);
}
if (children) XFree ((char *) children);
return w;
}
exit_from_editor(w,state,call_data)
Widget w;
int state;
XtPointer call_data;
{
if (editWindow != (Window) NULL && state == 0) {
send_command(w,"(DELETESCREENS)",False,
exit_from_editor,1,NULL);
return;
}
if (editWindow != (Window) NULL && !EditFound)
send_command(w,"(EXIT)",False,
XswExitProgramCallback,NULL,call_data);
else
XswExitProgramCallback(w,NULL,call_data);
}
send_command(w, command, create, notify, client_data, call_data)
Widget w;
unsigned char *command;
int create;
void (*notify)();
XtPointer client_data;
XtPointer call_data;
{
Display *dpy;
Widget dw = w;
while (! XtIsShell(dw)) dw = XtParent(dw);
dpy = XtDisplay(dw);
if (editWindow == (Window) NULL) {
char hostname[MAXHOSTNAMELEN];
char cmdbuf[MAXPATHLEN+sizeof("(CD \"/\")")+1];
gethostname(hostname,MAXHOSTNAMELEN);
editWindow = get_edit_window(dpy,hostname,create);
cmdProp = XInternAtom(dpy, "XPCN_CMD", False);
ackProp = XInternAtom(dpy, "XPCN_ACK", False);
PCNAck = XtNewString("");
if (editWindow != (Window) NULL) {
sprintf(cmdbuf,"(CONNECT \"%d\")",XtWindow(XswTopWidget()));
send_command(w, cmdbuf, False, NULL, NULL, NULL);
strcpy(cmdbuf,"(CD \"");
getwd(cmdbuf+strlen(cmdbuf));
strcat(cmdbuf,"/\")");
send_command(w, cmdbuf, False, NULL, NULL, NULL);
}
}
if (editWindow != (Window) NULL) {
/* printf("Sending command %s to %d\n", command, editWindow); */
struct s_message *tPtr =
(struct s_message *) XtMalloc(sizeof(struct s_message));
tPtr->notify = notify;
tPtr->w = w;
tPtr->client_data = client_data;
tPtr->call_data = call_data;
tPtr->message = XtNewString((char *) command);
tPtr->next = NULL;
if (OkToSend) {
OkToSend = 0;
XChangeProperty(dpy, editWindow,
cmdProp, XA_STRING, 8,
PropModeReplace, command,
strlen((char *) command)+1);
PendingCmd = tPtr;
} else {
if (CmdHead == NULL)
CmdHead = tPtr;
else
CmdTail->next = tPtr;
CmdTail = tPtr;
}
}
return editWindow == (Window) NULL ? 0 : 1;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.