2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
24 * (c) Copyright 1987, 1988, 1989, 1990, 1992, 1993 HEWLETT-PACKARD COMPANY
25 * (c) Copyright 1989, 1990, 1991, 1992 OPEN SOFTWARE FOUNDATION, INC.
40 #include "WmFunction.h"
43 #include "WmResParse.h"
45 #include "WmResNames.h"
46 #include "WmWrkspace.h"
47 #include "DataBaseLoad.h"
51 #include <Xm/MessageB.h>
52 #include <X11/keysymdef.h>
53 #include <X11/keysym.h>
54 #include <X11/Shell.h>
55 #include <Xm/MwmUtil.h>
57 #include <Dt/HelpDialog.h>
58 #include <Dt/HelpQuickD.h>
60 #include <Dt/DtNlUtils.h>
62 #include <X11/cursorfont.h>
65 /****************************************************************
67 * Cache List Info Structure Definition.
69 ****************************************************************/
70 typedef struct _CacheListStruct {
78 struct _CacheListStruct *pNext;
79 struct _CacheListStruct *pPrevious;
82 typedef struct _DisplayTopicInfo {
89 * Function Declarations:
92 /******** Static Function Declarations ********/
93 static int LocateTheControl(
97 static WmScreenData *WmScreenDataFromWidget (
100 static int WmDtReturnSelectedWidget (
104 static void WmDtDisplayTopic (
115 DisplayTopicInfo *displayTopicInfo);
116 static void WmDtCloseHelpCB (
118 XtPointer clientData,
120 static void WmDtWmCloseHelpCB (
122 XtPointer clientData,
124 static void WmDtVersionCloseCB (
126 XtPointer clientData,
128 static void WmDtVersionPopupCB (
130 XtPointer clientData,
133 static void WmDtProcessLinkCB (
135 XtPointer clientData,
137 static Boolean WmDtGetFromCache(
138 CacheListStruct **pCurrentNode,
140 static void ShowHelpDialog(
141 ClientData *pClient);
143 static void HideHelpDialog(
145 Boolean userDismissed );
146 static void wmDtHelpSetPosition(
147 PtrWsDtHelpData pHelp,
150 static void wmDtHelpMapEventHandler (
155 static void wmDtErrorDialog(
159 static void wmDtErrorDialogOkCB(
161 XtPointer client_data,
162 XtPointer call_data );
163 static void wmDtErrorDialogPopupCB(
165 XtPointer client_data,
166 XtPointer call_data );
167 static void wmDtErrorDialogHide(
170 /******** End Static Function Declarations ********/
178 static DisplayTopicInfo displayTopicInfo;
179 static Widget versionWidget = (Widget)NULL;
181 #define PT_IN_CHILD(X, Y, CHILD) \
182 (((X) >= (CHILD)->core.x) && \
183 ((X) <= ((CHILD)->core.x + (Position) (CHILD)->core.width)) && \
184 ((Y) >= (CHILD)->core.y) && \
185 ((Y) <= ((CHILD)->core.y + (Position) (CHILD)->core.height)))
187 #define MAX_WIDGET_PATH 100
190 /**********************************************************************
191 * Function: LocateTheControl()
195 **********************************************************************/
204 CompositeWidget comp_widget;
208 Window target_win = None;
217 Widget widget = NULL;
219 Boolean foundOne = False;
221 WmFpEmbeddedClientData *pECD;
222 WmScreenData *pSD = NULL;
226 /* Make the target cursor */
227 cursor = XCreateFontCursor (wmGD.display, XC_question_arrow);
229 /* Grab the pointer using target cursor, letting it roam all over */
230 status = XGrabPointer (wmGD.display, RootWindow(wmGD.display, screen),
232 ButtonPressMask|ButtonReleaseMask, GrabModeAsync,
233 GrabModeAsync, None, cursor, CurrentTime);
234 if (status != GrabSuccess)
236 Warning (((char *)GETMESSAGE(29, 1,
237 "Help on Item failed. Another program may have grabbed the mouse.")));
238 return(DtHELP_SELECT_ERROR);
242 /* Grab the Keyboard so we can catch the ESC button press */
243 status = XGrabKeyboard(wmGD.display, RootWindow(wmGD.display, screen),
245 GrabModeAsync, GrabModeAsync, CurrentTime);
246 if (status != GrabSuccess)
248 XUngrabPointer (wmGD.display, CurrentTime);
249 Warning (((char *)GETMESSAGE(29, 2,
250 "Help on Item failed. Another program may have grabbed the mouse.")));
251 return(DtHELP_SELECT_ERROR);
254 /* Let the user select a window... */
255 while ((target_win == None) || (buttons != 0))
257 XtAppNextEvent(wmGD.mwmAppContext, &event);
262 if (target_win == None)
264 target_win = event.xbutton.subwindow; /* window selected */
265 if (target_win == None)
266 target_win = RootWindow (wmGD.display, screen);
271 /* there may have been some down before we started */
276 /* Look for ESC key press and stop if we get one */
277 if (event.xkey.state & ShiftMask)
282 keySym = XLookupKeysym((XKeyEvent *)&event, offset);
283 if (keySym == XK_Escape)
285 XUngrabKeyboard (wmGD.display, CurrentTime);
286 XUngrabPointer (wmGD.display, CurrentTime);
287 return(DtHELP_SELECT_ABORT);
291 XtDispatchEvent(&event);
294 XUngrabKeyboard (wmGD.display, CurrentTime); /* Done with keyboard */
295 XUngrabPointer (wmGD.display, CurrentTime); /* Done with pointer */
298 printf("RootWindow (wmGD.display, screen) = %ld\n", RootWindow (wmGD.display, screen));
299 printf("event.xbutton.root = %ld\n", event.xbutton.root);
300 printf("event.xbutton.window = %ld\n", event.xbutton.window);
301 printf("event.xbutton.subwindow = %ld\n", event.xbutton.subwindow);
302 printf("event.xbutton.x = %d\n", event.xbutton.x);
303 printf("event.xbutton.y = %d\n", event.xbutton.y);
304 printf("event.xbutton.x_root = %d\n", event.xbutton.x_root);
305 printf("event.xbutton.y_root = %d\n", event.xbutton.y_root);
306 #endif /* DEBUGGER */
308 if (target_win == RootWindow (wmGD.display, screen))
309 return (DtHELP_SELECT_INVALID);
311 for (scr = 0; scr < wmGD.numScreens; scr++)
313 if (wmGD.Screens[scr].managed &&
314 wmGD.Screens[scr].screen == screen)
316 pSD = (&(wmGD.Screens[scr]));
325 /* check for subwindows */
326 parent = RootWindow (wmGD.display, screen);
327 x = event.xbutton.x_root;
328 y = event.xbutton.y_root;
332 XTranslateCoordinates(wmGD.display, parent, target_win, x, y,
333 &new_x, &new_y, &sub);
342 pECD = (WmFpEmbeddedClientData *) pSD->pECD;
343 for (clientNum = 0; clientNum < pSD->numEmbeddedClients;
347 (target_win == pECD->pCD->client))
349 widget = pECD->wControl;
364 widget = XtWindowToWidget (wmGD.display, target_win);
369 widget = XtWindowToWidget (wmGD.display1, target_win);
373 return (DtHELP_SELECT_INVALID);
377 if (!XtIsComposite (widget))
380 return (DtHELP_SELECT_VALID);
382 comp_widget = (CompositeWidget)widget;
384 /* look for gadgets at this point */
385 for (i = 0; i < comp_widget->composite.num_children; i++)
387 child = comp_widget->composite.children[i];
389 if (PT_IN_CHILD (x, y, child) && XtIsManaged(child))
392 return (DtHELP_SELECT_VALID);
399 return (DtHELP_SELECT_VALID);
402 return (DtHELP_SELECT_INVALID);
404 } /* END OF FUNCTION LocateTheControl */
407 /**********************************************************************
409 * Cache Creek related help functions
411 **********************************************************************/
413 /*************************************<->*************************************
422 *************************************<->***********************************/
424 void WmDtStringHelpCB (Widget theWidget,
425 XtPointer client_data,
429 char * theHelpString = (char *)client_data;
430 Widget theRealWidget = theWidget;
431 if( XmIsGadget(theWidget))
433 theRealWidget = XtParent(theWidget);
435 pSD = WmScreenDataFromWidget(theWidget);
437 /* WmDtDisplayTopic(theRealWidget, NULL, theHelpString, */
438 WmDtDisplayTopic(pSD->screenTopLevelW1, NULL, theHelpString,
439 DtHELP_TYPE_DYNAMIC_STRING, (Widget) NULL, True,
440 NULL, 0, NULL, False, NULL);
444 } /* END OF FUNCTION WmDtStringHelpCB */
447 /*************************************<->*************************************
456 *************************************<->***********************************/
458 void WmDtWmStringHelpCB (Widget theWidget,
459 XtPointer client_data,
463 char * theHelpString = (char *)client_data;
464 pSD = WmScreenDataFromWidget(theWidget);
467 if (XtDisplay(theWidget) == DISPLAY)
469 WmDtDisplayTopic(pSD->screenTopLevelW1,
471 DtHELP_TYPE_STRING, theWidget, True,
472 NULL, 0, NULL, False, NULL);
476 WmDtDisplayTopic(theWidget, NULL, theHelpString,
477 DtHELP_TYPE_STRING, theWidget, True,
478 NULL, 0, NULL, False, NULL);
482 WmDtDisplayTopic(pSD->screenTopLevelW1,
484 DtHELP_TYPE_DYNAMIC_STRING, theWidget, True,
485 NULL, 0, NULL, False, NULL);
488 } /* END OF FUNCTION WmDtWmStringHelpCB */
492 /*************************************<->*************************************
494 * WmDtDisplayTopicHelp
498 * External entry procedure used to display help topics.
500 *************************************<->***********************************/
502 void WmDtDisplayTopicHelp (Widget widget,
506 WmScreenData *pSD = WmScreenDataFromWidget(widget);
508 WmDtDisplayTopic(pSD->screenTopLevelW1,
509 helpVolume, locationID,
510 DtHELP_TYPE_TOPIC, (Widget) NULL, True,
511 NULL, 0, NULL, False, NULL);
514 /*************************************<->*************************************
516 * WmDtDisplayStringHelp
520 * External entry procedure used to display help topics.
522 *************************************<->***********************************/
524 void WmDtDisplayStringHelp (Widget widget,
527 WmScreenData *pSD = WmScreenDataFromWidget(widget);
529 WmDtDisplayTopic(pSD->screenTopLevelW1,
531 DtHELP_TYPE_DYNAMIC_STRING, widget, True,
532 NULL, 0, NULL, False, NULL);
535 /*************************************<->*************************************
542 * for each icon in the icon box
544 *************************************<->***********************************/
546 void WmDtWmTopicHelpCB (Widget theWidget,
547 XtPointer client_data,
552 char *helpVolume = WM_DT_HELP_VOLUME;
553 char *locationID = (char *)client_data;
554 pSD = WmScreenDataFromWidget(theWidget);
556 shellWidget = theWidget;
557 while (!(XtIsSubclass(XtParent(shellWidget), shellWidgetClass)))
559 shellWidget = XtParent(shellWidget);
562 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
564 DtHELP_TYPE_TOPIC, shellWidget, True,
565 NULL, 0, NULL, False, NULL);
567 } /* END OF FUNCTION WmDtWmTopicHelpCB */
569 /****************************************************************************
570 * Function: WmScreenDataFromWidget(
579 ***************************************************************************/
580 static WmScreenData *
581 WmScreenDataFromWidget (Widget theWidget)
584 WmScreenData *pSD = NULL;
587 CacheListStruct *pTemp;
591 for (scr = 0; scr < wmGD.numScreens; scr++)
593 if (wmGD.Screens[scr].managed &&
594 wmGD.Screens[scr].screen ==
595 XScreenNumberOfScreen(XtScreen(theWidget)))
597 pSD = (&(wmGD.Screens[scr]));
612 } /* END OF FUNCTION WmScreenDataFromWidget */
614 /****************************************************************************
615 * Function: WmDtCloseHelpCB(
617 * caddr_t clientData,
622 * Return Value: Void.
624 * Purpose: Process close requests on all Help Dialog widgets
625 * created and managed by this application.
627 ***************************************************************************/
628 static void WmDtCloseHelpCB (
630 XtPointer clientData,
633 WmScreenData *pSD = NULL;
635 Widget helpDialog = (Widget) clientData;
637 CacheListStruct *pTemp;
639 pSD = WmScreenDataFromWidget(w);
640 pTemp = pSD->cachedHelp;
642 /* Search our Cache List for the closed help dialog */
643 while (pTemp && (pTemp->helpDialog != helpDialog))
645 pTemp = pTemp->pNext;
651 /* printf("Didn't find our help dialog widget in the cache list??? /n");*/
654 XtPopdown (XtParent(helpDialog));
656 pTemp->inUseFlag = FALSE;
657 pSD->cachedHelp->hLink = False;
659 /* Re-Assign our pTemp to point to our head so we can see
660 * if we have any in-use help dialog in our list.
662 pTemp = pSD->cachedHelp;
664 } /* END OF FUNCTION WmDtCloseHelpCB */
667 /****************************************************************************
668 * Function: WmDtWmCloseHelpCB(
670 * caddr_t clientData,
675 * Return Value: Void.
677 * Purpose: Process close requests on all Help Dialog widgets
678 * created and managed by this application.
680 ***************************************************************************/
681 static void WmDtWmCloseHelpCB (
683 XtPointer clientData,
687 Widget helpDialog = (Widget) clientData;
688 pSD = WmScreenDataFromWidget(w);
689 HideHelpDialog (pSD, True);
691 } /* END OF FUNCTION WmDtWmCloseHelpCB */
695 /****************************************************************************
696 * Function: WmDtWmPopupHelpCB(
698 * caddr_t clientData,
703 * Return Value: Void.
708 ***************************************************************************/
709 static void WmDtWmPopupHelpCB (
711 XtPointer clientData,
714 PtrWsDtHelpData pHelp;
717 pSD = WmScreenDataFromWidget(w);
719 pHelp = &pSD->dtHelp;
721 if (pSD->dtHelp.restored)
723 /* set position of dialog to restored position */
724 wmDtHelpSetPosition (pHelp, pSD, True);
725 pSD->dtHelp.restored = False;
729 /* set position of dialog relative to client window */
730 wmDtHelpSetPosition (pHelp, pSD, False);
733 } /* END OF FUNCTION WmDtWmPopupHelpCB */
736 /****************************************************************************
737 * Function: WmDtVersionPopupCB(
739 * caddr_t clientData,
744 * Return Value: Void.
749 ***************************************************************************/
750 static void WmDtVersionPopupCB (
752 XtPointer clientData,
757 Dimension width, height;
765 XtSetArg (setArgs[n], XmNx, 0); n++;
766 XtSetArg (setArgs[n], XmNy, 0); n++;
770 * Center the Version Dialog on the screen
774 XtSetArg(getArgs[n], XmNheight, &height); n++;
775 XtSetArg(getArgs[n], XmNwidth, &width); n++;
776 XtGetValues (w, (ArgList) getArgs, n);
779 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) width))/2;
781 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) height))/2;
783 XtSetArg(setArgs[n], XmNx, (XtArgVal) x); n++;
784 XtSetArg(setArgs[n], XmNy, (XtArgVal) y); n++;
785 XtSetValues (w, setArgs, n);
788 } /* END OF FUNCTION WmDtVersionPopupCB */
792 /****************************************************************************
793 * Function: WmDtPopupHelpCB(
795 * caddr_t clientData,
800 * Return Value: Void.
805 ***************************************************************************/
806 static void WmDtPopupHelpCB (
808 XtPointer clientData,
812 Atom * workspace_atoms = NULL;
813 int num_workspaces=0;
815 CacheListStruct *pTemp = (CacheListStruct *)clientData;
820 XtSetArg (args[n], XmNgeometry, NULL); n++;
821 XtSetArg (args[n], XmNwaitForWm, False); n++;
825 if (pTemp->workspaces)
827 char **atom_names = NULL;
830 ptr = DtStrchr (pTemp->workspaces, '*');
831 if (ptr != NULL) *ptr = '\0';
834 (char **) XtRealloc ((char *)atom_names,
835 sizeof(char*) * (num_workspaces + 1));
836 atom_names[num_workspaces] = XtNewString(pTemp->workspaces);
842 pTemp->workspaces = ptr + 1;
844 } while (ptr != NULL);
846 workspace_atoms = (Atom *) XtMalloc(sizeof(Atom) * num_workspaces);
847 XInternAtoms(wmGD.display, atom_names, num_workspaces,
848 True, workspace_atoms);
850 DtWsmSetWorkspacesOccupied (XtDisplay(helpShellW),
851 XtWindow (helpShellW),
855 while (num_workspaces-- > 0)
856 XtFree(atom_names[num_workspaces]);
857 XtFree ((char *) atom_names);
858 XtFree ((char *) workspace_atoms);
861 XtSetArg (args[n], XmNx, pTemp->xPos); n++;
862 XtSetArg (args[n], XmNy, pTemp->yPos); n++;
863 pTemp->restored = False;
864 XtRemoveCallback(helpShellW, XmNpopupCallback,
865 WmDtPopupHelpCB, clientData);
866 XtAddCallback(helpShellW, XmNpopupCallback, WmDtPopupHelpCB, NULL);
870 XtSetArg (args[n], XmNx, 0); n++;
871 XtSetArg (args[n], XmNy, 0); n++;
874 XtSetValues (helpShellW, args, n);
877 } /* END OF FUNCTION WmDtPopupHelpCB */
881 /****************************************************************************
882 * Function: WmDtVersionCloseCB(
884 * caddr_t clientData,
889 * Return Value: Void.
891 * Purpose: Process close requests on all Help Dialog widgets
892 * created and managed by this application.
894 ***************************************************************************/
895 static void WmDtVersionCloseCB (
897 XtPointer clientData,
902 } /* END OF FUNCTION WmDtWmVersionCloseHelpCB */
907 /****************************************************************************
908 * Function: void WmDtProcessLinkCB(
910 * caddr_t clientData,
915 * Return Value: Void.
917 * Purpose: Process JUMP-NEW and APP-LINK hypertext requests in a
918 * given Help Dialog Window.
920 * This is the callback used for the DtNhyperLinkCallback
921 * on each of the help dialog widges created.
923 ****************************************************************************/
924 static void WmDtProcessLinkCB (
926 XtPointer clientData,
930 DtHelpDialogCallbackStruct * hyperData =
931 (DtHelpDialogCallbackStruct *) callData;
933 switch (hyperData->hyperType)
935 case DtHELP_LINK_JUMP_NEW:
936 WmDtDisplayTopic (XtParent(w), hyperData->helpVolume,
937 hyperData->locationId,
938 /* DtHELP_LINK_JUMP_NEW */ DtHELP_TYPE_TOPIC,
940 NULL, 0, NULL, True, NULL);
943 default: /* This catches the application definded link types */
944 if (hyperData->hyperType >= 100)
946 /* The application would put any code here to handle their
947 * Applicaiton-defined-links.
953 /* printf("We some how got a bogus hyptertext link type/n");*/
955 } /* End Switch Statement */
957 } /* END OF FUNCTION WmDtProcessLinkCB */
960 /****************************************************************************
961 * Function: void WmDtHelpOnVersion(
966 * Return Value: Void.
968 * Purpose: Displays a new Cache Creek help topic in a new/cached
969 * help dialog widget.
971 ****************************************************************************/
972 void WmDtHelpOnVersion (
981 Widget printButton = NULL;
982 Widget helpButton = NULL;
983 Widget backButton = NULL;
984 Widget closeButton = NULL;
985 #ifdef NO_MESSAGE_CATALOG
986 XmString label = NULL;
989 if((versionWidget != NULL) &&
990 (XtIsManaged(versionWidget)))
996 if (!(versionWidget))
998 #ifndef NO_MESSAGE_CATALOG
999 XtSetArg (setArgs[n], XmNtitle, wmNLS.defaultVersionTitle); n++;
1001 XtSetArg (setArgs[n], XmNtitle, "About Workspace Manager"); n++;
1005 XtSetArg (setArgs[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
1006 XtSetArg (setArgs[n], DtNlocationId, "_COPYRIGHT"); n++;
1007 XtSetArg (setArgs[n], DtNhelpVolume, WM_DT_HELP_VOLUME); n++;
1009 versionWidget = DtCreateHelpQuickDialog (parent, "VersionDialog",
1012 XtAddCallback(versionWidget, DtNcloseCallback,
1014 (XtPointer) versionWidget);
1016 XtAddCallback(XtParent(versionWidget), XmNpopupCallback,
1017 WmDtVersionPopupCB, NULL);
1019 closeButton = DtHelpQuickDialogGetChild( versionWidget,
1020 DtHELP_QUICK_CLOSE_BUTTON );
1023 #ifndef NO_MESSAGE_CATALOG
1024 XtSetArg (setArgs2[n2], DtNcloseLabelString, wmGD.okLabel); n2++;
1026 XtSetArg (setArgs2[n2], DtNcloseLabelString,
1027 label=XmStringCreateLocalized ("OK")); n2++;
1030 XtSetValues(closeButton, setArgs2, n2);
1031 #ifdef NO_MESSAGE_CATALOG
1032 if(label)XmStringFree(label);
1035 printButton = DtHelpQuickDialogGetChild( versionWidget,
1036 DtHELP_QUICK_PRINT_BUTTON );
1037 helpButton = DtHelpQuickDialogGetChild( versionWidget,
1038 DtHELP_QUICK_HELP_BUTTON );
1039 backButton = DtHelpQuickDialogGetChild( versionWidget,
1040 DtHELP_QUICK_BACK_BUTTON );
1042 XtUnmanageChild(printButton);
1043 XtUnmanageChild(helpButton);
1044 XtUnmanageChild(backButton);
1048 XtSetArg (setArgs[n], DtNlocationId, "_COPYRIGHT"); n++;
1049 XtSetArg (setArgs[n], DtNhelpVolume, WM_DT_HELP_VOLUME); n++;
1050 XtSetValues(versionWidget, setArgs, n);
1052 XtManageChild(versionWidget);
1056 } /* END OF FUNCTION WmDtHelpOnVersion */
1060 /******************************<->*************************************
1062 * Boolean WmDtHelp (String args)
1074 * Return - True if the find a help callback; false otherwise.
1079 ******************************<->***********************************/
1082 WmDtHelp (String args)
1086 WmPanelistObject pPanelist;
1087 char *theHelpVolume = WM_DT_HELP_VOLUME;
1088 char *theHelpTopic = WM_DT_HELP_TOPIC;
1089 unsigned char volume[MAXWMPATH + 1];
1090 unsigned char topic[MAXWMPATH + 1];
1094 /* get right screen data */
1095 /* pSD = WmScreenDataFromWidget(w);*/
1096 pSD = wmGD.pActiveSD;
1099 pPanelist = (WmPanelistObject) pSD->wPanelist;
1101 if ((theWidget = O_Panel(pPanelist)))
1106 * parse args for volume and topic
1108 WmDtGetHelpArgs(args, volume, topic, &argCount);
1111 WmDtDisplayTopic(pSD->screenTopLevelW1,
1114 DtHELP_TYPE_TOPIC, theWidget, True,
1115 NULL, 0, NULL, False, NULL);
1119 WmDtDisplayTopic(pSD->screenTopLevelW1,
1122 DtHELP_TYPE_TOPIC, theWidget, False,
1123 NULL, 0, NULL, False, NULL);
1129 WmDtDisplayTopic(pSD->screenTopLevelW1,
1132 DtHELP_TYPE_TOPIC, theWidget, True,
1133 NULL, 0, NULL, False, NULL);
1141 } /* END OF FUNCTION WmDtHelp */
1144 /******************************<->*************************************
1146 * Boolean WmDtHelpMode (void)
1150 * Invoke item help mode
1158 * Return - True if the find a help callback; false otherwise.
1163 ******************************<->***********************************/
1168 Widget selectedWidget = NULL;
1170 String sTmp, sMessage, sTitle;
1172 iStatus = WmDtReturnSelectedWidget(wmGD.topLevelW, None,
1177 case DtHELP_SELECT_VALID:
1178 if (selectedWidget != (Widget) NULL)
1182 if ((XtHasCallbacks(selectedWidget,
1183 XmNhelpCallback) == XtCallbackHasSome))
1185 XtCallCallbacks(selectedWidget, XmNhelpCallback,
1191 selectedWidget = XtParent(selectedWidget);
1194 while (selectedWidget != NULL);
1198 case DtHELP_SELECT_INVALID:
1199 /* invalid selection error (window not of this process) */
1200 #ifndef NO_MESSAGE_CATALOG
1201 sTmp = (char *)GETMESSAGE(29, 3,
1202 "You must select a Workspace Manager\n\
1203 dialog, an item in the Front Panel,\n\
1204 or an item in a subpanel.");
1205 sMessage = XtNewString (sTmp);
1206 sTmp = (char *)GETMESSAGE(29, 4,
1207 "Workspace Manager - Help On Item Error");
1208 sTitle = XtNewString (sTmp);
1210 sMessage = "You must select a Workspace Manager\n\
1211 dialog, an item in the Front Panel,\n\
1212 or an item in a subpanel.";
1213 sTitle = "Workspace Manager - Help On Item Error";
1215 wmDtErrorDialog (ACTIVE_PSD, sMessage, sTitle);
1216 #ifndef NO_MESSAGE_CATALOG
1217 if (sMessage) XtFree (sMessage);
1218 if (sTitle) XtFree (sTitle);
1222 case DtHELP_SELECT_ERROR:
1223 /* error (like grab failed) */
1226 case DtHELP_SELECT_ABORT:
1227 /* user aborted this selection */
1232 } /* END OF FUNCTION WmDtHelpMode */
1236 /*****************************************************************************
1237 * Function: WmDtReturnSelectedWidget (Widget, Cursor, Widget *)
1239 * Parameters: Widget Specifies a valid widget within the app's
1241 * Cursor Cursor to grab pointer with (use NULL!!)
1242 * Widget * ptr to loc to receive returned widget
1244 * Return Value: DtHELP_SELECT_ERROR - error in getting the widget
1245 * DtHELP_SELECT_ABORT - user aborted
1246 * DtHELP_SELECT_INVALID - user selected invalid window
1247 * DtHELP_SELECT_VALID - valid widget returned
1249 * Purpose: Allows developers to get the widget ID for any widget in their UI
1250 * that the user has selected vai the pointer. This function will
1251 * cause the cursor to change and allow a user to select an item in
1254 *****************************************************************************/
1256 WmDtReturnSelectedWidget(
1266 /* Setup some needed variables */
1267 dpy = XtDisplay(theWidget);
1268 screen = ACTIVE_SCREEN;
1270 /* refresh the display */
1271 XmUpdateDisplay(theWidget);
1273 /* Change the curser to let the user select the desired widget */
1274 iStatus = LocateTheControl(dpy, screen, pWidget);
1278 } /* END OF FUNCTION WmDtReturnSelectedWidget */
1281 /****************************************************************************
1282 * Function: void WmDtDisplayTopic(
1290 * ClientData *pCData,
1291 * Boolean hyperlink,
1292 * DisplayTopicInfo *displayTopicInfo)
1296 * Return Value: Void.
1298 * Purpose: Displays a new Cache Creek help topic in a new/cached
1299 * help dialog widget.
1301 ****************************************************************************/
1314 DisplayTopicInfo *displayTopicInfo)
1326 WmPanelistObject pPanelist;
1327 char * defaultTitle="Help";
1328 ClientData *pCD = NULL;
1329 WmScreenData *pSD = NULL;
1330 CacheListStruct *pCurrentNode = NULL;
1331 Boolean cachedNode = FALSE;
1334 pSD = WmScreenDataFromWidget (parent);
1337 pPanelist = (WmPanelistObject) pSD->wPanelist;
1341 /*argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount + 1)) ;*/
1342 argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount)) ;
1343 memcpy( argsNew, argList, (sizeof( Arg) * argCount)) ;
1346 shellWidget = parent;
1347 while (!(XtIsSubclass(shellWidget, shellWidgetClass)))
1349 shellWidget = XtParent(shellWidget);
1355 case DtHELP_TYPE_TOPIC:
1356 if (helpVolume != NULL)
1358 XtSetArg (setArgs[n],DtNhelpVolume,helpVolume); n++;
1360 XtSetArg (setArgs[n], DtNlocationId,locationId); n++;
1361 helpTitle=locationId;
1364 case DtHELP_TYPE_DYNAMIC_STRING:
1365 XtSetArg (setArgs[n], DtNstringData, locationId); n++;
1366 /* helpTitle=locationId;*/
1367 helpTitle=defaultTitle;
1370 case DtHELP_TYPE_MAN_PAGE:
1373 case DtHELP_TYPE_FILE:
1378 /* error condition, don't try to display help */
1384 XtSetArg (setArgs[n], DtNhelpType, helpType); n++;
1388 if (pSD->dtHelp.shell)
1390 helpWidget = pSD->dtHelp.dialog;
1391 XtSetValues(helpWidget, setArgs, n);
1395 #ifndef NO_MESSAGE_CATALOG
1396 XtSetArg (setArgs[n], XmNtitle,
1397 wmNLS.defaultDtwmHelpTitle); n++;
1399 XtSetArg (setArgs[n], XmNtitle,
1400 "Workspace Manager - Help"); n++;
1403 pSD->dtHelp.dialog =
1404 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1405 helpWidget = pSD->dtHelp.dialog;
1406 pSD->dtHelp.shell = XtParent(helpWidget);
1407 pSD->dtHelp.bMapped = False;
1410 XtSetArg (setArgs[n], XmNname, "wmHelp"); n++;
1413 XtSetValues(pSD->dtHelp.shell,
1417 XtAddCallback(helpWidget,
1418 DtNhyperLinkCallback,
1419 WmDtProcessLinkCB, NULL);
1421 XtAddCallback(helpWidget, DtNcloseCallback,
1423 (XtPointer) helpWidget);
1425 XtAddCallback(pSD->dtHelp.shell, XmNpopupCallback,
1426 WmDtWmPopupHelpCB, NULL);
1428 XtAddEventHandler(pSD->dtHelp.shell,
1429 StructureNotifyMask,
1431 wmDtHelpMapEventHandler,
1437 ShowHelpDialog(pCData);
1443 XFindContext (DISPLAY, XtWindow(XtParent(wmClient)),
1444 wmGD.windowContextType, (caddr_t *)&pCD);
1448 XFindContext (DISPLAY, XtWindow(O_Shell(pPanelist)),
1449 wmGD.windowContextType, (caddr_t *)&pCD);
1451 ShowHelpDialog(pCD);
1456 /* Get a used or new node form our cache if we have one */
1457 cachedNode = WmDtGetFromCache(&pCurrentNode, pSD);
1459 /* If we got a free one from the Cache, use it */
1460 /* Set Values on current free one, then map it */
1463 XtSetValues(pCurrentNode->helpDialog, setArgs, n);
1467 #ifndef NO_MESSAGE_CATALOG
1468 XtSetArg (setArgs[n], XmNtitle,
1469 wmNLS.defaultHelpTitle); n++;
1471 XtSetArg (setArgs[n], XmNtitle,
1472 "Workspace Manager - Help"); n++;
1475 XtSetArg (setArgs[n], XmNgeometry, NULL); n++;
1476 XtSetArg (setArgs[n], XmNx, 0); n++;
1477 XtSetArg (setArgs[n], XmNy, 0); n++;
1479 pCurrentNode->helpDialog =
1480 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1482 XtSetArg (setArgs[n], XmNname, "cachedHelp"); n++;
1485 XtSetValues(shellWidget, argList, argCount);
1488 XtAddCallback(pCurrentNode->helpDialog,
1489 DtNhyperLinkCallback,
1490 WmDtProcessLinkCB, NULL);
1492 XtAddCallback(pCurrentNode->helpDialog, DtNcloseCallback,
1494 (XtPointer) pCurrentNode->helpDialog);
1498 pCurrentNode->hLink = True;
1502 if (displayTopicInfo)
1504 pCurrentNode->workspaces =
1505 displayTopicInfo->workspaces;
1506 pCurrentNode->xPos = displayTopicInfo->xPos;
1507 pCurrentNode->yPos = displayTopicInfo->yPos;
1508 pCurrentNode->restored = True;
1509 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1512 (XtPointer)pCurrentNode);
1516 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1518 WmDtPopupHelpCB, NULL);
1523 helpWidget = pCurrentNode->helpDialog;
1524 XtManageChild(helpWidget);
1525 XtPopup(XtParent(helpWidget), XtGrabNone);
1528 } /* if n is still 0, we did not find a useful help type */
1530 } /* END OF FUNCTION WmDtDisplayTopic */
1533 /****************************************************************************
1534 * Function: static Boolean WmDtGetFromCache(
1535 * CacheListStruct **pCurrentNode)
1540 * Return Value: Void.
1542 * Purpose: Gets a free help node form our cache list. If none are
1543 * free, it will return fallse and the calling routine will
1544 * create a new help dialog widget.
1546 ****************************************************************************/
1547 static Boolean WmDtGetFromCache(
1548 CacheListStruct **pCurrentNode,
1551 CacheListStruct *pTemp;
1553 if (pSD->cachedHelp == NULL)
1555 /* We have a new list so lets create one and pass it back */
1557 (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1559 /* Assign the default values to our node */
1560 pSD->cachedHelp->helpDialog = NULL;
1561 pSD->cachedHelp->inUseFlag = TRUE;
1562 pSD->cachedHelp->restored = False;
1563 pSD->cachedHelp->hLink = False;
1564 pSD->cachedHelp->pNext = NULL;
1565 pSD->cachedHelp->pPrevious = NULL;
1567 /* Return our head pointer because it's our first and only node */
1568 *pCurrentNode = pSD->cachedHelp;
1573 /* We have some nodes so search for a free one first */
1574 pTemp = pSD->cachedHelp;
1576 while (pTemp != NULL)
1578 if (pTemp->inUseFlag == FALSE)
1580 pTemp->inUseFlag = TRUE;
1581 pTemp->hLink = False;
1582 pTemp->restored = False;
1583 *pCurrentNode = pTemp;
1587 pTemp = pTemp->pNext;
1592 * If we did not find a free node then we must add a new one to the
1593 * top of the list, and return it.
1596 pTemp = (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1598 /* Assign the default values to our node */
1599 pTemp->helpDialog = NULL;
1600 pTemp->inUseFlag = TRUE;
1601 pTemp->restored = False;
1602 pTemp->hLink = False;
1603 pTemp->pNext = pSD->cachedHelp;
1604 pTemp->pPrevious = NULL;
1606 pSD->cachedHelp->pPrevious = pTemp;
1608 /* Re-Assign our head pointer to point to the new head of the list */
1609 pSD->cachedHelp = pTemp;
1611 /* Return our head pointer because it's our new node */
1612 *pCurrentNode = pSD->cachedHelp;
1616 } /* END OF FUNCTION WmDtGetFromCache */
1618 /* End of Dt utils */
1621 /*************************************<->*************************************
1624 * RestoreHelpDialogs (pSD)
1629 * Saves the state of the help system
1643 ******************************<->***********************************/
1651 XrmName xrm_name[5];
1652 XrmRepresentation rep_type;
1655 Position xLoc, yLoc;
1656 short columns, rows;
1662 char dialogName[18];
1664 ClientData *pCD = NULL;
1665 char *tTitle = NULL;
1666 char *wsName = NULL;
1667 char *wmClientName = NULL;
1668 char *helpVolume = NULL;
1669 char *locationId = NULL;
1670 char *stringData = NULL;
1671 char *workspaces = NULL;
1676 WmPanelistObject pPanelist = (WmPanelistObject) pSD->wPanelist;
1683 if (pSD->helpResources)
1685 if ((db = XrmGetStringDatabase (pSD->helpResources)) == NULL)
1689 xrm_name [0] = XrmStringToQuark ("wsHelp");
1690 xrm_name [1] = XrmStringToQuark ("onScreen");
1691 xrm_name [2] = NULLQUARK;
1694 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1696 /* Are we supposed to be mapped? */
1697 if (strcmp(value.addr, "True") == 0)
1700 /* get x position */
1701 xrm_name [1] = XrmStringToQuark ("x");
1702 if (XrmQGetResource (db, xrm_name, xrm_name,
1705 pSD->dtHelp.xPos = (Position)atoi((char *)value.addr);
1706 pSD->dtHelp.restored = True;
1709 /* get y position */
1710 xrm_name [1] = XrmStringToQuark ("y");
1711 if (XrmQGetResource (db, xrm_name, xrm_name,
1714 pSD->dtHelp.yPos = (Position)atoi((char *)value.addr);
1715 pSD->dtHelp.restored = True;
1719 xrm_name [1] = XrmStringToQuark ("columns");
1720 if (XrmQGetResource (db, xrm_name, xrm_name,
1723 XtSetArg (setArgs[ac], XmNcolumns,
1724 (short)atoi((char *)value.addr)); ac++;
1725 columns = (short)atoi((char *)value.addr);
1729 xrm_name [1] = XrmStringToQuark ("rows");
1730 if (XrmQGetResource (db, xrm_name, xrm_name,
1733 XtSetArg (setArgs[ac], XmNrows,
1734 (short)atoi((char *)value.addr)); ac++;
1735 rows = (short)atoi((char *)value.addr);
1737 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1739 XtSetArg (setArgs[ac], XmNgeometry,
1740 XtNewString(geometry)); ac++;
1742 /* get visiblePathCount */
1743 xrm_name [1] = XrmStringToQuark ("vPCount");
1744 if (XrmQGetResource (db, xrm_name, xrm_name,
1747 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1748 (int)atoi((char *)value.addr)); ac++;
1751 /* get topicTitle */
1752 xrm_name [1] = XrmStringToQuark ("tTitle");
1753 if (XrmQGetResource (db, xrm_name, xrm_name,
1756 tTitle = XtNewString ((char *)value.addr);
1757 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1761 xrm_name [1] = XrmStringToQuark ("helpType");
1762 if (XrmQGetResource (db, xrm_name, xrm_name,
1765 XtSetArg (setArgs[ac], DtNhelpType,
1766 (int)atoi((char *)value.addr)); ac++;
1767 helpType = (int)atoi((char *)value.addr);
1773 case DtHELP_TYPE_TOPIC:
1774 /* get helpVolume */
1775 xrm_name [1] = XrmStringToQuark ("helpVolume");
1776 if (XrmQGetResource (db, xrm_name, xrm_name,
1779 helpVolume = XtNewString ((char *)value.addr);
1780 /* XtSetArg (setArgs[ac], DtNhelpVolume,
1781 helpVolume); ac++;*/
1783 /* get locationId */
1784 xrm_name [1] = XrmStringToQuark ("locationId");
1785 if (XrmQGetResource (db, xrm_name, xrm_name,
1788 locationId = XtNewString ((char *)value.addr);
1789 /* XtSetArg (setArgs[ac], DtNlocationId,
1790 locationId); ac++;*/
1795 case DtHELP_TYPE_DYNAMIC_STRING:
1797 /* get stringData */
1798 xrm_name [1] = XrmStringToQuark ("stringData");
1799 if (XrmQGetResource (db, xrm_name, xrm_name,
1802 stringData = XtNewString ((char *)value.addr);
1803 /* XtSetArg (setArgs[ac], DtNstringData,
1804 stringData); ac++;*/
1805 locationId = stringData;
1810 case DtHELP_TYPE_MAN_PAGE:
1814 case DtHELP_TYPE_FILE:
1819 /* error condition, don't try to display help */
1823 /* get name of wm client for which wmHelp is transient */
1825 xrm_name [1] = XrmStringToQuark ("windowGroup");
1826 if (XrmQGetResource (db, xrm_name, xrm_name,
1829 wmClientName = ((char *)value.addr);
1830 if ((!strcmp(wmClientName, pSD->iconBoxName)) &&
1833 xrm_name [1] = XrmStringToQuark ("wsName");
1834 if (XrmQGetResource (db, xrm_name, xrm_name,
1837 wsName = (char *)value.addr;
1838 for (wsCnt = 0; wsCnt < pSD->numWorkspaces;
1841 if (!strcmp(pSD->pWS[wsCnt].name, wsName))
1843 pCD=pSD->pWS[wsCnt].pIconBox->pCD_iconBox;
1851 else if(!strcmp(wmClientName, O_PanelName(pPanelist)))
1853 pCD=O_ClientData(pPanelist);
1859 * Map the help dialog
1862 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
1864 helpType, NULL, True,
1865 setArgs, ac, pCD, False, NULL);
1867 }/* if (XrmQGetResource for wsHelp) */
1869 xrm_name [0] = XrmStringToQuark ("cachedHelp");
1870 xrm_name [1] = XrmStringToQuark ("cachedCount");
1871 xrm_name [2] = NULLQUARK;
1874 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1876 /* restore cachedCount number of help dialogs */
1877 cachedCount = (int)atoi((char *)value.addr);
1878 for (cCount=1; cCount < (cachedCount + 1); cCount++)
1880 sprintf (dialogName, "oWsHelp%d", cCount);
1881 xrm_name [0] = XrmStringToQuark (dialogName);
1882 xrm_name [1] = NULLQUARK;
1883 xrm_name [2] = NULLQUARK;
1885 displayTopicInfo.xPos = 0;
1886 displayTopicInfo.xPos = 0;
1887 displayTopicInfo.workspaces = NULL;
1890 /* get x position */
1891 xrm_name [1] = XrmStringToQuark ("x");
1892 if (XrmQGetResource (db, xrm_name, xrm_name,
1895 /* XtSetArg (setArgs[ac], XmNx,
1896 atoi((char *)value.addr)); ac++;*/
1897 xLoc = (Position)atoi((char *)value.addr);
1898 displayTopicInfo.xPos = xLoc;
1901 /* get y position */
1902 xrm_name [1] = XrmStringToQuark ("y");
1903 if (XrmQGetResource (db, xrm_name, xrm_name,
1906 /* XtSetArg (setArgs[ac], XmNy,
1907 atoi((char *)value.addr)); ac++;*/
1908 yLoc = (Position)atoi((char *)value.addr);
1909 displayTopicInfo.yPos = yLoc;
1913 xrm_name [1] = XrmStringToQuark ("columns");
1914 if (XrmQGetResource (db, xrm_name, xrm_name,
1917 XtSetArg (setArgs[ac], XmNcolumns,
1918 (short)atoi((char *)value.addr)); ac++;
1919 columns = (short)atoi((char *)value.addr);
1923 xrm_name [1] = XrmStringToQuark ("rows");
1924 if (XrmQGetResource (db, xrm_name, xrm_name,
1927 XtSetArg (setArgs[ac], XmNrows,
1928 (short)atoi((char *)value.addr)); ac++;
1929 rows = (short)atoi((char *)value.addr);
1931 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1933 XtSetArg (setArgs[ac], XmNgeometry,
1934 XtNewString(geometry)); ac++;
1936 /* get visiblePathCount */
1937 xrm_name [1] = XrmStringToQuark ("vPCount");
1938 if (XrmQGetResource (db, xrm_name, xrm_name,
1941 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1942 (int)atoi((char *)value.addr)); ac++;
1945 /* get topicTitle */
1946 xrm_name [1] = XrmStringToQuark ("tTitle");
1947 if (XrmQGetResource (db, xrm_name, xrm_name,
1950 tTitle = XtNewString ((char *)value.addr);
1951 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1954 /* get workspaces list */
1955 xrm_name [1] = XrmStringToQuark ("workspaces");
1956 if (XrmQGetResource (db, xrm_name, xrm_name,
1959 workspaces = XtNewString ((char *)value.addr);
1960 displayTopicInfo.workspaces = workspaces;
1965 xrm_name [1] = XrmStringToQuark ("helpType");
1966 if (XrmQGetResource (db, xrm_name, xrm_name,
1969 XtSetArg (setArgs[ac], DtNhelpType,
1970 (int)atoi((char *)value.addr)); ac++;
1971 helpType = (int)atoi((char *)value.addr);
1977 case DtHELP_TYPE_TOPIC:
1978 /* get helpVolume */
1979 xrm_name [1] = XrmStringToQuark ("helpVolume");
1980 if (XrmQGetResource (db, xrm_name, xrm_name,
1983 helpVolume = XtNewString ((char *)value.addr);
1985 /* get locationId */
1986 xrm_name [1] = XrmStringToQuark ("locationId");
1987 if (XrmQGetResource (db, xrm_name, xrm_name,
1990 locationId = XtNewString ((char *)value.addr);
1995 case DtHELP_TYPE_DYNAMIC_STRING:
1997 /* get stringData */
1998 xrm_name [1] = XrmStringToQuark ("stringData");
1999 if (XrmQGetResource (db, xrm_name, xrm_name,
2002 stringData = XtNewString ((char *)value.addr);
2003 /* XtSetArg (setArgs[ac], DtNstringData,
2004 stringData); ac++;*/
2005 locationId = stringData;
2010 case DtHELP_TYPE_MAN_PAGE:
2014 case DtHELP_TYPE_FILE:
2019 /* error condition, don't try to display help */
2024 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
2026 helpType, NULL, False,
2027 setArgs, ac, NULL, False,
2030 } /* for all cached help dialogs */
2033 } /* if (XrmQGetResource ) cachedHelp/cachedCount */
2035 XrmDestroyDatabase(db);
2040 } /* END OF FUNCTION RestoreHelpDialogs */
2042 /*************************************<->*************************************
2045 * SaveHelpResources (pSD)
2050 * Saves the state of the help system
2064 ******************************<->***********************************/
2071 PtrWsDtHelpData pHelp;
2072 CacheListStruct *pTemp;
2076 Window wmGroupWindow;
2078 ClientData *pCDforHelp;
2082 WmWorkspaceData *pWS;
2084 Position xLoc, yLoc;
2085 short columns, rows;
2086 unsigned char helpType;
2093 char workspaces[MAXWMPATH+1];
2095 char buffer[MAXWMPATH+1];
2100 char screenName[10];
2101 char dialogName[128];
2102 char resString[MAXWMPATH+1];
2107 pHelp = &pSD->dtHelp;
2109 /* allocate initial data space */
2110 if ((data = (char *) XtMalloc (MAXWMPATH+1)) == NULL)
2113 GETMESSAGE(76,12,"Insufficient memory to save resources")));
2114 Do_Quit_Mwm (False);
2119 /* Get our current resource class */
2123 res_class = WM_RESOURCE_CLASS;
2127 res_class = DT_WM_RESOURCE_CLASS;
2130 sprintf (screenName, "%d", pSD->screen);
2132 sprintf (buffer, "%s*%s*%s: \\n ", res_class, screenName,
2134 AddStringToResourceData (buffer, &data, &cum_len);
2136 if (pHelp->onScreen)
2138 sprintf (dialogName, "wsHelp");
2139 sprintf (buffer, "%s*onScreen: True\\n ", dialogName);
2140 AddStringToResourceData (buffer, &data, &cum_len);
2143 XtSetArg(getArgs[ac], XmNx, &xLoc); ac++;
2144 XtSetArg(getArgs[ac], XmNy, &yLoc); ac++;
2145 XtGetValues(pSD->dtHelp.shell, getArgs, ac);
2146 if (!XFindContext (DISPLAY, XtWindow(pSD->dtHelp.shell),
2147 wmGD.windowContextType, (caddr_t *)&pCDforHelp))
2149 if (wmGD.positionIsFrame)
2151 xLoc = xLoc - pCDforHelp->clientOffset.x;
2152 yLoc = yLoc - pCDforHelp->clientOffset.y;
2157 XtSetArg(getArgs[ac], XmNcolumns, &columns); ac++;
2158 XtSetArg(getArgs[ac], XmNrows, &rows); ac++;
2159 XtSetArg(getArgs[ac], DtNhelpType, &helpType); ac++;
2160 XtSetArg(getArgs[ac], DtNvisiblePathCount, &vPCount); ac++;
2161 XtSetArg(getArgs[ac], DtNtopicTitle, &topicTitle); ac++;
2162 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2164 sprintf (buffer, "%s*x: %d \\n ", dialogName, xLoc);
2165 AddStringToResourceData (buffer, &data, &cum_len);
2166 sprintf (buffer, "%s*y: %d \\n ", dialogName, yLoc);
2167 AddStringToResourceData (buffer, &data, &cum_len);
2168 sprintf (buffer, "%s*columns: %d \\n ", dialogName, columns);
2169 AddStringToResourceData (buffer, &data, &cum_len);
2170 sprintf (buffer, "%s*rows: %d \\n ", dialogName, rows);
2171 AddStringToResourceData (buffer, &data, &cum_len);
2172 sprintf (buffer, "%s*helpType: %d \\n ", dialogName, helpType);
2173 AddStringToResourceData (buffer, &data, &cum_len);
2174 sprintf (buffer, "%s*vPCount: %d \\n ", dialogName, vPCount);
2175 AddStringToResourceData (buffer, &data, &cum_len);
2176 sprintf (buffer, "%s*tTitle: %s\\n ", dialogName, topicTitle);
2177 AddStringToResourceData (buffer, &data, &cum_len);
2182 case DtHELP_TYPE_TOPIC:
2183 XtSetArg (getArgs[ac],DtNhelpVolume, &helpVolume); ac++;
2184 XtSetArg (getArgs[ac], DtNlocationId, &locationId); ac++;
2185 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2186 sprintf (buffer, "%s*helpVolume: %s\\n ", dialogName, helpVolume);
2187 AddStringToResourceData (buffer, &data, &cum_len);
2188 sprintf (buffer, "%s*locationId: %s\\n ", dialogName, locationId);
2189 AddStringToResourceData (buffer, &data, &cum_len);
2193 case DtHELP_TYPE_DYNAMIC_STRING:
2194 XtSetArg (getArgs[ac], DtNstringData, &stringData); ac++;
2195 XtGetValues(pSD->dtHelp.dialog, getArgs, ac);
2196 sprintf (buffer, "%s*stringData: %s\\n ", dialogName, stringData);
2197 AddStringToResourceData (buffer, &data, &cum_len);
2201 case DtHELP_TYPE_MAN_PAGE:
2205 case DtHELP_TYPE_FILE:
2210 /* error condition, don't try to display help */
2215 XtSetArg(getArgs[ac], XmNwindowGroup, &wmGroupWindow); ac++;
2216 XtGetValues(pSD->dtHelp.shell, getArgs, ac);
2218 if (!XFindContext (DISPLAY, wmGroupWindow,
2219 wmGD.windowContextType, (caddr_t *)&pCD))
2221 sprintf (buffer, "%s*windowGroup: %s\\n ", dialogName,
2223 AddStringToResourceData (buffer, &data, &cum_len);
2225 if ((!strcmp(pCD->clientName, pSD->iconBoxName)) &&
2228 wsName = XGetAtomName(DISPLAY,
2229 pCD->pWsList[pCD->currentWsc].wsID);
2230 sprintf (buffer, "%s*wsName: %s\\n ", dialogName,
2232 AddStringToResourceData (buffer, &data, &cum_len);
2239 if (pSD->cachedHelp != NULL)
2242 * We have some nodes so search for
2243 * managed dialogs and save their state
2246 pTemp = pSD->cachedHelp;
2248 while (pTemp != NULL)
2250 if (pTemp->inUseFlag == FALSE)
2252 pTemp = pTemp->pNext;
2257 sprintf (dialogName, "oWsHelp%d",cachedCount);
2260 XtSetArg(getArgs[ac], XmNx, &xLoc); ac++;
2261 XtSetArg(getArgs[ac], XmNy, &yLoc); ac++;
2262 XtGetValues(XtParent(pTemp->helpDialog), getArgs, ac);
2263 if (!XFindContext (DISPLAY,
2264 XtWindow(XtParent(pTemp->helpDialog)),
2265 wmGD.windowContextType,
2266 (caddr_t *)&pCDforHelp))
2268 if (wmGD.positionIsFrame)
2270 xLoc = xLoc - pCDforHelp->clientOffset.x;
2271 yLoc = yLoc - pCDforHelp->clientOffset.y;
2281 XtSetArg(getArgs[ac], XmNcolumns, &columns); ac++;
2282 XtSetArg(getArgs[ac], XmNrows, &rows); ac++;
2283 XtSetArg(getArgs[ac], DtNhelpType, &helpType); ac++;
2284 XtSetArg(getArgs[ac], DtNvisiblePathCount, &vPCount); ac++;
2285 XtSetArg(getArgs[ac], DtNtopicTitle, &topicTitle); ac++;
2286 XtGetValues(pTemp->helpDialog, getArgs, ac);
2288 sprintf (buffer, "%s*x: %d \\n ", dialogName, xLoc);
2289 AddStringToResourceData (buffer, &data, &cum_len);
2290 sprintf (buffer, "%s*y: %d \\n ", dialogName, yLoc);
2291 AddStringToResourceData (buffer, &data, &cum_len);
2292 sprintf (buffer, "%s*columns: %d \\n ", dialogName, columns);
2293 AddStringToResourceData (buffer, &data, &cum_len);
2294 sprintf (buffer, "%s*rows: %d \\n ", dialogName, rows);
2295 AddStringToResourceData (buffer, &data, &cum_len);
2296 sprintf (buffer, "%s*helpType: %d \\n ", dialogName, helpType);
2297 AddStringToResourceData (buffer, &data, &cum_len);
2298 sprintf (buffer, "%s*vPCount: %d \\n ", dialogName, vPCount);
2299 AddStringToResourceData (buffer, &data, &cum_len);
2300 sprintf (buffer, "%s*tTitle: %s\\n ", dialogName, topicTitle);
2301 AddStringToResourceData (buffer, &data, &cum_len);
2306 case DtHELP_TYPE_TOPIC:
2307 XtSetArg (getArgs[ac],DtNhelpVolume, &helpVolume); ac++;
2308 XtSetArg (getArgs[ac], DtNlocationId, &locationId); ac++;
2309 XtGetValues(pTemp->helpDialog, getArgs, ac);
2310 sprintf (buffer, "%s*helpVolume: %s\\n ",
2311 dialogName, helpVolume);
2312 AddStringToResourceData (buffer, &data, &cum_len);
2313 sprintf (buffer, "%s*locationId: %s\\n ",
2314 dialogName, locationId);
2315 AddStringToResourceData (buffer, &data, &cum_len);
2319 case DtHELP_TYPE_DYNAMIC_STRING:
2320 XtSetArg (getArgs[ac], DtNstringData, &stringData); ac++;
2321 XtGetValues(pTemp->helpDialog, getArgs, ac);
2322 sprintf (buffer, "%s*stringData: %s\\n ",
2323 dialogName, stringData);
2324 AddStringToResourceData (buffer, &data, &cum_len);
2328 case DtHELP_TYPE_MAN_PAGE:
2332 case DtHELP_TYPE_FILE:
2337 /* error condition, don't try to display help */
2344 sprintf(workspaces, "%s", "");
2345 for (wsCnt = 0; wsCnt < pSD->numWorkspaces;
2348 wsID = XInternAtom (DISPLAY, pSD->pWS[wsCnt].name,
2350 pWS = GetWorkspaceData (pSD, wsID);
2352 if (ClientInWorkspace (pWS, pCDforHelp))
2356 strcpy(workspaces, pSD->pWS[wsCnt].name);
2361 strcat(workspaces, "*");
2362 strcat(workspaces, pSD->pWS[wsCnt].name);
2367 sprintf (buffer, "%s*workspaces: %s\\n ", dialogName,
2369 AddStringToResourceData (buffer, &data, &cum_len);
2371 pTemp = pTemp->pNext;
2376 sprintf (buffer, "cachedHelp*cachedCount: %d\\n ", cachedCount);
2377 AddStringToResourceData (buffer, &data, &cum_len);
2384 * Save help resources as a string
2386 sprintf (buffer, " \n");
2387 AddStringToResourceData (buffer, &data, &cum_len);
2389 _DtAddToResource (DISPLAY, data);
2393 } /* END OF FUNCTION SaveHelpResources */
2397 /* Code stolen from WmPresence.c */
2399 /*************************************<->*************************************
2402 * ShowHelpDialog (pClient)
2407 * Pops up (shows) the help dialog
2421 ******************************<->***********************************/
2425 ClientData *pClient)
2427 PtrWsDtHelpData pHelp;
2439 pHelp = &pSD->dtHelp;
2441 pOldCD = pHelp->pCDforClient;
2442 pHelp->pCDforClient = pClient;
2443 /* pHelp->contextForClient = wsContext;*/
2445 if (pSD->dtHelp.onScreen)
2447 ClientData *pCD = NULL;
2449 XFindContext (DISPLAY, XtWindow (pSD->dtHelp.shell),
2450 wmGD.windowContextType, (XtPointer) &pCD);
2452 if ((!pSD->dtHelp.bMapped) ||
2454 (!ClientInWorkspace (ACTIVE_WS, pCD) ||
2455 (pCD->clientState == MINIMIZED_STATE) ||
2456 (pOldCD && pOldCD != pHelp->pCDforClient))))
2458 HideHelpDialog (pSD, True);
2466 XtManageChild(pSD->dtHelp.dialog);
2467 XtPopup (pSD->dtHelp.shell, XtGrabNone);
2469 pSD->dtHelp.onScreen = True;
2471 } /* END OF FUNCTION ShowHelpDialog */
2474 /*************************************<->*************************************
2477 * HideHelpDialog (pSD, userDismissed)
2482 * Pops down (hides) the workspace presence dialog
2486 * pSD = pointer to screen data
2487 * userDismissed = did the user dismiss or did workspace switching
2488 * unpost the workspace presence box ?
2498 ******************************<->***********************************/
2503 Boolean userDismissed )
2506 if (pSD->dtHelp.onScreen)
2508 /* Pop down the shell */
2509 XtPopdown (pSD->dtHelp.shell);
2512 * Do a withdraw to make sure window gets unmanaged
2513 * (popdown does nothing if its unmapped)
2515 XWithdrawWindow (DISPLAY, XtWindow (pSD->dtHelp.shell),
2517 /* must sync to insure event order */
2518 XSync (DISPLAY, False);
2521 pSD->dtHelp.onScreen = False;
2522 pSD->dtHelp.userDismissed = userDismissed;
2525 } /* END OF FUNCTION HideHelpDialog */
2528 /*************************************<->*************************************
2530 * wmDtHelpSetPosition (pHelp, pSD, restorePos)
2535 * Sets the position of the workspace presence dialog
2539 * pPres = pointer to workspace presence data
2544 ******************************<->***********************************/
2546 wmDtHelpSetPosition(
2547 PtrWsDtHelpData pHelp,
2555 Window wGroup = None;
2557 ClientData *pCDforHelp;
2562 * Get size of this dialog
2565 XtSetArg (args[n], XmNheight, &height); n++;
2566 XtGetValues (pHelp->shell, args, n);
2568 if (wmGD.positionIsFrame)
2570 if (pSD->decoupleTitleAppearance)
2572 font = pSD->clientTitleAppearance.font;
2576 font = pSD->clientAppearance.font;
2579 /* height += TEXT_HEIGHT(font) + (2 * pSD->frameBorderWidth);*/
2580 height += TEXT_HEIGHT(font) + (2 * pSD->resizeBorderWidth);
2585 * set position of dialog relative to client window
2586 * (use system menu position)
2587 * set this dialog to be transient for the client
2588 * for which it is posted.
2590 if (pHelp->pCDforClient)
2592 GetSystemMenuPosition (pHelp->pCDforClient,
2596 if(y < pHelp->pCDforClient->frameInfo.y)
2598 if (!XFindContext (DISPLAY, XtWindow(pHelp->shell),
2599 wmGD.windowContextType,
2600 (caddr_t *)&pCDforHelp))
2602 if (wmGD.positionIsFrame)
2604 /* x = x - pCDforHelp->clientOffset.x;*/
2605 y = y - pCDforHelp->clientOffset.x;
2610 y = y - (2 * pSD->frameBorderWidth);
2618 * Don't have a client so map at 0,0
2631 XtSetArg (args[n], XmNgeometry, NULL); n++;
2632 XtSetArg (args[n], XmNx, x); n++;
2633 XtSetArg (args[n], XmNy, y); n++;
2634 XtSetArg (args[n], XmNtransientFor, NULL); n++;
2636 if (pHelp->pCDforClient)
2642 XtSetArg (al[ac], XmNwindowGroup, &wGroup); ac++;
2643 XtGetValues (pHelp->shell, al, ac);
2646 if (pHelp->contextForClient != F_CONTEXT_ICON)
2648 XtSetArg (args[n], XmNwindowGroup,
2649 pHelp->pCDforClient->client);
2652 else if (pSD->useIconBox && P_ICON_BOX(pHelp->pCDforClient))
2654 XtSetArg (args[n], XmNwindowGroup,
2655 P_ICON_BOX(pHelp->pCDforClient)->pCD_iconBox->client);
2660 XtSetArg (args[n], XmNwindowGroup, 0); n++;
2663 if (wGroup != pHelp->pCDforClient->client)
2666 * Changing who this is transient for, need to
2667 * make sure the window is unmapped so that the
2668 * window manager moves it to the right place.
2670 HideHelpDialog (pSD, True);
2673 XtSetArg (args[n], XmNwindowGroup, pHelp->pCDforClient->client); n++;
2680 HideHelpDialog (pSD, True);
2682 XtSetArg (args[n], XmNwindowGroup, 0); n++;
2685 XtSetArg (args[n], XmNwaitForWm, False); n++;
2687 XtSetValues (pHelp->shell, args, n);
2690 } /* END OF FUNCTION wmDtHelpSetPosition */
2692 /* End of Code stolen from WmPresence.c */
2694 /*************************************<->*************************************
2696 * wmDtHelpMapEventHandler (wHelp, pSD, pEvent)
2701 * An XtEventHandler called on structure notify events on the screen's
2702 * help window. (Only handles map and unmap events)
2706 * wHelp = help widget
2707 * pSD = ptr to screen data
2708 * pEvent = event triggering this call
2713 ******************************<->***********************************/
2715 wmDtHelpMapEventHandler(
2719 Boolean *pBoolean) /* unused */
2721 WmScreenData *pSD = (WmScreenData *) ptr;
2723 switch (pEvent->type)
2726 pSD->dtHelp.bMapped = True;
2730 pSD->dtHelp.bMapped = False;
2734 /* END OF FUNCTION wmDtHelpMapHandler */
2738 /*************************************<->*************************************
2740 * wmDtErrorDialog (pSD, message, title)
2745 * Called to show an error message
2749 * pSD = ptr to screen data
2750 * message = error message to display
2751 * title = title for the error dialog
2756 ******************************<->***********************************/
2766 XmString xmsMessage;
2771 Window wRoot, wChild;
2772 int rootX, rootY, winX, winY;
2774 Dimension dWidth, dHeight;
2776 WmPanelistObject pPanelist;
2779 XmStringCreateLocalized (sMessage);
2781 XmStringCreateLocalized (sTitle);
2783 if (pSD->dtHelp.errorDialog == NULL)
2785 #ifdef NO_MESSAGE_CATALOG
2786 XmString tmpXmString = (XmString)NULL;
2790 XtSetArg (al[ac], XmNmessageString, xmsMessage); ac++;
2791 XtSetArg (al[ac], XmNdialogTitle, xmsTitle); ac++;
2792 #ifndef NO_MESSAGE_CATALOG
2793 XtSetArg (al[ac], XmNokLabelString, wmGD.okLabel); ac++;
2795 tmpXmString = XmStringCreateLocalized ("OK");
2796 XtSetArg (al[ac], XmNokLabelString, tmpXmString); ac++;
2800 if ((wmGD.dtSD == pSD) && pSD->wPanelist)
2802 pPanelist = (WmPanelistObject) pSD->wPanelist;
2803 wParent = O_Shell (pPanelist);
2807 wParent = pSD->screenTopLevelW1;
2810 wParent = pSD->screenTopLevelW1;
2812 pSD->dtHelp.errorDialog =
2813 XmCreateErrorDialog (wParent, "Error Dialog", al, ac);
2815 #ifdef NO_MESSAGE_CATALOG
2817 XmStringFree(tmpXmString);
2820 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2821 XmDIALOG_HELP_BUTTON);
2822 XtUnmanageChild (wTemp);
2824 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2825 XmDIALOG_CANCEL_BUTTON);
2826 XtUnmanageChild (wTemp);
2828 XtAddCallback (pSD->dtHelp.errorDialog, XmNokCallback,
2829 wmDtErrorDialogOkCB, (XtPointer)pSD);
2831 wShell = pSD->dtHelp.errorDialog;
2832 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2834 wShell = XtParent(wShell);
2836 XtAddCallback(wShell, XmNpopupCallback, wmDtErrorDialogPopupCB,
2839 XtRealizeWidget (pSD->dtHelp.errorDialog);
2841 /* remove some WM functions */
2843 XtSetArg (al[ac], XmNmwmFunctions, (MWM_FUNC_ALL|
2844 MWM_FUNC_RESIZE|MWM_FUNC_MINIMIZE|MWM_FUNC_MAXIMIZE));
2846 XtSetValues (wShell, al, ac);
2848 DtWsmRemoveWorkspaceFunctions (DISPLAY, XtWindow(wShell));
2852 /* make sure it's unmanaged */
2853 wmDtErrorDialogHide (pSD);
2855 /* set new message and title */
2857 XtSetArg (al[ac], XmNmessageString, xmsMessage); ac++;
2858 XtSetArg (al[ac], XmNdialogTitle, xmsTitle); ac++;
2859 XtSetValues (pSD->dtHelp.errorDialog, al, ac);
2862 if (pSD->dtHelp.errorDialog)
2864 XtManageChild (pSD->dtHelp.errorDialog);
2865 XtPopup (XtParent(pSD->dtHelp.errorDialog), XtGrabNone);
2868 XmStringFree (xmsMessage);
2869 XmStringFree (xmsTitle);
2871 /* END OF FUNCTION wmDtErrorDialog */
2874 /*************************************<->*************************************
2877 * wmDtErrorDialogHide (pSD)
2886 * pSD = ptr to screen data
2897 *************************************<->***********************************/
2900 wmDtErrorDialogHide( WmScreenData *pSD )
2904 XtPopdown (XtParent(pSD->dtHelp.errorDialog));
2905 XtUnmanageChild (pSD->dtHelp.errorDialog);
2907 * Do a withdraw to make sure window gets unmanaged
2908 * (popdown does nothing if its unmapped)
2910 wShell = pSD->dtHelp.errorDialog;
2911 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2913 wShell = XtParent(wShell);
2916 XWithdrawWindow (DISPLAY, XtWindow (wShell), pSD->screen);
2918 /* must sync to insure event order */
2919 XSync (DISPLAY, False);
2921 } /* END OF FUNCTION wmDtErrorDialogHide */
2924 /*************************************<->*************************************
2927 * wmDtErrorDialogOkCB (w, client_data, call_data)
2949 *************************************<->***********************************/
2952 wmDtErrorDialogOkCB(
2954 XtPointer client_data,
2955 XtPointer call_data )
2957 WmScreenData *pSD = (WmScreenData *) client_data;
2959 wmDtErrorDialogHide (pSD);
2961 } /* END OF FUNCTION wmDtErrorDialogOkCB */
2964 /*************************************<->*************************************
2967 * wmDtErrorDialogPopupCB (w, client_data, call_data)
2989 *************************************<->***********************************/
2992 wmDtErrorDialogPopupCB(
2994 XtPointer client_data,
2995 XtPointer call_data )
2997 WmScreenData *pSD = (WmScreenData *) client_data;
2998 Window wRoot, wChild;
2999 int rootX, rootY, winX, winY;
3001 Dimension dWidth, dHeight;
3006 /* set new position near cursor position */
3007 XQueryPointer (DISPLAY, XtWindow(pSD->screenTopLevelW1),
3008 &wRoot, &wChild, &rootX, &rootY, &winX, &winY, &mask);
3011 XtSetArg (al[ac], XmNwidth, &dWidth); ac++;
3012 XtSetArg (al[ac], XmNheight, &dHeight); ac++;
3013 XtGetValues (w, al, ac);
3015 x = (Position) rootX - (dWidth / 2);
3016 y = (Position) rootY - (dHeight / 2);
3018 if ((x + ((Position) dWidth / 2)) > DisplayWidth (DISPLAY, pSD->screen))
3019 x = DisplayWidth (DISPLAY,pSD->screen) - (dWidth/2) - 1;
3023 if ((y + ((Position) dHeight / 2)) > DisplayHeight (DISPLAY, pSD->screen))
3024 y = DisplayHeight (DISPLAY,pSD->screen) - (dHeight/2) - 1;
3029 XtSetArg (al[ac], XmNx, x); ac++;
3030 XtSetArg (al[ac], XmNy, y); ac++;
3031 XtSetArg (al[ac], XmNwindowGroup,
3032 XtUnspecifiedWindowGroup); ac++;
3033 XtSetArg (al[ac], XmNwaitForWm, False); ac++;
3034 XtSetValues (w, al, ac);
3037 } /* END OF FUNCTION wmDtErrorDialogPopupCB */
3039 /**************************** eof ***************************/