2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $TOG: WmHelp.c /main/8 1997/06/18 17:30:51 samborn $ */
26 * (c) Copyright 1987, 1988, 1989, 1990, 1992, 1993 HEWLETT-PACKARD COMPANY
27 * (c) Copyright 1989, 1990, 1991, 1992 OPEN SOFTWARE FOUNDATION, INC.
32 static char rcsid[] = ""
47 #include "WmFunction.h"
50 #include "WmResParse.h"
52 #include "WmResNames.h"
53 #include "WmWrkspace.h"
54 #include "DataBaseLoad.h"
58 #include <Xm/MessageB.h>
59 #include <X11/keysymdef.h>
60 #include <X11/keysym.h>
61 #include <X11/Shell.h>
62 #include <Xm/MwmUtil.h>
64 #include <Dt/HelpDialog.h>
65 #include <Dt/HelpQuickD.h>
67 #include <Dt/DtNlUtils.h>
69 #include <X11/cursorfont.h>
72 /****************************************************************
74 * Cache List Info Structure Definition.
76 ****************************************************************/
77 typedef struct _CacheListStruct {
85 struct _CacheListStruct *pNext;
86 struct _CacheListStruct *pPrevious;
89 typedef struct _DisplayTopicInfo {
96 * Function Declarations:
99 /******** Static Function Declarations ********/
100 static int LocateTheControl(
104 static WmScreenData *WmScreenDataFromWidget (
107 static int WmDtReturnSelectedWidget (
111 static void WmDtDisplayTopic (
122 DisplayTopicInfo *displayTopicInfo);
123 static void WmDtCloseHelpCB (
125 XtPointer clientData,
127 static void WmDtWmCloseHelpCB (
129 XtPointer clientData,
131 static void WmDtVersionCloseCB (
133 XtPointer clientData,
135 static void WmDtVersionPopupCB (
137 XtPointer clientData,
140 static void WmDtProcessLinkCB (
142 XtPointer clientData,
144 static Boolean WmDtGetFromCache(
145 CacheListStruct **pCurrentNode,
147 static void ShowHelpDialog(
148 ClientData *pClient);
150 static void HideHelpDialog(
152 Boolean userDismissed );
153 static void wmDtHelpSetPosition(
154 PtrWsDtHelpData pHelp,
157 static void wmDtHelpMapEventHandler (
162 static void wmDtErrorDialog(
166 static void wmDtErrorDialogOkCB(
168 XtPointer client_data,
169 XtPointer call_data );
170 static void wmDtErrorDialogPopupCB(
172 XtPointer client_data,
173 XtPointer call_data );
174 static void wmDtErrorDialogHide(
177 /******** End Static Function Declarations ********/
185 static DisplayTopicInfo displayTopicInfo;
186 static Widget versionWidget = (Widget)NULL;
188 #define PT_IN_CHILD(X, Y, CHILD) \
189 (((X) >= (CHILD)->core.x) && \
190 ((X) <= ((CHILD)->core.x + (Position) (CHILD)->core.width)) && \
191 ((Y) >= (CHILD)->core.y) && \
192 ((Y) <= ((CHILD)->core.y + (Position) (CHILD)->core.height)))
194 #define MAX_WIDGET_PATH 100
197 /**********************************************************************
198 * Function: LocateTheControl()
202 **********************************************************************/
211 CompositeWidget comp_widget;
215 Window target_win = None;
224 Widget widget = NULL;
226 Boolean foundOne = False;
228 WmFpEmbeddedClientData *pECD;
229 WmScreenData *pSD = NULL;
233 /* Make the target cursor */
234 cursor = XCreateFontCursor (wmGD.display, XC_question_arrow);
236 /* Grab the pointer using target cursor, letting it roam all over */
237 status = XGrabPointer (wmGD.display, RootWindow(wmGD.display, screen),
239 ButtonPressMask|ButtonReleaseMask, GrabModeAsync,
240 GrabModeAsync, None, cursor, CurrentTime);
241 if (status != GrabSuccess)
243 Warning (((char *)GETMESSAGE(29, 1,
244 "Help on Item failed. Another program may have grabbed the mouse.")));
245 return(DtHELP_SELECT_ERROR);
249 /* Grab the Keyboard so we can catch the ESC button press */
250 status = XGrabKeyboard(wmGD.display, RootWindow(wmGD.display, screen),
252 GrabModeAsync, GrabModeAsync, CurrentTime);
253 if (status != GrabSuccess)
255 XUngrabPointer (wmGD.display, CurrentTime);
256 Warning (((char *)GETMESSAGE(29, 2,
257 "Help on Item failed. Another program may have grabbed the mouse.")));
258 return(DtHELP_SELECT_ERROR);
261 /* Let the user select a window... */
262 while ((target_win == None) || (buttons != 0))
264 XtAppNextEvent(wmGD.mwmAppContext, &event);
269 if (target_win == None)
271 target_win = event.xbutton.subwindow; /* window selected */
272 if (target_win == None)
273 target_win = RootWindow (wmGD.display, screen);
278 /* there may have been some down before we started */
283 /* Look for ESC key press and stop if we get one */
284 if (event.xkey.state & ShiftMask)
289 keySym = XLookupKeysym((XKeyEvent *)&event, offset);
290 if (keySym == XK_Escape)
292 XUngrabKeyboard (wmGD.display, CurrentTime);
293 XUngrabPointer (wmGD.display, CurrentTime);
294 return(DtHELP_SELECT_ABORT);
298 XtDispatchEvent(&event);
301 XUngrabKeyboard (wmGD.display, CurrentTime); /* Done with keyboard */
302 XUngrabPointer (wmGD.display, CurrentTime); /* Done with pointer */
305 printf("RootWindow (wmGD.display, screen) = %ld\n", RootWindow (wmGD.display, screen));
306 printf("event.xbutton.root = %ld\n", event.xbutton.root);
307 printf("event.xbutton.window = %ld\n", event.xbutton.window);
308 printf("event.xbutton.subwindow = %ld\n", event.xbutton.subwindow);
309 printf("event.xbutton.x = %d\n", event.xbutton.x);
310 printf("event.xbutton.y = %d\n", event.xbutton.y);
311 printf("event.xbutton.x_root = %d\n", event.xbutton.x_root);
312 printf("event.xbutton.y_root = %d\n", event.xbutton.y_root);
313 #endif /* DEBUGGER */
315 if (target_win == RootWindow (wmGD.display, screen))
316 return (DtHELP_SELECT_INVALID);
318 for (scr = 0; scr < wmGD.numScreens; scr++)
320 if (wmGD.Screens[scr].managed &&
321 wmGD.Screens[scr].screen == screen)
323 pSD = (&(wmGD.Screens[scr]));
332 /* check for subwindows */
333 parent = RootWindow (wmGD.display, screen);
334 x = event.xbutton.x_root;
335 y = event.xbutton.y_root;
339 XTranslateCoordinates(wmGD.display, parent, target_win, x, y,
340 &new_x, &new_y, &sub);
349 pECD = (WmFpEmbeddedClientData *) pSD->pECD;
350 for (clientNum = 0; clientNum < pSD->numEmbeddedClients;
354 (target_win == pECD->pCD->client))
356 widget = pECD->wControl;
371 widget = XtWindowToWidget (wmGD.display, target_win);
376 widget = XtWindowToWidget (wmGD.display1, target_win);
380 return (DtHELP_SELECT_INVALID);
384 if (!XtIsComposite (widget))
387 return (DtHELP_SELECT_VALID);
389 comp_widget = (CompositeWidget)widget;
391 /* look for gadgets at this point */
392 for (i = 0; i < comp_widget->composite.num_children; i++)
394 child = comp_widget->composite.children[i];
396 if (PT_IN_CHILD (x, y, child) && XtIsManaged(child))
399 return (DtHELP_SELECT_VALID);
406 return (DtHELP_SELECT_VALID);
409 return (DtHELP_SELECT_INVALID);
411 } /* END OF FUNCTION LocateTheControl */
414 /**********************************************************************
416 * Cache Creek related help functions
418 **********************************************************************/
420 /*************************************<->*************************************
429 *************************************<->***********************************/
431 void WmDtStringHelpCB (Widget theWidget,
432 XtPointer client_data,
436 char * theHelpString = (char *)client_data;
437 Widget theRealWidget = theWidget;
438 if( XmIsGadget(theWidget))
440 theRealWidget = XtParent(theWidget);
442 pSD = WmScreenDataFromWidget(theWidget);
444 /* WmDtDisplayTopic(theRealWidget, NULL, theHelpString, */
445 WmDtDisplayTopic(pSD->screenTopLevelW1, NULL, theHelpString,
446 DtHELP_TYPE_DYNAMIC_STRING, (Widget) NULL, True,
447 NULL, 0, NULL, False, NULL);
451 } /* END OF FUNCTION WmDtStringHelpCB */
454 /*************************************<->*************************************
463 *************************************<->***********************************/
465 void WmDtWmStringHelpCB (Widget theWidget,
466 XtPointer client_data,
470 char * theHelpString = (char *)client_data;
471 pSD = WmScreenDataFromWidget(theWidget);
474 if (XtDisplay(theWidget) == DISPLAY)
476 WmDtDisplayTopic(pSD->screenTopLevelW1,
478 DtHELP_TYPE_STRING, theWidget, True,
479 NULL, 0, NULL, False, NULL);
483 WmDtDisplayTopic(theWidget, NULL, theHelpString,
484 DtHELP_TYPE_STRING, theWidget, True,
485 NULL, 0, NULL, False, NULL);
489 WmDtDisplayTopic(pSD->screenTopLevelW1,
491 DtHELP_TYPE_DYNAMIC_STRING, theWidget, True,
492 NULL, 0, NULL, False, NULL);
495 } /* END OF FUNCTION WmDtWmStringHelpCB */
499 /*************************************<->*************************************
501 * WmDtDisplayTopicHelp
505 * External entry procedure used to display help topics.
507 *************************************<->***********************************/
509 void WmDtDisplayTopicHelp (Widget widget,
513 WmScreenData *pSD = WmScreenDataFromWidget(widget);
515 WmDtDisplayTopic(pSD->screenTopLevelW1,
516 helpVolume, locationID,
517 DtHELP_TYPE_TOPIC, (Widget) NULL, True,
518 NULL, 0, NULL, False, NULL);
521 /*************************************<->*************************************
523 * WmDtDisplayStringHelp
527 * External entry procedure used to display help topics.
529 *************************************<->***********************************/
531 void WmDtDisplayStringHelp (Widget widget,
534 WmScreenData *pSD = WmScreenDataFromWidget(widget);
536 WmDtDisplayTopic(pSD->screenTopLevelW1,
538 DtHELP_TYPE_DYNAMIC_STRING, widget, True,
539 NULL, 0, NULL, False, NULL);
542 /*************************************<->*************************************
549 * for each icon in the icon box
551 *************************************<->***********************************/
553 void WmDtWmTopicHelpCB (Widget theWidget,
554 XtPointer client_data,
559 char *helpVolume = WM_DT_HELP_VOLUME;
560 char *locationID = (char *)client_data;
561 pSD = WmScreenDataFromWidget(theWidget);
563 shellWidget = theWidget;
564 while (!(XtIsSubclass(XtParent(shellWidget), shellWidgetClass)))
566 shellWidget = XtParent(shellWidget);
569 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
571 DtHELP_TYPE_TOPIC, shellWidget, True,
572 NULL, 0, NULL, False, NULL);
574 } /* END OF FUNCTION WmDtWmTopicHelpCB */
576 /****************************************************************************
577 * Function: WmScreenDataFromWidget(
586 ***************************************************************************/
587 static WmScreenData *
588 WmScreenDataFromWidget (Widget theWidget)
591 WmScreenData *pSD = NULL;
594 CacheListStruct *pTemp;
598 for (scr = 0; scr < wmGD.numScreens; scr++)
600 if (wmGD.Screens[scr].managed &&
601 wmGD.Screens[scr].screen ==
602 XScreenNumberOfScreen(XtScreen(theWidget)))
604 pSD = (&(wmGD.Screens[scr]));
619 } /* END OF FUNCTION WmScreenDataFromWidget */
621 /****************************************************************************
622 * Function: WmDtCloseHelpCB(
624 * caddr_t clientData,
629 * Return Value: Void.
631 * Purpose: Process close requests on all Help Dialog widgets
632 * created and managed by this application.
634 ***************************************************************************/
635 static void WmDtCloseHelpCB (
637 XtPointer clientData,
640 WmScreenData *pSD = NULL;
642 Widget helpDialog = (Widget) clientData;
644 CacheListStruct *pTemp;
646 pSD = WmScreenDataFromWidget(w);
647 pTemp = pSD->cachedHelp;
649 /* Search our Cache List for the closed help dialog */
650 while ((pTemp->helpDialog != helpDialog) && (pTemp != NULL))
652 pTemp = pTemp->pNext;
658 /* printf("Didn't find our help dialog widget in the cache list??? /n");*/
661 XtPopdown (XtParent(helpDialog));
663 pTemp->inUseFlag = FALSE;
664 pSD->cachedHelp->hLink = False;
666 /* Re-Assign our pTemp to point to our head so we can see
667 * if we have any in-use help dialog in our list.
669 pTemp = pSD->cachedHelp;
671 } /* END OF FUNCTION WmDtCloseHelpCB */
674 /****************************************************************************
675 * Function: WmDtWmCloseHelpCB(
677 * caddr_t clientData,
682 * Return Value: Void.
684 * Purpose: Process close requests on all Help Dialog widgets
685 * created and managed by this application.
687 ***************************************************************************/
688 static void WmDtWmCloseHelpCB (
690 XtPointer clientData,
694 Widget helpDialog = (Widget) clientData;
695 pSD = WmScreenDataFromWidget(w);
696 HideHelpDialog (pSD, True);
698 } /* END OF FUNCTION WmDtWmCloseHelpCB */
702 /****************************************************************************
703 * Function: WmDtWmPopupHelpCB(
705 * caddr_t clientData,
710 * Return Value: Void.
715 ***************************************************************************/
716 static void WmDtWmPopupHelpCB (
718 XtPointer clientData,
721 PtrWsDtHelpData pHelp;
724 pSD = WmScreenDataFromWidget(w);
726 pHelp = &pSD->dtHelp;
728 if (pSD->dtHelp.restored)
730 /* set position of dialog to restored position */
731 wmDtHelpSetPosition (pHelp, pSD, True);
732 pSD->dtHelp.restored = False;
736 /* set position of dialog relative to client window */
737 wmDtHelpSetPosition (pHelp, pSD, False);
740 } /* END OF FUNCTION WmDtWmPopupHelpCB */
743 /****************************************************************************
744 * Function: WmDtVersionPopupCB(
746 * caddr_t clientData,
751 * Return Value: Void.
756 ***************************************************************************/
757 static void WmDtVersionPopupCB (
759 XtPointer clientData,
764 Dimension width, height;
772 XtSetArg (setArgs[n], XmNx, 0); n++;
773 XtSetArg (setArgs[n], XmNy, 0); n++;
777 * Center the Version Dialog on the screen
781 XtSetArg(getArgs[n], XmNheight, &height); n++;
782 XtSetArg(getArgs[n], XmNwidth, &width); n++;
783 XtGetValues (w, (ArgList) getArgs, n);
786 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) width))/2;
788 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) height))/2;
790 XtSetArg(setArgs[n], XmNx, (XtArgVal) x); n++;
791 XtSetArg(setArgs[n], XmNy, (XtArgVal) y); n++;
792 XtSetValues (w, setArgs, n);
795 } /* END OF FUNCTION WmDtVersionPopupCB */
799 /****************************************************************************
800 * Function: WmDtPopupHelpCB(
802 * caddr_t clientData,
807 * Return Value: Void.
812 ***************************************************************************/
813 static void WmDtPopupHelpCB (
815 XtPointer clientData,
819 Atom * workspace_atoms = NULL;
820 int num_workspaces=0;
822 CacheListStruct *pTemp = (CacheListStruct *)clientData;
827 XtSetArg (args[n], XmNgeometry, NULL); n++;
828 XtSetArg (args[n], XmNwaitForWm, False); n++;
832 if (pTemp->workspaces)
834 char **atom_names = NULL;
837 ptr = DtStrchr (pTemp->workspaces, '*');
838 if (ptr != NULL) *ptr = '\0';
841 (char **) XtRealloc ((char *)atom_names,
842 sizeof(char*) * (num_workspaces + 1));
843 atom_names[num_workspaces] = XtNewString(pTemp->workspaces);
849 pTemp->workspaces = ptr + 1;
851 } while (ptr != NULL);
853 workspace_atoms = (Atom *) XtMalloc(sizeof(Atom) * num_workspaces);
854 XInternAtoms(wmGD.display, atom_names, num_workspaces,
855 True, workspace_atoms);
857 DtWsmSetWorkspacesOccupied (XtDisplay(helpShellW),
858 XtWindow (helpShellW),
862 while (num_workspaces-- > 0)
863 XtFree(atom_names[num_workspaces]);
864 XtFree ((char *) atom_names);
865 XtFree ((char *) workspace_atoms);
868 XtSetArg (args[n], XmNx, pTemp->xPos); n++;
869 XtSetArg (args[n], XmNy, pTemp->yPos); n++;
870 pTemp->restored = False;
871 XtRemoveCallback(helpShellW, XmNpopupCallback,
872 WmDtPopupHelpCB, clientData);
873 XtAddCallback(helpShellW, XmNpopupCallback, WmDtPopupHelpCB, NULL);
877 XtSetArg (args[n], XmNx, 0); n++;
878 XtSetArg (args[n], XmNy, 0); n++;
881 XtSetValues (helpShellW, args, n);
884 } /* END OF FUNCTION WmDtPopupHelpCB */
888 /****************************************************************************
889 * Function: WmDtVersionCloseCB(
891 * caddr_t clientData,
896 * Return Value: Void.
898 * Purpose: Process close requests on all Help Dialog widgets
899 * created and managed by this application.
901 ***************************************************************************/
902 static void WmDtVersionCloseCB (
904 XtPointer clientData,
909 } /* END OF FUNCTION WmDtWmVersionCloseHelpCB */
914 /****************************************************************************
915 * Function: void WmDtProcessLinkCB(
917 * caddr_t clientData,
922 * Return Value: Void.
924 * Purpose: Process JUMP-NEW and APP-LINK hypertext requests in a
925 * given Help Dialog Window.
927 * This is the callback used for the DtNhyperLinkCallback
928 * on each of the help dialog widges created.
930 ****************************************************************************/
931 static void WmDtProcessLinkCB (
933 XtPointer clientData,
937 DtHelpDialogCallbackStruct * hyperData =
938 (DtHelpDialogCallbackStruct *) callData;
940 switch (hyperData->hyperType)
942 case DtHELP_LINK_JUMP_NEW:
943 WmDtDisplayTopic (XtParent(w), hyperData->helpVolume,
944 hyperData->locationId,
945 /* DtHELP_LINK_JUMP_NEW */ DtHELP_TYPE_TOPIC,
947 NULL, 0, NULL, True, NULL);
950 default: /* This catches the application definded link types */
951 if (hyperData->hyperType >= 100)
953 /* The application would put any code here to handle their
954 * Applicaiton-defined-links.
960 /* printf("We some how got a bogus hyptertext link type/n");*/
962 } /* End Switch Statement */
964 } /* END OF FUNCTION WmDtProcessLinkCB */
967 /****************************************************************************
968 * Function: void WmDtHelpOnVersion(
973 * Return Value: Void.
975 * Purpose: Displays a new Cache Creek help topic in a new/cached
976 * help dialog widget.
978 ****************************************************************************/
979 void WmDtHelpOnVersion (
988 Widget printButton = NULL;
989 Widget helpButton = NULL;
990 Widget backButton = NULL;
991 Widget closeButton = NULL;
992 #ifdef NO_MESSAGE_CATALOG
993 XmString label = NULL;
996 if((versionWidget != NULL) &&
997 (XtIsManaged(versionWidget)))
1003 if (!(versionWidget))
1005 #ifndef NO_MESSAGE_CATALOG
1006 XtSetArg (setArgs[n], XmNtitle, wmNLS.defaultVersionTitle); n++;
1008 XtSetArg (setArgs[n], XmNtitle, "About Workspace Manager"); n++;
1012 XtSetArg (setArgs[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
1013 XtSetArg (setArgs[n], DtNlocationId, "_COPYRIGHT"); n++;
1014 XtSetArg (setArgs[n], DtNhelpVolume, WM_DT_HELP_VOLUME); n++;
1016 versionWidget = DtCreateHelpQuickDialog (parent, "VersionDialog",
1019 XtAddCallback(versionWidget, DtNcloseCallback,
1021 (XtPointer) versionWidget);
1023 XtAddCallback(XtParent(versionWidget), XmNpopupCallback,
1024 WmDtVersionPopupCB, NULL);
1026 closeButton = DtHelpQuickDialogGetChild( versionWidget,
1027 DtHELP_QUICK_CLOSE_BUTTON );
1030 #ifndef NO_MESSAGE_CATALOG
1031 XtSetArg (setArgs2[n2], DtNcloseLabelString, wmGD.okLabel); n2++;
1033 XtSetArg (setArgs2[n2], DtNcloseLabelString,
1034 label=XmStringCreateLocalized ("OK")); n2++;
1037 XtSetValues(closeButton, setArgs2, n2);
1038 #ifdef NO_MESSAGE_CATALOG
1039 if(label)XmStringFree(label);
1042 printButton = DtHelpQuickDialogGetChild( versionWidget,
1043 DtHELP_QUICK_PRINT_BUTTON );
1044 helpButton = DtHelpQuickDialogGetChild( versionWidget,
1045 DtHELP_QUICK_HELP_BUTTON );
1046 backButton = DtHelpQuickDialogGetChild( versionWidget,
1047 DtHELP_QUICK_BACK_BUTTON );
1049 XtUnmanageChild(printButton);
1050 XtUnmanageChild(helpButton);
1051 XtUnmanageChild(backButton);
1055 XtSetArg (setArgs[n], DtNlocationId, "_COPYRIGHT"); n++;
1056 XtSetArg (setArgs[n], DtNhelpVolume, WM_DT_HELP_VOLUME); n++;
1057 XtSetValues(versionWidget, setArgs, n);
1059 XtManageChild(versionWidget);
1063 } /* END OF FUNCTION WmDtHelpOnVersion */
1067 /******************************<->*************************************
1069 * Boolean WmDtHelp (String args)
1081 * Return - True if the find a help callback; false otherwise.
1086 ******************************<->***********************************/
1089 WmDtHelp (String args)
1093 WmPanelistObject pPanelist;
1094 char *theHelpVolume = WM_DT_HELP_VOLUME;
1095 char *theHelpTopic = WM_DT_HELP_TOPIC;
1096 unsigned char volume[MAXWMPATH + 1];
1097 unsigned char topic[MAXWMPATH + 1];
1101 /* get right screen data */
1102 /* pSD = WmScreenDataFromWidget(w);*/
1103 pSD = wmGD.pActiveSD;
1106 pPanelist = (WmPanelistObject) pSD->wPanelist;
1108 if ((theWidget = O_Panel(pPanelist)))
1113 * parse args for volume and topic
1115 WmDtGetHelpArgs(args, volume, topic, &argCount);
1118 WmDtDisplayTopic(pSD->screenTopLevelW1,
1121 DtHELP_TYPE_TOPIC, theWidget, True,
1122 NULL, 0, NULL, False, NULL);
1126 WmDtDisplayTopic(pSD->screenTopLevelW1,
1129 DtHELP_TYPE_TOPIC, theWidget, False,
1130 NULL, 0, NULL, False, NULL);
1136 WmDtDisplayTopic(pSD->screenTopLevelW1,
1139 DtHELP_TYPE_TOPIC, theWidget, True,
1140 NULL, 0, NULL, False, NULL);
1148 } /* END OF FUNCTION WmDtHelp */
1151 /******************************<->*************************************
1153 * Boolean WmDtHelpMode (void)
1157 * Invoke item help mode
1165 * Return - True if the find a help callback; false otherwise.
1170 ******************************<->***********************************/
1175 Widget selectedWidget = NULL;
1177 String sTmp, sMessage, sTitle;
1179 iStatus = WmDtReturnSelectedWidget(wmGD.topLevelW, None,
1184 case DtHELP_SELECT_VALID:
1185 if (selectedWidget != (Widget) NULL)
1189 if ((XtHasCallbacks(selectedWidget,
1190 XmNhelpCallback) == XtCallbackHasSome))
1192 XtCallCallbacks(selectedWidget, XmNhelpCallback,
1198 selectedWidget = XtParent(selectedWidget);
1201 while (selectedWidget != NULL);
1205 case DtHELP_SELECT_INVALID:
1206 /* invalid selection error (window not of this process) */
1207 #ifndef NO_MESSAGE_CATALOG
1208 sTmp = (char *)GETMESSAGE(29, 3,
1209 "You must select a Workspace Manager\n\
1210 dialog, an item in the Front Panel,\n\
1211 or an item in a subpanel.");
1212 sMessage = XtNewString (sTmp);
1213 sTmp = (char *)GETMESSAGE(29, 4,
1214 "Workspace Manager - Help On Item Error");
1215 sTitle = XtNewString (sTmp);
1217 sMessage = "You must select a Workspace Manager\n\
1218 dialog, an item in the Front Panel,\n\
1219 or an item in a subpanel.";
1220 sTitle = "Workspace Manager - Help On Item Error";
1222 wmDtErrorDialog (ACTIVE_PSD, sMessage, sTitle);
1223 #ifndef NO_MESSAGE_CATALOG
1224 if (sMessage) XtFree (sMessage);
1225 if (sTitle) XtFree (sTitle);
1229 case DtHELP_SELECT_ERROR:
1230 /* error (like grab failed) */
1233 case DtHELP_SELECT_ABORT:
1234 /* user aborted this selection */
1239 } /* END OF FUNCTION WmDtHelpMode */
1243 /*****************************************************************************
1244 * Function: WmDtReturnSelectedWidget (Widget, Cursor, Widget *)
1246 * Parameters: Widget Specifies a valid widget within the app's
1248 * Cursor Cursor to grab pointer with (use NULL!!)
1249 * Widget * ptr to loc to receive returned widget
1251 * Return Value: DtHELP_SELECT_ERROR - error in getting the widget
1252 * DtHELP_SELECT_ABORT - user aborted
1253 * DtHELP_SELECT_INVALID - user selected invalid window
1254 * DtHELP_SELECT_VALID - valid widget returned
1256 * Purpose: Allows developers to get the widget ID for any widget in their UI
1257 * that the user has selected vai the pointer. This function will
1258 * cause the cursor to change and allow a user to select an item in
1261 *****************************************************************************/
1263 WmDtReturnSelectedWidget(
1273 /* Setup some needed variables */
1274 dpy = XtDisplay(theWidget);
1275 screen = ACTIVE_SCREEN;
1277 /* refresh the display */
1278 XmUpdateDisplay(theWidget);
1280 /* Change the curser to let the user select the desired widget */
1281 iStatus = LocateTheControl(dpy, screen, pWidget);
1285 } /* END OF FUNCTION WmDtReturnSelectedWidget */
1288 /****************************************************************************
1289 * Function: void WmDtDisplayTopic(
1297 * ClientData *pCData,
1298 * Boolean hyperlink,
1299 * DisplayTopicInfo *displayTopicInfo)
1303 * Return Value: Void.
1305 * Purpose: Displays a new Cache Creek help topic in a new/cached
1306 * help dialog widget.
1308 ****************************************************************************/
1321 DisplayTopicInfo *displayTopicInfo)
1333 WmPanelistObject pPanelist;
1334 char * defaultTitle="Help";
1335 ClientData *pCD = NULL;
1336 WmScreenData *pSD = NULL;
1337 CacheListStruct *pCurrentNode = NULL;
1338 Boolean cachedNode = FALSE;
1341 pSD = WmScreenDataFromWidget (parent);
1344 pPanelist = (WmPanelistObject) pSD->wPanelist;
1348 /*argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount + 1)) ;*/
1349 argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount)) ;
1350 memcpy( argsNew, argList, (sizeof( Arg) * argCount)) ;
1353 shellWidget = parent;
1354 while (!(XtIsSubclass(shellWidget, shellWidgetClass)))
1356 shellWidget = XtParent(shellWidget);
1362 case DtHELP_TYPE_TOPIC:
1363 if (helpVolume != NULL)
1365 XtSetArg (setArgs[n],DtNhelpVolume,helpVolume); n++;
1367 XtSetArg (setArgs[n], DtNlocationId,locationId); n++;
1368 helpTitle=locationId;
1371 case DtHELP_TYPE_DYNAMIC_STRING:
1372 XtSetArg (setArgs[n], DtNstringData, locationId); n++;
1373 /* helpTitle=locationId;*/
1374 helpTitle=defaultTitle;
1377 case DtHELP_TYPE_MAN_PAGE:
1380 case DtHELP_TYPE_FILE:
1385 /* error condition, don't try to display help */
1391 XtSetArg (setArgs[n], DtNhelpType, helpType); n++;
1395 if (pSD->dtHelp.shell)
1397 helpWidget = pSD->dtHelp.dialog;
1398 XtSetValues(helpWidget, setArgs, n);
1402 #ifndef NO_MESSAGE_CATALOG
1403 XtSetArg (setArgs[n], XmNtitle,
1404 wmNLS.defaultDtwmHelpTitle); n++;
1406 XtSetArg (setArgs[n], XmNtitle,
1407 "Workspace Manager - Help"); n++;
1410 pSD->dtHelp.dialog =
1411 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1412 helpWidget = pSD->dtHelp.dialog;
1413 pSD->dtHelp.shell = XtParent(helpWidget);
1414 pSD->dtHelp.bMapped = False;
1417 XtSetArg (setArgs[n], XmNname, "wmHelp"); n++;
1420 XtSetValues(pSD->dtHelp.shell,
1424 XtAddCallback(helpWidget,
1425 DtNhyperLinkCallback,
1426 WmDtProcessLinkCB, NULL);
1428 XtAddCallback(helpWidget, DtNcloseCallback,
1430 (XtPointer) helpWidget);
1432 XtAddCallback(pSD->dtHelp.shell, XmNpopupCallback,
1433 WmDtWmPopupHelpCB, NULL);
1435 XtAddEventHandler(pSD->dtHelp.shell,
1436 StructureNotifyMask,
1438 wmDtHelpMapEventHandler,
1444 ShowHelpDialog(pCData);
1450 XFindContext (DISPLAY, XtWindow(XtParent(wmClient)),
1451 wmGD.windowContextType, (caddr_t *)&pCD);
1455 XFindContext (DISPLAY, XtWindow(O_Shell(pPanelist)),
1456 wmGD.windowContextType, (caddr_t *)&pCD);
1458 ShowHelpDialog(pCD);
1463 /* Get a used or new node form our cache if we have one */
1464 cachedNode = WmDtGetFromCache(&pCurrentNode, pSD);
1466 /* If we got a free one from the Cache, use it */
1467 /* Set Values on current free one, then map it */
1470 XtSetValues(pCurrentNode->helpDialog, setArgs, n);
1474 #ifndef NO_MESSAGE_CATALOG
1475 XtSetArg (setArgs[n], XmNtitle,
1476 wmNLS.defaultHelpTitle); n++;
1478 XtSetArg (setArgs[n], XmNtitle,
1479 "Workspace Manager - Help"); n++;
1482 XtSetArg (setArgs[n], XmNgeometry, NULL); n++;
1483 XtSetArg (setArgs[n], XmNx, 0); n++;
1484 XtSetArg (setArgs[n], XmNy, 0); n++;
1486 pCurrentNode->helpDialog =
1487 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1489 XtSetArg (setArgs[n], XmNname, "cachedHelp"); n++;
1492 XtSetValues(shellWidget, argList, argCount);
1495 XtAddCallback(pCurrentNode->helpDialog,
1496 DtNhyperLinkCallback,
1497 WmDtProcessLinkCB, NULL);
1499 XtAddCallback(pCurrentNode->helpDialog, DtNcloseCallback,
1501 (XtPointer) pCurrentNode->helpDialog);
1505 pCurrentNode->hLink = True;
1509 if (displayTopicInfo)
1511 pCurrentNode->workspaces =
1512 displayTopicInfo->workspaces;
1513 pCurrentNode->xPos = displayTopicInfo->xPos;
1514 pCurrentNode->yPos = displayTopicInfo->yPos;
1515 pCurrentNode->restored = True;
1516 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1519 (XtPointer)pCurrentNode);
1523 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1525 WmDtPopupHelpCB, NULL);
1530 helpWidget = pCurrentNode->helpDialog;
1531 XtManageChild(helpWidget);
1532 XtPopup(XtParent(helpWidget), XtGrabNone);
1535 } /* if n is still 0, we did not find a useful help type */
1537 } /* END OF FUNCTION WmDtDisplayTopic */
1540 /****************************************************************************
1541 * Function: static Boolean WmDtGetFromCache(
1542 * CacheListStruct **pCurrentNode)
1547 * Return Value: Void.
1549 * Purpose: Gets a free help node form our cache list. If none are
1550 * free, it will return fallse and the calling routine will
1551 * create a new help dialog widget.
1553 ****************************************************************************/
1554 static Boolean WmDtGetFromCache(
1555 CacheListStruct **pCurrentNode,
1558 CacheListStruct *pTemp;
1560 if (pSD->cachedHelp == NULL)
1562 /* We have a new list so lets create one and pass it back */
1564 (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1566 /* Assign the default values to our node */
1567 pSD->cachedHelp->helpDialog = NULL;
1568 pSD->cachedHelp->inUseFlag = TRUE;
1569 pSD->cachedHelp->restored = False;
1570 pSD->cachedHelp->hLink = False;
1571 pSD->cachedHelp->pNext = NULL;
1572 pSD->cachedHelp->pPrevious = NULL;
1574 /* Return our head pointer because it's our first and only node */
1575 *pCurrentNode = pSD->cachedHelp;
1580 /* We have some nodes so search for a free one first */
1581 pTemp = pSD->cachedHelp;
1583 while (pTemp != NULL)
1585 if (pTemp->inUseFlag == FALSE)
1587 pTemp->inUseFlag = TRUE;
1588 pTemp->hLink = False;
1589 pTemp->restored = False;
1590 *pCurrentNode = pTemp;
1594 pTemp = pTemp->pNext;
1599 * If we did not find a free node then we must add a new one to the
1600 * top of the list, and return it.
1603 pTemp = (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1605 /* Assign the default values to our node */
1606 pTemp->helpDialog = NULL;
1607 pTemp->inUseFlag = TRUE;
1608 pTemp->restored = False;
1609 pTemp->hLink = False;
1610 pTemp->pNext = pSD->cachedHelp;
1611 pTemp->pPrevious = NULL;
1613 pSD->cachedHelp->pPrevious = pTemp;
1615 /* Re-Assign our head pointer to point to the new head of the list */
1616 pSD->cachedHelp = pTemp;
1618 /* Return our head pointer because it's our new node */
1619 *pCurrentNode = pSD->cachedHelp;
1623 } /* END OF FUNCTION WmDtGetFromCache */
1625 /* End of Dt utils */
1628 /*************************************<->*************************************
1631 * RestoreHelpDialogs (pSD)
1636 * Saves the state of the help system
1650 ******************************<->***********************************/
1658 XrmName xrm_name[5];
1659 XrmRepresentation rep_type;
1662 Position xLoc, yLoc;
1663 short columns, rows;
1669 char dialogName[18];
1671 ClientData *pCD = NULL;
1672 char *tTitle = NULL;
1673 char *wsName = NULL;
1674 char *wmClientName = NULL;
1675 char *helpVolume = NULL;
1676 char *locationId = NULL;
1677 char *stringData = NULL;
1678 char *workspaces = NULL;
1683 WmPanelistObject pPanelist = (WmPanelistObject) pSD->wPanelist;
1690 if (pSD->helpResources)
1692 if ((db = XrmGetStringDatabase (pSD->helpResources)) == NULL)
1696 xrm_name [0] = XrmStringToQuark ("wsHelp");
1697 xrm_name [1] = XrmStringToQuark ("onScreen");
1698 xrm_name [2] = NULLQUARK;
1701 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1703 /* Are we supposed to be mapped? */
1704 if (strcmp(value.addr, "True") == 0)
1707 /* get x position */
1708 xrm_name [1] = XrmStringToQuark ("x");
1709 if (XrmQGetResource (db, xrm_name, xrm_name,
1712 pSD->dtHelp.xPos = (Position)atoi((char *)value.addr);
1713 pSD->dtHelp.restored = True;
1716 /* get y position */
1717 xrm_name [1] = XrmStringToQuark ("y");
1718 if (XrmQGetResource (db, xrm_name, xrm_name,
1721 pSD->dtHelp.yPos = (Position)atoi((char *)value.addr);
1722 pSD->dtHelp.restored = True;
1726 xrm_name [1] = XrmStringToQuark ("columns");
1727 if (XrmQGetResource (db, xrm_name, xrm_name,
1730 XtSetArg (setArgs[ac], XmNcolumns,
1731 (short)atoi((char *)value.addr)); ac++;
1732 columns = (short)atoi((char *)value.addr);
1736 xrm_name [1] = XrmStringToQuark ("rows");
1737 if (XrmQGetResource (db, xrm_name, xrm_name,
1740 XtSetArg (setArgs[ac], XmNrows,
1741 (short)atoi((char *)value.addr)); ac++;
1742 rows = (short)atoi((char *)value.addr);
1744 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1746 XtSetArg (setArgs[ac], XmNgeometry,
1747 XtNewString(geometry)); ac++;
1749 /* get visiblePathCount */
1750 xrm_name [1] = XrmStringToQuark ("vPCount");
1751 if (XrmQGetResource (db, xrm_name, xrm_name,
1754 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1755 (int)atoi((char *)value.addr)); ac++;
1758 /* get topicTitle */
1759 xrm_name [1] = XrmStringToQuark ("tTitle");
1760 if (XrmQGetResource (db, xrm_name, xrm_name,
1763 tTitle = XtNewString ((char *)value.addr);
1764 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1768 xrm_name [1] = XrmStringToQuark ("helpType");
1769 if (XrmQGetResource (db, xrm_name, xrm_name,
1772 XtSetArg (setArgs[ac], DtNhelpType,
1773 (int)atoi((char *)value.addr)); ac++;
1774 helpType = (int)atoi((char *)value.addr);
1780 case DtHELP_TYPE_TOPIC:
1781 /* get helpVolume */
1782 xrm_name [1] = XrmStringToQuark ("helpVolume");
1783 if (XrmQGetResource (db, xrm_name, xrm_name,
1786 helpVolume = XtNewString ((char *)value.addr);
1787 /* XtSetArg (setArgs[ac], DtNhelpVolume,
1788 helpVolume); ac++;*/
1790 /* get locationId */
1791 xrm_name [1] = XrmStringToQuark ("locationId");
1792 if (XrmQGetResource (db, xrm_name, xrm_name,
1795 locationId = XtNewString ((char *)value.addr);
1796 /* XtSetArg (setArgs[ac], DtNlocationId,
1797 locationId); ac++;*/
1802 case DtHELP_TYPE_DYNAMIC_STRING:
1804 /* get stringData */
1805 xrm_name [1] = XrmStringToQuark ("stringData");
1806 if (XrmQGetResource (db, xrm_name, xrm_name,
1809 stringData = XtNewString ((char *)value.addr);
1810 /* XtSetArg (setArgs[ac], DtNstringData,
1811 stringData); ac++;*/
1812 locationId = stringData;
1817 case DtHELP_TYPE_MAN_PAGE:
1821 case DtHELP_TYPE_FILE:
1826 /* error condition, don't try to display help */
1830 /* get name of wm client for which wmHelp is transient */
1832 xrm_name [1] = XrmStringToQuark ("windowGroup");
1833 if (XrmQGetResource (db, xrm_name, xrm_name,
1836 wmClientName = ((char *)value.addr);
1837 if ((!strcmp(wmClientName, pSD->iconBoxName)) &&
1840 xrm_name [1] = XrmStringToQuark ("wsName");
1841 if (XrmQGetResource (db, xrm_name, xrm_name,
1844 wsName = (char *)value.addr;
1845 for (wsCnt = 0; wsCnt < pSD->numWorkspaces;
1848 if (!strcmp(pSD->pWS[wsCnt].name, wsName))
1850 pCD=pSD->pWS[wsCnt].pIconBox->pCD_iconBox;
1858 else if(!strcmp(wmClientName, O_PanelName(pPanelist)))
1860 pCD=O_ClientData(pPanelist);
1866 * Map the help dialog
1869 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
1871 helpType, NULL, True,
1872 setArgs, ac, pCD, False, NULL);
1874 }/* if (XrmQGetResource for wsHelp) */
1876 xrm_name [0] = XrmStringToQuark ("cachedHelp");
1877 xrm_name [1] = XrmStringToQuark ("cachedCount");
1878 xrm_name [2] = NULLQUARK;
1881 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1883 /* restore cachedCount number of help dialogs */
1884 cachedCount = (int)atoi((char *)value.addr);
1885 for (cCount=1; cCount < (cachedCount + 1); cCount++)
1887 sprintf (dialogName, "oWsHelp%d", cCount);
1888 xrm_name [0] = XrmStringToQuark (dialogName);
1889 xrm_name [1] = NULLQUARK;
1890 xrm_name [2] = NULLQUARK;
1892 displayTopicInfo.xPos = 0;
1893 displayTopicInfo.xPos = 0;
1894 displayTopicInfo.workspaces = NULL;
1897 /* get x position */
1898 xrm_name [1] = XrmStringToQuark ("x");
1899 if (XrmQGetResource (db, xrm_name, xrm_name,
1902 /* XtSetArg (setArgs[ac], XmNx,
1903 atoi((char *)value.addr)); ac++;*/
1904 xLoc = (Position)atoi((char *)value.addr);
1905 displayTopicInfo.xPos = xLoc;
1908 /* get y position */
1909 xrm_name [1] = XrmStringToQuark ("y");
1910 if (XrmQGetResource (db, xrm_name, xrm_name,
1913 /* XtSetArg (setArgs[ac], XmNy,
1914 atoi((char *)value.addr)); ac++;*/
1915 yLoc = (Position)atoi((char *)value.addr);
1916 displayTopicInfo.yPos = yLoc;
1920 xrm_name [1] = XrmStringToQuark ("columns");
1921 if (XrmQGetResource (db, xrm_name, xrm_name,
1924 XtSetArg (setArgs[ac], XmNcolumns,
1925 (short)atoi((char *)value.addr)); ac++;
1926 columns = (short)atoi((char *)value.addr);
1930 xrm_name [1] = XrmStringToQuark ("rows");
1931 if (XrmQGetResource (db, xrm_name, xrm_name,
1934 XtSetArg (setArgs[ac], XmNrows,
1935 (short)atoi((char *)value.addr)); ac++;
1936 rows = (short)atoi((char *)value.addr);
1938 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1940 XtSetArg (setArgs[ac], XmNgeometry,
1941 XtNewString(geometry)); ac++;
1943 /* get visiblePathCount */
1944 xrm_name [1] = XrmStringToQuark ("vPCount");
1945 if (XrmQGetResource (db, xrm_name, xrm_name,
1948 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1949 (int)atoi((char *)value.addr)); ac++;
1952 /* get topicTitle */
1953 xrm_name [1] = XrmStringToQuark ("tTitle");
1954 if (XrmQGetResource (db, xrm_name, xrm_name,
1957 tTitle = XtNewString ((char *)value.addr);
1958 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1961 /* get workspaces list */
1962 xrm_name [1] = XrmStringToQuark ("workspaces");
1963 if (XrmQGetResource (db, xrm_name, xrm_name,
1966 workspaces = XtNewString ((char *)value.addr);
1967 displayTopicInfo.workspaces = workspaces;
1972 xrm_name [1] = XrmStringToQuark ("helpType");
1973 if (XrmQGetResource (db, xrm_name, xrm_name,
1976 XtSetArg (setArgs[ac], DtNhelpType,
1977 (int)atoi((char *)value.addr)); ac++;
1978 helpType = (int)atoi((char *)value.addr);
1984 case DtHELP_TYPE_TOPIC:
1985 /* get helpVolume */
1986 xrm_name [1] = XrmStringToQuark ("helpVolume");
1987 if (XrmQGetResource (db, xrm_name, xrm_name,
1990 helpVolume = XtNewString ((char *)value.addr);
1992 /* get locationId */
1993 xrm_name [1] = XrmStringToQuark ("locationId");
1994 if (XrmQGetResource (db, xrm_name, xrm_name,
1997 locationId = XtNewString ((char *)value.addr);
2002 case DtHELP_TYPE_DYNAMIC_STRING:
2004 /* get stringData */
2005 xrm_name [1] = XrmStringToQuark ("stringData");
2006 if (XrmQGetResource (db, xrm_name, xrm_name,
2009 stringData = XtNewString ((char *)value.addr);
2010 /* XtSetArg (setArgs[ac], DtNstringData,
2011 stringData); ac++;*/
2012 locationId = stringData;
2017 case DtHELP_TYPE_MAN_PAGE:
2021 case DtHELP_TYPE_FILE:
2026 /* error condition, don't try to display help */
2031 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
2033 helpType, NULL, False,
2034 setArgs, ac, NULL, False,
2037 } /* for all cached help dialogs */
2040 } /* if (XrmQGetResource ) cachedHelp/cachedCount */
2042 XrmDestroyDatabase(db);
2047 } /* END OF FUNCTION RestoreHelpDialogs */
2049 /*************************************<->*************************************
2052 * SaveHelpResources (pSD)
2057 * Saves the state of the help system
2071 ******************************<->***********************************/
2078 PtrWsDtHelpData pHelp;
2079 CacheListStruct *pTemp;
2083 Window wmGroupWindow;
2085 ClientData *pCDforHelp;
2089 WmWorkspaceData *pWS;
2091 Position xLoc, yLoc;
2092 short columns, rows;
2093 unsigned char helpType;
2100 char workspaces[MAXWMPATH+1];
2102 char buffer[MAXWMPATH+1];
2107 char screenName[10];
2108 char dialogName[128];
2109 char resString[MAXWMPATH+1];
2114 pHelp = &pSD->dtHelp;
2116 /* allocate initial data space */
2117 if ((data = (char *) XtMalloc (MAXWMPATH+1)) == NULL)
2120 GETMESSAGE(76,12,"Insufficient memory to save resources")));
2121 Do_Quit_Mwm (False);
2126 /* Get our current resource class */
2130 res_class = WM_RESOURCE_CLASS;
2134 res_class = DT_WM_RESOURCE_CLASS;
2137 sprintf (screenName, "%d", pSD->screen);
2139 sprintf (buffer, "%s*%s*%s: \\n ", res_class, screenName,
2141 AddStringToResourceData (buffer, &data, &cum_len);
2143 if (pHelp->onScreen)
2145 sprintf (dialogName, "wsHelp");
2146 sprintf (buffer, "%s*onScreen: True\\n ", dialogName);
2147 AddStringToResourceData (buffer, &data, &cum_len);
2150 XtSetArg(getArgs[ac], XmNx, &xLoc); ac++;
2151 XtSetArg(getArgs[ac], XmNy, &yLoc); ac++;
2152 XtGetValues(pSD->dtHelp.shell, getArgs, ac);
2153 if (!XFindContext (DISPLAY, XtWindow(pSD->dtHelp.shell),
2154 wmGD.windowContextType, (caddr_t *)&pCDforHelp))
2156 if (wmGD.positionIsFrame)
2158 xLoc = xLoc - pCDforHelp->clientOffset.x;
2159 yLoc = yLoc - pCDforHelp->clientOffset.y;
2164 XtSetArg(getArgs[ac], XmNcolumns, &columns); ac++;
2165 XtSetArg(getArgs[ac], XmNrows, &rows); ac++;
2166 XtSetArg(getArgs[ac], DtNhelpType, &helpType); ac++;
2167 XtSetArg(getArgs[ac], DtNvisiblePathCount, &vPCount); ac++;
2168 XtSetArg(getArgs[ac], DtNtopicTitle, &topicTitle); ac++;
2169 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2171 sprintf (buffer, "%s*x: %d \\n ", dialogName, xLoc);
2172 AddStringToResourceData (buffer, &data, &cum_len);
2173 sprintf (buffer, "%s*y: %d \\n ", dialogName, yLoc);
2174 AddStringToResourceData (buffer, &data, &cum_len);
2175 sprintf (buffer, "%s*columns: %d \\n ", dialogName, columns);
2176 AddStringToResourceData (buffer, &data, &cum_len);
2177 sprintf (buffer, "%s*rows: %d \\n ", dialogName, rows);
2178 AddStringToResourceData (buffer, &data, &cum_len);
2179 sprintf (buffer, "%s*helpType: %d \\n ", dialogName, helpType);
2180 AddStringToResourceData (buffer, &data, &cum_len);
2181 sprintf (buffer, "%s*vPCount: %d \\n ", dialogName, vPCount);
2182 AddStringToResourceData (buffer, &data, &cum_len);
2183 sprintf (buffer, "%s*tTitle: %s\\n ", dialogName, topicTitle);
2184 AddStringToResourceData (buffer, &data, &cum_len);
2189 case DtHELP_TYPE_TOPIC:
2190 XtSetArg (getArgs[ac],DtNhelpVolume, &helpVolume); ac++;
2191 XtSetArg (getArgs[ac], DtNlocationId, &locationId); ac++;
2192 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2193 sprintf (buffer, "%s*helpVolume: %s\\n ", dialogName, helpVolume);
2194 AddStringToResourceData (buffer, &data, &cum_len);
2195 sprintf (buffer, "%s*locationId: %s\\n ", dialogName, locationId);
2196 AddStringToResourceData (buffer, &data, &cum_len);
2200 case DtHELP_TYPE_DYNAMIC_STRING:
2201 XtSetArg (getArgs[ac], DtNstringData, &stringData); ac++;
2202 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2203 sprintf (buffer, "%s*stringData: %s\\n ", dialogName, stringData);
2204 AddStringToResourceData (buffer, &data, &cum_len);
2208 case DtHELP_TYPE_MAN_PAGE:
2212 case DtHELP_TYPE_FILE:
2217 /* error condition, don't try to display help */
2222 XtSetArg(getArgs[ac], XmNwindowGroup, &wmGroupWindow); ac++;
2223 XtGetValues(pSD->dtHelp.shell, getArgs, ac);
2225 if (!XFindContext (DISPLAY, wmGroupWindow,
2226 wmGD.windowContextType, (caddr_t *)&pCD))
2228 sprintf (buffer, "%s*windowGroup: %s\\n ", dialogName,
2230 AddStringToResourceData (buffer, &data, &cum_len);
2232 if ((!strcmp(pCD->clientName, pSD->iconBoxName)) &&
2235 wsName = XGetAtomName(DISPLAY,
2236 pCD->pWsList[pCD->currentWsc].wsID);
2237 sprintf (buffer, "%s*wsName: %s\\n ", dialogName,
2239 AddStringToResourceData (buffer, &data, &cum_len);
2246 if (pSD->cachedHelp != NULL)
2249 * We have some nodes so search for
2250 * managed dialogs and save their state
2253 pTemp = pSD->cachedHelp;
2255 while (pTemp != NULL)
2257 if (pTemp->inUseFlag == FALSE)
2259 pTemp = pTemp->pNext;
2264 sprintf (dialogName, "oWsHelp%d",cachedCount);
2267 XtSetArg(getArgs[ac], XmNx, &xLoc); ac++;
2268 XtSetArg(getArgs[ac], XmNy, &yLoc); ac++;
2269 XtGetValues(XtParent(pTemp->helpDialog), getArgs, ac);
2270 if (!XFindContext (DISPLAY,
2271 XtWindow(XtParent(pTemp->helpDialog)),
2272 wmGD.windowContextType,
2273 (caddr_t *)&pCDforHelp))
2275 if (wmGD.positionIsFrame)
2277 xLoc = xLoc - pCDforHelp->clientOffset.x;
2278 yLoc = yLoc - pCDforHelp->clientOffset.y;
2288 XtSetArg(getArgs[ac], XmNcolumns, &columns); ac++;
2289 XtSetArg(getArgs[ac], XmNrows, &rows); ac++;
2290 XtSetArg(getArgs[ac], DtNhelpType, &helpType); ac++;
2291 XtSetArg(getArgs[ac], DtNvisiblePathCount, &vPCount); ac++;
2292 XtSetArg(getArgs[ac], DtNtopicTitle, &topicTitle); ac++;
2293 XtGetValues(pTemp->helpDialog, getArgs, ac);
2295 sprintf (buffer, "%s*x: %d \\n ", dialogName, xLoc);
2296 AddStringToResourceData (buffer, &data, &cum_len);
2297 sprintf (buffer, "%s*y: %d \\n ", dialogName, yLoc);
2298 AddStringToResourceData (buffer, &data, &cum_len);
2299 sprintf (buffer, "%s*columns: %d \\n ", dialogName, columns);
2300 AddStringToResourceData (buffer, &data, &cum_len);
2301 sprintf (buffer, "%s*rows: %d \\n ", dialogName, rows);
2302 AddStringToResourceData (buffer, &data, &cum_len);
2303 sprintf (buffer, "%s*helpType: %d \\n ", dialogName, helpType);
2304 AddStringToResourceData (buffer, &data, &cum_len);
2305 sprintf (buffer, "%s*vPCount: %d \\n ", dialogName, vPCount);
2306 AddStringToResourceData (buffer, &data, &cum_len);
2307 sprintf (buffer, "%s*tTitle: %s\\n ", dialogName, topicTitle);
2308 AddStringToResourceData (buffer, &data, &cum_len);
2313 case DtHELP_TYPE_TOPIC:
2314 XtSetArg (getArgs[ac],DtNhelpVolume, &helpVolume); ac++;
2315 XtSetArg (getArgs[ac], DtNlocationId, &locationId); ac++;
2316 XtGetValues(pTemp->helpDialog, getArgs, ac);
2317 sprintf (buffer, "%s*helpVolume: %s\\n ",
2318 dialogName, helpVolume);
2319 AddStringToResourceData (buffer, &data, &cum_len);
2320 sprintf (buffer, "%s*locationId: %s\\n ",
2321 dialogName, locationId);
2322 AddStringToResourceData (buffer, &data, &cum_len);
2326 case DtHELP_TYPE_DYNAMIC_STRING:
2327 XtSetArg (getArgs[ac], DtNstringData, &stringData); ac++;
2328 XtGetValues(pTemp->helpDialog, getArgs, ac);
2329 sprintf (buffer, "%s*stringData: %s\\n ",
2330 dialogName, stringData);
2331 AddStringToResourceData (buffer, &data, &cum_len);
2335 case DtHELP_TYPE_MAN_PAGE:
2339 case DtHELP_TYPE_FILE:
2344 /* error condition, don't try to display help */
2351 sprintf(workspaces, "%s", "");
2352 for (wsCnt = 0; wsCnt < pSD->numWorkspaces;
2355 wsID = XInternAtom (DISPLAY, pSD->pWS[wsCnt].name,
2357 pWS = GetWorkspaceData (pSD, wsID);
2359 if (ClientInWorkspace (pWS, pCDforHelp))
2363 strcpy(workspaces, pSD->pWS[wsCnt].name);
2368 strcat(workspaces, "*");
2369 strcat(workspaces, pSD->pWS[wsCnt].name);
2374 sprintf (buffer, "%s*workspaces: %s\\n ", dialogName,
2376 AddStringToResourceData (buffer, &data, &cum_len);
2378 pTemp = pTemp->pNext;
2383 sprintf (buffer, "cachedHelp*cachedCount: %d\\n ", cachedCount);
2384 AddStringToResourceData (buffer, &data, &cum_len);
2391 * Save help resources as a string
2393 sprintf (buffer, " \n");
2394 AddStringToResourceData (buffer, &data, &cum_len);
2396 _DtAddToResource (DISPLAY, data);
2400 } /* END OF FUNCTION SaveHelpResources */
2404 /* Code stolen from WmPresence.c */
2406 /*************************************<->*************************************
2409 * ShowHelpDialog (pClient)
2414 * Pops up (shows) the help dialog
2428 ******************************<->***********************************/
2432 ClientData *pClient)
2434 PtrWsDtHelpData pHelp;
2446 pHelp = &pSD->dtHelp;
2448 pOldCD = pHelp->pCDforClient;
2449 pHelp->pCDforClient = pClient;
2450 /* pHelp->contextForClient = wsContext;*/
2452 if (pSD->dtHelp.onScreen)
2454 ClientData *pCD = NULL;
2456 XFindContext (DISPLAY, XtWindow (pSD->dtHelp.shell),
2457 wmGD.windowContextType, (XtPointer) &pCD);
2459 if ((!pSD->dtHelp.bMapped) ||
2461 (!ClientInWorkspace (ACTIVE_WS, pCD) ||
2462 (pCD->clientState == MINIMIZED_STATE) ||
2463 (pOldCD && pOldCD != pHelp->pCDforClient))))
2465 HideHelpDialog (pSD, True);
2473 XtManageChild(pSD->dtHelp.dialog);
2474 XtPopup (pSD->dtHelp.shell, XtGrabNone);
2476 pSD->dtHelp.onScreen = True;
2478 } /* END OF FUNCTION ShowHelpDialog */
2481 /*************************************<->*************************************
2484 * HideHelpDialog (pSD, userDismissed)
2489 * Pops down (hides) the workspace presence dialog
2493 * pSD = pointer to screen data
2494 * userDismissed = did the user dismiss or did workspace switching
2495 * unpost the workspace presence box ?
2505 ******************************<->***********************************/
2510 Boolean userDismissed )
2513 if (pSD->dtHelp.onScreen)
2515 /* Pop down the shell */
2516 XtPopdown (pSD->dtHelp.shell);
2519 * Do a withdraw to make sure window gets unmanaged
2520 * (popdown does nothing if its unmapped)
2522 XWithdrawWindow (DISPLAY, XtWindow (pSD->dtHelp.shell),
2524 /* must sync to insure event order */
2525 XSync (DISPLAY, False);
2528 pSD->dtHelp.onScreen = False;
2529 pSD->dtHelp.userDismissed = userDismissed;
2532 } /* END OF FUNCTION HideHelpDialog */
2535 /*************************************<->*************************************
2537 * wmDtHelpSetPosition (pHelp, pSD, restorePos)
2542 * Sets the position of the workspace presence dialog
2546 * pPres = pointer to workspace presence data
2551 ******************************<->***********************************/
2553 wmDtHelpSetPosition(
2554 PtrWsDtHelpData pHelp,
2562 Window wGroup = None;
2564 ClientData *pCDforHelp;
2569 * Get size of this dialog
2572 XtSetArg (args[n], XmNheight, &height); n++;
2573 XtGetValues (pHelp->shell, args, n);
2575 if (wmGD.positionIsFrame)
2577 if (pSD->decoupleTitleAppearance)
2579 font = pSD->clientTitleAppearance.font;
2583 font = pSD->clientAppearance.font;
2586 /* height += TEXT_HEIGHT(font) + (2 * pSD->frameBorderWidth);*/
2587 height += TEXT_HEIGHT(font) + (2 * pSD->resizeBorderWidth);
2592 * set position of dialog relative to client window
2593 * (use system menu position)
2594 * set this dialog to be transient for the client
2595 * for which it is posted.
2597 if (pHelp->pCDforClient)
2599 GetSystemMenuPosition (pHelp->pCDforClient,
2603 if(y < pHelp->pCDforClient->frameInfo.y)
2605 if (!XFindContext (DISPLAY, XtWindow(pHelp->shell),
2606 wmGD.windowContextType,
2607 (caddr_t *)&pCDforHelp))
2609 if (wmGD.positionIsFrame)
2611 /* x = x - pCDforHelp->clientOffset.x;*/
2612 y = y - pCDforHelp->clientOffset.x;
2617 y = y - (2 * pSD->frameBorderWidth);
2625 * Don't have a client so map at 0,0
2638 XtSetArg (args[n], XmNgeometry, NULL); n++;
2639 XtSetArg (args[n], XmNx, x); n++;
2640 XtSetArg (args[n], XmNy, y); n++;
2641 XtSetArg (args[n], XmNtransientFor, NULL); n++;
2643 if (pHelp->pCDforClient)
2649 XtSetArg (al[ac], XmNwindowGroup, &wGroup); ac++;
2650 XtGetValues (pHelp->shell, al, ac);
2653 if (pHelp->contextForClient != F_CONTEXT_ICON)
2655 XtSetArg (args[n], XmNwindowGroup,
2656 pHelp->pCDforClient->client);
2659 else if (pSD->useIconBox && P_ICON_BOX(pHelp->pCDforClient))
2661 XtSetArg (args[n], XmNwindowGroup,
2662 P_ICON_BOX(pHelp->pCDforClient)->pCD_iconBox->client);
2667 XtSetArg (args[n], XmNwindowGroup, 0); n++;
2670 if (wGroup != pHelp->pCDforClient->client)
2673 * Changing who this is transient for, need to
2674 * make sure the window is unmapped so that the
2675 * window manager moves it to the right place.
2677 HideHelpDialog (pSD, True);
2680 XtSetArg (args[n], XmNwindowGroup, pHelp->pCDforClient->client); n++;
2687 HideHelpDialog (pSD, True);
2689 XtSetArg (args[n], XmNwindowGroup, 0); n++;
2692 XtSetArg (args[n], XmNwaitForWm, False); n++;
2694 XtSetValues (pHelp->shell, args, n);
2697 } /* END OF FUNCTION wmDtHelpSetPosition */
2699 /* End of Code stolen from WmPresence.c */
2701 /*************************************<->*************************************
2703 * wmDtHelpMapEventHandler (wHelp, pSD, pEvent)
2708 * An XtEventHandler called on structure notify events on the screen's
2709 * help window. (Only handles map and unmap events)
2713 * wHelp = help widget
2714 * pSD = ptr to screen data
2715 * pEvent = event triggering this call
2720 ******************************<->***********************************/
2722 wmDtHelpMapEventHandler(
2726 Boolean *pBoolean) /* unused */
2728 WmScreenData *pSD = (WmScreenData *) ptr;
2730 switch (pEvent->type)
2733 pSD->dtHelp.bMapped = True;
2737 pSD->dtHelp.bMapped = False;
2741 /* END OF FUNCTION wmDtHelpMapHandler */
2745 /*************************************<->*************************************
2747 * wmDtErrorDialog (pSD, message, title)
2752 * Called to show an error message
2756 * pSD = ptr to screen data
2757 * message = error message to display
2758 * title = title for the error dialog
2763 ******************************<->***********************************/
2773 XmString xmsMessage;
2778 Window wRoot, wChild;
2779 int rootX, rootY, winX, winY;
2781 Dimension dWidth, dHeight;
2783 WmPanelistObject pPanelist;
2786 XmStringCreateLocalized (sMessage);
2788 XmStringCreateLocalized (sTitle);
2790 if (pSD->dtHelp.errorDialog == NULL)
2792 #ifdef NO_MESSAGE_CATALOG
2793 XmString tmpXmString = (XmString)NULL;
2797 XtSetArg (al[ac], XmNmessageString, xmsMessage); ac++;
2798 XtSetArg (al[ac], XmNdialogTitle, xmsTitle); ac++;
2799 #ifndef NO_MESSAGE_CATALOG
2800 XtSetArg (al[ac], XmNokLabelString, wmGD.okLabel); ac++;
2802 tmpXmString = XmStringCreateLocalized ("OK");
2803 XtSetArg (al[ac], XmNokLabelString, tmpXmString); ac++;
2807 if ((wmGD.dtSD == pSD) && pSD->wPanelist)
2809 pPanelist = (WmPanelistObject) pSD->wPanelist;
2810 wParent = O_Shell (pPanelist);
2814 wParent = pSD->screenTopLevelW1;
2817 wParent = pSD->screenTopLevelW1;
2819 pSD->dtHelp.errorDialog =
2820 XmCreateErrorDialog (wParent, "Error Dialog", al, ac);
2822 #ifdef NO_MESSAGE_CATALOG
2824 XmStringFree(tmpXmString);
2827 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2828 XmDIALOG_HELP_BUTTON);
2829 XtUnmanageChild (wTemp);
2831 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2832 XmDIALOG_CANCEL_BUTTON);
2833 XtUnmanageChild (wTemp);
2835 XtAddCallback (pSD->dtHelp.errorDialog, XmNokCallback,
2836 wmDtErrorDialogOkCB, (XtPointer)pSD);
2838 wShell = pSD->dtHelp.errorDialog;
2839 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2841 wShell = XtParent(wShell);
2843 XtAddCallback(wShell, XmNpopupCallback, wmDtErrorDialogPopupCB,
2846 XtRealizeWidget (pSD->dtHelp.errorDialog);
2848 /* remove some WM functions */
2850 XtSetArg (al[ac], XmNmwmFunctions, (MWM_FUNC_ALL|
2851 MWM_FUNC_RESIZE|MWM_FUNC_MINIMIZE|MWM_FUNC_MAXIMIZE));
2853 XtSetValues (wShell, al, ac);
2855 DtWsmRemoveWorkspaceFunctions (DISPLAY, XtWindow(wShell));
2859 /* make sure it's unmanaged */
2860 wmDtErrorDialogHide (pSD);
2862 /* set new message and title */
2864 XtSetArg (al[ac], XmNmessageString, xmsMessage); ac++;
2865 XtSetArg (al[ac], XmNdialogTitle, xmsTitle); ac++;
2866 XtSetValues (pSD->dtHelp.errorDialog, al, ac);
2869 if (pSD->dtHelp.errorDialog)
2871 XtManageChild (pSD->dtHelp.errorDialog);
2872 XtPopup (XtParent(pSD->dtHelp.errorDialog), XtGrabNone);
2875 XmStringFree (xmsMessage);
2876 XmStringFree (xmsTitle);
2878 /* END OF FUNCTION wmDtErrorDialog */
2881 /*************************************<->*************************************
2884 * wmDtErrorDialogHide (pSD)
2893 * pSD = ptr to screen data
2904 *************************************<->***********************************/
2907 wmDtErrorDialogHide( WmScreenData *pSD )
2911 XtPopdown (XtParent(pSD->dtHelp.errorDialog));
2912 XtUnmanageChild (pSD->dtHelp.errorDialog);
2914 * Do a withdraw to make sure window gets unmanaged
2915 * (popdown does nothing if its unmapped)
2917 wShell = pSD->dtHelp.errorDialog;
2918 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2920 wShell = XtParent(wShell);
2923 XWithdrawWindow (DISPLAY, XtWindow (wShell), pSD->screen);
2925 /* must sync to insure event order */
2926 XSync (DISPLAY, False);
2928 } /* END OF FUNCTION wmDtErrorDialogHide */
2931 /*************************************<->*************************************
2934 * wmDtErrorDialogOkCB (w, client_data, call_data)
2956 *************************************<->***********************************/
2959 wmDtErrorDialogOkCB(
2961 XtPointer client_data,
2962 XtPointer call_data )
2964 WmScreenData *pSD = (WmScreenData *) client_data;
2966 wmDtErrorDialogHide (pSD);
2968 } /* END OF FUNCTION wmDtErrorDialogOkCB */
2971 /*************************************<->*************************************
2974 * wmDtErrorDialogPopupCB (w, client_data, call_data)
2996 *************************************<->***********************************/
2999 wmDtErrorDialogPopupCB(
3001 XtPointer client_data,
3002 XtPointer call_data )
3004 WmScreenData *pSD = (WmScreenData *) client_data;
3005 Window wRoot, wChild;
3006 int rootX, rootY, winX, winY;
3008 Dimension dWidth, dHeight;
3013 /* set new position near cursor position */
3014 XQueryPointer (DISPLAY, XtWindow(pSD->screenTopLevelW1),
3015 &wRoot, &wChild, &rootX, &rootY, &winX, &winY, &mask);
3018 XtSetArg (al[ac], XmNwidth, &dWidth); ac++;
3019 XtSetArg (al[ac], XmNheight, &dHeight); ac++;
3020 XtGetValues (w, al, ac);
3022 x = (Position) rootX - (dWidth / 2);
3023 y = (Position) rootY - (dHeight / 2);
3025 if ((x + ((Position) dWidth / 2)) > DisplayWidth (DISPLAY, pSD->screen))
3026 x = DisplayWidth (DISPLAY,pSD->screen) - (dWidth/2) - 1;
3030 if ((y + ((Position) dHeight / 2)) > DisplayHeight (DISPLAY, pSD->screen))
3031 y = DisplayHeight (DISPLAY,pSD->screen) - (dHeight/2) - 1;
3036 XtSetArg (al[ac], XmNx, x); ac++;
3037 XtSetArg (al[ac], XmNy, y); ac++;
3038 XtSetArg (al[ac], XmNwindowGroup,
3039 XtUnspecifiedWindowGroup); ac++;
3040 XtSetArg (al[ac], XmNwaitForWm, False); ac++;
3041 XtSetValues (w, al, ac);
3044 } /* END OF FUNCTION wmDtErrorDialogPopupCB */
3046 /**************************** eof ***************************/