1 /* $TOG: WmHelp.c /main/8 1997/06/18 17:30:51 samborn $ */
4 * (c) Copyright 1987, 1988, 1989, 1990, 1992, 1993 HEWLETT-PACKARD COMPANY
5 * (c) Copyright 1989, 1990, 1991, 1992 OPEN SOFTWARE FOUNDATION, INC.
10 static char rcsid[] = ""
29 #include "WmResNames.h"
30 #include "WmWrkspace.h"
31 #include "DataBaseLoad.h"
35 #include <Xm/MessageB.h>
36 #include <X11/keysymdef.h>
37 #include <X11/keysym.h>
38 #include <X11/Shell.h>
39 #include <Xm/MwmUtil.h>
41 #include <Dt/HelpDialog.h>
42 #include <Dt/HelpQuickD.h>
44 #include <Dt/DtNlUtils.h>
46 #include <X11/cursorfont.h>
49 /****************************************************************
51 * Cache List Info Structure Definition.
53 ****************************************************************/
54 typedef struct _CacheListStruct {
62 struct _CacheListStruct *pNext;
63 struct _CacheListStruct *pPrevious;
66 typedef struct _DisplayTopicInfo {
73 * Function Declarations:
76 /******** Static Function Declarations ********/
77 static int LocateTheControl(
81 static WmScreenData *WmScreenDataFromWidget (
84 static int WmDtReturnSelectedWidget (
88 static void WmDtDisplayTopic (
99 DisplayTopicInfo *displayTopicInfo);
100 static void WmDtCloseHelpCB (
102 XtPointer clientData,
104 static void WmDtWmCloseHelpCB (
106 XtPointer clientData,
108 static void WmDtVersionCloseCB (
110 XtPointer clientData,
112 static void WmDtVersionPopupCB (
114 XtPointer clientData,
117 static void WmDtProcessLinkCB (
119 XtPointer clientData,
121 static Boolean WmDtGetFromCache(
122 CacheListStruct **pCurrentNode,
124 static void ShowHelpDialog(
125 ClientData *pClient);
127 static void HideHelpDialog(
129 Boolean userDismissed );
130 static void wmDtHelpSetPosition(
131 PtrWsDtHelpData pHelp,
134 static void wmDtHelpMapEventHandler (
139 static void wmDtErrorDialog(
143 static void wmDtErrorDialogOkCB(
145 XtPointer client_data,
146 XtPointer call_data );
147 static void wmDtErrorDialogPopupCB(
149 XtPointer client_data,
150 XtPointer call_data );
151 static void wmDtErrorDialogHide(
154 /******** End Static Function Declarations ********/
162 static DisplayTopicInfo displayTopicInfo;
163 static Widget versionWidget = (Widget)NULL;
165 #define PT_IN_CHILD(X, Y, CHILD) \
166 (((X) >= (CHILD)->core.x) && \
167 ((X) <= ((CHILD)->core.x + (Position) (CHILD)->core.width)) && \
168 ((Y) >= (CHILD)->core.y) && \
169 ((Y) <= ((CHILD)->core.y + (Position) (CHILD)->core.height)))
171 #define MAX_WIDGET_PATH 100
174 /**********************************************************************
175 * Function: LocateTheControl()
179 **********************************************************************/
188 CompositeWidget comp_widget;
192 Window target_win = None;
201 Widget widget = NULL;
203 Boolean foundOne = False;
205 WmFpEmbeddedClientData *pECD;
206 WmScreenData *pSD = NULL;
210 /* Make the target cursor */
211 cursor = XCreateFontCursor (wmGD.display, XC_question_arrow);
213 /* Grab the pointer using target cursor, letting it roam all over */
214 status = XGrabPointer (wmGD.display, RootWindow(wmGD.display, screen),
216 ButtonPressMask|ButtonReleaseMask, GrabModeAsync,
217 GrabModeAsync, None, cursor, CurrentTime);
218 if (status != GrabSuccess)
220 Warning (((char *)GETMESSAGE(29, 1,
221 "Help on Item failed. Another program may have grabbed the mouse.")));
222 return(DtHELP_SELECT_ERROR);
226 /* Grab the Keyboard so we can catch the ESC button press */
227 status = XGrabKeyboard(wmGD.display, RootWindow(wmGD.display, screen),
229 GrabModeAsync, GrabModeAsync, CurrentTime);
230 if (status != GrabSuccess)
232 XUngrabPointer (wmGD.display, CurrentTime);
233 Warning (((char *)GETMESSAGE(29, 2,
234 "Help on Item failed. Another program may have grabbed the mouse.")));
235 return(DtHELP_SELECT_ERROR);
238 /* Let the user select a window... */
239 while ((target_win == None) || (buttons != 0))
241 XtAppNextEvent(wmGD.mwmAppContext, &event);
246 if (target_win == None)
248 target_win = event.xbutton.subwindow; /* window selected */
249 if (target_win == None)
250 target_win = RootWindow (wmGD.display, screen);
255 /* there may have been some down before we started */
260 /* Look for ESC key press and stop if we get one */
261 if (event.xkey.state & ShiftMask)
266 keySym = XLookupKeysym((XKeyEvent *)&event, offset);
267 if (keySym == XK_Escape)
269 XUngrabKeyboard (wmGD.display, CurrentTime);
270 XUngrabPointer (wmGD.display, CurrentTime);
271 return(DtHELP_SELECT_ABORT);
275 XtDispatchEvent(&event);
278 XUngrabKeyboard (wmGD.display, CurrentTime); /* Done with keyboard */
279 XUngrabPointer (wmGD.display, CurrentTime); /* Done with pointer */
282 printf("RootWindow (wmGD.display, screen) = %ld\n", RootWindow (wmGD.display, screen));
283 printf("event.xbutton.root = %ld\n", event.xbutton.root);
284 printf("event.xbutton.window = %ld\n", event.xbutton.window);
285 printf("event.xbutton.subwindow = %ld\n", event.xbutton.subwindow);
286 printf("event.xbutton.x = %d\n", event.xbutton.x);
287 printf("event.xbutton.y = %d\n", event.xbutton.y);
288 printf("event.xbutton.x_root = %d\n", event.xbutton.x_root);
289 printf("event.xbutton.y_root = %d\n", event.xbutton.y_root);
290 #endif /* DEBUGGER */
292 if (target_win == RootWindow (wmGD.display, screen))
293 return (DtHELP_SELECT_INVALID);
295 for (scr = 0; scr < wmGD.numScreens; scr++)
297 if (wmGD.Screens[scr].managed &&
298 wmGD.Screens[scr].screen == screen)
300 pSD = (&(wmGD.Screens[scr]));
309 /* check for subwindows */
310 parent = RootWindow (wmGD.display, screen);
311 x = event.xbutton.x_root;
312 y = event.xbutton.y_root;
316 XTranslateCoordinates(wmGD.display, parent, target_win, x, y,
317 &new_x, &new_y, &sub);
326 pECD = (WmFpEmbeddedClientData *) pSD->pECD;
327 for (clientNum = 0; clientNum < pSD->numEmbeddedClients;
331 (target_win == pECD->pCD->client))
333 widget = pECD->wControl;
348 widget = XtWindowToWidget (wmGD.display, target_win);
353 widget = XtWindowToWidget (wmGD.display1, target_win);
357 return (DtHELP_SELECT_INVALID);
361 if (!XtIsComposite (widget))
364 return (DtHELP_SELECT_VALID);
366 comp_widget = (CompositeWidget)widget;
368 /* look for gadgets at this point */
369 for (i = 0; i < comp_widget->composite.num_children; i++)
371 child = comp_widget->composite.children[i];
373 if (PT_IN_CHILD (x, y, child) && XtIsManaged(child))
376 return (DtHELP_SELECT_VALID);
383 return (DtHELP_SELECT_VALID);
386 return (DtHELP_SELECT_INVALID);
388 } /* END OF FUNCTION LocateTheControl */
391 /**********************************************************************
393 * Cache Creek related help functions
395 **********************************************************************/
397 /*************************************<->*************************************
406 *************************************<->***********************************/
408 void WmDtStringHelpCB (Widget theWidget,
409 XtPointer client_data,
413 char * theHelpString = (char *)client_data;
414 Widget theRealWidget = theWidget;
415 if( XmIsGadget(theWidget))
417 theRealWidget = XtParent(theWidget);
419 pSD = WmScreenDataFromWidget(theWidget);
421 /* WmDtDisplayTopic(theRealWidget, NULL, theHelpString, */
422 WmDtDisplayTopic(pSD->screenTopLevelW1, NULL, theHelpString,
423 DtHELP_TYPE_DYNAMIC_STRING, (Widget) NULL, True,
424 NULL, 0, NULL, False, NULL);
428 } /* END OF FUNCTION WmDtStringHelpCB */
431 /*************************************<->*************************************
440 *************************************<->***********************************/
442 void WmDtWmStringHelpCB (Widget theWidget,
443 XtPointer client_data,
447 char * theHelpString = (char *)client_data;
448 pSD = WmScreenDataFromWidget(theWidget);
451 if (XtDisplay(theWidget) == DISPLAY)
453 WmDtDisplayTopic(pSD->screenTopLevelW1,
455 DtHELP_TYPE_STRING, theWidget, True,
456 NULL, 0, NULL, False, NULL);
460 WmDtDisplayTopic(theWidget, NULL, theHelpString,
461 DtHELP_TYPE_STRING, theWidget, True,
462 NULL, 0, NULL, False, NULL);
466 WmDtDisplayTopic(pSD->screenTopLevelW1,
468 DtHELP_TYPE_DYNAMIC_STRING, theWidget, True,
469 NULL, 0, NULL, False, NULL);
472 } /* END OF FUNCTION WmDtWmStringHelpCB */
476 /*************************************<->*************************************
478 * WmDtDisplayTopicHelp
482 * External entry procedure used to display help topics.
484 *************************************<->***********************************/
486 void WmDtDisplayTopicHelp (Widget widget,
490 WmScreenData *pSD = WmScreenDataFromWidget(widget);
492 WmDtDisplayTopic(pSD->screenTopLevelW1,
493 helpVolume, locationID,
494 DtHELP_TYPE_TOPIC, (Widget) NULL, True,
495 NULL, 0, NULL, False, NULL);
498 /*************************************<->*************************************
500 * WmDtDisplayStringHelp
504 * External entry procedure used to display help topics.
506 *************************************<->***********************************/
508 void WmDtDisplayStringHelp (Widget widget,
511 WmScreenData *pSD = WmScreenDataFromWidget(widget);
513 WmDtDisplayTopic(pSD->screenTopLevelW1,
515 DtHELP_TYPE_DYNAMIC_STRING, widget, True,
516 NULL, 0, NULL, False, NULL);
519 /*************************************<->*************************************
526 * for each icon in the icon box
528 *************************************<->***********************************/
530 void WmDtWmTopicHelpCB (Widget theWidget,
531 XtPointer client_data,
536 char *helpVolume = WM_DT_HELP_VOLUME;
537 char *locationID = (char *)client_data;
538 pSD = WmScreenDataFromWidget(theWidget);
540 shellWidget = theWidget;
541 while (!(XtIsSubclass(XtParent(shellWidget), shellWidgetClass)))
543 shellWidget = XtParent(shellWidget);
546 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
548 DtHELP_TYPE_TOPIC, shellWidget, True,
549 NULL, 0, NULL, False, NULL);
551 } /* END OF FUNCTION WmDtWmTopicHelpCB */
553 /****************************************************************************
554 * Function: WmScreenDataFromWidget(
563 ***************************************************************************/
564 static WmScreenData *
565 WmScreenDataFromWidget (Widget theWidget)
568 WmScreenData *pSD = NULL;
571 CacheListStruct *pTemp;
575 for (scr = 0; scr < wmGD.numScreens; scr++)
577 if (wmGD.Screens[scr].managed &&
578 wmGD.Screens[scr].screen ==
579 XScreenNumberOfScreen(XtScreen(theWidget)))
581 pSD = (&(wmGD.Screens[scr]));
596 } /* END OF FUNCTION WmScreenDataFromWidget */
598 /****************************************************************************
599 * Function: WmDtCloseHelpCB(
601 * caddr_t clientData,
606 * Return Value: Void.
608 * Purpose: Process close requests on all Help Dialog widgets
609 * created and managed by this application.
611 ***************************************************************************/
612 static void WmDtCloseHelpCB (
614 XtPointer clientData,
617 WmScreenData *pSD = NULL;
619 Widget helpDialog = (Widget) clientData;
621 CacheListStruct *pTemp;
623 pSD = WmScreenDataFromWidget(w);
624 pTemp = pSD->cachedHelp;
626 /* Search our Cache List for the closed help dialog */
627 while ((pTemp->helpDialog != helpDialog) && (pTemp != NULL))
629 pTemp = pTemp->pNext;
635 /* printf("Didn't find our help dialog widget in the cache list??? /n");*/
638 XtPopdown (XtParent(helpDialog));
640 pTemp->inUseFlag = FALSE;
641 pSD->cachedHelp->hLink = False;
643 /* Re-Assign our pTemp to point to our head so we can see
644 * if we have any in-use help dialog in our list.
646 pTemp = pSD->cachedHelp;
648 } /* END OF FUNCTION WmDtCloseHelpCB */
651 /****************************************************************************
652 * Function: WmDtWmCloseHelpCB(
654 * caddr_t clientData,
659 * Return Value: Void.
661 * Purpose: Process close requests on all Help Dialog widgets
662 * created and managed by this application.
664 ***************************************************************************/
665 static void WmDtWmCloseHelpCB (
667 XtPointer clientData,
671 Widget helpDialog = (Widget) clientData;
672 pSD = WmScreenDataFromWidget(w);
673 HideHelpDialog (pSD, True);
675 } /* END OF FUNCTION WmDtWmCloseHelpCB */
679 /****************************************************************************
680 * Function: WmDtWmPopupHelpCB(
682 * caddr_t clientData,
687 * Return Value: Void.
692 ***************************************************************************/
693 static void WmDtWmPopupHelpCB (
695 XtPointer clientData,
698 PtrWsDtHelpData pHelp;
701 pSD = WmScreenDataFromWidget(w);
703 pHelp = &pSD->dtHelp;
705 if (pSD->dtHelp.restored)
707 /* set position of dialog to restored position */
708 wmDtHelpSetPosition (pHelp, pSD, True);
709 pSD->dtHelp.restored = False;
713 /* set position of dialog relative to client window */
714 wmDtHelpSetPosition (pHelp, pSD, False);
717 } /* END OF FUNCTION WmDtWmPopupHelpCB */
720 /****************************************************************************
721 * Function: WmDtVersionPopupCB(
723 * caddr_t clientData,
728 * Return Value: Void.
733 ***************************************************************************/
734 static void WmDtVersionPopupCB (
736 XtPointer clientData,
741 Dimension width, height;
749 XtSetArg (setArgs[n], XmNx, 0); n++;
750 XtSetArg (setArgs[n], XmNy, 0); n++;
754 * Center the Version Dialog on the screen
758 XtSetArg(getArgs[n], XmNheight, &height); n++;
759 XtSetArg(getArgs[n], XmNwidth, &width); n++;
760 XtGetValues (w, (ArgList) getArgs, n);
763 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) width))/2;
765 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) height))/2;
767 XtSetArg(setArgs[n], XmNx, (XtArgVal) x); n++;
768 XtSetArg(setArgs[n], XmNy, (XtArgVal) y); n++;
769 XtSetValues (w, setArgs, n);
772 } /* END OF FUNCTION WmDtVersionPopupCB */
776 /****************************************************************************
777 * Function: WmDtPopupHelpCB(
779 * caddr_t clientData,
784 * Return Value: Void.
789 ***************************************************************************/
790 static void WmDtPopupHelpCB (
792 XtPointer clientData,
796 Atom * workspace_atoms = NULL;
797 int num_workspaces=0;
799 CacheListStruct *pTemp = (CacheListStruct *)clientData;
804 XtSetArg (args[n], XmNgeometry, NULL); n++;
805 XtSetArg (args[n], XmNwaitForWm, False); n++;
809 if (pTemp->workspaces)
811 char **atom_names = NULL;
814 ptr = DtStrchr (pTemp->workspaces, '*');
815 if (ptr != NULL) *ptr = NULL;
818 (char **) XtRealloc ((char *)atom_names,
819 sizeof(char*) * (num_workspaces + 1));
820 atom_names[num_workspaces] = XtNewString(pTemp->workspaces);
826 pTemp->workspaces = ptr + 1;
828 } while (ptr != NULL);
830 workspace_atoms = (Atom *) XtMalloc(sizeof(Atom) * num_workspaces);
831 XInternAtoms(wmGD.display, atom_names, num_workspaces,
832 True, workspace_atoms);
834 DtWsmSetWorkspacesOccupied (XtDisplay(helpShellW),
835 XtWindow (helpShellW),
839 while (num_workspaces-- > 0)
840 XtFree(atom_names[num_workspaces]);
841 XtFree ((char *) atom_names);
842 XtFree ((char *) workspace_atoms);
845 XtSetArg (args[n], XmNx, pTemp->xPos); n++;
846 XtSetArg (args[n], XmNy, pTemp->yPos); n++;
847 pTemp->restored = False;
848 XtRemoveCallback(helpShellW, XmNpopupCallback,
849 WmDtPopupHelpCB, clientData);
850 XtAddCallback(helpShellW, XmNpopupCallback, WmDtPopupHelpCB, NULL);
854 XtSetArg (args[n], XmNx, 0); n++;
855 XtSetArg (args[n], XmNy, 0); n++;
858 XtSetValues (helpShellW, args, n);
861 } /* END OF FUNCTION WmDtPopupHelpCB */
865 /****************************************************************************
866 * Function: WmDtVersionCloseCB(
868 * caddr_t clientData,
873 * Return Value: Void.
875 * Purpose: Process close requests on all Help Dialog widgets
876 * created and managed by this application.
878 ***************************************************************************/
879 static void WmDtVersionCloseCB (
881 XtPointer clientData,
886 } /* END OF FUNCTION WmDtWmVersionCloseHelpCB */
891 /****************************************************************************
892 * Function: void WmDtProcessLinkCB(
894 * caddr_t clientData,
899 * Return Value: Void.
901 * Purpose: Process JUMP-NEW and APP-LINK hypertext requests in a
902 * given Help Dialog Window.
904 * This is the callback used for the DtNhyperLinkCallback
905 * on each of the help dialog widges created.
907 ****************************************************************************/
908 static void WmDtProcessLinkCB (
910 XtPointer clientData,
914 DtHelpDialogCallbackStruct * hyperData =
915 (DtHelpDialogCallbackStruct *) callData;
917 switch (hyperData->hyperType)
919 case DtHELP_LINK_JUMP_NEW:
920 WmDtDisplayTopic (XtParent(w), hyperData->helpVolume,
921 hyperData->locationId,
922 /* DtHELP_LINK_JUMP_NEW */ DtHELP_TYPE_TOPIC,
924 NULL, 0, NULL, True, NULL);
927 default: /* This catches the application definded link types */
928 if (hyperData->hyperType >= 100)
930 /* The application would put any code here to handle their
931 * Applicaiton-defined-links.
937 /* printf("We some how got a bogus hyptertext link type/n");*/
939 } /* End Switch Statement */
941 } /* END OF FUNCTION WmDtProcessLinkCB */
944 /****************************************************************************
945 * Function: void WmDtHelpOnVersion(
950 * Return Value: Void.
952 * Purpose: Displays a new Cache Creek help topic in a new/cached
953 * help dialog widget.
955 ****************************************************************************/
956 void WmDtHelpOnVersion (
965 Widget printButton = NULL;
966 Widget helpButton = NULL;
967 Widget backButton = NULL;
968 Widget closeButton = NULL;
969 XmString label = NULL;
971 if((versionWidget != NULL) &&
972 (XtIsManaged(versionWidget)))
978 if (!(versionWidget))
980 #ifndef NO_MESSAGE_CATALOG
981 XtSetArg (setArgs[n], XmNtitle, wmNLS.defaultVersionTitle); n++;
983 XtSetArg (setArgs[n], XmNtitle, "About Workspace Manager"); n++;
987 XtSetArg (setArgs[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
988 XtSetArg (setArgs[n], DtNlocationId, "_COPYRIGHT"); n++;
989 XtSetArg (setArgs[n], DtNhelpVolume, WM_DT_HELP_VOLUME); n++;
991 versionWidget = DtCreateHelpQuickDialog (parent, "VersionDialog",
994 XtAddCallback(versionWidget, DtNcloseCallback,
996 (XtPointer) versionWidget);
998 XtAddCallback(XtParent(versionWidget), XmNpopupCallback,
999 WmDtVersionPopupCB, NULL);
1001 closeButton = DtHelpQuickDialogGetChild( versionWidget,
1002 DtHELP_QUICK_CLOSE_BUTTON );
1005 #ifndef NO_MESSAGE_CATALOG
1006 XtSetArg (setArgs2[n2], DtNcloseLabelString, wmGD.okLabel); n2++;
1008 XtSetArg (setArgs2[n2], DtNcloseLabelString,
1009 label=XmStringCreateLocalized ("OK")); n2++;
1012 XtSetValues(closeButton, setArgs2, n2);
1013 if(label)XmStringFree(label);
1015 printButton = DtHelpQuickDialogGetChild( versionWidget,
1016 DtHELP_QUICK_PRINT_BUTTON );
1017 helpButton = DtHelpQuickDialogGetChild( versionWidget,
1018 DtHELP_QUICK_HELP_BUTTON );
1019 backButton = DtHelpQuickDialogGetChild( versionWidget,
1020 DtHELP_QUICK_BACK_BUTTON );
1022 XtUnmanageChild(printButton);
1023 XtUnmanageChild(helpButton);
1024 XtUnmanageChild(backButton);
1028 XtSetArg (setArgs[n], DtNlocationId, "_COPYRIGHT"); n++;
1029 XtSetArg (setArgs[n], DtNhelpVolume, WM_DT_HELP_VOLUME); n++;
1030 XtSetValues(versionWidget, setArgs, n);
1032 XtManageChild(versionWidget);
1036 } /* END OF FUNCTION WmDtHelpOnVersion */
1040 /******************************<->*************************************
1042 * Boolean WmDtHelp (String args)
1054 * Return - True if the find a help callback; false otherwise.
1059 ******************************<->***********************************/
1062 WmDtHelp (String args)
1066 WmPanelistObject pPanelist;
1067 char *theHelpVolume = WM_DT_HELP_VOLUME;
1068 char *theHelpTopic = WM_DT_HELP_TOPIC;
1069 char volume[MAXWMPATH + 1];
1070 char topic[MAXWMPATH + 1];
1074 /* get right screen data */
1075 /* pSD = WmScreenDataFromWidget(w);*/
1076 pSD = wmGD.pActiveSD;
1079 pPanelist = (WmPanelistObject) pSD->wPanelist;
1081 if (theWidget = O_Panel(pPanelist))
1086 * parse args for volume and topic
1088 WmDtGetHelpArgs((unsigned char*)args, &volume, &topic, &argCount);
1091 WmDtDisplayTopic(pSD->screenTopLevelW1,
1094 DtHELP_TYPE_TOPIC, theWidget, True,
1095 NULL, 0, NULL, False, NULL);
1099 WmDtDisplayTopic(pSD->screenTopLevelW1,
1102 DtHELP_TYPE_TOPIC, theWidget, False,
1103 NULL, 0, NULL, False, NULL);
1109 WmDtDisplayTopic(pSD->screenTopLevelW1,
1112 DtHELP_TYPE_TOPIC, theWidget, True,
1113 NULL, 0, NULL, False, NULL);
1121 } /* END OF FUNCTION WmDtHelp */
1124 /******************************<->*************************************
1126 * Boolean WmDtHelpMode (void)
1130 * Invoke item help mode
1138 * Return - True if the find a help callback; false otherwise.
1143 ******************************<->***********************************/
1148 Widget selectedWidget = NULL;
1150 String sTmp, sMessage, sTitle;
1152 iStatus = WmDtReturnSelectedWidget(wmGD.topLevelW, NULL,
1157 case DtHELP_SELECT_VALID:
1158 if (selectedWidget != (Widget) NULL)
1162 if ((XtHasCallbacks(selectedWidget,
1163 XmNhelpCallback) == XtCallbackHasSome))
1165 XtCallCallbacks(selectedWidget, XmNhelpCallback,
1171 selectedWidget = XtParent(selectedWidget);
1174 while (selectedWidget != NULL);
1178 case DtHELP_SELECT_INVALID:
1179 /* invalid selection error (window not of this process) */
1180 #ifndef NO_MESSAGE_CATALOG
1181 sTmp = (char *)GETMESSAGE(29, 3,
1182 "You must select a Workspace Manager\n\
1183 dialog, an item in the Front Panel,\n\
1184 or an item in a subpanel.");
1185 sMessage = XtNewString (sTmp);
1186 sTmp = (char *)GETMESSAGE(29, 4,
1187 "Workspace Manager - Help On Item Error");
1188 sTitle = XtNewString (sTmp);
1190 sMessage = "You must select a Workspace Manager\n\
1191 dialog, an item in the Front Panel,\n\
1192 or an item in a subpanel.";
1193 sTitle = "Workspace Manager - Help On Item Error";
1195 wmDtErrorDialog (ACTIVE_PSD, sMessage, sTitle);
1196 #ifndef NO_MESSAGE_CATALOG
1197 if (sMessage) XtFree (sMessage);
1198 if (sTitle) XtFree (sTitle);
1202 case DtHELP_SELECT_ERROR:
1203 /* error (like grab failed) */
1206 case DtHELP_SELECT_ABORT:
1207 /* user aborted this selection */
1212 } /* END OF FUNCTION WmDtHelpMode */
1216 /*****************************************************************************
1217 * Function: WmDtReturnSelectedWidget (Widget, Cursor, Widget *)
1219 * Parameters: Widget Specifies a valid widget within the app's
1221 * Cursor Cursor to grab pointer with (use NULL!!)
1222 * Widget * ptr to loc to receive returned widget
1224 * Return Value: DtHELP_SELECT_ERROR - error in getting the widget
1225 * DtHELP_SELECT_ABORT - user aborted
1226 * DtHELP_SELECT_INVALID - user selected invalid window
1227 * DtHELP_SELECT_VALID - valid widget returned
1229 * Purpose: Allows developers to get the widget ID for any widget in their UI
1230 * that the user has selected vai the pointer. This function will
1231 * cause the cursor to change and allow a user to select an item in
1234 *****************************************************************************/
1236 WmDtReturnSelectedWidget(
1246 /* Setup some needed variables */
1247 dpy = XtDisplay(theWidget);
1248 screen = ACTIVE_SCREEN;
1250 /* refresh the display */
1251 XmUpdateDisplay(theWidget);
1253 /* Change the curser to let the user select the desired widget */
1254 iStatus = LocateTheControl(dpy, screen, pWidget);
1258 } /* END OF FUNCTION WmDtReturnSelectedWidget */
1261 /****************************************************************************
1262 * Function: void WmDtDisplayTopic(
1270 * ClientData *pCData,
1271 * Boolean hyperlink,
1272 * DisplayTopicInfo *displayTopicInfo)
1276 * Return Value: Void.
1278 * Purpose: Displays a new Cache Creek help topic in a new/cached
1279 * help dialog widget.
1281 ****************************************************************************/
1294 DisplayTopicInfo *displayTopicInfo)
1306 WmPanelistObject pPanelist;
1307 char * defaultTitle="Help";
1308 ClientData *pCD = NULL;
1309 WmScreenData *pSD = NULL;
1310 CacheListStruct *pCurrentNode = NULL;
1311 Boolean cachedNode = FALSE;
1314 pSD = WmScreenDataFromWidget (parent);
1317 pPanelist = (WmPanelistObject) pSD->wPanelist;
1321 /*argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount + 1)) ;*/
1322 argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount)) ;
1323 memcpy( argsNew, argList, (sizeof( Arg) * argCount)) ;
1326 shellWidget = parent;
1327 while (!(XtIsSubclass(shellWidget, shellWidgetClass)))
1329 shellWidget = XtParent(shellWidget);
1335 case DtHELP_TYPE_TOPIC:
1336 if (helpVolume != NULL)
1338 XtSetArg (setArgs[n],DtNhelpVolume,helpVolume); n++;
1340 XtSetArg (setArgs[n], DtNlocationId,locationId); n++;
1341 helpTitle=locationId;
1344 case DtHELP_TYPE_DYNAMIC_STRING:
1345 XtSetArg (setArgs[n], DtNstringData, locationId); n++;
1346 /* helpTitle=locationId;*/
1347 helpTitle=defaultTitle;
1350 case DtHELP_TYPE_MAN_PAGE:
1353 case DtHELP_TYPE_FILE:
1358 /* error condition, don't try to display help */
1364 XtSetArg (setArgs[n], DtNhelpType, helpType); n++;
1368 if (pSD->dtHelp.shell)
1370 helpWidget = pSD->dtHelp.dialog;
1371 XtSetValues(helpWidget, setArgs, n);
1375 #ifndef NO_MESSAGE_CATALOG
1376 XtSetArg (setArgs[n], XmNtitle,
1377 wmNLS.defaultDtwmHelpTitle); n++;
1379 XtSetArg (setArgs[n], XmNtitle,
1380 "Workspace Manager - Help"); n++;
1383 pSD->dtHelp.dialog =
1384 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1385 helpWidget = pSD->dtHelp.dialog;
1386 pSD->dtHelp.shell = XtParent(helpWidget);
1387 pSD->dtHelp.bMapped = False;
1390 XtSetArg (setArgs[n], XmNname, "wmHelp"); n++;
1393 XtSetValues(pSD->dtHelp.shell,
1397 XtAddCallback(helpWidget,
1398 DtNhyperLinkCallback,
1399 WmDtProcessLinkCB, NULL);
1401 XtAddCallback(helpWidget, DtNcloseCallback,
1403 (XtPointer) helpWidget);
1405 XtAddCallback(pSD->dtHelp.shell, XmNpopupCallback,
1406 WmDtWmPopupHelpCB, NULL);
1408 XtAddEventHandler(pSD->dtHelp.shell,
1409 StructureNotifyMask,
1411 wmDtHelpMapEventHandler,
1417 ShowHelpDialog(pCData);
1423 XFindContext (DISPLAY, XtWindow(XtParent(wmClient)),
1424 wmGD.windowContextType, (caddr_t *)&pCD);
1428 XFindContext (DISPLAY, XtWindow(O_Shell(pPanelist)),
1429 wmGD.windowContextType, (caddr_t *)&pCD);
1431 ShowHelpDialog(pCD);
1436 /* Get a used or new node form our cache if we have one */
1437 cachedNode = WmDtGetFromCache(&pCurrentNode, pSD);
1439 /* If we got a free one from the Cache, use it */
1440 /* Set Values on current free one, then map it */
1443 XtSetValues(pCurrentNode->helpDialog, setArgs, n);
1447 #ifndef NO_MESSAGE_CATALOG
1448 XtSetArg (setArgs[n], XmNtitle,
1449 wmNLS.defaultHelpTitle); n++;
1451 XtSetArg (setArgs[n], XmNtitle,
1452 "Workspace Manager - Help"); n++;
1455 XtSetArg (setArgs[n], XmNgeometry, NULL); n++;
1456 XtSetArg (setArgs[n], XmNx, 0); n++;
1457 XtSetArg (setArgs[n], XmNy, 0); n++;
1459 pCurrentNode->helpDialog =
1460 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1462 XtSetArg (setArgs[n], XmNname, "cachedHelp"); n++;
1465 XtSetValues(shellWidget, argList, argCount);
1468 XtAddCallback(pCurrentNode->helpDialog,
1469 DtNhyperLinkCallback,
1470 WmDtProcessLinkCB, NULL);
1472 XtAddCallback(pCurrentNode->helpDialog, DtNcloseCallback,
1474 (XtPointer) pCurrentNode->helpDialog);
1478 pCurrentNode->hLink = True;
1482 if (displayTopicInfo)
1484 pCurrentNode->workspaces =
1485 displayTopicInfo->workspaces;
1486 pCurrentNode->xPos = displayTopicInfo->xPos;
1487 pCurrentNode->yPos = displayTopicInfo->yPos;
1488 pCurrentNode->restored = True;
1489 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1492 (XtPointer)pCurrentNode);
1496 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1498 WmDtPopupHelpCB, NULL);
1503 helpWidget = pCurrentNode->helpDialog;
1504 XtManageChild(helpWidget);
1505 XtPopup(XtParent(helpWidget), XtGrabNone);
1508 } /* if n is still 0, we did not find a useful help type */
1510 } /* END OF FUNCTION WmDtDisplayTopic */
1513 /****************************************************************************
1514 * Function: static Boolean WmDtGetFromCache(
1515 * CacheListStruct **pCurrentNode)
1520 * Return Value: Void.
1522 * Purpose: Gets a free help node form our cache list. If none are
1523 * free, it will return fallse and the calling routine will
1524 * create a new help dialog widget.
1526 ****************************************************************************/
1527 static Boolean WmDtGetFromCache(
1528 CacheListStruct **pCurrentNode,
1531 CacheListStruct *pTemp;
1533 if (pSD->cachedHelp == NULL)
1535 /* We have a new list so lets create one and pass it back */
1537 (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1539 /* Assign the default values to our node */
1540 pSD->cachedHelp->helpDialog = NULL;
1541 pSD->cachedHelp->inUseFlag = TRUE;
1542 pSD->cachedHelp->restored = False;
1543 pSD->cachedHelp->hLink = False;
1544 pSD->cachedHelp->pNext = NULL;
1545 pSD->cachedHelp->pPrevious = NULL;
1547 /* Return our head pointer because it's our first and only node */
1548 *pCurrentNode = pSD->cachedHelp;
1553 /* We have some nodes so search for a free one first */
1554 pTemp = pSD->cachedHelp;
1556 while (pTemp != NULL)
1558 if (pTemp->inUseFlag == FALSE)
1560 pTemp->inUseFlag = TRUE;
1561 pTemp->hLink = False;
1562 pTemp->restored = False;
1563 *pCurrentNode = pTemp;
1567 pTemp = pTemp->pNext;
1572 * If we did not find a free node then we must add a new one to the
1573 * top of the list, and return it.
1576 pTemp = (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1578 /* Assign the default values to our node */
1579 pTemp->helpDialog = NULL;
1580 pTemp->inUseFlag = TRUE;
1581 pTemp->restored = False;
1582 pTemp->hLink = False;
1583 pTemp->pNext = pSD->cachedHelp;
1584 pTemp->pPrevious = NULL;
1586 pSD->cachedHelp->pPrevious = pTemp;
1588 /* Re-Assign our head pointer to point to the new head of the list */
1589 pSD->cachedHelp = pTemp;
1591 /* Return our head pointer because it's our new node */
1592 *pCurrentNode = pSD->cachedHelp;
1596 } /* END OF FUNCTION WmDtGetFromCache */
1598 /* End of Dt utils */
1601 /*************************************<->*************************************
1604 * RestoreHelpDialogs (pSD)
1609 * Saves the state of the help system
1623 ******************************<->***********************************/
1631 XrmName xrm_name[5];
1632 XrmRepresentation rep_type;
1635 Position xLoc, yLoc;
1636 short columns, rows;
1642 char dialogName[10];
1644 ClientData *pCD = NULL;
1645 char *tTitle = NULL;
1646 char *wsName = NULL;
1647 char *wmClientName = NULL;
1648 char *helpVolume = NULL;
1649 char *locationId = NULL;
1650 char *stringData = NULL;
1651 char *workspaces = NULL;
1656 WmPanelistObject pPanelist = (WmPanelistObject) pSD->wPanelist;
1663 if (pSD->helpResources)
1665 if ((db = XrmGetStringDatabase (pSD->helpResources)) == NULL)
1669 xrm_name [0] = XrmStringToQuark ("wsHelp");
1670 xrm_name [1] = XrmStringToQuark ("onScreen");
1671 xrm_name [2] = NULL;
1674 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1676 /* Are we supposed to be mapped? */
1677 if (strcmp(value.addr, "True") == 0)
1680 /* get x position */
1681 xrm_name [1] = XrmStringToQuark ("x");
1682 if (XrmQGetResource (db, xrm_name, xrm_name,
1685 pSD->dtHelp.xPos = (Position)atoi((char *)value.addr);
1686 pSD->dtHelp.restored = True;
1689 /* get y position */
1690 xrm_name [1] = XrmStringToQuark ("y");
1691 if (XrmQGetResource (db, xrm_name, xrm_name,
1694 pSD->dtHelp.yPos = (Position)atoi((char *)value.addr);
1695 pSD->dtHelp.restored = True;
1699 xrm_name [1] = XrmStringToQuark ("columns");
1700 if (XrmQGetResource (db, xrm_name, xrm_name,
1703 XtSetArg (setArgs[ac], XmNcolumns,
1704 (short)atoi((char *)value.addr)); ac++;
1705 columns = (short)atoi((char *)value.addr);
1709 xrm_name [1] = XrmStringToQuark ("rows");
1710 if (XrmQGetResource (db, xrm_name, xrm_name,
1713 XtSetArg (setArgs[ac], XmNrows,
1714 (short)atoi((char *)value.addr)); ac++;
1715 rows = (short)atoi((char *)value.addr);
1717 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1719 XtSetArg (setArgs[ac], XmNgeometry,
1720 XtNewString(geometry)); ac++;
1722 /* get visiblePathCount */
1723 xrm_name [1] = XrmStringToQuark ("vPCount");
1724 if (XrmQGetResource (db, xrm_name, xrm_name,
1727 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1728 (int)atoi((char *)value.addr)); ac++;
1731 /* get topicTitle */
1732 xrm_name [1] = XrmStringToQuark ("tTitle");
1733 if (XrmQGetResource (db, xrm_name, xrm_name,
1736 tTitle = XtNewString ((char *)value.addr);
1737 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1741 xrm_name [1] = XrmStringToQuark ("helpType");
1742 if (XrmQGetResource (db, xrm_name, xrm_name,
1745 XtSetArg (setArgs[ac], DtNhelpType,
1746 (int)atoi((char *)value.addr)); ac++;
1747 helpType = (int)atoi((char *)value.addr);
1753 case DtHELP_TYPE_TOPIC:
1754 /* get helpVolume */
1755 xrm_name [1] = XrmStringToQuark ("helpVolume");
1756 if (XrmQGetResource (db, xrm_name, xrm_name,
1759 helpVolume = XtNewString ((char *)value.addr);
1760 /* XtSetArg (setArgs[ac], DtNhelpVolume,
1761 helpVolume); ac++;*/
1763 /* get locationId */
1764 xrm_name [1] = XrmStringToQuark ("locationId");
1765 if (XrmQGetResource (db, xrm_name, xrm_name,
1768 locationId = XtNewString ((char *)value.addr);
1769 /* XtSetArg (setArgs[ac], DtNlocationId,
1770 locationId); ac++;*/
1775 case DtHELP_TYPE_DYNAMIC_STRING:
1777 /* get stringData */
1778 xrm_name [1] = XrmStringToQuark ("stringData");
1779 if (XrmQGetResource (db, xrm_name, xrm_name,
1782 stringData = XtNewString ((char *)value.addr);
1783 /* XtSetArg (setArgs[ac], DtNstringData,
1784 stringData); ac++;*/
1785 locationId = stringData;
1790 case DtHELP_TYPE_MAN_PAGE:
1794 case DtHELP_TYPE_FILE:
1799 /* error condition, don't try to display help */
1803 /* get name of wm client for which wmHelp is transient */
1805 xrm_name [1] = XrmStringToQuark ("windowGroup");
1806 if (XrmQGetResource (db, xrm_name, xrm_name,
1809 wmClientName = ((char *)value.addr);
1810 if ((!strcmp(wmClientName, pSD->iconBoxName)) &&
1813 xrm_name [1] = XrmStringToQuark ("wsName");
1814 if (XrmQGetResource (db, xrm_name, xrm_name,
1817 wsName = (char *)value.addr;
1818 for (wsCnt = 0; wsCnt < pSD->numWorkspaces;
1821 if (!strcmp(pSD->pWS[wsCnt].name, wsName))
1823 pCD=pSD->pWS[wsCnt].pIconBox->pCD_iconBox;
1831 else if(!strcmp(wmClientName, O_PanelName(pPanelist)))
1833 pCD=O_ClientData(pPanelist);
1839 * Map the help dialog
1842 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
1844 helpType, NULL, True,
1845 setArgs, ac, pCD, False, NULL);
1847 }/* if (XrmQGetResource for wsHelp) */
1849 xrm_name [0] = XrmStringToQuark ("cachedHelp");
1850 xrm_name [1] = XrmStringToQuark ("cachedCount");
1851 xrm_name [2] = NULL;
1854 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1856 /* restore cachedCount number of help dialogs */
1857 cachedCount = (int)atoi((char *)value.addr);
1858 for (cCount=1; cCount < (cachedCount + 1); cCount++)
1860 sprintf (dialogName, "oWsHelp%d", cCount);
1861 xrm_name [0] = XrmStringToQuark (dialogName);
1862 xrm_name [1] = NULL;
1863 xrm_name [2] = NULL;
1865 displayTopicInfo.xPos = 0;
1866 displayTopicInfo.xPos = 0;
1867 displayTopicInfo.workspaces = NULL;
1870 /* get x position */
1871 xrm_name [1] = XrmStringToQuark ("x");
1872 if (XrmQGetResource (db, xrm_name, xrm_name,
1875 /* XtSetArg (setArgs[ac], XmNx,
1876 atoi((char *)value.addr)); ac++;*/
1877 xLoc = (Position)atoi((char *)value.addr);
1878 displayTopicInfo.xPos = xLoc;
1881 /* get y position */
1882 xrm_name [1] = XrmStringToQuark ("y");
1883 if (XrmQGetResource (db, xrm_name, xrm_name,
1886 /* XtSetArg (setArgs[ac], XmNy,
1887 atoi((char *)value.addr)); ac++;*/
1888 yLoc = (Position)atoi((char *)value.addr);
1889 displayTopicInfo.yPos = yLoc;
1893 xrm_name [1] = XrmStringToQuark ("columns");
1894 if (XrmQGetResource (db, xrm_name, xrm_name,
1897 XtSetArg (setArgs[ac], XmNcolumns,
1898 (short)atoi((char *)value.addr)); ac++;
1899 columns = (short)atoi((char *)value.addr);
1903 xrm_name [1] = XrmStringToQuark ("rows");
1904 if (XrmQGetResource (db, xrm_name, xrm_name,
1907 XtSetArg (setArgs[ac], XmNrows,
1908 (short)atoi((char *)value.addr)); ac++;
1909 rows = (short)atoi((char *)value.addr);
1911 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1913 XtSetArg (setArgs[ac], XmNgeometry,
1914 XtNewString(geometry)); ac++;
1916 /* get visiblePathCount */
1917 xrm_name [1] = XrmStringToQuark ("vPCount");
1918 if (XrmQGetResource (db, xrm_name, xrm_name,
1921 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1922 (int)atoi((char *)value.addr)); ac++;
1925 /* get topicTitle */
1926 xrm_name [1] = XrmStringToQuark ("tTitle");
1927 if (XrmQGetResource (db, xrm_name, xrm_name,
1930 tTitle = XtNewString ((char *)value.addr);
1931 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1934 /* get workspaces list */
1935 xrm_name [1] = XrmStringToQuark ("workspaces");
1936 if (XrmQGetResource (db, xrm_name, xrm_name,
1939 workspaces = XtNewString ((char *)value.addr);
1940 displayTopicInfo.workspaces = workspaces;
1945 xrm_name [1] = XrmStringToQuark ("helpType");
1946 if (XrmQGetResource (db, xrm_name, xrm_name,
1949 XtSetArg (setArgs[ac], DtNhelpType,
1950 (int)atoi((char *)value.addr)); ac++;
1951 helpType = (int)atoi((char *)value.addr);
1957 case DtHELP_TYPE_TOPIC:
1958 /* get helpVolume */
1959 xrm_name [1] = XrmStringToQuark ("helpVolume");
1960 if (XrmQGetResource (db, xrm_name, xrm_name,
1963 helpVolume = XtNewString ((char *)value.addr);
1965 /* get locationId */
1966 xrm_name [1] = XrmStringToQuark ("locationId");
1967 if (XrmQGetResource (db, xrm_name, xrm_name,
1970 locationId = XtNewString ((char *)value.addr);
1975 case DtHELP_TYPE_DYNAMIC_STRING:
1977 /* get stringData */
1978 xrm_name [1] = XrmStringToQuark ("stringData");
1979 if (XrmQGetResource (db, xrm_name, xrm_name,
1982 stringData = XtNewString ((char *)value.addr);
1983 /* XtSetArg (setArgs[ac], DtNstringData,
1984 stringData); ac++;*/
1985 locationId = stringData;
1990 case DtHELP_TYPE_MAN_PAGE:
1994 case DtHELP_TYPE_FILE:
1999 /* error condition, don't try to display help */
2004 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
2006 helpType, NULL, False,
2007 setArgs, ac, NULL, False,
2010 } /* for all cached help dialogs */
2013 } /* if (XrmQGetResource ) cachedHelp/cachedCount */
2015 XrmDestroyDatabase(db);
2018 } /* END OF FUNCTION RestoreHelpDialogs */
2020 /*************************************<->*************************************
2023 * SaveHelpResources (pSD)
2028 * Saves the state of the help system
2042 ******************************<->***********************************/
2049 PtrWsDtHelpData pHelp;
2050 CacheListStruct *pTemp;
2054 Window wmGroupWindow;
2056 ClientData *pCDforHelp;
2060 WmWorkspaceData *pWS;
2062 Position xLoc, yLoc;
2063 short columns, rows;
2064 unsigned char helpType;
2071 char workspaces[MAXWMPATH+1];
2073 char buffer[MAXWMPATH+1];
2078 char screenName[10];
2079 char dialogName[128];
2080 char resString[MAXWMPATH+1];
2085 pHelp = &pSD->dtHelp;
2087 /* allocate initial data space */
2088 if ((data = (char *) XtMalloc (MAXWMPATH+1)) == NULL)
2091 GETMESSAGE(76,12,"Insufficient memory to save resources")));
2092 Do_Quit_Mwm (False);
2097 /* Get our current resource class */
2101 res_class = WM_RESOURCE_CLASS;
2105 res_class = DT_WM_RESOURCE_CLASS;
2108 sprintf (screenName, "%d\0", pSD->screen);
2110 sprintf (buffer, "%s*%s*%s: \\n ", res_class, screenName,
2112 AddStringToResourceData (buffer, &data, &cum_len);
2114 if (pHelp->onScreen)
2116 sprintf (dialogName, "wsHelp");
2117 sprintf (buffer, "%s*onScreen: True\\n ", dialogName);
2118 AddStringToResourceData (buffer, &data, &cum_len);
2121 XtSetArg(getArgs[ac], XmNx, &xLoc); ac++;
2122 XtSetArg(getArgs[ac], XmNy, &yLoc); ac++;
2123 XtGetValues(pSD->dtHelp.shell, getArgs, ac);
2124 if (!XFindContext (DISPLAY, XtWindow(pSD->dtHelp.shell),
2125 wmGD.windowContextType, (caddr_t *)&pCDforHelp))
2127 if (wmGD.positionIsFrame)
2129 xLoc = xLoc - pCDforHelp->clientOffset.x;
2130 yLoc = yLoc - pCDforHelp->clientOffset.y;
2135 XtSetArg(getArgs[ac], XmNcolumns, &columns); ac++;
2136 XtSetArg(getArgs[ac], XmNrows, &rows); ac++;
2137 XtSetArg(getArgs[ac], DtNhelpType, &helpType); ac++;
2138 XtSetArg(getArgs[ac], DtNvisiblePathCount, &vPCount); ac++;
2139 XtSetArg(getArgs[ac], DtNtopicTitle, &topicTitle); ac++;
2140 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2142 sprintf (buffer, "%s*x: %d \\n ", dialogName, xLoc);
2143 AddStringToResourceData (buffer, &data, &cum_len);
2144 sprintf (buffer, "%s*y: %d \\n ", dialogName, yLoc);
2145 AddStringToResourceData (buffer, &data, &cum_len);
2146 sprintf (buffer, "%s*columns: %d \\n ", dialogName, columns);
2147 AddStringToResourceData (buffer, &data, &cum_len);
2148 sprintf (buffer, "%s*rows: %d \\n ", dialogName, rows);
2149 AddStringToResourceData (buffer, &data, &cum_len);
2150 sprintf (buffer, "%s*helpType: %d \\n ", dialogName, helpType);
2151 AddStringToResourceData (buffer, &data, &cum_len);
2152 sprintf (buffer, "%s*vPCount: %d \\n ", dialogName, vPCount);
2153 AddStringToResourceData (buffer, &data, &cum_len);
2154 sprintf (buffer, "%s*tTitle: %s\\n ", dialogName, topicTitle);
2155 AddStringToResourceData (buffer, &data, &cum_len);
2160 case DtHELP_TYPE_TOPIC:
2161 XtSetArg (getArgs[ac],DtNhelpVolume, &helpVolume); ac++;
2162 XtSetArg (getArgs[ac], DtNlocationId, &locationId); ac++;
2163 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2164 sprintf (buffer, "%s*helpVolume: %s\\n ", dialogName, helpVolume);
2165 AddStringToResourceData (buffer, &data, &cum_len);
2166 sprintf (buffer, "%s*locationId: %s\\n ", dialogName, locationId);
2167 AddStringToResourceData (buffer, &data, &cum_len);
2171 case DtHELP_TYPE_DYNAMIC_STRING:
2172 XtSetArg (getArgs[ac], DtNstringData, &stringData); ac++;
2173 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2174 sprintf (buffer, "%s*stringData: %s\\n ", dialogName, stringData);
2175 AddStringToResourceData (buffer, &data, &cum_len);
2179 case DtHELP_TYPE_MAN_PAGE:
2183 case DtHELP_TYPE_FILE:
2188 /* error condition, don't try to display help */
2193 XtSetArg(getArgs[ac], XmNwindowGroup, &wmGroupWindow); ac++;
2194 XtGetValues(pSD->dtHelp.shell, getArgs, ac);
2196 if (!XFindContext (DISPLAY, wmGroupWindow,
2197 wmGD.windowContextType, (caddr_t *)&pCD))
2199 sprintf (buffer, "%s*windowGroup: %s\\n ", dialogName,
2201 AddStringToResourceData (buffer, &data, &cum_len);
2203 if ((!strcmp(pCD->clientName, pSD->iconBoxName)) &&
2206 wsName = XGetAtomName(DISPLAY,
2207 pCD->pWsList[pCD->currentWsc].wsID);
2208 sprintf (buffer, "%s*wsName: %s\\n ", dialogName,
2210 AddStringToResourceData (buffer, &data, &cum_len);
2217 if (pSD->cachedHelp != NULL)
2220 * We have some nodes so search for
2221 * managed dialogs and save their state
2224 pTemp = pSD->cachedHelp;
2226 while (pTemp != NULL)
2228 if (pTemp->inUseFlag == FALSE)
2230 pTemp = pTemp->pNext;
2235 sprintf (dialogName, "oWsHelp%d",cachedCount);
2238 XtSetArg(getArgs[ac], XmNx, &xLoc); ac++;
2239 XtSetArg(getArgs[ac], XmNy, &yLoc); ac++;
2240 XtGetValues(XtParent(pTemp->helpDialog), getArgs, ac);
2241 if (!XFindContext (DISPLAY,
2242 XtWindow(XtParent(pTemp->helpDialog)),
2243 wmGD.windowContextType,
2244 (caddr_t *)&pCDforHelp))
2246 if (wmGD.positionIsFrame)
2248 xLoc = xLoc - pCDforHelp->clientOffset.x;
2249 yLoc = yLoc - pCDforHelp->clientOffset.y;
2259 XtSetArg(getArgs[ac], XmNcolumns, &columns); ac++;
2260 XtSetArg(getArgs[ac], XmNrows, &rows); ac++;
2261 XtSetArg(getArgs[ac], DtNhelpType, &helpType); ac++;
2262 XtSetArg(getArgs[ac], DtNvisiblePathCount, &vPCount); ac++;
2263 XtSetArg(getArgs[ac], DtNtopicTitle, &topicTitle); ac++;
2264 XtGetValues(pTemp->helpDialog, getArgs, ac);
2266 sprintf (buffer, "%s*x: %d \\n ", dialogName, xLoc);
2267 AddStringToResourceData (buffer, &data, &cum_len);
2268 sprintf (buffer, "%s*y: %d \\n ", dialogName, yLoc);
2269 AddStringToResourceData (buffer, &data, &cum_len);
2270 sprintf (buffer, "%s*columns: %d \\n ", dialogName, columns);
2271 AddStringToResourceData (buffer, &data, &cum_len);
2272 sprintf (buffer, "%s*rows: %d \\n ", dialogName, rows);
2273 AddStringToResourceData (buffer, &data, &cum_len);
2274 sprintf (buffer, "%s*helpType: %d \\n ", dialogName, helpType);
2275 AddStringToResourceData (buffer, &data, &cum_len);
2276 sprintf (buffer, "%s*vPCount: %d \\n ", dialogName, vPCount);
2277 AddStringToResourceData (buffer, &data, &cum_len);
2278 sprintf (buffer, "%s*tTitle: %s\\n ", dialogName, topicTitle);
2279 AddStringToResourceData (buffer, &data, &cum_len);
2284 case DtHELP_TYPE_TOPIC:
2285 XtSetArg (getArgs[ac],DtNhelpVolume, &helpVolume); ac++;
2286 XtSetArg (getArgs[ac], DtNlocationId, &locationId); ac++;
2287 XtGetValues(pTemp->helpDialog, getArgs, ac);
2288 sprintf (buffer, "%s*helpVolume: %s\\n ",
2289 dialogName, helpVolume);
2290 AddStringToResourceData (buffer, &data, &cum_len);
2291 sprintf (buffer, "%s*locationId: %s\\n ",
2292 dialogName, locationId);
2293 AddStringToResourceData (buffer, &data, &cum_len);
2297 case DtHELP_TYPE_DYNAMIC_STRING:
2298 XtSetArg (getArgs[ac], DtNstringData, &stringData); ac++;
2299 XtGetValues(pTemp->helpDialog, getArgs, ac);
2300 sprintf (buffer, "%s*stringData: %s\\n ",
2301 dialogName, stringData);
2302 AddStringToResourceData (buffer, &data, &cum_len);
2306 case DtHELP_TYPE_MAN_PAGE:
2310 case DtHELP_TYPE_FILE:
2315 /* error condition, don't try to display help */
2322 sprintf(workspaces,"");
2323 for (wsCnt = 0; wsCnt < pSD->numWorkspaces;
2326 wsID = XInternAtom (DISPLAY, pSD->pWS[wsCnt].name,
2328 pWS = GetWorkspaceData (pSD, wsID);
2330 if (ClientInWorkspace (pWS, pCDforHelp))
2334 strcpy(workspaces, pSD->pWS[wsCnt].name);
2339 strcat(workspaces, "*");
2340 strcat(workspaces, pSD->pWS[wsCnt].name);
2345 sprintf (buffer, "%s*workspaces: %s\\n ", dialogName,
2347 AddStringToResourceData (buffer, &data, &cum_len);
2349 pTemp = pTemp->pNext;
2354 sprintf (buffer, "cachedHelp*cachedCount: %d\\n ", cachedCount);
2355 AddStringToResourceData (buffer, &data, &cum_len);
2362 * Save help resources as a string
2364 sprintf (buffer, " \n");
2365 AddStringToResourceData (buffer, &data, &cum_len);
2367 _DtAddToResource (DISPLAY, data);
2371 } /* END OF FUNCTION SaveHelpResources */
2375 /* Code stolen from WmPresence.c */
2377 /*************************************<->*************************************
2380 * ShowHelpDialog (pClient)
2385 * Pops up (shows) the help dialog
2399 ******************************<->***********************************/
2403 ClientData *pClient)
2405 PtrWsDtHelpData pHelp;
2417 pHelp = &pSD->dtHelp;
2419 pOldCD = pHelp->pCDforClient;
2420 pHelp->pCDforClient = pClient;
2421 /* pHelp->contextForClient = wsContext;*/
2423 if (pSD->dtHelp.onScreen)
2425 ClientData *pCD = NULL;
2427 XFindContext (DISPLAY, XtWindow (pSD->dtHelp.shell),
2428 wmGD.windowContextType, (XtPointer) &pCD);
2430 if ((!pSD->dtHelp.bMapped) ||
2432 (!ClientInWorkspace (ACTIVE_WS, pCD) ||
2433 (pCD->clientState == MINIMIZED_STATE) ||
2434 (pOldCD && pOldCD != pHelp->pCDforClient))))
2436 HideHelpDialog (pSD, True);
2444 XtManageChild(pSD->dtHelp.dialog);
2445 XtPopup (pSD->dtHelp.shell, XtGrabNone);
2447 pSD->dtHelp.onScreen = True;
2449 } /* END OF FUNCTION ShowHelpDialog */
2452 /*************************************<->*************************************
2455 * HideHelpDialog (pSD, userDismissed)
2460 * Pops down (hides) the workspace presence dialog
2464 * pSD = pointer to screen data
2465 * userDismissed = did the user dismiss or did workspace switching
2466 * unpost the workspace presence box ?
2476 ******************************<->***********************************/
2481 Boolean userDismissed )
2484 if (pSD->dtHelp.onScreen)
2486 /* Pop down the shell */
2487 XtPopdown (pSD->dtHelp.shell);
2490 * Do a withdraw to make sure window gets unmanaged
2491 * (popdown does nothing if its unmapped)
2493 XWithdrawWindow (DISPLAY, XtWindow (pSD->dtHelp.shell),
2495 /* must sync to insure event order */
2496 XSync (DISPLAY, False);
2499 pSD->dtHelp.onScreen = False;
2500 pSD->dtHelp.userDismissed = userDismissed;
2503 } /* END OF FUNCTION HideHelpDialog */
2506 /*************************************<->*************************************
2508 * wmDtHelpSetPosition (pHelp, pSD, restorePos)
2513 * Sets the position of the workspace presence dialog
2517 * pPres = pointer to workspace presence data
2522 ******************************<->***********************************/
2524 wmDtHelpSetPosition(
2525 PtrWsDtHelpData pHelp,
2535 ClientData *pCDforHelp;
2540 * Get size of this dialog
2543 XtSetArg (args[n], XmNheight, &height); n++;
2544 XtGetValues (pHelp->shell, args, n);
2546 if (wmGD.positionIsFrame)
2548 if (pSD->decoupleTitleAppearance)
2550 font = pSD->clientTitleAppearance.font;
2554 font = pSD->clientAppearance.font;
2557 /* height += TEXT_HEIGHT(font) + (2 * pSD->frameBorderWidth);*/
2558 height += TEXT_HEIGHT(font) + (2 * pSD->resizeBorderWidth);
2563 * set position of dialog relative to client window
2564 * (use system menu position)
2565 * set this dialog to be transient for the client
2566 * for which it is posted.
2568 if (pHelp->pCDforClient)
2570 GetSystemMenuPosition (pHelp->pCDforClient,
2574 if(y < pHelp->pCDforClient->frameInfo.y)
2576 if (!XFindContext (DISPLAY, XtWindow(pHelp->shell),
2577 wmGD.windowContextType,
2578 (caddr_t *)&pCDforHelp))
2580 if (wmGD.positionIsFrame)
2582 /* x = x - pCDforHelp->clientOffset.x;*/
2583 y = y - pCDforHelp->clientOffset.x;
2588 y = y - (2 * pSD->frameBorderWidth);
2596 * Don't have a client so map at 0,0
2609 XtSetArg (args[n], XmNgeometry, NULL); n++;
2610 XtSetArg (args[n], XmNx, x); n++;
2611 XtSetArg (args[n], XmNy, y); n++;
2612 XtSetArg (args[n], XmNtransientFor, NULL); n++;
2614 if (pHelp->pCDforClient)
2620 XtSetArg (al[ac], XmNwindowGroup, &wGroup); ac++;
2621 XtGetValues (pHelp->shell, al, ac);
2624 if (pHelp->contextForClient != F_CONTEXT_ICON)
2626 XtSetArg (args[n], XmNwindowGroup,
2627 pHelp->pCDforClient->client);
2630 else if (pSD->useIconBox && P_ICON_BOX(pHelp->pCDforClient))
2632 XtSetArg (args[n], XmNwindowGroup,
2633 P_ICON_BOX(pHelp->pCDforClient)->pCD_iconBox->client);
2638 XtSetArg (args[n], XmNwindowGroup, 0); n++;
2641 if (wGroup != pHelp->pCDforClient->client)
2644 * Changing who this is transient for, need to
2645 * make sure the window is unmapped so that the
2646 * window manager moves it to the right place.
2648 HideHelpDialog (pSD, True);
2651 XtSetArg (args[n], XmNwindowGroup, pHelp->pCDforClient->client); n++;
2658 HideHelpDialog (pSD, True);
2660 XtSetArg (args[n], XmNwindowGroup, 0); n++;
2663 XtSetArg (args[n], XmNwaitForWm, False); n++;
2665 XtSetValues (pHelp->shell, args, n);
2668 } /* END OF FUNCTION wmDtHelpSetPosition */
2670 /* End of Code stolen from WmPresence.c */
2672 /*************************************<->*************************************
2674 * wmDtHelpMapEventHandler (wHelp, pSD, pEvent)
2679 * An XtEventHandler called on structure notify events on the screen's
2680 * help window. (Only handles map and unmap events)
2684 * wHelp = help widget
2685 * pSD = ptr to screen data
2686 * pEvent = event triggering this call
2691 ******************************<->***********************************/
2693 wmDtHelpMapEventHandler(
2697 Boolean *pBoolean) /* unused */
2699 WmScreenData *pSD = (WmScreenData *) ptr;
2701 switch (pEvent->type)
2704 pSD->dtHelp.bMapped = True;
2708 pSD->dtHelp.bMapped = False;
2712 /* END OF FUNCTION wmDtHelpMapHandler */
2716 /*************************************<->*************************************
2718 * wmDtErrorDialog (pSD, message, title)
2723 * Called to show an error message
2727 * pSD = ptr to screen data
2728 * message = error message to display
2729 * title = title for the error dialog
2734 ******************************<->***********************************/
2744 XmString xmsMessage;
2749 Window wRoot, wChild;
2750 int rootX, rootY, winX, winY;
2752 Dimension dWidth, dHeight;
2755 WmPanelistObject pPanelist;
2756 #endif /* PANELIST */
2759 XmStringCreateLocalized (sMessage);
2761 XmStringCreateLocalized (sTitle);
2763 if (pSD->dtHelp.errorDialog == NULL)
2765 XmString tmpXmString = (XmString)NULL;
2768 XtSetArg (al[ac], XmNmessageString, xmsMessage); ac++;
2769 XtSetArg (al[ac], XmNdialogTitle, xmsTitle); ac++;
2770 #ifndef NO_MESSAGE_CATALOG
2771 XtSetArg (al[ac], XmNokLabelString, wmGD.okLabel); ac++;
2773 tmpXmString = XmStringCreateLocalized ("OK");
2774 XtSetArg (al[ac], XmNokLabelString, tmpXmString); ac++;
2778 if ((wmGD.dtSD == pSD) && pSD->wPanelist)
2780 pPanelist = (WmPanelistObject) pSD->wPanelist;
2781 wParent = O_Shell (pPanelist);
2785 wParent = pSD->screenTopLevelW1;
2788 wParent = pSD->screenTopLevelW1;
2790 pSD->dtHelp.errorDialog =
2791 XmCreateErrorDialog (wParent, "Error Dialog", al, ac);
2794 XmStringFree(tmpXmString);
2796 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2797 XmDIALOG_HELP_BUTTON);
2798 XtUnmanageChild (wTemp);
2800 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2801 XmDIALOG_CANCEL_BUTTON);
2802 XtUnmanageChild (wTemp);
2804 XtAddCallback (pSD->dtHelp.errorDialog, XmNokCallback,
2805 wmDtErrorDialogOkCB, (XtPointer)pSD);
2807 wShell = pSD->dtHelp.errorDialog;
2808 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2810 wShell = XtParent(wShell);
2812 XtAddCallback(wShell, XmNpopupCallback, wmDtErrorDialogPopupCB,
2815 XtRealizeWidget (pSD->dtHelp.errorDialog);
2817 /* remove some WM functions */
2819 XtSetArg (al[ac], XmNmwmFunctions, (MWM_FUNC_ALL|
2820 MWM_FUNC_RESIZE|MWM_FUNC_MINIMIZE|MWM_FUNC_MAXIMIZE));
2822 XtSetValues (wShell, al, ac);
2824 DtWsmRemoveWorkspaceFunctions (DISPLAY, XtWindow(wShell));
2828 /* make sure it's unmanaged */
2829 wmDtErrorDialogHide (pSD);
2831 /* set new message and title */
2833 XtSetArg (al[ac], XmNmessageString, xmsMessage); ac++;
2834 XtSetArg (al[ac], XmNdialogTitle, xmsTitle); ac++;
2835 XtSetValues (pSD->dtHelp.errorDialog, al, ac);
2838 if (pSD->dtHelp.errorDialog)
2840 XtManageChild (pSD->dtHelp.errorDialog);
2841 XtPopup (XtParent(pSD->dtHelp.errorDialog), XtGrabNone);
2844 XmStringFree (xmsMessage);
2845 XmStringFree (xmsTitle);
2847 /* END OF FUNCTION wmDtErrorDialog */
2850 /*************************************<->*************************************
2853 * wmDtErrorDialogHide (pSD)
2862 * pSD = ptr to screen data
2873 *************************************<->***********************************/
2876 wmDtErrorDialogHide( WmScreenData *pSD )
2880 XtPopdown (XtParent(pSD->dtHelp.errorDialog));
2881 XtUnmanageChild (pSD->dtHelp.errorDialog);
2883 * Do a withdraw to make sure window gets unmanaged
2884 * (popdown does nothing if its unmapped)
2886 wShell = pSD->dtHelp.errorDialog;
2887 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2889 wShell = XtParent(wShell);
2892 XWithdrawWindow (DISPLAY, XtWindow (wShell), pSD->screen);
2894 /* must sync to insure event order */
2895 XSync (DISPLAY, False);
2897 } /* END OF FUNCTION wmDtErrorDialogHide */
2900 /*************************************<->*************************************
2903 * wmDtErrorDialogOkCB (w, client_data, call_data)
2925 *************************************<->***********************************/
2928 wmDtErrorDialogOkCB(
2930 XtPointer client_data,
2931 XtPointer call_data )
2933 WmScreenData *pSD = (WmScreenData *) client_data;
2935 wmDtErrorDialogHide (pSD);
2937 } /* END OF FUNCTION wmDtErrorDialogOkCB */
2940 /*************************************<->*************************************
2943 * wmDtErrorDialogPopupCB (w, client_data, call_data)
2965 *************************************<->***********************************/
2968 wmDtErrorDialogPopupCB(
2970 XtPointer client_data,
2971 XtPointer call_data )
2973 WmScreenData *pSD = (WmScreenData *) client_data;
2974 Window wRoot, wChild;
2975 int rootX, rootY, winX, winY;
2977 Dimension dWidth, dHeight;
2982 /* set new position near cursor position */
2983 XQueryPointer (DISPLAY, XtWindow(pSD->screenTopLevelW1),
2984 &wRoot, &wChild, &rootX, &rootY, &winX, &winY, &mask);
2987 XtSetArg (al[ac], XmNwidth, &dWidth); ac++;
2988 XtSetArg (al[ac], XmNheight, &dHeight); ac++;
2989 XtGetValues (w, al, ac);
2991 x = (Position) rootX - (dWidth / 2);
2992 y = (Position) rootY - (dHeight / 2);
2994 if ((x + ((Position) dWidth / 2)) > DisplayWidth (DISPLAY, pSD->screen))
2995 x = DisplayWidth (DISPLAY,pSD->screen) - (dWidth/2) - 1;
2999 if ((y + ((Position) dHeight / 2)) > DisplayHeight (DISPLAY, pSD->screen))
3000 y = DisplayHeight (DISPLAY,pSD->screen) - (dHeight/2) - 1;
3005 XtSetArg (al[ac], XmNx, x); ac++;
3006 XtSetArg (al[ac], XmNy, y); ac++;
3007 XtSetArg (al[ac], XmNwindowGroup,
3008 XtUnspecifiedWindowGroup); ac++;
3009 XtSetArg (al[ac], XmNwaitForWm, False); ac++;
3010 XtSetValues (w, al, ac);
3013 } /* END OF FUNCTION wmDtErrorDialogPopupCB */
3015 /**************************** eof ***************************/