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 librararies 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"
54 #include "WmResNames.h"
55 #include "WmWrkspace.h"
56 #include "DataBaseLoad.h"
60 #include <Xm/MessageB.h>
61 #include <X11/keysymdef.h>
62 #include <X11/keysym.h>
63 #include <X11/Shell.h>
64 #include <Xm/MwmUtil.h>
66 #include <Dt/HelpDialog.h>
67 #include <Dt/HelpQuickD.h>
69 #include <Dt/DtNlUtils.h>
71 #include <X11/cursorfont.h>
74 /****************************************************************
76 * Cache List Info Structure Definition.
78 ****************************************************************/
79 typedef struct _CacheListStruct {
87 struct _CacheListStruct *pNext;
88 struct _CacheListStruct *pPrevious;
91 typedef struct _DisplayTopicInfo {
98 * Function Declarations:
101 /******** Static Function Declarations ********/
102 static int LocateTheControl(
106 static WmScreenData *WmScreenDataFromWidget (
109 static int WmDtReturnSelectedWidget (
113 static void WmDtDisplayTopic (
124 DisplayTopicInfo *displayTopicInfo);
125 static void WmDtCloseHelpCB (
127 XtPointer clientData,
129 static void WmDtWmCloseHelpCB (
131 XtPointer clientData,
133 static void WmDtVersionCloseCB (
135 XtPointer clientData,
137 static void WmDtVersionPopupCB (
139 XtPointer clientData,
142 static void WmDtProcessLinkCB (
144 XtPointer clientData,
146 static Boolean WmDtGetFromCache(
147 CacheListStruct **pCurrentNode,
149 static void ShowHelpDialog(
150 ClientData *pClient);
152 static void HideHelpDialog(
154 Boolean userDismissed );
155 static void wmDtHelpSetPosition(
156 PtrWsDtHelpData pHelp,
159 static void wmDtHelpMapEventHandler (
164 static void wmDtErrorDialog(
168 static void wmDtErrorDialogOkCB(
170 XtPointer client_data,
171 XtPointer call_data );
172 static void wmDtErrorDialogPopupCB(
174 XtPointer client_data,
175 XtPointer call_data );
176 static void wmDtErrorDialogHide(
179 /******** End Static Function Declarations ********/
187 static DisplayTopicInfo displayTopicInfo;
188 static Widget versionWidget = (Widget)NULL;
190 #define PT_IN_CHILD(X, Y, CHILD) \
191 (((X) >= (CHILD)->core.x) && \
192 ((X) <= ((CHILD)->core.x + (Position) (CHILD)->core.width)) && \
193 ((Y) >= (CHILD)->core.y) && \
194 ((Y) <= ((CHILD)->core.y + (Position) (CHILD)->core.height)))
196 #define MAX_WIDGET_PATH 100
199 /**********************************************************************
200 * Function: LocateTheControl()
204 **********************************************************************/
213 CompositeWidget comp_widget;
217 Window target_win = None;
226 Widget widget = NULL;
228 Boolean foundOne = False;
230 WmFpEmbeddedClientData *pECD;
231 WmScreenData *pSD = NULL;
235 /* Make the target cursor */
236 cursor = XCreateFontCursor (wmGD.display, XC_question_arrow);
238 /* Grab the pointer using target cursor, letting it roam all over */
239 status = XGrabPointer (wmGD.display, RootWindow(wmGD.display, screen),
241 ButtonPressMask|ButtonReleaseMask, GrabModeAsync,
242 GrabModeAsync, None, cursor, CurrentTime);
243 if (status != GrabSuccess)
245 Warning (((char *)GETMESSAGE(29, 1,
246 "Help on Item failed. Another program may have grabbed the mouse.")));
247 return(DtHELP_SELECT_ERROR);
251 /* Grab the Keyboard so we can catch the ESC button press */
252 status = XGrabKeyboard(wmGD.display, RootWindow(wmGD.display, screen),
254 GrabModeAsync, GrabModeAsync, CurrentTime);
255 if (status != GrabSuccess)
257 XUngrabPointer (wmGD.display, CurrentTime);
258 Warning (((char *)GETMESSAGE(29, 2,
259 "Help on Item failed. Another program may have grabbed the mouse.")));
260 return(DtHELP_SELECT_ERROR);
263 /* Let the user select a window... */
264 while ((target_win == None) || (buttons != 0))
266 XtAppNextEvent(wmGD.mwmAppContext, &event);
271 if (target_win == None)
273 target_win = event.xbutton.subwindow; /* window selected */
274 if (target_win == None)
275 target_win = RootWindow (wmGD.display, screen);
280 /* there may have been some down before we started */
285 /* Look for ESC key press and stop if we get one */
286 if (event.xkey.state & ShiftMask)
291 keySym = XLookupKeysym((XKeyEvent *)&event, offset);
292 if (keySym == XK_Escape)
294 XUngrabKeyboard (wmGD.display, CurrentTime);
295 XUngrabPointer (wmGD.display, CurrentTime);
296 return(DtHELP_SELECT_ABORT);
300 XtDispatchEvent(&event);
303 XUngrabKeyboard (wmGD.display, CurrentTime); /* Done with keyboard */
304 XUngrabPointer (wmGD.display, CurrentTime); /* Done with pointer */
307 printf("RootWindow (wmGD.display, screen) = %ld\n", RootWindow (wmGD.display, screen));
308 printf("event.xbutton.root = %ld\n", event.xbutton.root);
309 printf("event.xbutton.window = %ld\n", event.xbutton.window);
310 printf("event.xbutton.subwindow = %ld\n", event.xbutton.subwindow);
311 printf("event.xbutton.x = %d\n", event.xbutton.x);
312 printf("event.xbutton.y = %d\n", event.xbutton.y);
313 printf("event.xbutton.x_root = %d\n", event.xbutton.x_root);
314 printf("event.xbutton.y_root = %d\n", event.xbutton.y_root);
315 #endif /* DEBUGGER */
317 if (target_win == RootWindow (wmGD.display, screen))
318 return (DtHELP_SELECT_INVALID);
320 for (scr = 0; scr < wmGD.numScreens; scr++)
322 if (wmGD.Screens[scr].managed &&
323 wmGD.Screens[scr].screen == screen)
325 pSD = (&(wmGD.Screens[scr]));
334 /* check for subwindows */
335 parent = RootWindow (wmGD.display, screen);
336 x = event.xbutton.x_root;
337 y = event.xbutton.y_root;
341 XTranslateCoordinates(wmGD.display, parent, target_win, x, y,
342 &new_x, &new_y, &sub);
351 pECD = (WmFpEmbeddedClientData *) pSD->pECD;
352 for (clientNum = 0; clientNum < pSD->numEmbeddedClients;
356 (target_win == pECD->pCD->client))
358 widget = pECD->wControl;
373 widget = XtWindowToWidget (wmGD.display, target_win);
378 widget = XtWindowToWidget (wmGD.display1, target_win);
382 return (DtHELP_SELECT_INVALID);
386 if (!XtIsComposite (widget))
389 return (DtHELP_SELECT_VALID);
391 comp_widget = (CompositeWidget)widget;
393 /* look for gadgets at this point */
394 for (i = 0; i < comp_widget->composite.num_children; i++)
396 child = comp_widget->composite.children[i];
398 if (PT_IN_CHILD (x, y, child) && XtIsManaged(child))
401 return (DtHELP_SELECT_VALID);
408 return (DtHELP_SELECT_VALID);
411 return (DtHELP_SELECT_INVALID);
413 } /* END OF FUNCTION LocateTheControl */
416 /**********************************************************************
418 * Cache Creek related help functions
420 **********************************************************************/
422 /*************************************<->*************************************
431 *************************************<->***********************************/
433 void WmDtStringHelpCB (Widget theWidget,
434 XtPointer client_data,
438 char * theHelpString = (char *)client_data;
439 Widget theRealWidget = theWidget;
440 if( XmIsGadget(theWidget))
442 theRealWidget = XtParent(theWidget);
444 pSD = WmScreenDataFromWidget(theWidget);
446 /* WmDtDisplayTopic(theRealWidget, NULL, theHelpString, */
447 WmDtDisplayTopic(pSD->screenTopLevelW1, NULL, theHelpString,
448 DtHELP_TYPE_DYNAMIC_STRING, (Widget) NULL, True,
449 NULL, 0, NULL, False, NULL);
453 } /* END OF FUNCTION WmDtStringHelpCB */
456 /*************************************<->*************************************
465 *************************************<->***********************************/
467 void WmDtWmStringHelpCB (Widget theWidget,
468 XtPointer client_data,
472 char * theHelpString = (char *)client_data;
473 pSD = WmScreenDataFromWidget(theWidget);
476 if (XtDisplay(theWidget) == DISPLAY)
478 WmDtDisplayTopic(pSD->screenTopLevelW1,
480 DtHELP_TYPE_STRING, theWidget, True,
481 NULL, 0, NULL, False, NULL);
485 WmDtDisplayTopic(theWidget, NULL, theHelpString,
486 DtHELP_TYPE_STRING, theWidget, True,
487 NULL, 0, NULL, False, NULL);
491 WmDtDisplayTopic(pSD->screenTopLevelW1,
493 DtHELP_TYPE_DYNAMIC_STRING, theWidget, True,
494 NULL, 0, NULL, False, NULL);
497 } /* END OF FUNCTION WmDtWmStringHelpCB */
501 /*************************************<->*************************************
503 * WmDtDisplayTopicHelp
507 * External entry procedure used to display help topics.
509 *************************************<->***********************************/
511 void WmDtDisplayTopicHelp (Widget widget,
515 WmScreenData *pSD = WmScreenDataFromWidget(widget);
517 WmDtDisplayTopic(pSD->screenTopLevelW1,
518 helpVolume, locationID,
519 DtHELP_TYPE_TOPIC, (Widget) NULL, True,
520 NULL, 0, NULL, False, NULL);
523 /*************************************<->*************************************
525 * WmDtDisplayStringHelp
529 * External entry procedure used to display help topics.
531 *************************************<->***********************************/
533 void WmDtDisplayStringHelp (Widget widget,
536 WmScreenData *pSD = WmScreenDataFromWidget(widget);
538 WmDtDisplayTopic(pSD->screenTopLevelW1,
540 DtHELP_TYPE_DYNAMIC_STRING, widget, True,
541 NULL, 0, NULL, False, NULL);
544 /*************************************<->*************************************
551 * for each icon in the icon box
553 *************************************<->***********************************/
555 void WmDtWmTopicHelpCB (Widget theWidget,
556 XtPointer client_data,
561 char *helpVolume = WM_DT_HELP_VOLUME;
562 char *locationID = (char *)client_data;
563 pSD = WmScreenDataFromWidget(theWidget);
565 shellWidget = theWidget;
566 while (!(XtIsSubclass(XtParent(shellWidget), shellWidgetClass)))
568 shellWidget = XtParent(shellWidget);
571 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
573 DtHELP_TYPE_TOPIC, shellWidget, True,
574 NULL, 0, NULL, False, NULL);
576 } /* END OF FUNCTION WmDtWmTopicHelpCB */
578 /****************************************************************************
579 * Function: WmScreenDataFromWidget(
588 ***************************************************************************/
589 static WmScreenData *
590 WmScreenDataFromWidget (Widget theWidget)
593 WmScreenData *pSD = NULL;
596 CacheListStruct *pTemp;
600 for (scr = 0; scr < wmGD.numScreens; scr++)
602 if (wmGD.Screens[scr].managed &&
603 wmGD.Screens[scr].screen ==
604 XScreenNumberOfScreen(XtScreen(theWidget)))
606 pSD = (&(wmGD.Screens[scr]));
621 } /* END OF FUNCTION WmScreenDataFromWidget */
623 /****************************************************************************
624 * Function: WmDtCloseHelpCB(
626 * caddr_t clientData,
631 * Return Value: Void.
633 * Purpose: Process close requests on all Help Dialog widgets
634 * created and managed by this application.
636 ***************************************************************************/
637 static void WmDtCloseHelpCB (
639 XtPointer clientData,
642 WmScreenData *pSD = NULL;
644 Widget helpDialog = (Widget) clientData;
646 CacheListStruct *pTemp;
648 pSD = WmScreenDataFromWidget(w);
649 pTemp = pSD->cachedHelp;
651 /* Search our Cache List for the closed help dialog */
652 while ((pTemp->helpDialog != helpDialog) && (pTemp != NULL))
654 pTemp = pTemp->pNext;
660 /* printf("Didn't find our help dialog widget in the cache list??? /n");*/
663 XtPopdown (XtParent(helpDialog));
665 pTemp->inUseFlag = FALSE;
666 pSD->cachedHelp->hLink = False;
668 /* Re-Assign our pTemp to point to our head so we can see
669 * if we have any in-use help dialog in our list.
671 pTemp = pSD->cachedHelp;
673 } /* END OF FUNCTION WmDtCloseHelpCB */
676 /****************************************************************************
677 * Function: WmDtWmCloseHelpCB(
679 * caddr_t clientData,
684 * Return Value: Void.
686 * Purpose: Process close requests on all Help Dialog widgets
687 * created and managed by this application.
689 ***************************************************************************/
690 static void WmDtWmCloseHelpCB (
692 XtPointer clientData,
696 Widget helpDialog = (Widget) clientData;
697 pSD = WmScreenDataFromWidget(w);
698 HideHelpDialog (pSD, True);
700 } /* END OF FUNCTION WmDtWmCloseHelpCB */
704 /****************************************************************************
705 * Function: WmDtWmPopupHelpCB(
707 * caddr_t clientData,
712 * Return Value: Void.
717 ***************************************************************************/
718 static void WmDtWmPopupHelpCB (
720 XtPointer clientData,
723 PtrWsDtHelpData pHelp;
726 pSD = WmScreenDataFromWidget(w);
728 pHelp = &pSD->dtHelp;
730 if (pSD->dtHelp.restored)
732 /* set position of dialog to restored position */
733 wmDtHelpSetPosition (pHelp, pSD, True);
734 pSD->dtHelp.restored = False;
738 /* set position of dialog relative to client window */
739 wmDtHelpSetPosition (pHelp, pSD, False);
742 } /* END OF FUNCTION WmDtWmPopupHelpCB */
745 /****************************************************************************
746 * Function: WmDtVersionPopupCB(
748 * caddr_t clientData,
753 * Return Value: Void.
758 ***************************************************************************/
759 static void WmDtVersionPopupCB (
761 XtPointer clientData,
766 Dimension width, height;
774 XtSetArg (setArgs[n], XmNx, 0); n++;
775 XtSetArg (setArgs[n], XmNy, 0); n++;
779 * Center the Version Dialog on the screen
783 XtSetArg(getArgs[n], XmNheight, &height); n++;
784 XtSetArg(getArgs[n], XmNwidth, &width); n++;
785 XtGetValues (w, (ArgList) getArgs, n);
788 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) width))/2;
790 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) height))/2;
792 XtSetArg(setArgs[n], XmNx, (XtArgVal) x); n++;
793 XtSetArg(setArgs[n], XmNy, (XtArgVal) y); n++;
794 XtSetValues (w, setArgs, n);
797 } /* END OF FUNCTION WmDtVersionPopupCB */
801 /****************************************************************************
802 * Function: WmDtPopupHelpCB(
804 * caddr_t clientData,
809 * Return Value: Void.
814 ***************************************************************************/
815 static void WmDtPopupHelpCB (
817 XtPointer clientData,
821 Atom * workspace_atoms = NULL;
822 int num_workspaces=0;
824 CacheListStruct *pTemp = (CacheListStruct *)clientData;
829 XtSetArg (args[n], XmNgeometry, NULL); n++;
830 XtSetArg (args[n], XmNwaitForWm, False); n++;
834 if (pTemp->workspaces)
836 char **atom_names = NULL;
839 ptr = DtStrchr (pTemp->workspaces, '*');
840 if (ptr != NULL) *ptr = NULL;
843 (char **) XtRealloc ((char *)atom_names,
844 sizeof(char*) * (num_workspaces + 1));
845 atom_names[num_workspaces] = XtNewString(pTemp->workspaces);
851 pTemp->workspaces = ptr + 1;
853 } while (ptr != NULL);
855 workspace_atoms = (Atom *) XtMalloc(sizeof(Atom) * num_workspaces);
856 XInternAtoms(wmGD.display, atom_names, num_workspaces,
857 True, workspace_atoms);
859 DtWsmSetWorkspacesOccupied (XtDisplay(helpShellW),
860 XtWindow (helpShellW),
864 while (num_workspaces-- > 0)
865 XtFree(atom_names[num_workspaces]);
866 XtFree ((char *) atom_names);
867 XtFree ((char *) workspace_atoms);
870 XtSetArg (args[n], XmNx, pTemp->xPos); n++;
871 XtSetArg (args[n], XmNy, pTemp->yPos); n++;
872 pTemp->restored = False;
873 XtRemoveCallback(helpShellW, XmNpopupCallback,
874 WmDtPopupHelpCB, clientData);
875 XtAddCallback(helpShellW, XmNpopupCallback, WmDtPopupHelpCB, NULL);
879 XtSetArg (args[n], XmNx, 0); n++;
880 XtSetArg (args[n], XmNy, 0); n++;
883 XtSetValues (helpShellW, args, n);
886 } /* END OF FUNCTION WmDtPopupHelpCB */
890 /****************************************************************************
891 * Function: WmDtVersionCloseCB(
893 * caddr_t clientData,
898 * Return Value: Void.
900 * Purpose: Process close requests on all Help Dialog widgets
901 * created and managed by this application.
903 ***************************************************************************/
904 static void WmDtVersionCloseCB (
906 XtPointer clientData,
911 } /* END OF FUNCTION WmDtWmVersionCloseHelpCB */
916 /****************************************************************************
917 * Function: void WmDtProcessLinkCB(
919 * caddr_t clientData,
924 * Return Value: Void.
926 * Purpose: Process JUMP-NEW and APP-LINK hypertext requests in a
927 * given Help Dialog Window.
929 * This is the callback used for the DtNhyperLinkCallback
930 * on each of the help dialog widges created.
932 ****************************************************************************/
933 static void WmDtProcessLinkCB (
935 XtPointer clientData,
939 DtHelpDialogCallbackStruct * hyperData =
940 (DtHelpDialogCallbackStruct *) callData;
942 switch (hyperData->hyperType)
944 case DtHELP_LINK_JUMP_NEW:
945 WmDtDisplayTopic (XtParent(w), hyperData->helpVolume,
946 hyperData->locationId,
947 /* DtHELP_LINK_JUMP_NEW */ DtHELP_TYPE_TOPIC,
949 NULL, 0, NULL, True, NULL);
952 default: /* This catches the application definded link types */
953 if (hyperData->hyperType >= 100)
955 /* The application would put any code here to handle their
956 * Applicaiton-defined-links.
962 /* printf("We some how got a bogus hyptertext link type/n");*/
964 } /* End Switch Statement */
966 } /* END OF FUNCTION WmDtProcessLinkCB */
969 /****************************************************************************
970 * Function: void WmDtHelpOnVersion(
975 * Return Value: Void.
977 * Purpose: Displays a new Cache Creek help topic in a new/cached
978 * help dialog widget.
980 ****************************************************************************/
981 void WmDtHelpOnVersion (
990 Widget printButton = NULL;
991 Widget helpButton = NULL;
992 Widget backButton = NULL;
993 Widget closeButton = NULL;
994 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 if(label)XmStringFree(label);
1040 printButton = DtHelpQuickDialogGetChild( versionWidget,
1041 DtHELP_QUICK_PRINT_BUTTON );
1042 helpButton = DtHelpQuickDialogGetChild( versionWidget,
1043 DtHELP_QUICK_HELP_BUTTON );
1044 backButton = DtHelpQuickDialogGetChild( versionWidget,
1045 DtHELP_QUICK_BACK_BUTTON );
1047 XtUnmanageChild(printButton);
1048 XtUnmanageChild(helpButton);
1049 XtUnmanageChild(backButton);
1053 XtSetArg (setArgs[n], DtNlocationId, "_COPYRIGHT"); n++;
1054 XtSetArg (setArgs[n], DtNhelpVolume, WM_DT_HELP_VOLUME); n++;
1055 XtSetValues(versionWidget, setArgs, n);
1057 XtManageChild(versionWidget);
1061 } /* END OF FUNCTION WmDtHelpOnVersion */
1065 /******************************<->*************************************
1067 * Boolean WmDtHelp (String args)
1079 * Return - True if the find a help callback; false otherwise.
1084 ******************************<->***********************************/
1087 WmDtHelp (String args)
1091 WmPanelistObject pPanelist;
1092 char *theHelpVolume = WM_DT_HELP_VOLUME;
1093 char *theHelpTopic = WM_DT_HELP_TOPIC;
1094 char volume[MAXWMPATH + 1];
1095 char topic[MAXWMPATH + 1];
1099 /* get right screen data */
1100 /* pSD = WmScreenDataFromWidget(w);*/
1101 pSD = wmGD.pActiveSD;
1104 pPanelist = (WmPanelistObject) pSD->wPanelist;
1106 if (theWidget = O_Panel(pPanelist))
1111 * parse args for volume and topic
1113 WmDtGetHelpArgs((unsigned char*)args, &volume, &topic, &argCount);
1116 WmDtDisplayTopic(pSD->screenTopLevelW1,
1119 DtHELP_TYPE_TOPIC, theWidget, True,
1120 NULL, 0, NULL, False, NULL);
1124 WmDtDisplayTopic(pSD->screenTopLevelW1,
1127 DtHELP_TYPE_TOPIC, theWidget, False,
1128 NULL, 0, NULL, False, NULL);
1134 WmDtDisplayTopic(pSD->screenTopLevelW1,
1137 DtHELP_TYPE_TOPIC, theWidget, True,
1138 NULL, 0, NULL, False, NULL);
1146 } /* END OF FUNCTION WmDtHelp */
1149 /******************************<->*************************************
1151 * Boolean WmDtHelpMode (void)
1155 * Invoke item help mode
1163 * Return - True if the find a help callback; false otherwise.
1168 ******************************<->***********************************/
1173 Widget selectedWidget = NULL;
1175 String sTmp, sMessage, sTitle;
1177 iStatus = WmDtReturnSelectedWidget(wmGD.topLevelW, NULL,
1182 case DtHELP_SELECT_VALID:
1183 if (selectedWidget != (Widget) NULL)
1187 if ((XtHasCallbacks(selectedWidget,
1188 XmNhelpCallback) == XtCallbackHasSome))
1190 XtCallCallbacks(selectedWidget, XmNhelpCallback,
1196 selectedWidget = XtParent(selectedWidget);
1199 while (selectedWidget != NULL);
1203 case DtHELP_SELECT_INVALID:
1204 /* invalid selection error (window not of this process) */
1205 #ifndef NO_MESSAGE_CATALOG
1206 sTmp = (char *)GETMESSAGE(29, 3,
1207 "You must select a Workspace Manager\n\
1208 dialog, an item in the Front Panel,\n\
1209 or an item in a subpanel.");
1210 sMessage = XtNewString (sTmp);
1211 sTmp = (char *)GETMESSAGE(29, 4,
1212 "Workspace Manager - Help On Item Error");
1213 sTitle = XtNewString (sTmp);
1215 sMessage = "You must select a Workspace Manager\n\
1216 dialog, an item in the Front Panel,\n\
1217 or an item in a subpanel.";
1218 sTitle = "Workspace Manager - Help On Item Error";
1220 wmDtErrorDialog (ACTIVE_PSD, sMessage, sTitle);
1221 #ifndef NO_MESSAGE_CATALOG
1222 if (sMessage) XtFree (sMessage);
1223 if (sTitle) XtFree (sTitle);
1227 case DtHELP_SELECT_ERROR:
1228 /* error (like grab failed) */
1231 case DtHELP_SELECT_ABORT:
1232 /* user aborted this selection */
1237 } /* END OF FUNCTION WmDtHelpMode */
1241 /*****************************************************************************
1242 * Function: WmDtReturnSelectedWidget (Widget, Cursor, Widget *)
1244 * Parameters: Widget Specifies a valid widget within the app's
1246 * Cursor Cursor to grab pointer with (use NULL!!)
1247 * Widget * ptr to loc to receive returned widget
1249 * Return Value: DtHELP_SELECT_ERROR - error in getting the widget
1250 * DtHELP_SELECT_ABORT - user aborted
1251 * DtHELP_SELECT_INVALID - user selected invalid window
1252 * DtHELP_SELECT_VALID - valid widget returned
1254 * Purpose: Allows developers to get the widget ID for any widget in their UI
1255 * that the user has selected vai the pointer. This function will
1256 * cause the cursor to change and allow a user to select an item in
1259 *****************************************************************************/
1261 WmDtReturnSelectedWidget(
1271 /* Setup some needed variables */
1272 dpy = XtDisplay(theWidget);
1273 screen = ACTIVE_SCREEN;
1275 /* refresh the display */
1276 XmUpdateDisplay(theWidget);
1278 /* Change the curser to let the user select the desired widget */
1279 iStatus = LocateTheControl(dpy, screen, pWidget);
1283 } /* END OF FUNCTION WmDtReturnSelectedWidget */
1286 /****************************************************************************
1287 * Function: void WmDtDisplayTopic(
1295 * ClientData *pCData,
1296 * Boolean hyperlink,
1297 * DisplayTopicInfo *displayTopicInfo)
1301 * Return Value: Void.
1303 * Purpose: Displays a new Cache Creek help topic in a new/cached
1304 * help dialog widget.
1306 ****************************************************************************/
1319 DisplayTopicInfo *displayTopicInfo)
1331 WmPanelistObject pPanelist;
1332 char * defaultTitle="Help";
1333 ClientData *pCD = NULL;
1334 WmScreenData *pSD = NULL;
1335 CacheListStruct *pCurrentNode = NULL;
1336 Boolean cachedNode = FALSE;
1339 pSD = WmScreenDataFromWidget (parent);
1342 pPanelist = (WmPanelistObject) pSD->wPanelist;
1346 /*argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount + 1)) ;*/
1347 argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount)) ;
1348 memcpy( argsNew, argList, (sizeof( Arg) * argCount)) ;
1351 shellWidget = parent;
1352 while (!(XtIsSubclass(shellWidget, shellWidgetClass)))
1354 shellWidget = XtParent(shellWidget);
1360 case DtHELP_TYPE_TOPIC:
1361 if (helpVolume != NULL)
1363 XtSetArg (setArgs[n],DtNhelpVolume,helpVolume); n++;
1365 XtSetArg (setArgs[n], DtNlocationId,locationId); n++;
1366 helpTitle=locationId;
1369 case DtHELP_TYPE_DYNAMIC_STRING:
1370 XtSetArg (setArgs[n], DtNstringData, locationId); n++;
1371 /* helpTitle=locationId;*/
1372 helpTitle=defaultTitle;
1375 case DtHELP_TYPE_MAN_PAGE:
1378 case DtHELP_TYPE_FILE:
1383 /* error condition, don't try to display help */
1389 XtSetArg (setArgs[n], DtNhelpType, helpType); n++;
1393 if (pSD->dtHelp.shell)
1395 helpWidget = pSD->dtHelp.dialog;
1396 XtSetValues(helpWidget, setArgs, n);
1400 #ifndef NO_MESSAGE_CATALOG
1401 XtSetArg (setArgs[n], XmNtitle,
1402 wmNLS.defaultDtwmHelpTitle); n++;
1404 XtSetArg (setArgs[n], XmNtitle,
1405 "Workspace Manager - Help"); n++;
1408 pSD->dtHelp.dialog =
1409 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1410 helpWidget = pSD->dtHelp.dialog;
1411 pSD->dtHelp.shell = XtParent(helpWidget);
1412 pSD->dtHelp.bMapped = False;
1415 XtSetArg (setArgs[n], XmNname, "wmHelp"); n++;
1418 XtSetValues(pSD->dtHelp.shell,
1422 XtAddCallback(helpWidget,
1423 DtNhyperLinkCallback,
1424 WmDtProcessLinkCB, NULL);
1426 XtAddCallback(helpWidget, DtNcloseCallback,
1428 (XtPointer) helpWidget);
1430 XtAddCallback(pSD->dtHelp.shell, XmNpopupCallback,
1431 WmDtWmPopupHelpCB, NULL);
1433 XtAddEventHandler(pSD->dtHelp.shell,
1434 StructureNotifyMask,
1436 wmDtHelpMapEventHandler,
1442 ShowHelpDialog(pCData);
1448 XFindContext (DISPLAY, XtWindow(XtParent(wmClient)),
1449 wmGD.windowContextType, (caddr_t *)&pCD);
1453 XFindContext (DISPLAY, XtWindow(O_Shell(pPanelist)),
1454 wmGD.windowContextType, (caddr_t *)&pCD);
1456 ShowHelpDialog(pCD);
1461 /* Get a used or new node form our cache if we have one */
1462 cachedNode = WmDtGetFromCache(&pCurrentNode, pSD);
1464 /* If we got a free one from the Cache, use it */
1465 /* Set Values on current free one, then map it */
1468 XtSetValues(pCurrentNode->helpDialog, setArgs, n);
1472 #ifndef NO_MESSAGE_CATALOG
1473 XtSetArg (setArgs[n], XmNtitle,
1474 wmNLS.defaultHelpTitle); n++;
1476 XtSetArg (setArgs[n], XmNtitle,
1477 "Workspace Manager - Help"); n++;
1480 XtSetArg (setArgs[n], XmNgeometry, NULL); n++;
1481 XtSetArg (setArgs[n], XmNx, 0); n++;
1482 XtSetArg (setArgs[n], XmNy, 0); n++;
1484 pCurrentNode->helpDialog =
1485 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1487 XtSetArg (setArgs[n], XmNname, "cachedHelp"); n++;
1490 XtSetValues(shellWidget, argList, argCount);
1493 XtAddCallback(pCurrentNode->helpDialog,
1494 DtNhyperLinkCallback,
1495 WmDtProcessLinkCB, NULL);
1497 XtAddCallback(pCurrentNode->helpDialog, DtNcloseCallback,
1499 (XtPointer) pCurrentNode->helpDialog);
1503 pCurrentNode->hLink = True;
1507 if (displayTopicInfo)
1509 pCurrentNode->workspaces =
1510 displayTopicInfo->workspaces;
1511 pCurrentNode->xPos = displayTopicInfo->xPos;
1512 pCurrentNode->yPos = displayTopicInfo->yPos;
1513 pCurrentNode->restored = True;
1514 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1517 (XtPointer)pCurrentNode);
1521 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1523 WmDtPopupHelpCB, NULL);
1528 helpWidget = pCurrentNode->helpDialog;
1529 XtManageChild(helpWidget);
1530 XtPopup(XtParent(helpWidget), XtGrabNone);
1533 } /* if n is still 0, we did not find a useful help type */
1535 } /* END OF FUNCTION WmDtDisplayTopic */
1538 /****************************************************************************
1539 * Function: static Boolean WmDtGetFromCache(
1540 * CacheListStruct **pCurrentNode)
1545 * Return Value: Void.
1547 * Purpose: Gets a free help node form our cache list. If none are
1548 * free, it will return fallse and the calling routine will
1549 * create a new help dialog widget.
1551 ****************************************************************************/
1552 static Boolean WmDtGetFromCache(
1553 CacheListStruct **pCurrentNode,
1556 CacheListStruct *pTemp;
1558 if (pSD->cachedHelp == NULL)
1560 /* We have a new list so lets create one and pass it back */
1562 (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1564 /* Assign the default values to our node */
1565 pSD->cachedHelp->helpDialog = NULL;
1566 pSD->cachedHelp->inUseFlag = TRUE;
1567 pSD->cachedHelp->restored = False;
1568 pSD->cachedHelp->hLink = False;
1569 pSD->cachedHelp->pNext = NULL;
1570 pSD->cachedHelp->pPrevious = NULL;
1572 /* Return our head pointer because it's our first and only node */
1573 *pCurrentNode = pSD->cachedHelp;
1578 /* We have some nodes so search for a free one first */
1579 pTemp = pSD->cachedHelp;
1581 while (pTemp != NULL)
1583 if (pTemp->inUseFlag == FALSE)
1585 pTemp->inUseFlag = TRUE;
1586 pTemp->hLink = False;
1587 pTemp->restored = False;
1588 *pCurrentNode = pTemp;
1592 pTemp = pTemp->pNext;
1597 * If we did not find a free node then we must add a new one to the
1598 * top of the list, and return it.
1601 pTemp = (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1603 /* Assign the default values to our node */
1604 pTemp->helpDialog = NULL;
1605 pTemp->inUseFlag = TRUE;
1606 pTemp->restored = False;
1607 pTemp->hLink = False;
1608 pTemp->pNext = pSD->cachedHelp;
1609 pTemp->pPrevious = NULL;
1611 pSD->cachedHelp->pPrevious = pTemp;
1613 /* Re-Assign our head pointer to point to the new head of the list */
1614 pSD->cachedHelp = pTemp;
1616 /* Return our head pointer because it's our new node */
1617 *pCurrentNode = pSD->cachedHelp;
1621 } /* END OF FUNCTION WmDtGetFromCache */
1623 /* End of Dt utils */
1626 /*************************************<->*************************************
1629 * RestoreHelpDialogs (pSD)
1634 * Saves the state of the help system
1648 ******************************<->***********************************/
1656 XrmName xrm_name[5];
1657 XrmRepresentation rep_type;
1660 Position xLoc, yLoc;
1661 short columns, rows;
1667 char dialogName[10];
1669 ClientData *pCD = NULL;
1670 char *tTitle = NULL;
1671 char *wsName = NULL;
1672 char *wmClientName = NULL;
1673 char *helpVolume = NULL;
1674 char *locationId = NULL;
1675 char *stringData = NULL;
1676 char *workspaces = NULL;
1681 WmPanelistObject pPanelist = (WmPanelistObject) pSD->wPanelist;
1688 if (pSD->helpResources)
1690 if ((db = XrmGetStringDatabase (pSD->helpResources)) == NULL)
1694 xrm_name [0] = XrmStringToQuark ("wsHelp");
1695 xrm_name [1] = XrmStringToQuark ("onScreen");
1696 xrm_name [2] = NULL;
1699 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1701 /* Are we supposed to be mapped? */
1702 if (strcmp(value.addr, "True") == 0)
1705 /* get x position */
1706 xrm_name [1] = XrmStringToQuark ("x");
1707 if (XrmQGetResource (db, xrm_name, xrm_name,
1710 pSD->dtHelp.xPos = (Position)atoi((char *)value.addr);
1711 pSD->dtHelp.restored = True;
1714 /* get y position */
1715 xrm_name [1] = XrmStringToQuark ("y");
1716 if (XrmQGetResource (db, xrm_name, xrm_name,
1719 pSD->dtHelp.yPos = (Position)atoi((char *)value.addr);
1720 pSD->dtHelp.restored = True;
1724 xrm_name [1] = XrmStringToQuark ("columns");
1725 if (XrmQGetResource (db, xrm_name, xrm_name,
1728 XtSetArg (setArgs[ac], XmNcolumns,
1729 (short)atoi((char *)value.addr)); ac++;
1730 columns = (short)atoi((char *)value.addr);
1734 xrm_name [1] = XrmStringToQuark ("rows");
1735 if (XrmQGetResource (db, xrm_name, xrm_name,
1738 XtSetArg (setArgs[ac], XmNrows,
1739 (short)atoi((char *)value.addr)); ac++;
1740 rows = (short)atoi((char *)value.addr);
1742 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1744 XtSetArg (setArgs[ac], XmNgeometry,
1745 XtNewString(geometry)); ac++;
1747 /* get visiblePathCount */
1748 xrm_name [1] = XrmStringToQuark ("vPCount");
1749 if (XrmQGetResource (db, xrm_name, xrm_name,
1752 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1753 (int)atoi((char *)value.addr)); ac++;
1756 /* get topicTitle */
1757 xrm_name [1] = XrmStringToQuark ("tTitle");
1758 if (XrmQGetResource (db, xrm_name, xrm_name,
1761 tTitle = XtNewString ((char *)value.addr);
1762 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1766 xrm_name [1] = XrmStringToQuark ("helpType");
1767 if (XrmQGetResource (db, xrm_name, xrm_name,
1770 XtSetArg (setArgs[ac], DtNhelpType,
1771 (int)atoi((char *)value.addr)); ac++;
1772 helpType = (int)atoi((char *)value.addr);
1778 case DtHELP_TYPE_TOPIC:
1779 /* get helpVolume */
1780 xrm_name [1] = XrmStringToQuark ("helpVolume");
1781 if (XrmQGetResource (db, xrm_name, xrm_name,
1784 helpVolume = XtNewString ((char *)value.addr);
1785 /* XtSetArg (setArgs[ac], DtNhelpVolume,
1786 helpVolume); ac++;*/
1788 /* get locationId */
1789 xrm_name [1] = XrmStringToQuark ("locationId");
1790 if (XrmQGetResource (db, xrm_name, xrm_name,
1793 locationId = XtNewString ((char *)value.addr);
1794 /* XtSetArg (setArgs[ac], DtNlocationId,
1795 locationId); ac++;*/
1800 case DtHELP_TYPE_DYNAMIC_STRING:
1802 /* get stringData */
1803 xrm_name [1] = XrmStringToQuark ("stringData");
1804 if (XrmQGetResource (db, xrm_name, xrm_name,
1807 stringData = XtNewString ((char *)value.addr);
1808 /* XtSetArg (setArgs[ac], DtNstringData,
1809 stringData); ac++;*/
1810 locationId = stringData;
1815 case DtHELP_TYPE_MAN_PAGE:
1819 case DtHELP_TYPE_FILE:
1824 /* error condition, don't try to display help */
1828 /* get name of wm client for which wmHelp is transient */
1830 xrm_name [1] = XrmStringToQuark ("windowGroup");
1831 if (XrmQGetResource (db, xrm_name, xrm_name,
1834 wmClientName = ((char *)value.addr);
1835 if ((!strcmp(wmClientName, pSD->iconBoxName)) &&
1838 xrm_name [1] = XrmStringToQuark ("wsName");
1839 if (XrmQGetResource (db, xrm_name, xrm_name,
1842 wsName = (char *)value.addr;
1843 for (wsCnt = 0; wsCnt < pSD->numWorkspaces;
1846 if (!strcmp(pSD->pWS[wsCnt].name, wsName))
1848 pCD=pSD->pWS[wsCnt].pIconBox->pCD_iconBox;
1856 else if(!strcmp(wmClientName, O_PanelName(pPanelist)))
1858 pCD=O_ClientData(pPanelist);
1864 * Map the help dialog
1867 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
1869 helpType, NULL, True,
1870 setArgs, ac, pCD, False, NULL);
1872 }/* if (XrmQGetResource for wsHelp) */
1874 xrm_name [0] = XrmStringToQuark ("cachedHelp");
1875 xrm_name [1] = XrmStringToQuark ("cachedCount");
1876 xrm_name [2] = NULL;
1879 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1881 /* restore cachedCount number of help dialogs */
1882 cachedCount = (int)atoi((char *)value.addr);
1883 for (cCount=1; cCount < (cachedCount + 1); cCount++)
1885 sprintf (dialogName, "oWsHelp%d", cCount);
1886 xrm_name [0] = XrmStringToQuark (dialogName);
1887 xrm_name [1] = NULL;
1888 xrm_name [2] = NULL;
1890 displayTopicInfo.xPos = 0;
1891 displayTopicInfo.xPos = 0;
1892 displayTopicInfo.workspaces = NULL;
1895 /* get x position */
1896 xrm_name [1] = XrmStringToQuark ("x");
1897 if (XrmQGetResource (db, xrm_name, xrm_name,
1900 /* XtSetArg (setArgs[ac], XmNx,
1901 atoi((char *)value.addr)); ac++;*/
1902 xLoc = (Position)atoi((char *)value.addr);
1903 displayTopicInfo.xPos = xLoc;
1906 /* get y position */
1907 xrm_name [1] = XrmStringToQuark ("y");
1908 if (XrmQGetResource (db, xrm_name, xrm_name,
1911 /* XtSetArg (setArgs[ac], XmNy,
1912 atoi((char *)value.addr)); ac++;*/
1913 yLoc = (Position)atoi((char *)value.addr);
1914 displayTopicInfo.yPos = yLoc;
1918 xrm_name [1] = XrmStringToQuark ("columns");
1919 if (XrmQGetResource (db, xrm_name, xrm_name,
1922 XtSetArg (setArgs[ac], XmNcolumns,
1923 (short)atoi((char *)value.addr)); ac++;
1924 columns = (short)atoi((char *)value.addr);
1928 xrm_name [1] = XrmStringToQuark ("rows");
1929 if (XrmQGetResource (db, xrm_name, xrm_name,
1932 XtSetArg (setArgs[ac], XmNrows,
1933 (short)atoi((char *)value.addr)); ac++;
1934 rows = (short)atoi((char *)value.addr);
1936 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1938 XtSetArg (setArgs[ac], XmNgeometry,
1939 XtNewString(geometry)); ac++;
1941 /* get visiblePathCount */
1942 xrm_name [1] = XrmStringToQuark ("vPCount");
1943 if (XrmQGetResource (db, xrm_name, xrm_name,
1946 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1947 (int)atoi((char *)value.addr)); ac++;
1950 /* get topicTitle */
1951 xrm_name [1] = XrmStringToQuark ("tTitle");
1952 if (XrmQGetResource (db, xrm_name, xrm_name,
1955 tTitle = XtNewString ((char *)value.addr);
1956 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1959 /* get workspaces list */
1960 xrm_name [1] = XrmStringToQuark ("workspaces");
1961 if (XrmQGetResource (db, xrm_name, xrm_name,
1964 workspaces = XtNewString ((char *)value.addr);
1965 displayTopicInfo.workspaces = workspaces;
1970 xrm_name [1] = XrmStringToQuark ("helpType");
1971 if (XrmQGetResource (db, xrm_name, xrm_name,
1974 XtSetArg (setArgs[ac], DtNhelpType,
1975 (int)atoi((char *)value.addr)); ac++;
1976 helpType = (int)atoi((char *)value.addr);
1982 case DtHELP_TYPE_TOPIC:
1983 /* get helpVolume */
1984 xrm_name [1] = XrmStringToQuark ("helpVolume");
1985 if (XrmQGetResource (db, xrm_name, xrm_name,
1988 helpVolume = XtNewString ((char *)value.addr);
1990 /* get locationId */
1991 xrm_name [1] = XrmStringToQuark ("locationId");
1992 if (XrmQGetResource (db, xrm_name, xrm_name,
1995 locationId = XtNewString ((char *)value.addr);
2000 case DtHELP_TYPE_DYNAMIC_STRING:
2002 /* get stringData */
2003 xrm_name [1] = XrmStringToQuark ("stringData");
2004 if (XrmQGetResource (db, xrm_name, xrm_name,
2007 stringData = XtNewString ((char *)value.addr);
2008 /* XtSetArg (setArgs[ac], DtNstringData,
2009 stringData); ac++;*/
2010 locationId = stringData;
2015 case DtHELP_TYPE_MAN_PAGE:
2019 case DtHELP_TYPE_FILE:
2024 /* error condition, don't try to display help */
2029 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
2031 helpType, NULL, False,
2032 setArgs, ac, NULL, False,
2035 } /* for all cached help dialogs */
2038 } /* if (XrmQGetResource ) cachedHelp/cachedCount */
2040 XrmDestroyDatabase(db);
2043 } /* END OF FUNCTION RestoreHelpDialogs */
2045 /*************************************<->*************************************
2048 * SaveHelpResources (pSD)
2053 * Saves the state of the help system
2067 ******************************<->***********************************/
2074 PtrWsDtHelpData pHelp;
2075 CacheListStruct *pTemp;
2079 Window wmGroupWindow;
2081 ClientData *pCDforHelp;
2085 WmWorkspaceData *pWS;
2087 Position xLoc, yLoc;
2088 short columns, rows;
2089 unsigned char helpType;
2096 char workspaces[MAXWMPATH+1];
2098 char buffer[MAXWMPATH+1];
2103 char screenName[10];
2104 char dialogName[128];
2105 char resString[MAXWMPATH+1];
2110 pHelp = &pSD->dtHelp;
2112 /* allocate initial data space */
2113 if ((data = (char *) XtMalloc (MAXWMPATH+1)) == NULL)
2116 GETMESSAGE(76,12,"Insufficient memory to save resources")));
2117 Do_Quit_Mwm (False);
2122 /* Get our current resource class */
2126 res_class = WM_RESOURCE_CLASS;
2130 res_class = DT_WM_RESOURCE_CLASS;
2133 sprintf (screenName, "%d\0", pSD->screen);
2135 sprintf (buffer, "%s*%s*%s: \\n ", res_class, screenName,
2137 AddStringToResourceData (buffer, &data, &cum_len);
2139 if (pHelp->onScreen)
2141 sprintf (dialogName, "wsHelp");
2142 sprintf (buffer, "%s*onScreen: True\\n ", dialogName);
2143 AddStringToResourceData (buffer, &data, &cum_len);
2146 XtSetArg(getArgs[ac], XmNx, &xLoc); ac++;
2147 XtSetArg(getArgs[ac], XmNy, &yLoc); ac++;
2148 XtGetValues(pSD->dtHelp.shell, getArgs, ac);
2149 if (!XFindContext (DISPLAY, XtWindow(pSD->dtHelp.shell),
2150 wmGD.windowContextType, (caddr_t *)&pCDforHelp))
2152 if (wmGD.positionIsFrame)
2154 xLoc = xLoc - pCDforHelp->clientOffset.x;
2155 yLoc = yLoc - pCDforHelp->clientOffset.y;
2160 XtSetArg(getArgs[ac], XmNcolumns, &columns); ac++;
2161 XtSetArg(getArgs[ac], XmNrows, &rows); ac++;
2162 XtSetArg(getArgs[ac], DtNhelpType, &helpType); ac++;
2163 XtSetArg(getArgs[ac], DtNvisiblePathCount, &vPCount); ac++;
2164 XtSetArg(getArgs[ac], DtNtopicTitle, &topicTitle); ac++;
2165 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2167 sprintf (buffer, "%s*x: %d \\n ", dialogName, xLoc);
2168 AddStringToResourceData (buffer, &data, &cum_len);
2169 sprintf (buffer, "%s*y: %d \\n ", dialogName, yLoc);
2170 AddStringToResourceData (buffer, &data, &cum_len);
2171 sprintf (buffer, "%s*columns: %d \\n ", dialogName, columns);
2172 AddStringToResourceData (buffer, &data, &cum_len);
2173 sprintf (buffer, "%s*rows: %d \\n ", dialogName, rows);
2174 AddStringToResourceData (buffer, &data, &cum_len);
2175 sprintf (buffer, "%s*helpType: %d \\n ", dialogName, helpType);
2176 AddStringToResourceData (buffer, &data, &cum_len);
2177 sprintf (buffer, "%s*vPCount: %d \\n ", dialogName, vPCount);
2178 AddStringToResourceData (buffer, &data, &cum_len);
2179 sprintf (buffer, "%s*tTitle: %s\\n ", dialogName, topicTitle);
2180 AddStringToResourceData (buffer, &data, &cum_len);
2185 case DtHELP_TYPE_TOPIC:
2186 XtSetArg (getArgs[ac],DtNhelpVolume, &helpVolume); ac++;
2187 XtSetArg (getArgs[ac], DtNlocationId, &locationId); ac++;
2188 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2189 sprintf (buffer, "%s*helpVolume: %s\\n ", dialogName, helpVolume);
2190 AddStringToResourceData (buffer, &data, &cum_len);
2191 sprintf (buffer, "%s*locationId: %s\\n ", dialogName, locationId);
2192 AddStringToResourceData (buffer, &data, &cum_len);
2196 case DtHELP_TYPE_DYNAMIC_STRING:
2197 XtSetArg (getArgs[ac], DtNstringData, &stringData); ac++;
2198 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2199 sprintf (buffer, "%s*stringData: %s\\n ", dialogName, stringData);
2200 AddStringToResourceData (buffer, &data, &cum_len);
2204 case DtHELP_TYPE_MAN_PAGE:
2208 case DtHELP_TYPE_FILE:
2213 /* error condition, don't try to display help */
2218 XtSetArg(getArgs[ac], XmNwindowGroup, &wmGroupWindow); ac++;
2219 XtGetValues(pSD->dtHelp.shell, getArgs, ac);
2221 if (!XFindContext (DISPLAY, wmGroupWindow,
2222 wmGD.windowContextType, (caddr_t *)&pCD))
2224 sprintf (buffer, "%s*windowGroup: %s\\n ", dialogName,
2226 AddStringToResourceData (buffer, &data, &cum_len);
2228 if ((!strcmp(pCD->clientName, pSD->iconBoxName)) &&
2231 wsName = XGetAtomName(DISPLAY,
2232 pCD->pWsList[pCD->currentWsc].wsID);
2233 sprintf (buffer, "%s*wsName: %s\\n ", dialogName,
2235 AddStringToResourceData (buffer, &data, &cum_len);
2242 if (pSD->cachedHelp != NULL)
2245 * We have some nodes so search for
2246 * managed dialogs and save their state
2249 pTemp = pSD->cachedHelp;
2251 while (pTemp != NULL)
2253 if (pTemp->inUseFlag == FALSE)
2255 pTemp = pTemp->pNext;
2260 sprintf (dialogName, "oWsHelp%d",cachedCount);
2263 XtSetArg(getArgs[ac], XmNx, &xLoc); ac++;
2264 XtSetArg(getArgs[ac], XmNy, &yLoc); ac++;
2265 XtGetValues(XtParent(pTemp->helpDialog), getArgs, ac);
2266 if (!XFindContext (DISPLAY,
2267 XtWindow(XtParent(pTemp->helpDialog)),
2268 wmGD.windowContextType,
2269 (caddr_t *)&pCDforHelp))
2271 if (wmGD.positionIsFrame)
2273 xLoc = xLoc - pCDforHelp->clientOffset.x;
2274 yLoc = yLoc - pCDforHelp->clientOffset.y;
2284 XtSetArg(getArgs[ac], XmNcolumns, &columns); ac++;
2285 XtSetArg(getArgs[ac], XmNrows, &rows); ac++;
2286 XtSetArg(getArgs[ac], DtNhelpType, &helpType); ac++;
2287 XtSetArg(getArgs[ac], DtNvisiblePathCount, &vPCount); ac++;
2288 XtSetArg(getArgs[ac], DtNtopicTitle, &topicTitle); ac++;
2289 XtGetValues(pTemp->helpDialog, getArgs, ac);
2291 sprintf (buffer, "%s*x: %d \\n ", dialogName, xLoc);
2292 AddStringToResourceData (buffer, &data, &cum_len);
2293 sprintf (buffer, "%s*y: %d \\n ", dialogName, yLoc);
2294 AddStringToResourceData (buffer, &data, &cum_len);
2295 sprintf (buffer, "%s*columns: %d \\n ", dialogName, columns);
2296 AddStringToResourceData (buffer, &data, &cum_len);
2297 sprintf (buffer, "%s*rows: %d \\n ", dialogName, rows);
2298 AddStringToResourceData (buffer, &data, &cum_len);
2299 sprintf (buffer, "%s*helpType: %d \\n ", dialogName, helpType);
2300 AddStringToResourceData (buffer, &data, &cum_len);
2301 sprintf (buffer, "%s*vPCount: %d \\n ", dialogName, vPCount);
2302 AddStringToResourceData (buffer, &data, &cum_len);
2303 sprintf (buffer, "%s*tTitle: %s\\n ", dialogName, topicTitle);
2304 AddStringToResourceData (buffer, &data, &cum_len);
2309 case DtHELP_TYPE_TOPIC:
2310 XtSetArg (getArgs[ac],DtNhelpVolume, &helpVolume); ac++;
2311 XtSetArg (getArgs[ac], DtNlocationId, &locationId); ac++;
2312 XtGetValues(pTemp->helpDialog, getArgs, ac);
2313 sprintf (buffer, "%s*helpVolume: %s\\n ",
2314 dialogName, helpVolume);
2315 AddStringToResourceData (buffer, &data, &cum_len);
2316 sprintf (buffer, "%s*locationId: %s\\n ",
2317 dialogName, locationId);
2318 AddStringToResourceData (buffer, &data, &cum_len);
2322 case DtHELP_TYPE_DYNAMIC_STRING:
2323 XtSetArg (getArgs[ac], DtNstringData, &stringData); ac++;
2324 XtGetValues(pTemp->helpDialog, getArgs, ac);
2325 sprintf (buffer, "%s*stringData: %s\\n ",
2326 dialogName, stringData);
2327 AddStringToResourceData (buffer, &data, &cum_len);
2331 case DtHELP_TYPE_MAN_PAGE:
2335 case DtHELP_TYPE_FILE:
2340 /* error condition, don't try to display help */
2347 sprintf(workspaces,"");
2348 for (wsCnt = 0; wsCnt < pSD->numWorkspaces;
2351 wsID = XInternAtom (DISPLAY, pSD->pWS[wsCnt].name,
2353 pWS = GetWorkspaceData (pSD, wsID);
2355 if (ClientInWorkspace (pWS, pCDforHelp))
2359 strcpy(workspaces, pSD->pWS[wsCnt].name);
2364 strcat(workspaces, "*");
2365 strcat(workspaces, pSD->pWS[wsCnt].name);
2370 sprintf (buffer, "%s*workspaces: %s\\n ", dialogName,
2372 AddStringToResourceData (buffer, &data, &cum_len);
2374 pTemp = pTemp->pNext;
2379 sprintf (buffer, "cachedHelp*cachedCount: %d\\n ", cachedCount);
2380 AddStringToResourceData (buffer, &data, &cum_len);
2387 * Save help resources as a string
2389 sprintf (buffer, " \n");
2390 AddStringToResourceData (buffer, &data, &cum_len);
2392 _DtAddToResource (DISPLAY, data);
2396 } /* END OF FUNCTION SaveHelpResources */
2400 /* Code stolen from WmPresence.c */
2402 /*************************************<->*************************************
2405 * ShowHelpDialog (pClient)
2410 * Pops up (shows) the help dialog
2424 ******************************<->***********************************/
2428 ClientData *pClient)
2430 PtrWsDtHelpData pHelp;
2442 pHelp = &pSD->dtHelp;
2444 pOldCD = pHelp->pCDforClient;
2445 pHelp->pCDforClient = pClient;
2446 /* pHelp->contextForClient = wsContext;*/
2448 if (pSD->dtHelp.onScreen)
2450 ClientData *pCD = NULL;
2452 XFindContext (DISPLAY, XtWindow (pSD->dtHelp.shell),
2453 wmGD.windowContextType, (XtPointer) &pCD);
2455 if ((!pSD->dtHelp.bMapped) ||
2457 (!ClientInWorkspace (ACTIVE_WS, pCD) ||
2458 (pCD->clientState == MINIMIZED_STATE) ||
2459 (pOldCD && pOldCD != pHelp->pCDforClient))))
2461 HideHelpDialog (pSD, True);
2469 XtManageChild(pSD->dtHelp.dialog);
2470 XtPopup (pSD->dtHelp.shell, XtGrabNone);
2472 pSD->dtHelp.onScreen = True;
2474 } /* END OF FUNCTION ShowHelpDialog */
2477 /*************************************<->*************************************
2480 * HideHelpDialog (pSD, userDismissed)
2485 * Pops down (hides) the workspace presence dialog
2489 * pSD = pointer to screen data
2490 * userDismissed = did the user dismiss or did workspace switching
2491 * unpost the workspace presence box ?
2501 ******************************<->***********************************/
2506 Boolean userDismissed )
2509 if (pSD->dtHelp.onScreen)
2511 /* Pop down the shell */
2512 XtPopdown (pSD->dtHelp.shell);
2515 * Do a withdraw to make sure window gets unmanaged
2516 * (popdown does nothing if its unmapped)
2518 XWithdrawWindow (DISPLAY, XtWindow (pSD->dtHelp.shell),
2520 /* must sync to insure event order */
2521 XSync (DISPLAY, False);
2524 pSD->dtHelp.onScreen = False;
2525 pSD->dtHelp.userDismissed = userDismissed;
2528 } /* END OF FUNCTION HideHelpDialog */
2531 /*************************************<->*************************************
2533 * wmDtHelpSetPosition (pHelp, pSD, restorePos)
2538 * Sets the position of the workspace presence dialog
2542 * pPres = pointer to workspace presence data
2547 ******************************<->***********************************/
2549 wmDtHelpSetPosition(
2550 PtrWsDtHelpData pHelp,
2560 ClientData *pCDforHelp;
2565 * Get size of this dialog
2568 XtSetArg (args[n], XmNheight, &height); n++;
2569 XtGetValues (pHelp->shell, args, n);
2571 if (wmGD.positionIsFrame)
2573 if (pSD->decoupleTitleAppearance)
2575 font = pSD->clientTitleAppearance.font;
2579 font = pSD->clientAppearance.font;
2582 /* height += TEXT_HEIGHT(font) + (2 * pSD->frameBorderWidth);*/
2583 height += TEXT_HEIGHT(font) + (2 * pSD->resizeBorderWidth);
2588 * set position of dialog relative to client window
2589 * (use system menu position)
2590 * set this dialog to be transient for the client
2591 * for which it is posted.
2593 if (pHelp->pCDforClient)
2595 GetSystemMenuPosition (pHelp->pCDforClient,
2599 if(y < pHelp->pCDforClient->frameInfo.y)
2601 if (!XFindContext (DISPLAY, XtWindow(pHelp->shell),
2602 wmGD.windowContextType,
2603 (caddr_t *)&pCDforHelp))
2605 if (wmGD.positionIsFrame)
2607 /* x = x - pCDforHelp->clientOffset.x;*/
2608 y = y - pCDforHelp->clientOffset.x;
2613 y = y - (2 * pSD->frameBorderWidth);
2621 * Don't have a client so map at 0,0
2634 XtSetArg (args[n], XmNgeometry, NULL); n++;
2635 XtSetArg (args[n], XmNx, x); n++;
2636 XtSetArg (args[n], XmNy, y); n++;
2637 XtSetArg (args[n], XmNtransientFor, NULL); n++;
2639 if (pHelp->pCDforClient)
2645 XtSetArg (al[ac], XmNwindowGroup, &wGroup); ac++;
2646 XtGetValues (pHelp->shell, al, ac);
2649 if (pHelp->contextForClient != F_CONTEXT_ICON)
2651 XtSetArg (args[n], XmNwindowGroup,
2652 pHelp->pCDforClient->client);
2655 else if (pSD->useIconBox && P_ICON_BOX(pHelp->pCDforClient))
2657 XtSetArg (args[n], XmNwindowGroup,
2658 P_ICON_BOX(pHelp->pCDforClient)->pCD_iconBox->client);
2663 XtSetArg (args[n], XmNwindowGroup, 0); n++;
2666 if (wGroup != pHelp->pCDforClient->client)
2669 * Changing who this is transient for, need to
2670 * make sure the window is unmapped so that the
2671 * window manager moves it to the right place.
2673 HideHelpDialog (pSD, True);
2676 XtSetArg (args[n], XmNwindowGroup, pHelp->pCDforClient->client); n++;
2683 HideHelpDialog (pSD, True);
2685 XtSetArg (args[n], XmNwindowGroup, 0); n++;
2688 XtSetArg (args[n], XmNwaitForWm, False); n++;
2690 XtSetValues (pHelp->shell, args, n);
2693 } /* END OF FUNCTION wmDtHelpSetPosition */
2695 /* End of Code stolen from WmPresence.c */
2697 /*************************************<->*************************************
2699 * wmDtHelpMapEventHandler (wHelp, pSD, pEvent)
2704 * An XtEventHandler called on structure notify events on the screen's
2705 * help window. (Only handles map and unmap events)
2709 * wHelp = help widget
2710 * pSD = ptr to screen data
2711 * pEvent = event triggering this call
2716 ******************************<->***********************************/
2718 wmDtHelpMapEventHandler(
2722 Boolean *pBoolean) /* unused */
2724 WmScreenData *pSD = (WmScreenData *) ptr;
2726 switch (pEvent->type)
2729 pSD->dtHelp.bMapped = True;
2733 pSD->dtHelp.bMapped = False;
2737 /* END OF FUNCTION wmDtHelpMapHandler */
2741 /*************************************<->*************************************
2743 * wmDtErrorDialog (pSD, message, title)
2748 * Called to show an error message
2752 * pSD = ptr to screen data
2753 * message = error message to display
2754 * title = title for the error dialog
2759 ******************************<->***********************************/
2769 XmString xmsMessage;
2774 Window wRoot, wChild;
2775 int rootX, rootY, winX, winY;
2777 Dimension dWidth, dHeight;
2780 WmPanelistObject pPanelist;
2781 #endif /* PANELIST */
2784 XmStringCreateLocalized (sMessage);
2786 XmStringCreateLocalized (sTitle);
2788 if (pSD->dtHelp.errorDialog == NULL)
2790 XmString tmpXmString = (XmString)NULL;
2793 XtSetArg (al[ac], XmNmessageString, xmsMessage); ac++;
2794 XtSetArg (al[ac], XmNdialogTitle, xmsTitle); ac++;
2795 #ifndef NO_MESSAGE_CATALOG
2796 XtSetArg (al[ac], XmNokLabelString, wmGD.okLabel); ac++;
2798 tmpXmString = XmStringCreateLocalized ("OK");
2799 XtSetArg (al[ac], XmNokLabelString, tmpXmString); ac++;
2803 if ((wmGD.dtSD == pSD) && pSD->wPanelist)
2805 pPanelist = (WmPanelistObject) pSD->wPanelist;
2806 wParent = O_Shell (pPanelist);
2810 wParent = pSD->screenTopLevelW1;
2813 wParent = pSD->screenTopLevelW1;
2815 pSD->dtHelp.errorDialog =
2816 XmCreateErrorDialog (wParent, "Error Dialog", al, ac);
2819 XmStringFree(tmpXmString);
2821 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2822 XmDIALOG_HELP_BUTTON);
2823 XtUnmanageChild (wTemp);
2825 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2826 XmDIALOG_CANCEL_BUTTON);
2827 XtUnmanageChild (wTemp);
2829 XtAddCallback (pSD->dtHelp.errorDialog, XmNokCallback,
2830 wmDtErrorDialogOkCB, (XtPointer)pSD);
2832 wShell = pSD->dtHelp.errorDialog;
2833 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2835 wShell = XtParent(wShell);
2837 XtAddCallback(wShell, XmNpopupCallback, wmDtErrorDialogPopupCB,
2840 XtRealizeWidget (pSD->dtHelp.errorDialog);
2842 /* remove some WM functions */
2844 XtSetArg (al[ac], XmNmwmFunctions, (MWM_FUNC_ALL|
2845 MWM_FUNC_RESIZE|MWM_FUNC_MINIMIZE|MWM_FUNC_MAXIMIZE));
2847 XtSetValues (wShell, al, ac);
2849 DtWsmRemoveWorkspaceFunctions (DISPLAY, XtWindow(wShell));
2853 /* make sure it's unmanaged */
2854 wmDtErrorDialogHide (pSD);
2856 /* set new message and title */
2858 XtSetArg (al[ac], XmNmessageString, xmsMessage); ac++;
2859 XtSetArg (al[ac], XmNdialogTitle, xmsTitle); ac++;
2860 XtSetValues (pSD->dtHelp.errorDialog, al, ac);
2863 if (pSD->dtHelp.errorDialog)
2865 XtManageChild (pSD->dtHelp.errorDialog);
2866 XtPopup (XtParent(pSD->dtHelp.errorDialog), XtGrabNone);
2869 XmStringFree (xmsMessage);
2870 XmStringFree (xmsTitle);
2872 /* END OF FUNCTION wmDtErrorDialog */
2875 /*************************************<->*************************************
2878 * wmDtErrorDialogHide (pSD)
2887 * pSD = ptr to screen data
2898 *************************************<->***********************************/
2901 wmDtErrorDialogHide( WmScreenData *pSD )
2905 XtPopdown (XtParent(pSD->dtHelp.errorDialog));
2906 XtUnmanageChild (pSD->dtHelp.errorDialog);
2908 * Do a withdraw to make sure window gets unmanaged
2909 * (popdown does nothing if its unmapped)
2911 wShell = pSD->dtHelp.errorDialog;
2912 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2914 wShell = XtParent(wShell);
2917 XWithdrawWindow (DISPLAY, XtWindow (wShell), pSD->screen);
2919 /* must sync to insure event order */
2920 XSync (DISPLAY, False);
2922 } /* END OF FUNCTION wmDtErrorDialogHide */
2925 /*************************************<->*************************************
2928 * wmDtErrorDialogOkCB (w, client_data, call_data)
2950 *************************************<->***********************************/
2953 wmDtErrorDialogOkCB(
2955 XtPointer client_data,
2956 XtPointer call_data )
2958 WmScreenData *pSD = (WmScreenData *) client_data;
2960 wmDtErrorDialogHide (pSD);
2962 } /* END OF FUNCTION wmDtErrorDialogOkCB */
2965 /*************************************<->*************************************
2968 * wmDtErrorDialogPopupCB (w, client_data, call_data)
2990 *************************************<->***********************************/
2993 wmDtErrorDialogPopupCB(
2995 XtPointer client_data,
2996 XtPointer call_data )
2998 WmScreenData *pSD = (WmScreenData *) client_data;
2999 Window wRoot, wChild;
3000 int rootX, rootY, winX, winY;
3002 Dimension dWidth, dHeight;
3007 /* set new position near cursor position */
3008 XQueryPointer (DISPLAY, XtWindow(pSD->screenTopLevelW1),
3009 &wRoot, &wChild, &rootX, &rootY, &winX, &winY, &mask);
3012 XtSetArg (al[ac], XmNwidth, &dWidth); ac++;
3013 XtSetArg (al[ac], XmNheight, &dHeight); ac++;
3014 XtGetValues (w, al, ac);
3016 x = (Position) rootX - (dWidth / 2);
3017 y = (Position) rootY - (dHeight / 2);
3019 if ((x + ((Position) dWidth / 2)) > DisplayWidth (DISPLAY, pSD->screen))
3020 x = DisplayWidth (DISPLAY,pSD->screen) - (dWidth/2) - 1;
3024 if ((y + ((Position) dHeight / 2)) > DisplayHeight (DISPLAY, pSD->screen))
3025 y = DisplayHeight (DISPLAY,pSD->screen) - (dHeight/2) - 1;
3030 XtSetArg (al[ac], XmNx, x); ac++;
3031 XtSetArg (al[ac], XmNy, y); ac++;
3032 XtSetArg (al[ac], XmNwindowGroup,
3033 XtUnspecifiedWindowGroup); ac++;
3034 XtSetArg (al[ac], XmNwaitForWm, False); ac++;
3035 XtSetValues (w, al, ac);
3038 } /* END OF FUNCTION wmDtErrorDialogPopupCB */
3040 /**************************** eof ***************************/