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[] = ""
51 #include "WmResNames.h"
52 #include "WmWrkspace.h"
53 #include "DataBaseLoad.h"
57 #include <Xm/MessageB.h>
58 #include <X11/keysymdef.h>
59 #include <X11/keysym.h>
60 #include <X11/Shell.h>
61 #include <Xm/MwmUtil.h>
63 #include <Dt/HelpDialog.h>
64 #include <Dt/HelpQuickD.h>
66 #include <Dt/DtNlUtils.h>
68 #include <X11/cursorfont.h>
71 /****************************************************************
73 * Cache List Info Structure Definition.
75 ****************************************************************/
76 typedef struct _CacheListStruct {
84 struct _CacheListStruct *pNext;
85 struct _CacheListStruct *pPrevious;
88 typedef struct _DisplayTopicInfo {
95 * Function Declarations:
98 /******** Static Function Declarations ********/
99 static int LocateTheControl(
103 static WmScreenData *WmScreenDataFromWidget (
106 static int WmDtReturnSelectedWidget (
110 static void WmDtDisplayTopic (
121 DisplayTopicInfo *displayTopicInfo);
122 static void WmDtCloseHelpCB (
124 XtPointer clientData,
126 static void WmDtWmCloseHelpCB (
128 XtPointer clientData,
130 static void WmDtVersionCloseCB (
132 XtPointer clientData,
134 static void WmDtVersionPopupCB (
136 XtPointer clientData,
139 static void WmDtProcessLinkCB (
141 XtPointer clientData,
143 static Boolean WmDtGetFromCache(
144 CacheListStruct **pCurrentNode,
146 static void ShowHelpDialog(
147 ClientData *pClient);
149 static void HideHelpDialog(
151 Boolean userDismissed );
152 static void wmDtHelpSetPosition(
153 PtrWsDtHelpData pHelp,
156 static void wmDtHelpMapEventHandler (
161 static void wmDtErrorDialog(
165 static void wmDtErrorDialogOkCB(
167 XtPointer client_data,
168 XtPointer call_data );
169 static void wmDtErrorDialogPopupCB(
171 XtPointer client_data,
172 XtPointer call_data );
173 static void wmDtErrorDialogHide(
176 /******** End Static Function Declarations ********/
184 static DisplayTopicInfo displayTopicInfo;
185 static Widget versionWidget = (Widget)NULL;
187 #define PT_IN_CHILD(X, Y, CHILD) \
188 (((X) >= (CHILD)->core.x) && \
189 ((X) <= ((CHILD)->core.x + (Position) (CHILD)->core.width)) && \
190 ((Y) >= (CHILD)->core.y) && \
191 ((Y) <= ((CHILD)->core.y + (Position) (CHILD)->core.height)))
193 #define MAX_WIDGET_PATH 100
196 /**********************************************************************
197 * Function: LocateTheControl()
201 **********************************************************************/
210 CompositeWidget comp_widget;
214 Window target_win = None;
223 Widget widget = NULL;
225 Boolean foundOne = False;
227 WmFpEmbeddedClientData *pECD;
228 WmScreenData *pSD = NULL;
232 /* Make the target cursor */
233 cursor = XCreateFontCursor (wmGD.display, XC_question_arrow);
235 /* Grab the pointer using target cursor, letting it roam all over */
236 status = XGrabPointer (wmGD.display, RootWindow(wmGD.display, screen),
238 ButtonPressMask|ButtonReleaseMask, GrabModeAsync,
239 GrabModeAsync, None, cursor, CurrentTime);
240 if (status != GrabSuccess)
242 Warning (((char *)GETMESSAGE(29, 1,
243 "Help on Item failed. Another program may have grabbed the mouse.")));
244 return(DtHELP_SELECT_ERROR);
248 /* Grab the Keyboard so we can catch the ESC button press */
249 status = XGrabKeyboard(wmGD.display, RootWindow(wmGD.display, screen),
251 GrabModeAsync, GrabModeAsync, CurrentTime);
252 if (status != GrabSuccess)
254 XUngrabPointer (wmGD.display, CurrentTime);
255 Warning (((char *)GETMESSAGE(29, 2,
256 "Help on Item failed. Another program may have grabbed the mouse.")));
257 return(DtHELP_SELECT_ERROR);
260 /* Let the user select a window... */
261 while ((target_win == None) || (buttons != 0))
263 XtAppNextEvent(wmGD.mwmAppContext, &event);
268 if (target_win == None)
270 target_win = event.xbutton.subwindow; /* window selected */
271 if (target_win == None)
272 target_win = RootWindow (wmGD.display, screen);
277 /* there may have been some down before we started */
282 /* Look for ESC key press and stop if we get one */
283 if (event.xkey.state & ShiftMask)
288 keySym = XLookupKeysym((XKeyEvent *)&event, offset);
289 if (keySym == XK_Escape)
291 XUngrabKeyboard (wmGD.display, CurrentTime);
292 XUngrabPointer (wmGD.display, CurrentTime);
293 return(DtHELP_SELECT_ABORT);
297 XtDispatchEvent(&event);
300 XUngrabKeyboard (wmGD.display, CurrentTime); /* Done with keyboard */
301 XUngrabPointer (wmGD.display, CurrentTime); /* Done with pointer */
304 printf("RootWindow (wmGD.display, screen) = %ld\n", RootWindow (wmGD.display, screen));
305 printf("event.xbutton.root = %ld\n", event.xbutton.root);
306 printf("event.xbutton.window = %ld\n", event.xbutton.window);
307 printf("event.xbutton.subwindow = %ld\n", event.xbutton.subwindow);
308 printf("event.xbutton.x = %d\n", event.xbutton.x);
309 printf("event.xbutton.y = %d\n", event.xbutton.y);
310 printf("event.xbutton.x_root = %d\n", event.xbutton.x_root);
311 printf("event.xbutton.y_root = %d\n", event.xbutton.y_root);
312 #endif /* DEBUGGER */
314 if (target_win == RootWindow (wmGD.display, screen))
315 return (DtHELP_SELECT_INVALID);
317 for (scr = 0; scr < wmGD.numScreens; scr++)
319 if (wmGD.Screens[scr].managed &&
320 wmGD.Screens[scr].screen == screen)
322 pSD = (&(wmGD.Screens[scr]));
331 /* check for subwindows */
332 parent = RootWindow (wmGD.display, screen);
333 x = event.xbutton.x_root;
334 y = event.xbutton.y_root;
338 XTranslateCoordinates(wmGD.display, parent, target_win, x, y,
339 &new_x, &new_y, &sub);
348 pECD = (WmFpEmbeddedClientData *) pSD->pECD;
349 for (clientNum = 0; clientNum < pSD->numEmbeddedClients;
353 (target_win == pECD->pCD->client))
355 widget = pECD->wControl;
370 widget = XtWindowToWidget (wmGD.display, target_win);
375 widget = XtWindowToWidget (wmGD.display1, target_win);
379 return (DtHELP_SELECT_INVALID);
383 if (!XtIsComposite (widget))
386 return (DtHELP_SELECT_VALID);
388 comp_widget = (CompositeWidget)widget;
390 /* look for gadgets at this point */
391 for (i = 0; i < comp_widget->composite.num_children; i++)
393 child = comp_widget->composite.children[i];
395 if (PT_IN_CHILD (x, y, child) && XtIsManaged(child))
398 return (DtHELP_SELECT_VALID);
405 return (DtHELP_SELECT_VALID);
408 return (DtHELP_SELECT_INVALID);
410 } /* END OF FUNCTION LocateTheControl */
413 /**********************************************************************
415 * Cache Creek related help functions
417 **********************************************************************/
419 /*************************************<->*************************************
428 *************************************<->***********************************/
430 void WmDtStringHelpCB (Widget theWidget,
431 XtPointer client_data,
435 char * theHelpString = (char *)client_data;
436 Widget theRealWidget = theWidget;
437 if( XmIsGadget(theWidget))
439 theRealWidget = XtParent(theWidget);
441 pSD = WmScreenDataFromWidget(theWidget);
443 /* WmDtDisplayTopic(theRealWidget, NULL, theHelpString, */
444 WmDtDisplayTopic(pSD->screenTopLevelW1, NULL, theHelpString,
445 DtHELP_TYPE_DYNAMIC_STRING, (Widget) NULL, True,
446 NULL, 0, NULL, False, NULL);
450 } /* END OF FUNCTION WmDtStringHelpCB */
453 /*************************************<->*************************************
462 *************************************<->***********************************/
464 void WmDtWmStringHelpCB (Widget theWidget,
465 XtPointer client_data,
469 char * theHelpString = (char *)client_data;
470 pSD = WmScreenDataFromWidget(theWidget);
473 if (XtDisplay(theWidget) == DISPLAY)
475 WmDtDisplayTopic(pSD->screenTopLevelW1,
477 DtHELP_TYPE_STRING, theWidget, True,
478 NULL, 0, NULL, False, NULL);
482 WmDtDisplayTopic(theWidget, NULL, theHelpString,
483 DtHELP_TYPE_STRING, theWidget, True,
484 NULL, 0, NULL, False, NULL);
488 WmDtDisplayTopic(pSD->screenTopLevelW1,
490 DtHELP_TYPE_DYNAMIC_STRING, theWidget, True,
491 NULL, 0, NULL, False, NULL);
494 } /* END OF FUNCTION WmDtWmStringHelpCB */
498 /*************************************<->*************************************
500 * WmDtDisplayTopicHelp
504 * External entry procedure used to display help topics.
506 *************************************<->***********************************/
508 void WmDtDisplayTopicHelp (Widget widget,
512 WmScreenData *pSD = WmScreenDataFromWidget(widget);
514 WmDtDisplayTopic(pSD->screenTopLevelW1,
515 helpVolume, locationID,
516 DtHELP_TYPE_TOPIC, (Widget) NULL, True,
517 NULL, 0, NULL, False, NULL);
520 /*************************************<->*************************************
522 * WmDtDisplayStringHelp
526 * External entry procedure used to display help topics.
528 *************************************<->***********************************/
530 void WmDtDisplayStringHelp (Widget widget,
533 WmScreenData *pSD = WmScreenDataFromWidget(widget);
535 WmDtDisplayTopic(pSD->screenTopLevelW1,
537 DtHELP_TYPE_DYNAMIC_STRING, widget, True,
538 NULL, 0, NULL, False, NULL);
541 /*************************************<->*************************************
548 * for each icon in the icon box
550 *************************************<->***********************************/
552 void WmDtWmTopicHelpCB (Widget theWidget,
553 XtPointer client_data,
558 char *helpVolume = WM_DT_HELP_VOLUME;
559 char *locationID = (char *)client_data;
560 pSD = WmScreenDataFromWidget(theWidget);
562 shellWidget = theWidget;
563 while (!(XtIsSubclass(XtParent(shellWidget), shellWidgetClass)))
565 shellWidget = XtParent(shellWidget);
568 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
570 DtHELP_TYPE_TOPIC, shellWidget, True,
571 NULL, 0, NULL, False, NULL);
573 } /* END OF FUNCTION WmDtWmTopicHelpCB */
575 /****************************************************************************
576 * Function: WmScreenDataFromWidget(
585 ***************************************************************************/
586 static WmScreenData *
587 WmScreenDataFromWidget (Widget theWidget)
590 WmScreenData *pSD = NULL;
593 CacheListStruct *pTemp;
597 for (scr = 0; scr < wmGD.numScreens; scr++)
599 if (wmGD.Screens[scr].managed &&
600 wmGD.Screens[scr].screen ==
601 XScreenNumberOfScreen(XtScreen(theWidget)))
603 pSD = (&(wmGD.Screens[scr]));
618 } /* END OF FUNCTION WmScreenDataFromWidget */
620 /****************************************************************************
621 * Function: WmDtCloseHelpCB(
623 * caddr_t clientData,
628 * Return Value: Void.
630 * Purpose: Process close requests on all Help Dialog widgets
631 * created and managed by this application.
633 ***************************************************************************/
634 static void WmDtCloseHelpCB (
636 XtPointer clientData,
639 WmScreenData *pSD = NULL;
641 Widget helpDialog = (Widget) clientData;
643 CacheListStruct *pTemp;
645 pSD = WmScreenDataFromWidget(w);
646 pTemp = pSD->cachedHelp;
648 /* Search our Cache List for the closed help dialog */
649 while ((pTemp->helpDialog != helpDialog) && (pTemp != NULL))
651 pTemp = pTemp->pNext;
657 /* printf("Didn't find our help dialog widget in the cache list??? /n");*/
660 XtPopdown (XtParent(helpDialog));
662 pTemp->inUseFlag = FALSE;
663 pSD->cachedHelp->hLink = False;
665 /* Re-Assign our pTemp to point to our head so we can see
666 * if we have any in-use help dialog in our list.
668 pTemp = pSD->cachedHelp;
670 } /* END OF FUNCTION WmDtCloseHelpCB */
673 /****************************************************************************
674 * Function: WmDtWmCloseHelpCB(
676 * caddr_t clientData,
681 * Return Value: Void.
683 * Purpose: Process close requests on all Help Dialog widgets
684 * created and managed by this application.
686 ***************************************************************************/
687 static void WmDtWmCloseHelpCB (
689 XtPointer clientData,
693 Widget helpDialog = (Widget) clientData;
694 pSD = WmScreenDataFromWidget(w);
695 HideHelpDialog (pSD, True);
697 } /* END OF FUNCTION WmDtWmCloseHelpCB */
701 /****************************************************************************
702 * Function: WmDtWmPopupHelpCB(
704 * caddr_t clientData,
709 * Return Value: Void.
714 ***************************************************************************/
715 static void WmDtWmPopupHelpCB (
717 XtPointer clientData,
720 PtrWsDtHelpData pHelp;
723 pSD = WmScreenDataFromWidget(w);
725 pHelp = &pSD->dtHelp;
727 if (pSD->dtHelp.restored)
729 /* set position of dialog to restored position */
730 wmDtHelpSetPosition (pHelp, pSD, True);
731 pSD->dtHelp.restored = False;
735 /* set position of dialog relative to client window */
736 wmDtHelpSetPosition (pHelp, pSD, False);
739 } /* END OF FUNCTION WmDtWmPopupHelpCB */
742 /****************************************************************************
743 * Function: WmDtVersionPopupCB(
745 * caddr_t clientData,
750 * Return Value: Void.
755 ***************************************************************************/
756 static void WmDtVersionPopupCB (
758 XtPointer clientData,
763 Dimension width, height;
771 XtSetArg (setArgs[n], XmNx, 0); n++;
772 XtSetArg (setArgs[n], XmNy, 0); n++;
776 * Center the Version Dialog on the screen
780 XtSetArg(getArgs[n], XmNheight, &height); n++;
781 XtSetArg(getArgs[n], XmNwidth, &width); n++;
782 XtGetValues (w, (ArgList) getArgs, n);
785 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) width))/2;
787 (DISPLAY, XScreenNumberOfScreen(XtScreen(w))) - ((int) height))/2;
789 XtSetArg(setArgs[n], XmNx, (XtArgVal) x); n++;
790 XtSetArg(setArgs[n], XmNy, (XtArgVal) y); n++;
791 XtSetValues (w, setArgs, n);
794 } /* END OF FUNCTION WmDtVersionPopupCB */
798 /****************************************************************************
799 * Function: WmDtPopupHelpCB(
801 * caddr_t clientData,
806 * Return Value: Void.
811 ***************************************************************************/
812 static void WmDtPopupHelpCB (
814 XtPointer clientData,
818 Atom * workspace_atoms = NULL;
819 int num_workspaces=0;
821 CacheListStruct *pTemp = (CacheListStruct *)clientData;
826 XtSetArg (args[n], XmNgeometry, NULL); n++;
827 XtSetArg (args[n], XmNwaitForWm, False); n++;
831 if (pTemp->workspaces)
833 char **atom_names = NULL;
836 ptr = DtStrchr (pTemp->workspaces, '*');
837 if (ptr != NULL) *ptr = NULL;
840 (char **) XtRealloc ((char *)atom_names,
841 sizeof(char*) * (num_workspaces + 1));
842 atom_names[num_workspaces] = XtNewString(pTemp->workspaces);
848 pTemp->workspaces = ptr + 1;
850 } while (ptr != NULL);
852 workspace_atoms = (Atom *) XtMalloc(sizeof(Atom) * num_workspaces);
853 XInternAtoms(wmGD.display, atom_names, num_workspaces,
854 True, workspace_atoms);
856 DtWsmSetWorkspacesOccupied (XtDisplay(helpShellW),
857 XtWindow (helpShellW),
861 while (num_workspaces-- > 0)
862 XtFree(atom_names[num_workspaces]);
863 XtFree ((char *) atom_names);
864 XtFree ((char *) workspace_atoms);
867 XtSetArg (args[n], XmNx, pTemp->xPos); n++;
868 XtSetArg (args[n], XmNy, pTemp->yPos); n++;
869 pTemp->restored = False;
870 XtRemoveCallback(helpShellW, XmNpopupCallback,
871 WmDtPopupHelpCB, clientData);
872 XtAddCallback(helpShellW, XmNpopupCallback, WmDtPopupHelpCB, NULL);
876 XtSetArg (args[n], XmNx, 0); n++;
877 XtSetArg (args[n], XmNy, 0); n++;
880 XtSetValues (helpShellW, args, n);
883 } /* END OF FUNCTION WmDtPopupHelpCB */
887 /****************************************************************************
888 * Function: WmDtVersionCloseCB(
890 * caddr_t clientData,
895 * Return Value: Void.
897 * Purpose: Process close requests on all Help Dialog widgets
898 * created and managed by this application.
900 ***************************************************************************/
901 static void WmDtVersionCloseCB (
903 XtPointer clientData,
908 } /* END OF FUNCTION WmDtWmVersionCloseHelpCB */
913 /****************************************************************************
914 * Function: void WmDtProcessLinkCB(
916 * caddr_t clientData,
921 * Return Value: Void.
923 * Purpose: Process JUMP-NEW and APP-LINK hypertext requests in a
924 * given Help Dialog Window.
926 * This is the callback used for the DtNhyperLinkCallback
927 * on each of the help dialog widges created.
929 ****************************************************************************/
930 static void WmDtProcessLinkCB (
932 XtPointer clientData,
936 DtHelpDialogCallbackStruct * hyperData =
937 (DtHelpDialogCallbackStruct *) callData;
939 switch (hyperData->hyperType)
941 case DtHELP_LINK_JUMP_NEW:
942 WmDtDisplayTopic (XtParent(w), hyperData->helpVolume,
943 hyperData->locationId,
944 /* DtHELP_LINK_JUMP_NEW */ DtHELP_TYPE_TOPIC,
946 NULL, 0, NULL, True, NULL);
949 default: /* This catches the application definded link types */
950 if (hyperData->hyperType >= 100)
952 /* The application would put any code here to handle their
953 * Applicaiton-defined-links.
959 /* printf("We some how got a bogus hyptertext link type/n");*/
961 } /* End Switch Statement */
963 } /* END OF FUNCTION WmDtProcessLinkCB */
966 /****************************************************************************
967 * Function: void WmDtHelpOnVersion(
972 * Return Value: Void.
974 * Purpose: Displays a new Cache Creek help topic in a new/cached
975 * help dialog widget.
977 ****************************************************************************/
978 void WmDtHelpOnVersion (
987 Widget printButton = NULL;
988 Widget helpButton = NULL;
989 Widget backButton = NULL;
990 Widget closeButton = NULL;
991 XmString label = NULL;
993 if((versionWidget != NULL) &&
994 (XtIsManaged(versionWidget)))
1000 if (!(versionWidget))
1002 #ifndef NO_MESSAGE_CATALOG
1003 XtSetArg (setArgs[n], XmNtitle, wmNLS.defaultVersionTitle); n++;
1005 XtSetArg (setArgs[n], XmNtitle, "About Workspace Manager"); n++;
1009 XtSetArg (setArgs[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
1010 XtSetArg (setArgs[n], DtNlocationId, "_COPYRIGHT"); n++;
1011 XtSetArg (setArgs[n], DtNhelpVolume, WM_DT_HELP_VOLUME); n++;
1013 versionWidget = DtCreateHelpQuickDialog (parent, "VersionDialog",
1016 XtAddCallback(versionWidget, DtNcloseCallback,
1018 (XtPointer) versionWidget);
1020 XtAddCallback(XtParent(versionWidget), XmNpopupCallback,
1021 WmDtVersionPopupCB, NULL);
1023 closeButton = DtHelpQuickDialogGetChild( versionWidget,
1024 DtHELP_QUICK_CLOSE_BUTTON );
1027 #ifndef NO_MESSAGE_CATALOG
1028 XtSetArg (setArgs2[n2], DtNcloseLabelString, wmGD.okLabel); n2++;
1030 XtSetArg (setArgs2[n2], DtNcloseLabelString,
1031 label=XmStringCreateLocalized ("OK")); n2++;
1034 XtSetValues(closeButton, setArgs2, n2);
1035 if(label)XmStringFree(label);
1037 printButton = DtHelpQuickDialogGetChild( versionWidget,
1038 DtHELP_QUICK_PRINT_BUTTON );
1039 helpButton = DtHelpQuickDialogGetChild( versionWidget,
1040 DtHELP_QUICK_HELP_BUTTON );
1041 backButton = DtHelpQuickDialogGetChild( versionWidget,
1042 DtHELP_QUICK_BACK_BUTTON );
1044 XtUnmanageChild(printButton);
1045 XtUnmanageChild(helpButton);
1046 XtUnmanageChild(backButton);
1050 XtSetArg (setArgs[n], DtNlocationId, "_COPYRIGHT"); n++;
1051 XtSetArg (setArgs[n], DtNhelpVolume, WM_DT_HELP_VOLUME); n++;
1052 XtSetValues(versionWidget, setArgs, n);
1054 XtManageChild(versionWidget);
1058 } /* END OF FUNCTION WmDtHelpOnVersion */
1062 /******************************<->*************************************
1064 * Boolean WmDtHelp (String args)
1076 * Return - True if the find a help callback; false otherwise.
1081 ******************************<->***********************************/
1084 WmDtHelp (String args)
1088 WmPanelistObject pPanelist;
1089 char *theHelpVolume = WM_DT_HELP_VOLUME;
1090 char *theHelpTopic = WM_DT_HELP_TOPIC;
1091 char volume[MAXWMPATH + 1];
1092 char topic[MAXWMPATH + 1];
1096 /* get right screen data */
1097 /* pSD = WmScreenDataFromWidget(w);*/
1098 pSD = wmGD.pActiveSD;
1101 pPanelist = (WmPanelistObject) pSD->wPanelist;
1103 if (theWidget = O_Panel(pPanelist))
1108 * parse args for volume and topic
1110 WmDtGetHelpArgs((unsigned char*)args, &volume, &topic, &argCount);
1113 WmDtDisplayTopic(pSD->screenTopLevelW1,
1116 DtHELP_TYPE_TOPIC, theWidget, True,
1117 NULL, 0, NULL, False, NULL);
1121 WmDtDisplayTopic(pSD->screenTopLevelW1,
1124 DtHELP_TYPE_TOPIC, theWidget, False,
1125 NULL, 0, NULL, False, NULL);
1131 WmDtDisplayTopic(pSD->screenTopLevelW1,
1134 DtHELP_TYPE_TOPIC, theWidget, True,
1135 NULL, 0, NULL, False, NULL);
1143 } /* END OF FUNCTION WmDtHelp */
1146 /******************************<->*************************************
1148 * Boolean WmDtHelpMode (void)
1152 * Invoke item help mode
1160 * Return - True if the find a help callback; false otherwise.
1165 ******************************<->***********************************/
1170 Widget selectedWidget = NULL;
1172 String sTmp, sMessage, sTitle;
1174 iStatus = WmDtReturnSelectedWidget(wmGD.topLevelW, NULL,
1179 case DtHELP_SELECT_VALID:
1180 if (selectedWidget != (Widget) NULL)
1184 if ((XtHasCallbacks(selectedWidget,
1185 XmNhelpCallback) == XtCallbackHasSome))
1187 XtCallCallbacks(selectedWidget, XmNhelpCallback,
1193 selectedWidget = XtParent(selectedWidget);
1196 while (selectedWidget != NULL);
1200 case DtHELP_SELECT_INVALID:
1201 /* invalid selection error (window not of this process) */
1202 #ifndef NO_MESSAGE_CATALOG
1203 sTmp = (char *)GETMESSAGE(29, 3,
1204 "You must select a Workspace Manager\n\
1205 dialog, an item in the Front Panel,\n\
1206 or an item in a subpanel.");
1207 sMessage = XtNewString (sTmp);
1208 sTmp = (char *)GETMESSAGE(29, 4,
1209 "Workspace Manager - Help On Item Error");
1210 sTitle = XtNewString (sTmp);
1212 sMessage = "You must select a Workspace Manager\n\
1213 dialog, an item in the Front Panel,\n\
1214 or an item in a subpanel.";
1215 sTitle = "Workspace Manager - Help On Item Error";
1217 wmDtErrorDialog (ACTIVE_PSD, sMessage, sTitle);
1218 #ifndef NO_MESSAGE_CATALOG
1219 if (sMessage) XtFree (sMessage);
1220 if (sTitle) XtFree (sTitle);
1224 case DtHELP_SELECT_ERROR:
1225 /* error (like grab failed) */
1228 case DtHELP_SELECT_ABORT:
1229 /* user aborted this selection */
1234 } /* END OF FUNCTION WmDtHelpMode */
1238 /*****************************************************************************
1239 * Function: WmDtReturnSelectedWidget (Widget, Cursor, Widget *)
1241 * Parameters: Widget Specifies a valid widget within the app's
1243 * Cursor Cursor to grab pointer with (use NULL!!)
1244 * Widget * ptr to loc to receive returned widget
1246 * Return Value: DtHELP_SELECT_ERROR - error in getting the widget
1247 * DtHELP_SELECT_ABORT - user aborted
1248 * DtHELP_SELECT_INVALID - user selected invalid window
1249 * DtHELP_SELECT_VALID - valid widget returned
1251 * Purpose: Allows developers to get the widget ID for any widget in their UI
1252 * that the user has selected vai the pointer. This function will
1253 * cause the cursor to change and allow a user to select an item in
1256 *****************************************************************************/
1258 WmDtReturnSelectedWidget(
1268 /* Setup some needed variables */
1269 dpy = XtDisplay(theWidget);
1270 screen = ACTIVE_SCREEN;
1272 /* refresh the display */
1273 XmUpdateDisplay(theWidget);
1275 /* Change the curser to let the user select the desired widget */
1276 iStatus = LocateTheControl(dpy, screen, pWidget);
1280 } /* END OF FUNCTION WmDtReturnSelectedWidget */
1283 /****************************************************************************
1284 * Function: void WmDtDisplayTopic(
1292 * ClientData *pCData,
1293 * Boolean hyperlink,
1294 * DisplayTopicInfo *displayTopicInfo)
1298 * Return Value: Void.
1300 * Purpose: Displays a new Cache Creek help topic in a new/cached
1301 * help dialog widget.
1303 ****************************************************************************/
1316 DisplayTopicInfo *displayTopicInfo)
1328 WmPanelistObject pPanelist;
1329 char * defaultTitle="Help";
1330 ClientData *pCD = NULL;
1331 WmScreenData *pSD = NULL;
1332 CacheListStruct *pCurrentNode = NULL;
1333 Boolean cachedNode = FALSE;
1336 pSD = WmScreenDataFromWidget (parent);
1339 pPanelist = (WmPanelistObject) pSD->wPanelist;
1343 /*argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount + 1)) ;*/
1344 argsNew = (ArgList) XtMalloc( sizeof( Arg) * (argCount)) ;
1345 memcpy( argsNew, argList, (sizeof( Arg) * argCount)) ;
1348 shellWidget = parent;
1349 while (!(XtIsSubclass(shellWidget, shellWidgetClass)))
1351 shellWidget = XtParent(shellWidget);
1357 case DtHELP_TYPE_TOPIC:
1358 if (helpVolume != NULL)
1360 XtSetArg (setArgs[n],DtNhelpVolume,helpVolume); n++;
1362 XtSetArg (setArgs[n], DtNlocationId,locationId); n++;
1363 helpTitle=locationId;
1366 case DtHELP_TYPE_DYNAMIC_STRING:
1367 XtSetArg (setArgs[n], DtNstringData, locationId); n++;
1368 /* helpTitle=locationId;*/
1369 helpTitle=defaultTitle;
1372 case DtHELP_TYPE_MAN_PAGE:
1375 case DtHELP_TYPE_FILE:
1380 /* error condition, don't try to display help */
1386 XtSetArg (setArgs[n], DtNhelpType, helpType); n++;
1390 if (pSD->dtHelp.shell)
1392 helpWidget = pSD->dtHelp.dialog;
1393 XtSetValues(helpWidget, setArgs, n);
1397 #ifndef NO_MESSAGE_CATALOG
1398 XtSetArg (setArgs[n], XmNtitle,
1399 wmNLS.defaultDtwmHelpTitle); n++;
1401 XtSetArg (setArgs[n], XmNtitle,
1402 "Workspace Manager - Help"); n++;
1405 pSD->dtHelp.dialog =
1406 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1407 helpWidget = pSD->dtHelp.dialog;
1408 pSD->dtHelp.shell = XtParent(helpWidget);
1409 pSD->dtHelp.bMapped = False;
1412 XtSetArg (setArgs[n], XmNname, "wmHelp"); n++;
1415 XtSetValues(pSD->dtHelp.shell,
1419 XtAddCallback(helpWidget,
1420 DtNhyperLinkCallback,
1421 WmDtProcessLinkCB, NULL);
1423 XtAddCallback(helpWidget, DtNcloseCallback,
1425 (XtPointer) helpWidget);
1427 XtAddCallback(pSD->dtHelp.shell, XmNpopupCallback,
1428 WmDtWmPopupHelpCB, NULL);
1430 XtAddEventHandler(pSD->dtHelp.shell,
1431 StructureNotifyMask,
1433 wmDtHelpMapEventHandler,
1439 ShowHelpDialog(pCData);
1445 XFindContext (DISPLAY, XtWindow(XtParent(wmClient)),
1446 wmGD.windowContextType, (caddr_t *)&pCD);
1450 XFindContext (DISPLAY, XtWindow(O_Shell(pPanelist)),
1451 wmGD.windowContextType, (caddr_t *)&pCD);
1453 ShowHelpDialog(pCD);
1458 /* Get a used or new node form our cache if we have one */
1459 cachedNode = WmDtGetFromCache(&pCurrentNode, pSD);
1461 /* If we got a free one from the Cache, use it */
1462 /* Set Values on current free one, then map it */
1465 XtSetValues(pCurrentNode->helpDialog, setArgs, n);
1469 #ifndef NO_MESSAGE_CATALOG
1470 XtSetArg (setArgs[n], XmNtitle,
1471 wmNLS.defaultHelpTitle); n++;
1473 XtSetArg (setArgs[n], XmNtitle,
1474 "Workspace Manager - Help"); n++;
1477 XtSetArg (setArgs[n], XmNgeometry, NULL); n++;
1478 XtSetArg (setArgs[n], XmNx, 0); n++;
1479 XtSetArg (setArgs[n], XmNy, 0); n++;
1481 pCurrentNode->helpDialog =
1482 DtCreateHelpDialog(shellWidget, "helpWidget", setArgs, n);
1484 XtSetArg (setArgs[n], XmNname, "cachedHelp"); n++;
1487 XtSetValues(shellWidget, argList, argCount);
1490 XtAddCallback(pCurrentNode->helpDialog,
1491 DtNhyperLinkCallback,
1492 WmDtProcessLinkCB, NULL);
1494 XtAddCallback(pCurrentNode->helpDialog, DtNcloseCallback,
1496 (XtPointer) pCurrentNode->helpDialog);
1500 pCurrentNode->hLink = True;
1504 if (displayTopicInfo)
1506 pCurrentNode->workspaces =
1507 displayTopicInfo->workspaces;
1508 pCurrentNode->xPos = displayTopicInfo->xPos;
1509 pCurrentNode->yPos = displayTopicInfo->yPos;
1510 pCurrentNode->restored = True;
1511 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1514 (XtPointer)pCurrentNode);
1518 XtAddCallback(XtParent(pCurrentNode->helpDialog),
1520 WmDtPopupHelpCB, NULL);
1525 helpWidget = pCurrentNode->helpDialog;
1526 XtManageChild(helpWidget);
1527 XtPopup(XtParent(helpWidget), XtGrabNone);
1530 } /* if n is still 0, we did not find a useful help type */
1532 } /* END OF FUNCTION WmDtDisplayTopic */
1535 /****************************************************************************
1536 * Function: static Boolean WmDtGetFromCache(
1537 * CacheListStruct **pCurrentNode)
1542 * Return Value: Void.
1544 * Purpose: Gets a free help node form our cache list. If none are
1545 * free, it will return fallse and the calling routine will
1546 * create a new help dialog widget.
1548 ****************************************************************************/
1549 static Boolean WmDtGetFromCache(
1550 CacheListStruct **pCurrentNode,
1553 CacheListStruct *pTemp;
1555 if (pSD->cachedHelp == NULL)
1557 /* We have a new list so lets create one and pass it back */
1559 (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1561 /* Assign the default values to our node */
1562 pSD->cachedHelp->helpDialog = NULL;
1563 pSD->cachedHelp->inUseFlag = TRUE;
1564 pSD->cachedHelp->restored = False;
1565 pSD->cachedHelp->hLink = False;
1566 pSD->cachedHelp->pNext = NULL;
1567 pSD->cachedHelp->pPrevious = NULL;
1569 /* Return our head pointer because it's our first and only node */
1570 *pCurrentNode = pSD->cachedHelp;
1575 /* We have some nodes so search for a free one first */
1576 pTemp = pSD->cachedHelp;
1578 while (pTemp != NULL)
1580 if (pTemp->inUseFlag == FALSE)
1582 pTemp->inUseFlag = TRUE;
1583 pTemp->hLink = False;
1584 pTemp->restored = False;
1585 *pCurrentNode = pTemp;
1589 pTemp = pTemp->pNext;
1594 * If we did not find a free node then we must add a new one to the
1595 * top of the list, and return it.
1598 pTemp = (CacheListStruct *) XtMalloc((sizeof(CacheListStruct)));
1600 /* Assign the default values to our node */
1601 pTemp->helpDialog = NULL;
1602 pTemp->inUseFlag = TRUE;
1603 pTemp->restored = False;
1604 pTemp->hLink = False;
1605 pTemp->pNext = pSD->cachedHelp;
1606 pTemp->pPrevious = NULL;
1608 pSD->cachedHelp->pPrevious = pTemp;
1610 /* Re-Assign our head pointer to point to the new head of the list */
1611 pSD->cachedHelp = pTemp;
1613 /* Return our head pointer because it's our new node */
1614 *pCurrentNode = pSD->cachedHelp;
1618 } /* END OF FUNCTION WmDtGetFromCache */
1620 /* End of Dt utils */
1623 /*************************************<->*************************************
1626 * RestoreHelpDialogs (pSD)
1631 * Saves the state of the help system
1645 ******************************<->***********************************/
1653 XrmName xrm_name[5];
1654 XrmRepresentation rep_type;
1657 Position xLoc, yLoc;
1658 short columns, rows;
1664 char dialogName[10];
1666 ClientData *pCD = NULL;
1667 char *tTitle = NULL;
1668 char *wsName = NULL;
1669 char *wmClientName = NULL;
1670 char *helpVolume = NULL;
1671 char *locationId = NULL;
1672 char *stringData = NULL;
1673 char *workspaces = NULL;
1678 WmPanelistObject pPanelist = (WmPanelistObject) pSD->wPanelist;
1685 if (pSD->helpResources)
1687 if ((db = XrmGetStringDatabase (pSD->helpResources)) == NULL)
1691 xrm_name [0] = XrmStringToQuark ("wsHelp");
1692 xrm_name [1] = XrmStringToQuark ("onScreen");
1693 xrm_name [2] = NULL;
1696 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1698 /* Are we supposed to be mapped? */
1699 if (strcmp(value.addr, "True") == 0)
1702 /* get x position */
1703 xrm_name [1] = XrmStringToQuark ("x");
1704 if (XrmQGetResource (db, xrm_name, xrm_name,
1707 pSD->dtHelp.xPos = (Position)atoi((char *)value.addr);
1708 pSD->dtHelp.restored = True;
1711 /* get y position */
1712 xrm_name [1] = XrmStringToQuark ("y");
1713 if (XrmQGetResource (db, xrm_name, xrm_name,
1716 pSD->dtHelp.yPos = (Position)atoi((char *)value.addr);
1717 pSD->dtHelp.restored = True;
1721 xrm_name [1] = XrmStringToQuark ("columns");
1722 if (XrmQGetResource (db, xrm_name, xrm_name,
1725 XtSetArg (setArgs[ac], XmNcolumns,
1726 (short)atoi((char *)value.addr)); ac++;
1727 columns = (short)atoi((char *)value.addr);
1731 xrm_name [1] = XrmStringToQuark ("rows");
1732 if (XrmQGetResource (db, xrm_name, xrm_name,
1735 XtSetArg (setArgs[ac], XmNrows,
1736 (short)atoi((char *)value.addr)); ac++;
1737 rows = (short)atoi((char *)value.addr);
1739 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1741 XtSetArg (setArgs[ac], XmNgeometry,
1742 XtNewString(geometry)); ac++;
1744 /* get visiblePathCount */
1745 xrm_name [1] = XrmStringToQuark ("vPCount");
1746 if (XrmQGetResource (db, xrm_name, xrm_name,
1749 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1750 (int)atoi((char *)value.addr)); ac++;
1753 /* get topicTitle */
1754 xrm_name [1] = XrmStringToQuark ("tTitle");
1755 if (XrmQGetResource (db, xrm_name, xrm_name,
1758 tTitle = XtNewString ((char *)value.addr);
1759 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1763 xrm_name [1] = XrmStringToQuark ("helpType");
1764 if (XrmQGetResource (db, xrm_name, xrm_name,
1767 XtSetArg (setArgs[ac], DtNhelpType,
1768 (int)atoi((char *)value.addr)); ac++;
1769 helpType = (int)atoi((char *)value.addr);
1775 case DtHELP_TYPE_TOPIC:
1776 /* get helpVolume */
1777 xrm_name [1] = XrmStringToQuark ("helpVolume");
1778 if (XrmQGetResource (db, xrm_name, xrm_name,
1781 helpVolume = XtNewString ((char *)value.addr);
1782 /* XtSetArg (setArgs[ac], DtNhelpVolume,
1783 helpVolume); ac++;*/
1785 /* get locationId */
1786 xrm_name [1] = XrmStringToQuark ("locationId");
1787 if (XrmQGetResource (db, xrm_name, xrm_name,
1790 locationId = XtNewString ((char *)value.addr);
1791 /* XtSetArg (setArgs[ac], DtNlocationId,
1792 locationId); ac++;*/
1797 case DtHELP_TYPE_DYNAMIC_STRING:
1799 /* get stringData */
1800 xrm_name [1] = XrmStringToQuark ("stringData");
1801 if (XrmQGetResource (db, xrm_name, xrm_name,
1804 stringData = XtNewString ((char *)value.addr);
1805 /* XtSetArg (setArgs[ac], DtNstringData,
1806 stringData); ac++;*/
1807 locationId = stringData;
1812 case DtHELP_TYPE_MAN_PAGE:
1816 case DtHELP_TYPE_FILE:
1821 /* error condition, don't try to display help */
1825 /* get name of wm client for which wmHelp is transient */
1827 xrm_name [1] = XrmStringToQuark ("windowGroup");
1828 if (XrmQGetResource (db, xrm_name, xrm_name,
1831 wmClientName = ((char *)value.addr);
1832 if ((!strcmp(wmClientName, pSD->iconBoxName)) &&
1835 xrm_name [1] = XrmStringToQuark ("wsName");
1836 if (XrmQGetResource (db, xrm_name, xrm_name,
1839 wsName = (char *)value.addr;
1840 for (wsCnt = 0; wsCnt < pSD->numWorkspaces;
1843 if (!strcmp(pSD->pWS[wsCnt].name, wsName))
1845 pCD=pSD->pWS[wsCnt].pIconBox->pCD_iconBox;
1853 else if(!strcmp(wmClientName, O_PanelName(pPanelist)))
1855 pCD=O_ClientData(pPanelist);
1861 * Map the help dialog
1864 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
1866 helpType, NULL, True,
1867 setArgs, ac, pCD, False, NULL);
1869 }/* if (XrmQGetResource for wsHelp) */
1871 xrm_name [0] = XrmStringToQuark ("cachedHelp");
1872 xrm_name [1] = XrmStringToQuark ("cachedCount");
1873 xrm_name [2] = NULL;
1876 if (XrmQGetResource (db, xrm_name, xrm_name, &rep_type, &value))
1878 /* restore cachedCount number of help dialogs */
1879 cachedCount = (int)atoi((char *)value.addr);
1880 for (cCount=1; cCount < (cachedCount + 1); cCount++)
1882 sprintf (dialogName, "oWsHelp%d", cCount);
1883 xrm_name [0] = XrmStringToQuark (dialogName);
1884 xrm_name [1] = NULL;
1885 xrm_name [2] = NULL;
1887 displayTopicInfo.xPos = 0;
1888 displayTopicInfo.xPos = 0;
1889 displayTopicInfo.workspaces = NULL;
1892 /* get x position */
1893 xrm_name [1] = XrmStringToQuark ("x");
1894 if (XrmQGetResource (db, xrm_name, xrm_name,
1897 /* XtSetArg (setArgs[ac], XmNx,
1898 atoi((char *)value.addr)); ac++;*/
1899 xLoc = (Position)atoi((char *)value.addr);
1900 displayTopicInfo.xPos = xLoc;
1903 /* get y position */
1904 xrm_name [1] = XrmStringToQuark ("y");
1905 if (XrmQGetResource (db, xrm_name, xrm_name,
1908 /* XtSetArg (setArgs[ac], XmNy,
1909 atoi((char *)value.addr)); ac++;*/
1910 yLoc = (Position)atoi((char *)value.addr);
1911 displayTopicInfo.yPos = yLoc;
1915 xrm_name [1] = XrmStringToQuark ("columns");
1916 if (XrmQGetResource (db, xrm_name, xrm_name,
1919 XtSetArg (setArgs[ac], XmNcolumns,
1920 (short)atoi((char *)value.addr)); ac++;
1921 columns = (short)atoi((char *)value.addr);
1925 xrm_name [1] = XrmStringToQuark ("rows");
1926 if (XrmQGetResource (db, xrm_name, xrm_name,
1929 XtSetArg (setArgs[ac], XmNrows,
1930 (short)atoi((char *)value.addr)); ac++;
1931 rows = (short)atoi((char *)value.addr);
1933 sprintf (geometry, "=+%d+%d", xLoc, yLoc);
1935 XtSetArg (setArgs[ac], XmNgeometry,
1936 XtNewString(geometry)); ac++;
1938 /* get visiblePathCount */
1939 xrm_name [1] = XrmStringToQuark ("vPCount");
1940 if (XrmQGetResource (db, xrm_name, xrm_name,
1943 XtSetArg (setArgs[ac], DtNvisiblePathCount,
1944 (int)atoi((char *)value.addr)); ac++;
1947 /* get topicTitle */
1948 xrm_name [1] = XrmStringToQuark ("tTitle");
1949 if (XrmQGetResource (db, xrm_name, xrm_name,
1952 tTitle = XtNewString ((char *)value.addr);
1953 XtSetArg (setArgs[ac], DtNtopicTitle, tTitle); ac++;
1956 /* get workspaces list */
1957 xrm_name [1] = XrmStringToQuark ("workspaces");
1958 if (XrmQGetResource (db, xrm_name, xrm_name,
1961 workspaces = XtNewString ((char *)value.addr);
1962 displayTopicInfo.workspaces = workspaces;
1967 xrm_name [1] = XrmStringToQuark ("helpType");
1968 if (XrmQGetResource (db, xrm_name, xrm_name,
1971 XtSetArg (setArgs[ac], DtNhelpType,
1972 (int)atoi((char *)value.addr)); ac++;
1973 helpType = (int)atoi((char *)value.addr);
1979 case DtHELP_TYPE_TOPIC:
1980 /* get helpVolume */
1981 xrm_name [1] = XrmStringToQuark ("helpVolume");
1982 if (XrmQGetResource (db, xrm_name, xrm_name,
1985 helpVolume = XtNewString ((char *)value.addr);
1987 /* get locationId */
1988 xrm_name [1] = XrmStringToQuark ("locationId");
1989 if (XrmQGetResource (db, xrm_name, xrm_name,
1992 locationId = XtNewString ((char *)value.addr);
1997 case DtHELP_TYPE_DYNAMIC_STRING:
1999 /* get stringData */
2000 xrm_name [1] = XrmStringToQuark ("stringData");
2001 if (XrmQGetResource (db, xrm_name, xrm_name,
2004 stringData = XtNewString ((char *)value.addr);
2005 /* XtSetArg (setArgs[ac], DtNstringData,
2006 stringData); ac++;*/
2007 locationId = stringData;
2012 case DtHELP_TYPE_MAN_PAGE:
2016 case DtHELP_TYPE_FILE:
2021 /* error condition, don't try to display help */
2026 WmDtDisplayTopic(pSD->screenTopLevelW1, helpVolume,
2028 helpType, NULL, False,
2029 setArgs, ac, NULL, False,
2032 } /* for all cached help dialogs */
2035 } /* if (XrmQGetResource ) cachedHelp/cachedCount */
2037 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\0", 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,"");
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,
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;
2777 WmPanelistObject pPanelist;
2778 #endif /* PANELIST */
2781 XmStringCreateLocalized (sMessage);
2783 XmStringCreateLocalized (sTitle);
2785 if (pSD->dtHelp.errorDialog == NULL)
2787 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);
2816 XmStringFree(tmpXmString);
2818 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2819 XmDIALOG_HELP_BUTTON);
2820 XtUnmanageChild (wTemp);
2822 wTemp = XmMessageBoxGetChild (pSD->dtHelp.errorDialog,
2823 XmDIALOG_CANCEL_BUTTON);
2824 XtUnmanageChild (wTemp);
2826 XtAddCallback (pSD->dtHelp.errorDialog, XmNokCallback,
2827 wmDtErrorDialogOkCB, (XtPointer)pSD);
2829 wShell = pSD->dtHelp.errorDialog;
2830 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2832 wShell = XtParent(wShell);
2834 XtAddCallback(wShell, XmNpopupCallback, wmDtErrorDialogPopupCB,
2837 XtRealizeWidget (pSD->dtHelp.errorDialog);
2839 /* remove some WM functions */
2841 XtSetArg (al[ac], XmNmwmFunctions, (MWM_FUNC_ALL|
2842 MWM_FUNC_RESIZE|MWM_FUNC_MINIMIZE|MWM_FUNC_MAXIMIZE));
2844 XtSetValues (wShell, al, ac);
2846 DtWsmRemoveWorkspaceFunctions (DISPLAY, XtWindow(wShell));
2850 /* make sure it's unmanaged */
2851 wmDtErrorDialogHide (pSD);
2853 /* set new message and title */
2855 XtSetArg (al[ac], XmNmessageString, xmsMessage); ac++;
2856 XtSetArg (al[ac], XmNdialogTitle, xmsTitle); ac++;
2857 XtSetValues (pSD->dtHelp.errorDialog, al, ac);
2860 if (pSD->dtHelp.errorDialog)
2862 XtManageChild (pSD->dtHelp.errorDialog);
2863 XtPopup (XtParent(pSD->dtHelp.errorDialog), XtGrabNone);
2866 XmStringFree (xmsMessage);
2867 XmStringFree (xmsTitle);
2869 /* END OF FUNCTION wmDtErrorDialog */
2872 /*************************************<->*************************************
2875 * wmDtErrorDialogHide (pSD)
2884 * pSD = ptr to screen data
2895 *************************************<->***********************************/
2898 wmDtErrorDialogHide( WmScreenData *pSD )
2902 XtPopdown (XtParent(pSD->dtHelp.errorDialog));
2903 XtUnmanageChild (pSD->dtHelp.errorDialog);
2905 * Do a withdraw to make sure window gets unmanaged
2906 * (popdown does nothing if its unmapped)
2908 wShell = pSD->dtHelp.errorDialog;
2909 while (!(XtIsSubclass(wShell, shellWidgetClass)))
2911 wShell = XtParent(wShell);
2914 XWithdrawWindow (DISPLAY, XtWindow (wShell), pSD->screen);
2916 /* must sync to insure event order */
2917 XSync (DISPLAY, False);
2919 } /* END OF FUNCTION wmDtErrorDialogHide */
2922 /*************************************<->*************************************
2925 * wmDtErrorDialogOkCB (w, client_data, call_data)
2947 *************************************<->***********************************/
2950 wmDtErrorDialogOkCB(
2952 XtPointer client_data,
2953 XtPointer call_data )
2955 WmScreenData *pSD = (WmScreenData *) client_data;
2957 wmDtErrorDialogHide (pSD);
2959 } /* END OF FUNCTION wmDtErrorDialogOkCB */
2962 /*************************************<->*************************************
2965 * wmDtErrorDialogPopupCB (w, client_data, call_data)
2987 *************************************<->***********************************/
2990 wmDtErrorDialogPopupCB(
2992 XtPointer client_data,
2993 XtPointer call_data )
2995 WmScreenData *pSD = (WmScreenData *) client_data;
2996 Window wRoot, wChild;
2997 int rootX, rootY, winX, winY;
2999 Dimension dWidth, dHeight;
3004 /* set new position near cursor position */
3005 XQueryPointer (DISPLAY, XtWindow(pSD->screenTopLevelW1),
3006 &wRoot, &wChild, &rootX, &rootY, &winX, &winY, &mask);
3009 XtSetArg (al[ac], XmNwidth, &dWidth); ac++;
3010 XtSetArg (al[ac], XmNheight, &dHeight); ac++;
3011 XtGetValues (w, al, ac);
3013 x = (Position) rootX - (dWidth / 2);
3014 y = (Position) rootY - (dHeight / 2);
3016 if ((x + ((Position) dWidth / 2)) > DisplayWidth (DISPLAY, pSD->screen))
3017 x = DisplayWidth (DISPLAY,pSD->screen) - (dWidth/2) - 1;
3021 if ((y + ((Position) dHeight / 2)) > DisplayHeight (DISPLAY, pSD->screen))
3022 y = DisplayHeight (DISPLAY,pSD->screen) - (dHeight/2) - 1;
3027 XtSetArg (al[ac], XmNx, x); ac++;
3028 XtSetArg (al[ac], XmNy, y); ac++;
3029 XtSetArg (al[ac], XmNwindowGroup,
3030 XtUnspecifiedWindowGroup); ac++;
3031 XtSetArg (al[ac], XmNwaitForWm, False); ac++;
3032 XtSetValues (w, al, ac);
3035 } /* END OF FUNCTION wmDtErrorDialogPopupCB */
3037 /**************************** eof ***************************/