#include "xmh.h"
#include <X11/Xmu/CharSet.h>
#include <X11/Xaw/Cardinals.h>
#include <X11/Xatom.h>
#include <sys/stat.h>
#include <ctype.h>
#include "bboxint.h"
#include "tocintrnl.h"
#include "actions.h"
typedef struct {
Scrn scrn;
Toc toc;
Toc original_toc;
} DeleteDataRec, *DeleteData;
static void CheckAndDeleteFolder(XMH_CB_ARGS);
static void CancelDeleteFolder(XMH_CB_ARGS);
static void CheckAndConfirmDeleteFolder(XMH_CB_ARGS);
static void FreeMenuData(XMH_CB_ARGS);
static void CreateFolderMenu(Button);
static void AddFolderMenuEntry(Button, char *);
static void DeleteFolderMenuEntry(Button, char *);
#ifdef DEBUG_CLEANUP
extern Boolean ExitLoop;
#endif
void DoClose(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
Scrn scrn = (Scrn) client_data;
register int i, count;
Toc toc;
XtCallbackRec confirm_callbacks[2];
count = 0;
for (i=0 ; i<numScrns ; i++)
if (scrnList[i]->kind == STtocAndView && scrnList[i]->mapped)
count++;
confirm_callbacks[0].callback = (XtCallbackProc) DoClose;
confirm_callbacks[0].closure = (XtPointer) scrn;
confirm_callbacks[1].callback = (XtCallbackProc) NULL;
confirm_callbacks[1].closure = (XtPointer) NULL;
if (count <= 1) {
for (i = numScrns - 1; i >= 0; i--)
if (scrnList[i] != scrn) {
if (MsgSetScrn((Msg) NULL, scrnList[i], confirm_callbacks,
(XtCallbackList) NULL) == NEEDS_CONFIRMATION)
return;
}
for (i = 0; i < numFolders; i++) {
toc = folderList[i];
if (TocConfirmCataclysm(toc, confirm_callbacks,
(XtCallbackList) NULL))
return;
}
#ifdef DEBUG_CLEANUP
XtDestroyWidget(scrn->parent);
ExitLoop = TRUE;
return;
#else
XtVaSetValues(scrn->parent, XtNjoinSession, (XtArgVal)False, NULL);
XtUnmapWidget(scrn->parent);
XtDestroyApplicationContext
(XtWidgetToApplicationContext(scrn->parent));
exit(0);
#endif
}
else {
if (MsgSetScrn((Msg) NULL, scrn, confirm_callbacks,
(XtCallbackList) NULL) == NEEDS_CONFIRMATION)
return;
DestroyScrn(scrn);
}
}
void XmhClose(
Widget w,
XEvent *event,
String *params,
Cardinal *num_params)
{
Scrn scrn = ScrnFromWidget(w);
DoClose(w, (XtPointer) scrn, (XtPointer) NULL);
}
void DoOpenFolder(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
Scrn scrn = (Scrn) client_data;
Toc toc = SelectedToc(scrn);
if (TocFolderExists(toc))
TocSetScrn(toc, scrn);
else
PopupError(scrn->parent, "Cannot open selected folder.");
}
void XmhOpenFolder(
Widget w,
XEvent *event,
String *params,
Cardinal *num_params)
{
Scrn scrn = ScrnFromWidget(w);
if (! UserWantsAction(w, scrn)) return;
if (*num_params) SetCurrentFolderName(scrn, params[0]);
DoOpenFolder(w, (XtPointer) scrn, (XtPointer) NULL);
}
void DoComposeMessage(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
Scrn scrn = NewCompScrn();
Msg msg = TocMakeNewMsg(DraftsFolder);
MsgLoadComposition(msg);
MsgSetTemporary(msg);
MsgSetReapable(msg);
MsgSetScrnForComp(msg, scrn);
MapScrn(scrn);
}
void XmhComposeMessage(
Widget w,
XEvent *event,
String *params,
Cardinal *num_params)
{
DoComposeMessage(w, (XtPointer) NULL, (XtPointer) NULL);
}
void DoOpenFolderInNewWindow(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
Scrn scrn = (Scrn) client_data;
Toc toc = SelectedToc(scrn);
if (TocFolderExists(toc)) {
scrn = CreateNewScrn(STtocAndView);
TocSetScrn(toc, scrn);
MapScrn(scrn);
} else
PopupError(scrn->parent, "Cannot open selected folder.");
}
void XmhOpenFolderInNewWindow(
Widget w,
XEvent *event,
String *params,
Cardinal *num_params)
{
Scrn scrn = ScrnFromWidget(w);
DoOpenFolderInNewWindow(w, (XtPointer) scrn, (XtPointer) NULL);
}
static char *previous_label = NULL;
static void CreateFolder(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
Toc toc;
register int i;
char *name;
Widget dialog = (Widget) client_data;
Arg args[3];
char str[300], *label;
name = XawDialogGetValueString(dialog);
for (i=0 ; name[i] > ' ' ; i++) ;
name[i] = '\0';
toc = TocGetNamed(name);
if ((toc) || (i==0) || (name[0]=='/') || ((toc = TocCreateFolder(name))
== NULL)) {
if (toc)
(void) sprintf(str, "Folder \"%s\" already exists. Try again.",
name);
else if (name[0]=='/')
(void) sprintf(str, "Please specify folders relative to \"%s\".",
app_resources.mail_path);
else
(void) sprintf(str, "Cannot create folder \"%s\". Try again.",
name);
label = XtNewString(str);
XtSetArg(args[0], XtNlabel, label);
XtSetArg(args[1], XtNvalue, "");
XtSetValues(dialog, args, TWO);
if (previous_label)
XtFree(previous_label);
previous_label = label;
return;
}
for (i = 0; i < numScrns; i++)
if (scrnList[i]->folderbuttons) {
char *c;
Button button;
if ((c = strchr(name, '/'))) {
c[0] = '\0';
button = BBoxFindButtonNamed(scrnList[i]->folderbuttons,
name);
c[0] = '/';
if (button) AddFolderMenuEntry(button, name);
}
else
BBoxAddButton(scrnList[i]->folderbuttons, name,
menuButtonWidgetClass, True);
}
DestroyPopup(widget, (XtPointer) XtParent(dialog), (XtPointer) NULL);
}
void DoCreateFolder(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
Scrn scrn = (Scrn) client_data;
PopupPrompt(scrn->parent, "Create folder named:", CreateFolder);
}
void XmhCreateFolder(
Widget w,
XEvent *event,
String *params,
Cardinal *num_params)
{
Scrn scrn = ScrnFromWidget(w);
DoCreateFolder(w, (XtPointer)scrn, (XtPointer)NULL);
}
static void CancelDeleteFolder(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
DeleteData deleteData = (DeleteData) client_data;
TocClearDeletePending(deleteData->toc);
if (deleteData->original_toc != NULL)
TocSetScrn(deleteData->original_toc, deleteData->scrn);
XtFree((char *) deleteData);
}
static void CheckAndConfirmDeleteFolder(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
DeleteData deleteData = (DeleteData) client_data;
Scrn scrn = deleteData->scrn;
Toc toc = deleteData->toc;
char str[300];
XtCallbackRec confirms[2];
XtCallbackRec cancels[2];
static XtCallbackRec yes_callbacks[] = {
{CheckAndDeleteFolder, (XtPointer) NULL},
{(XtCallbackProc) NULL, (XtPointer) NULL}
};
static XtCallbackRec no_callbacks[] = {
{CancelDeleteFolder, (XtPointer) NULL},
{(XtCallbackProc) NULL, (XtPointer) NULL}
};
TocSetScrn(toc, scrn);
confirms[0].callback = (XtCallbackProc) CheckAndConfirmDeleteFolder;
confirms[0].closure = client_data;
confirms[1].callback = (XtCallbackProc) NULL;
confirms[1].closure = (XtPointer) NULL;
cancels[0].callback = (XtCallbackProc) CancelDeleteFolder;
cancels[0].closure = client_data;
cancels[1].callback = (XtCallbackProc) NULL;
cancels[1].closure = (XtPointer) NULL;
if (TocConfirmCataclysm(toc, confirms, cancels) == NEEDS_CONFIRMATION)
return;
yes_callbacks[0].closure = client_data;
no_callbacks[0].closure = client_data;
(void) sprintf(str, "Are you sure you want to destroy %s?", TocName(toc));
PopupConfirm(scrn->tocwidget, str, yes_callbacks, no_callbacks);
}
static void CheckAndDeleteFolder(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
DeleteData deleteData = (DeleteData) client_data;
Scrn scrn = deleteData->scrn;
Toc toc = deleteData->toc;
XtCallbackRec confirms[2];
XtCallbackRec cancels[2];
int i;
char *foldername;
confirms[0].callback = (XtCallbackProc) CheckAndConfirmDeleteFolder;
confirms[0].closure = client_data;
confirms[1].callback = (XtCallbackProc) NULL;
confirms[1].closure = (XtPointer) NULL;
cancels[0].callback = (XtCallbackProc) CancelDeleteFolder;
cancels[0].closure = client_data;
cancels[1].callback = (XtCallbackProc) NULL;
cancels[1].closure = (XtPointer) NULL;
if (TocConfirmCataclysm(toc, confirms, cancels) == NEEDS_CONFIRMATION)
return;
foldername = TocName(toc);
TocSetScrn(toc, (Scrn) NULL);
TocDeleteFolder(toc);
for (i=0 ; i<numScrns ; i++)
if (scrnList[i]->folderbuttons) {
if (IsSubfolder(foldername)) {
char parent_folder[300];
char *c = strchr( strcpy(parent_folder, foldername), '/');
*c = '\0';
DeleteFolderMenuEntry
( BBoxFindButtonNamed( scrnList[i]->folderbuttons,
parent_folder),
foldername);
}
else {
BBoxDeleteButton
(BBoxFindButtonNamed( scrnList[i]->folderbuttons,
foldername));
}
if ((! strcmp(scrnList[i]->curfolder, foldername))
&& (BBoxNumButtons(scrnList[i]->folderbuttons))
&& (strcmp(foldername, app_resources.initial_folder_name)))
TocSetScrn(InitialFolder, scrnList[i]);
}
XtFree(foldername);
if (deleteData->original_toc != NULL)
TocSetScrn(deleteData->original_toc, scrn);
XtFree((char *) deleteData);
}
void DoDeleteFolder(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
Scrn scrn = (Scrn) client_data;
Toc toc = SelectedToc(scrn);
DeleteData deleteData;
if (! TocFolderExists(toc)) {
PopupError(scrn->parent,
"Cannot open selected folder for confirmation to delete.");
return;
}
if (TocTestAndSetDeletePending(toc)) {
PopupError(scrn->parent, "There is a delete pending on this folder.");
return;
}
deleteData = XtNew(DeleteDataRec);
deleteData->scrn = scrn;
deleteData->toc = toc;
deleteData->original_toc = CurrentToc(scrn);
if (deleteData->original_toc == toc)
deleteData->original_toc = (Toc) NULL;
CheckAndConfirmDeleteFolder(w, (XtPointer) deleteData, (XtPointer) NULL);
}
void XmhDeleteFolder(
Widget w,
XEvent *event,
String *params,
Cardinal *num_params)
{
Scrn scrn = ScrnFromWidget(w);
DoDeleteFolder(w, (XtPointer) scrn, (XtPointer) NULL);
}
static char filename[500];
static int flen = 0;
static int IsFolder(char *name)
{
register int i, len;
struct stat buf;
if (isdigit(name[0]) || name[0] == '#') {
len = strlen(name);
for(i=1; i < len && isdigit(name[i]); i++)
;
if (i == len) return FALSE;
}
else if (name[0] == '.')
return FALSE;
(void) sprintf(filename + flen, "/%s", name);
if (stat(filename, &buf) ) return False;
#ifdef S_ISDIR
return S_ISDIR(buf.st_mode);
#else
return (buf.st_mode & S_IFMT) == S_IFDIR;
#endif
}
static void DoSelectFolder(
Widget w,
XtPointer closure,
XtPointer data)
{
Scrn scrn = ScrnFromWidget(w);
SetCurrentFolderName(scrn, (char *) closure);
}
static void FreeMenuData(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
XtFree((char*) client_data);
}
static void AddFolderMenuEntry(
Button button,
char *entryname)
{
Arg args[4];
char * name;
char * c;
char tmpname[300];
char * label;
static XtCallbackRec callbacks[] = {
{ DoSelectFolder, (XtPointer) NULL },
{ (XtCallbackProc) NULL, (XtPointer) NULL}
};
static XtCallbackRec destroyCallbacks[] = {
{ FreeMenuData, (XtPointer) NULL },
{ (XtCallbackProc) NULL, (XtPointer) NULL}
};
if (button->menu == NULL || button->menu == NoMenuForButton) {
CreateFolderMenu(button);
return;
}
name = XtNewString(entryname);
callbacks[0].closure = (XtPointer) name;
destroyCallbacks[0].closure = (XtPointer) name;
XtSetArg(args[0], XtNcallback, callbacks);
XtSetArg(args[1], XtNdestroyCallback, destroyCallbacks);
label = entryname;
c = strchr( strcpy(tmpname, entryname), '/');
if (c) {
*c = '\0';
label = ++c;
if (strcmp(tmpname, c) == 0) {
c--;
*c = '_';
}
name = c;
}
XtSetArg(args[2], XtNlabel, label);
XtCreateManagedWidget(name, smeBSBObjectClass, button->menu,
args, THREE);
}
static void CreateFolderMenu(
Button button)
{
char **namelist;
register int i, n, length;
char directory[500];
n = strlen(app_resources.mail_path);
(void) strncpy(directory, app_resources.mail_path, n);
directory[n++] = '/';
(void) strcpy(directory + n, button->name);
flen = strlen(directory);
(void) strcpy(filename, directory);
n = ScanDir(directory, &namelist, IsFolder);
if (n <= 0) {
button->menu = NoMenuForButton;
return;
}
button->menu = XtCreatePopupShell("menu", simpleMenuWidgetClass,
button->widget, (ArgList) NULL, ZERO);
AddFolderMenuEntry(button, button->name);
length = strlen(button->name);
(void) strncpy(directory, button->name, length);
directory[length++] = '/';
for (i=0; i < n; i++) {
(void) strcpy(directory + length, namelist[i]);
free((char *) namelist[i]);
AddFolderMenuEntry(button, directory);
}
free((char *) namelist);
}
static void DeleteFolderMenuEntry(
Button button,
char *foldername)
{
char * c;
Arg args[2];
char * subfolder;
int n;
char tmpname[300];
Widget entry;
if (button == NULL || button->menu == NULL) return;
XtSetArg(args[0], XtNnumChildren, &n);
XtSetArg(args[1], XtNlabel, &c);
XtGetValues(button->menu, args, TWO);
if ((n <= 3 && c) || n <= 2) {
XtDestroyWidget(button->menu);
button->menu = NoMenuForButton;
return;
}
c = strchr( strcpy(tmpname, foldername), '/');
if (c) {
*c = '\0';
subfolder = ++c;
if (strcmp(button->name, subfolder) == 0) {
c--;
*c = '_';
subfolder = c;
}
if ((entry = XtNameToWidget(button->menu, subfolder)) != NULL)
XtDestroyWidget(entry);
}
}
void XmhPopupFolderMenu(
Widget w,
XEvent *event,
String *vector,
Cardinal *count)
{
Button button;
Scrn scrn;
scrn = ScrnFromWidget(w);
if ((button = BBoxFindButton(scrn->folderbuttons, w)) == NULL)
return;
if (button->menu == NULL)
CreateFolderMenu(button);
if (button->menu == NoMenuForButton)
LastMenuButtonPressed = w;
else {
XtCallActionProc(button->widget, "PopupMenu", (XEvent *) NULL,
(String *) NULL, (Cardinal) 0);
XtCallActionProc(button->widget, "reset", (XEvent *) NULL,
(String *) NULL, (Cardinal) 0);
}
}
void XmhSetCurrentFolder(
Widget w,
XEvent *event,
String *vector,
Cardinal *count)
{
Button button;
Scrn scrn;
if (w != LastMenuButtonPressed)
return;
scrn = ScrnFromWidget(w);
if ((button = BBoxFindButton(scrn->folderbuttons, w)) == NULL)
return;
SetCurrentFolderName(scrn, button->name);
}
void XmhLeaveFolderButton(
Widget w,
XEvent *event,
String *vector,
Cardinal *count)
{
LastMenuButtonPressed = NULL;
}
void Push(
Stack *stack_ptr,
char *data)
{
Stack new = XtNew(StackRec);
new->data = data;
new->next = *stack_ptr;
*stack_ptr = new;
}
char * Pop(
Stack *stack_ptr)
{
Stack top;
char *data = NULL;
if ((top = *stack_ptr) != NULL) {
data = top->data;
*stack_ptr = top->next;
XtFree((char *) top);
}
return data;
}
void XmhPushFolder(
Widget w,
XEvent *event,
String *params,
Cardinal *count)
{
Scrn scrn = ScrnFromWidget(w);
Cardinal i;
for (i=0; i < *count; i++)
Push(&scrn->folder_stack, params[i]);
if (*count == 0 && scrn->curfolder)
Push(&scrn->folder_stack, scrn->curfolder);
}
void XmhPopFolder(
Widget w,
XEvent *event,
String *params,
Cardinal *count)
{
Scrn scrn = ScrnFromWidget(w);
char *folder;
if ((folder = Pop(&scrn->folder_stack)) != NULL)
SetCurrentFolderName(scrn, folder);
}
static Boolean InParams(
String str,
String *p,
Cardinal n)
{
Cardinal i;
for (i=0; i < n; p++, i++)
if (! XmuCompareISOLatin1(*p, str)) return True;
return False;
}
void XmhWMProtocols(
Widget w,
XEvent * event,
String * params,
Cardinal * num_params)
{
Boolean dw = False;
Boolean sy = False;
static char*WM_DELETE_WINDOW = "WM_DELETE_WINDOW";
static char*WM_SAVE_YOURSELF = "WM_SAVE_YOURSELF";
#define DO_DELETE_WINDOW InParams(WM_DELETE_WINDOW, params, *num_params)
#define DO_SAVE_YOURSELF InParams(WM_SAVE_YOURSELF, params, *num_params)
if (event && event->type == ClientMessage) {
if (event->xclient.message_type == wm_protocols) {
if (event->xclient.data.l[0] == wm_delete_window &&
(*num_params == 0 || DO_DELETE_WINDOW))
dw = True;
else if (event->xclient.data.l[0] == wm_save_yourself &&
(*num_params == 0 || DO_SAVE_YOURSELF))
sy = True;
}
} else {
if (DO_DELETE_WINDOW)
dw = True;
if (DO_SAVE_YOURSELF)
sy = True;
}
#undef DO_DELETE_WINDOW
#undef DO_SAVE_YOURSELF
if (sy) {
register int i;
for (i=0; i<numScrns; i++)
if (scrnList[i]->msg)
MsgCheckPoint(scrnList[i]->msg);
if (w)
XChangeProperty(XtDisplay(toplevel), XtWindow(toplevel),
XA_WM_COMMAND, XA_STRING, 8, PropModeAppend,
(unsigned char *)"", 0);
}
if (dw && w) {
Scrn scrn;
while (w && !XtIsShell(w))
w = XtParent(w);
if (XtIsTransientShell(w)) {
WMDeletePopup(w, event);
return;
}
scrn = ScrnFromWidget(w);
switch (scrn->kind) {
case STtocAndView:
DoClose(w, (XtPointer)scrn, (XtPointer)NULL);
break;
case STview:
case STcomp:
DoCloseView(w, (XtPointer)scrn, (XtPointer)NULL);
break;
case STpick:
DestroyScrn(scrn);
break;
}
}
}
typedef struct _InteractMsgTokenRec {
Scrn scrn;
XtCheckpointToken cp_token;
} InteractMsgTokenRec, *InteractMsgToken;
static void CommitMsgChanges(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
Cardinal zero = 0;
InteractMsgToken iToken = (InteractMsgToken) client_data;
XmhSave(iToken->scrn->parent, (XEvent*)NULL, (String*)NULL, &zero);
if (MsgChanged(iToken->scrn->msg))
iToken->cp_token->save_success = False;
XtSessionReturnToken(iToken->cp_token);
XtFree((XtPointer)iToken);
}
static void CancelMsgChanges(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
InteractMsgToken iToken = (InteractMsgToken) client_data;
MsgCheckPoint(iToken->scrn->msg);
XtSessionReturnToken(iToken->cp_token);
XtFree((XtPointer)iToken);
}
static void CommitMsgInteract(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
Scrn scrn = (Scrn) client_data;
XtCheckpointToken cpToken = (XtCheckpointToken) call_data;
char str[300];
InteractMsgToken iToken;
static XtCallbackRec yes_callbacks[] = {
{CommitMsgChanges, (XtPointer) NULL},
{(XtCallbackProc) NULL, (XtPointer) NULL}
};
static XtCallbackRec no_callbacks[] = {
{CancelMsgChanges, (XtPointer) NULL},
{(XtCallbackProc) NULL, (XtPointer) NULL}
};
if (cpToken->interact_style != SmInteractStyleAny
|| cpToken->cancel_shutdown) {
XtSessionReturnToken(cpToken);
return;
}
iToken = XtNew(InteractMsgTokenRec);
iToken->scrn = scrn;
iToken->cp_token = cpToken;
yes_callbacks[0].closure = no_callbacks[0].closure = (XtPointer) iToken;
(void)sprintf(str,"Save changes to message %s?", MsgName(scrn->msg));
PopupConfirm(scrn->parent, str, yes_callbacks, no_callbacks);
}
typedef struct _InteractTocTokenRec {
Toc toc;
XtCheckpointToken cp_token;
} InteractTocTokenRec, *InteractTocToken;
static void CommitTocChanges(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
InteractTocToken iToken = (InteractTocToken) client_data;
TocCommitChanges(w, (XtPointer) iToken->toc, (XtPointer) NULL);
XtSessionReturnToken(iToken->cp_token);
XtFree((XtPointer)iToken);
}
static void CancelTocChanges(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
InteractTocToken iToken = (InteractTocToken) client_data;
XtSessionReturnToken(iToken->cp_token);
XtFree((XtPointer)iToken);
}
static void CommitTocInteract(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
Toc toc = (Toc) client_data;
XtCheckpointToken cpToken = (XtCheckpointToken) call_data;
char str[300];
Widget tocwidget;
Cardinal i;
InteractTocToken iToken;
static XtCallbackRec yes_callbacks[] = {
{CommitTocChanges, (XtPointer) NULL},
{(XtCallbackProc) NULL, (XtPointer) NULL}
};
static XtCallbackRec no_callbacks[] = {
{CancelTocChanges, (XtPointer) NULL},
{(XtCallbackProc) NULL, (XtPointer) NULL}
};
if (cpToken->interact_style != SmInteractStyleAny
|| cpToken->cancel_shutdown) {
XtSessionReturnToken(cpToken);
return;
}
iToken = XtNew(InteractTocTokenRec);
iToken->toc = toc;
iToken->cp_token = cpToken;
yes_callbacks[0].closure = no_callbacks[0].closure = (XtPointer) iToken;
(void)sprintf(str,"Commit all changes to %s folder?", toc->foldername);
tocwidget = NULL;
for (i=0; i < toc->num_scrns; i++)
if (toc->scrn[i]->mapped) {
tocwidget = toc->scrn[i]->tocwidget;
break;
}
PopupConfirm(tocwidget, str, yes_callbacks, no_callbacks);
}
void DoSaveYourself(
Widget w,
XtPointer client_data,
XtPointer call_data)
{
XtCheckpointToken cpToken = (XtCheckpointToken)call_data;
{
int i;
for (i=0 ; i<numScrns ; i++) {
if (MsgChanged(scrnList[i]->msg)) {
if (cpToken->interact_style == SmInteractStyleAny)
XtAddCallback(toplevel, XtNinteractCallback,
CommitMsgInteract, (XtPointer)scrnList[i]);
else {
Cardinal zero = 0;
XmhSave(scrnList[i]->parent, (XEvent*)NULL,
(String*)NULL, &zero);
if (MsgChanged(scrnList[i]->msg)) {
MsgCheckPoint(scrnList[i]->msg);
cpToken->save_success = False;
}
}
}
}
}
{
int i;
for (i = 0; i < numFolders; i++) {
if (TocHasChanges(folderList[i])) {
if (cpToken->interact_style == SmInteractStyleAny)
XtAddCallback(toplevel, XtNinteractCallback,
CommitTocInteract, (XtPointer)folderList[i]);
else
TocCommitChanges(w, (XtPointer)folderList[i],
(XtPointer) NULL);
}
}
}
}