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 1989, 1990, 1991, 1992, 1993, 1994 OPEN SOFTWARE FOUNDATION, INC.
31 * (c) Copyright 1987, 1988, 1989, 1990 HEWLETT-PACKARD COMPANY */
38 #include "WmResNames.h"
47 * include extern functions
50 #include "WmResParse.h"
53 * Function Declarations:
56 unsigned char *NextToken ();
64 /*************************************<->*************************************
66 * AddWmResourceConverters (args)
71 * This function adds resource type converters for mwm specific resource
72 * types to the X Toolkit collection.
91 *************************************<->***********************************/
93 void AddWmResourceConverters (void)
95 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRAbsentMapBehavior,
96 (XtConverter)WmCvtStringToAMBehavior, NULL, 0);
97 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRCFocusPolicy,
98 (XtConverter)WmCvtStringToCFocus, NULL, 0);
99 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRClientDecor,
100 (XtConverter)WmCvtStringToCDecor, NULL, 0);
101 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRClientFunction,
102 (XtConverter)WmCvtStringToCFunc, NULL, 0);
103 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRFrameStyle,
104 (XtConverter)WmCvtStringToFrameStyle, NULL, 0);
105 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRIconDecor,
106 (XtConverter)WmCvtStringToIDecor, NULL, 0);
107 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRIconPlacement,
108 (XtConverter)WmCvtStringToIPlace, NULL, 0);
109 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRKFocusPolicy,
110 (XtConverter)WmCvtStringToKFocus, NULL, 0);
111 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRSize,
112 (XtConverter)WmCvtStringToSize, NULL, 0);
113 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRShowFeedback,
114 (XtConverter)WmCvtStringToShowFeedback, NULL, 0);
115 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRUsePPosition,
116 (XtConverter)WmCvtStringToUsePPosition, NULL, 0);
118 } /* END OF FUNCTION AddWmResourceConverters */
120 /*************************************<->*************************************
122 * WmCvtStringToAMBehavior (args, numArgs, fromVal, toVal)
127 * This function converts a string to an absent map behavior description.
132 * args = additional XrmValue arguments to the converter - NULL here
134 * numArgs = number of XrmValue arguments - 0 here
136 * fromVal = resource value to convert
141 * toVal = descriptor to use to return converted value
143 *************************************<->***********************************/
145 void WmCvtStringToAMBehavior (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
147 unsigned char *pch = (unsigned char *) (fromVal->addr);
148 unsigned char *pchNext;
151 Boolean fHit = False;
154 * Absent map behavior policies:
156 #define AMAP_BEHAVIOR_ADD_STR (unsigned char *)"add"
157 #define AMAP_BEHAVIOR_MOVE_STR (unsigned char *)"move"
158 #define AMAP_BEHAVIOR_IGNORE_STR (unsigned char *)"ignore"
161 * Convert the absent map behavior policy resource value:
164 if (*pch && NextToken (pch, &len, &pchNext))
166 if ((*pch == 'A') || (*pch == 'a'))
168 if (StringsAreEqual (pch, AMAP_BEHAVIOR_ADD_STR, len))
170 cval = AMAP_BEHAVIOR_ADD;
175 else if ((*pch == 'M') || (*pch == 'm'))
177 if (StringsAreEqual (pch, AMAP_BEHAVIOR_MOVE_STR, len))
179 cval = AMAP_BEHAVIOR_MOVE;
184 else if ((*pch == 'I') || (*pch == 'i'))
186 if (StringsAreEqual (pch, AMAP_BEHAVIOR_IGNORE_STR, len))
188 cval = AMAP_BEHAVIOR_IGNORE;
196 cval = AMAP_BEHAVIOR_ADD;
200 (*toVal).size = sizeof (int);
201 (*toVal).addr = (caddr_t)&cval;
204 } /* END OF FUNCTION WmCvtStringToAMBehavior */
207 /*************************************<->*************************************
209 * WmCvtStringToCFocus (args, numArgs, fromVal, toVal)
214 * This function converts a string to a colormap focus policy description.
219 * args = additional XrmValue arguments to the converter - NULL here
221 * numArgs = number of XrmValue arguments - 0 here
223 * fromVal = resource value to convert
228 * toVal = descriptor to use to return converted value
230 *************************************<->***********************************/
232 void WmCvtStringToCFocus (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
234 unsigned char *pch = (unsigned char *) (fromVal->addr);
235 unsigned char *pchNext;
238 Boolean fHit = False;
241 * Colormap focus policies:
244 #define CMAP_FOCUS_EXPLICIT_STR (unsigned char *)"explicit"
245 #define CMAP_FOCUS_KEYBOARD_STR (unsigned char *)"keyboard"
246 #define CMAP_FOCUS_POINTER_STR (unsigned char *)"pointer"
250 * Convert the colormap focus policy resource value:
253 if (*pch && NextToken (pch, &len, &pchNext))
255 if ((*pch == 'E') || (*pch == 'e'))
257 if (StringsAreEqual (pch, CMAP_FOCUS_EXPLICIT_STR, len))
259 cval = CMAP_FOCUS_EXPLICIT;
264 else if ((*pch == 'K') || (*pch == 'k'))
266 if (StringsAreEqual (pch, CMAP_FOCUS_KEYBOARD_STR, len))
268 cval = CMAP_FOCUS_KEYBOARD;
273 else if ((*pch == 'P') || (*pch == 'p'))
275 if (StringsAreEqual (pch, CMAP_FOCUS_POINTER_STR, len))
277 cval = CMAP_FOCUS_POINTER;
285 cval = CMAP_FOCUS_KEYBOARD;
289 (*toVal).size = sizeof (int);
290 (*toVal).addr = (caddr_t)&cval;
293 } /* END OF FUNCTION WmCvtStringToCFocus */
297 /*************************************<->*************************************
299 * WmCvtStringToCDecor (args, numArgs, fromVal, toVal)
304 * This function converts a string to a mwm client window frame decoration
310 * args = NULL (don't care)
312 * numArgs = 0 (don't care)
314 * fromVal = resource value to convert
319 * toVal = descriptor to use to return converted value
324 * o Accepts the following syntax:
326 * CDecor ::= [sign] decor_spec [decor_spec ...]
328 * sign ::= ['+' | '-']
330 * decor_spec ::= [sign] decor_name
332 * decor_name ::= "all" | "none" | "title" | "titlebar" |
333 * "menu" | "minimize" | "maximize" | "resize"
335 *************************************<->***********************************/
337 void WmCvtStringToCDecor (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
339 unsigned char *pch = (unsigned char *) (fromVal->addr);
340 unsigned char *pchNext;
343 Boolean fHit = False;
344 Boolean fAddNext = True;
346 * Client decoration parts:
349 #define WM_DECOR_ALL_STR (unsigned char *)"all"
350 #define WM_DECOR_NONE_STR (unsigned char *)"none"
351 #define WM_DECOR_BORDER_STR (unsigned char *)"border"
352 #define WM_DECOR_RESIZEH_STR (unsigned char *)"resizeh"
353 #define WM_DECOR_TITLE_STR (unsigned char *)"title"
354 #define WM_DECOR_TITLEBAR_STR (unsigned char *)"titlebar"
355 #define WM_DECOR_MINIMIZE_STR (unsigned char *)"minimize"
356 #define WM_DECOR_MAXIMIZE_STR (unsigned char *)"maximize"
357 #define WM_DECOR_MENU_STR (unsigned char *)"menu"
358 #define WM_DECOR_RESIZE_STR (unsigned char *)"resize"
361 * Check first token. If '-' we subtract from all decoration.
362 * Otherwise, we start with no decoration and add things in.
365 (NextToken (pch, &len, &pchNext)) &&
373 cval = WM_DECOR_NONE;
377 while (*pch && NextToken(pch, &len, &pchNext))
380 * Strip off "sign" if prepended to another token, and process
381 * that token the next time through.
393 else if (*pch == '-')
402 else if ((*pch == 'A') || (*pch == 'a'))
404 if (StringsAreEqual(pch, WM_DECOR_ALL_STR,len))
406 cval = fAddNext ? (cval | WM_DECOR_ALL) :
407 (cval & ~WM_DECOR_ALL);
412 else if ((*pch == 'N') || (*pch == 'n'))
414 if (StringsAreEqual(pch, WM_DECOR_NONE_STR,len))
416 /* don't bother adding or subtracting nothing */
421 else if ((*pch == 'T') || (*pch == 't'))
423 if (StringsAreEqual(pch, WM_DECOR_TITLE_STR,len))
425 cval = fAddNext ? (cval | WM_DECOR_TITLE) :
426 (cval & ~WM_DECOR_TITLEBAR);
429 else if (StringsAreEqual(pch, WM_DECOR_TITLEBAR_STR,len))
431 cval = fAddNext ? (cval | WM_DECOR_TITLEBAR) :
432 (cval & ~WM_DECOR_TITLEBAR);
437 else if ((*pch == 'M') || (*pch == 'm'))
439 if (StringsAreEqual(pch, WM_DECOR_MINIMIZE_STR,len))
441 cval = fAddNext ? (cval | WM_DECOR_MINIMIZE) :
442 (cval & ~MWM_DECOR_MINIMIZE);
445 else if (StringsAreEqual(pch, WM_DECOR_MAXIMIZE_STR,len))
447 cval = fAddNext ? (cval | WM_DECOR_MAXIMIZE) :
448 (cval & ~MWM_DECOR_MAXIMIZE);
451 else if (StringsAreEqual(pch, WM_DECOR_MENU_STR,len))
453 cval = fAddNext ? (cval | WM_DECOR_SYSTEM) :
454 (cval & ~MWM_DECOR_MENU);
459 else if ((*pch == 'R') || (*pch == 'r'))
461 if (StringsAreEqual(pch, WM_DECOR_RESIZE_STR,len) ||
462 StringsAreEqual(pch, WM_DECOR_RESIZEH_STR,len))
464 cval = fAddNext ? (cval | WM_DECOR_RESIZEH) :
465 (cval & ~MWM_DECOR_RESIZEH);
470 else if ((*pch == 'B') || (*pch == 'b'))
472 if (StringsAreEqual(pch, WM_DECOR_BORDER_STR,len))
474 cval = fAddNext ? (cval | WM_DECOR_BORDER) :
475 (cval & ~WM_DECOR_BORDER);
483 if (!fHit) cval = WM_DECOR_ALL;
485 (*toVal).size = sizeof (int);
486 (*toVal).addr = (caddr_t) &cval;
488 } /* END OF FUNCTION WmCvtStringToCDecor */
492 /*************************************<->*************************************
494 * WmCvtStringToCFunc (args, numArgs, fromVal, toVal)
499 * This function converts a string to a mwm client-applicable function
505 * args = NULL (don't care)
507 * numArgs = 0 (don't care)
509 * fromVal = resource value to convert
514 * toVal = descriptor to use to return converted value
519 * o Accepts the following syntax:
521 * CFunc ::= [sign] func_spec [func_spec ...]
523 * sign ::= ['+' | '-']
525 * func_spec ::= [sign] func_name
527 * func_name ::= "all" | "none" | "resize" | "move" | "minimize" |
528 * "maximize" | "close"
530 *************************************<->***********************************/
532 void WmCvtStringToCFunc (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
534 unsigned char *pch = (unsigned char *) (fromVal->addr);
535 unsigned char *pchNext;
538 Boolean fHit = False;
539 Boolean fAddNext = True;
542 * Client-applicable functions:
545 #define WM_FUNC_ALL_STR (unsigned char *)"all"
546 #define WM_FUNC_NONE_STR (unsigned char *)"none"
547 #define WM_FUNC_RESIZE_STR (unsigned char *)"resize"
548 #define WM_FUNC_MOVE_STR (unsigned char *)"move"
549 #define WM_FUNC_MINIMIZE_STR (unsigned char *)"minimize"
550 #define WM_FUNC_MAXIMIZE_STR (unsigned char *)"maximize"
551 #define WM_FUNC_CLOSE_STR (unsigned char *)"close"
554 * Check first token. If '-' we subtract from all functions.
555 * Otherwise, we start with no functions and add things in.
559 (NextToken (pch, &len, &pchNext)) &&
571 while (*pch && NextToken(pch, &len, &pchNext))
574 * Strip off "sign" if prepended to another token, and process
575 * that token the next time through.
587 else if (*pch == '-')
596 else if ((*pch == 'A') || (*pch == 'a'))
598 if (StringsAreEqual(pch, WM_FUNC_ALL_STR,len))
600 cval = fAddNext ? (cval | WM_FUNC_ALL) :
601 (cval & ~WM_FUNC_ALL);
606 else if ((*pch == 'N') || (*pch == 'n'))
608 if (StringsAreEqual(pch, WM_FUNC_NONE_STR,len))
610 /* don't bother adding or subtracting nothing */
615 else if ((*pch == 'R') || (*pch == 'r'))
617 if (StringsAreEqual(pch, WM_FUNC_RESIZE_STR,len))
619 cval = fAddNext ? (cval | MWM_FUNC_RESIZE) :
620 (cval & ~MWM_FUNC_RESIZE);
625 else if ((*pch == 'M') || (*pch == 'm'))
627 if (StringsAreEqual(pch, WM_FUNC_MINIMIZE_STR,len))
629 cval = fAddNext ? (cval | MWM_FUNC_MINIMIZE) :
630 (cval & ~MWM_FUNC_MINIMIZE);
633 else if (StringsAreEqual(pch, WM_FUNC_MAXIMIZE_STR,len))
635 cval = fAddNext ? (cval | MWM_FUNC_MAXIMIZE) :
636 (cval & ~MWM_FUNC_MAXIMIZE);
639 else if (StringsAreEqual(pch, WM_FUNC_MOVE_STR,len))
641 cval = fAddNext ? (cval | MWM_FUNC_MOVE) :
642 (cval & ~MWM_FUNC_MOVE);
647 else if ((*pch == 'C') || (*pch == 'c'))
649 if (StringsAreEqual(pch, WM_FUNC_CLOSE_STR,len))
651 cval = fAddNext ? (cval | MWM_FUNC_CLOSE) :
652 (cval & ~MWM_FUNC_CLOSE);
660 if (!fHit) cval = WM_FUNC_ALL;
662 (*toVal).size = sizeof (int);
663 (*toVal).addr = (caddr_t) &cval;
665 } /* END OF FUNCTION WmCvtStringToCFunc */
668 /*************************************<->*************************************
670 * WmCvtStringToFrameStyle (args, numArgs, fromVal, toVal)
675 * This function converts a string to a frame style description.
680 * args = NULL (don't care)
682 * numArgs = 0 (don't care)
684 * fromVal = resource value to convert
689 * toVal = descriptor to use to return converted value
691 *************************************<->***********************************/
693 void WmCvtStringToFrameStyle (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
695 unsigned char *pch = (unsigned char *) (fromVal->addr);
696 unsigned char *pchNext;
698 static FrameStyle frameStyle;
699 Boolean fHit = False;
702 #define FRAME_STYLE_RECESSED_STR (unsigned char *)"recessed"
703 #define FRAME_STYLE_SLAB_STR (unsigned char *)"slab"
706 * Convert the resource value:
709 if (*pch && NextToken (pch, &len, &pchNext))
711 if ((*pch == 'R') || (*pch == 'r'))
713 if (StringsAreEqual (pch, FRAME_STYLE_RECESSED_STR, len))
715 frameStyle = WmRECESSED;
719 else if (StringsAreEqual (pch, FRAME_STYLE_SLAB_STR, len))
728 frameStyle = WmRECESSED;
731 (*toVal).size = sizeof (FrameStyle);
732 (*toVal).addr = (caddr_t)&frameStyle;
735 } /* END OF FUNCTION WmCvtStringToFrameStyle */
739 /*************************************<->*************************************
741 * WmCvtStringToIDecor (args, numArgs, fromVal, toVal)
746 * This function converts a string to an icon decoration description.
751 * args = NULL (don't care)
753 * numArgs = 0 (don't care)
755 * fromVal = resource value to convert
760 * toVal = descriptor to use to return converted value
762 *************************************<->***********************************/
764 void WmCvtStringToIDecor (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
766 unsigned char *pch = (unsigned char *) (fromVal->addr);
767 unsigned char *pchNext;
770 Boolean fHit = False;
773 * Icon decoration parts:
776 #define ICON_DECOR_IMAGE_STR (unsigned char *)"image"
777 #define ICON_DECOR_LABEL_STR (unsigned char *)"label"
778 #define ICON_DECOR_ACTIVE_LABEL_STR (unsigned char *)"activelabel"
782 * Convert the icon decoration resource value:
787 while (*pch && NextToken (pch, &len, &pchNext))
789 if ((*pch == 'A') || (*pch == 'a'))
791 if (StringsAreEqual (pch, ICON_DECOR_ACTIVE_LABEL_STR, len))
793 cval |= ICON_ACTIVE_LABEL_PART;
798 else if ((*pch == 'I') || (*pch == 'i'))
800 if (StringsAreEqual (pch, ICON_DECOR_IMAGE_STR, len))
802 cval |= ICON_IMAGE_PART;
807 else if ((*pch == 'L') || (*pch == 'l'))
809 if (StringsAreEqual (pch, ICON_DECOR_LABEL_STR, len))
811 cval |= ICON_LABEL_PART;
820 * If we didn't match anything or only have the active label
821 * (which is just a modifier) then give 'em the whole ball of wax.
823 if (!fHit || cval == ICON_ACTIVE_LABEL_PART)
825 cval = ICON_LABEL_PART | ICON_IMAGE_PART | ICON_ACTIVE_LABEL_PART;
829 (*toVal).size = sizeof (int);
830 (*toVal).addr = (caddr_t) &cval;
832 } /* END OF FUNCTION WmCvtStringToIDecor */
836 /*************************************<->*************************************
838 * WmCvtStringToIPlace (args, numArgs, fromVal, toVal)
843 * This function converts a string to an icon placement scheme description.
848 * args = NULL (don't care)
850 * numArgs = 0 (don't care)
852 * fromVal = resource value to convert
857 * toVal = descriptor to use to return converted value
859 *************************************<->***********************************/
861 void WmCvtStringToIPlace (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
863 unsigned char *pch = (unsigned char *) (fromVal->addr);
864 unsigned char *pchNext;
867 Boolean fPrimarySet = False;
868 Boolean fSecondarySet = False;
871 * Icon placement layout values:
874 #define ICON_PLACE_BOTTOM_STR (unsigned char *)"bottom"
875 #define ICON_PLACE_LEFT_STR (unsigned char *)"left"
876 #define ICON_PLACE_RIGHT_STR (unsigned char *)"right"
877 #define ICON_PLACE_TOP_STR (unsigned char *)"top"
878 #define ICON_PLACE_TIGHT_STR (unsigned char *)"tight"
882 * Convert the icon placement resource value:
887 while (*pch && NextToken (pch, &len, &pchNext))
889 if ((*pch == 'B') || (*pch == 'b'))
891 if (StringsAreEqual (pch, ICON_PLACE_BOTTOM_STR, len))
895 cval |= ICON_PLACE_BOTTOM_PRIMARY;
898 else if (!fSecondarySet)
901 (ICON_PLACE_BOTTOM_PRIMARY | ICON_PLACE_TOP_PRIMARY)))
903 cval |= ICON_PLACE_BOTTOM_SECONDARY;
904 fSecondarySet = True;
909 else if ((*pch == 'L') || (*pch == 'l'))
911 if (StringsAreEqual (pch, ICON_PLACE_LEFT_STR, len))
915 cval |= ICON_PLACE_LEFT_PRIMARY;
918 else if (!fSecondarySet)
921 (ICON_PLACE_LEFT_PRIMARY | ICON_PLACE_RIGHT_PRIMARY)))
923 cval |= ICON_PLACE_LEFT_SECONDARY;
924 fSecondarySet = True;
930 else if ((*pch == 'R') || (*pch == 'r'))
932 if (StringsAreEqual (pch, ICON_PLACE_RIGHT_STR, len))
936 cval |= ICON_PLACE_RIGHT_PRIMARY;
939 else if (!fSecondarySet)
942 (ICON_PLACE_RIGHT_PRIMARY | ICON_PLACE_LEFT_PRIMARY)))
944 cval |= ICON_PLACE_RIGHT_SECONDARY;
945 fSecondarySet = True;
951 else if ((*pch == 'T') || (*pch == 't'))
953 if (StringsAreEqual (pch, ICON_PLACE_TOP_STR, len))
957 cval |= ICON_PLACE_TOP_PRIMARY;
960 else if (!fSecondarySet)
963 (ICON_PLACE_TOP_PRIMARY | ICON_PLACE_BOTTOM_PRIMARY)))
965 cval |= ICON_PLACE_TOP_SECONDARY;
966 fSecondarySet = True;
971 else if (StringsAreEqual (pch, ICON_PLACE_TIGHT_STR, len))
973 cval |= ICON_PLACE_TIGHT;
982 cval = ICON_PLACE_LEFT_PRIMARY;
986 if (cval & (ICON_PLACE_LEFT_PRIMARY | ICON_PLACE_RIGHT_PRIMARY))
988 cval |= ICON_PLACE_BOTTOM_SECONDARY;
992 cval |= ICON_PLACE_LEFT_SECONDARY;
997 (*toVal).size = sizeof (int);
998 (*toVal).addr = (caddr_t) &cval;
1000 } /* END OF FUNCTION WmCvtStringToIPlace */
1004 /*************************************<->*************************************
1006 * WmCvtStringToKFocus (args, numArgs, fromVal, toVal)
1011 * This function converts a string to a keyboard focus policy description.
1016 * args = NULL (don't care)
1018 * numArgs = 0 (don't care)
1020 * fromVal = resource value to convert
1025 * toVal = descriptor to use to return converted value
1027 *************************************<->***********************************/
1029 void WmCvtStringToKFocus (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
1031 unsigned char *pch = (unsigned char *) (fromVal->addr);
1032 unsigned char *pchNext;
1035 Boolean fHit = False;
1038 * Keyboard focus policies:
1041 #define KEYBOARD_FOCUS_EXPLICIT_STR (unsigned char *)"explicit"
1042 #define KEYBOARD_FOCUS_POINTER_STR (unsigned char *)"pointer"
1046 * Convert the keyboard focus policy resource value:
1049 if (*pch && NextToken (pch, &len, &pchNext))
1051 if ((*pch == 'E') || (*pch == 'e'))
1053 if (StringsAreEqual (pch, KEYBOARD_FOCUS_EXPLICIT_STR, len))
1055 cval = KEYBOARD_FOCUS_EXPLICIT;
1060 else if ((*pch == 'P') || (*pch == 'p'))
1062 if (StringsAreEqual (pch, KEYBOARD_FOCUS_POINTER_STR, len))
1064 cval = KEYBOARD_FOCUS_POINTER;
1073 cval = KEYBOARD_FOCUS_POINTER;
1075 cval = KEYBOARD_FOCUS_EXPLICIT;
1080 (*toVal).size = sizeof (int);
1081 (*toVal).addr = (caddr_t)&cval;
1084 } /* END OF FUNCTION WmCvtStringToKFocus */
1088 /*************************************<->*************************************
1090 * WmCvtStringToSize (args, numArgs, fromVal, toVal)
1095 * This function converts a string to a size description (<width>x<height>).
1100 * args = NULL (don't care)
1102 * numArgs = 0 (don't care)
1104 * fromVal = resource value to convert
1109 * toVal = descriptor to use to return converted value
1111 *************************************<->***********************************/
1113 void WmCvtStringToSize (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
1115 unsigned char *pch = (unsigned char *) (fromVal->addr);
1116 unsigned char *pchNext;
1121 * Convenience values for WmSize:
1124 #define VERTICAL_STR (unsigned char *)"vertical"
1125 #define HORIZONTAL_STR (unsigned char *)"horizontal"
1129 * Convert the size resource value. The syntax is "<width>[xX]<height>"
1130 * OR it is the string 'vertical' or 'horizontal'. It's kinda neat that
1131 * BIGSIZE is a legal Dimension so that we get vertical and horizontal
1140 cval.width = (int) DecStrToL (pch, &pchNext);
1141 if (!((cval.width == 0) && (pchNext == pch)))
1144 * Width was converted.
1145 * Check for a delimiter (must be 'x' or 'X'):
1149 if (*pch && ((*pch == 'x') || (*pch == 'X')))
1152 * Delimiter found now get the height:
1156 cval.height = (int) DecStrToL (pch, &pchNext);
1161 if (*pch && NextToken (pch, &len, &pchNext))
1163 if ((*pch == 'V') || (*pch == 'v'))
1165 if (StringsAreEqual (pch, VERTICAL_STR, len))
1167 cval.height = BIGSIZE;
1170 else if ((*pch == 'H') || (*pch == 'h'))
1172 if (StringsAreEqual (pch, HORIZONTAL_STR, len))
1174 cval.width = BIGSIZE;
1181 /* !!! check for the maximum maximum sizes !!! */
1183 (*toVal).size = sizeof (WHSize);
1184 (*toVal).addr = (caddr_t)&cval;
1187 } /* END OF FUNCTION WmCvtStringToSize */
1190 /*************************************<->*************************************
1192 * WmCvtStringToShowFeedback (args, numArgs, fromVal, toVal)
1197 * This function converts a string to a value for the showFeedback flag set.
1202 * args = NULL (don't care)
1204 * numArgs = 0 (don't care)
1206 * fromVal = resource value to convert
1211 * toVal = descriptor to use to return converted value
1213 *************************************<->***********************************/
1215 void WmCvtStringToShowFeedback (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
1217 unsigned char *pch = (unsigned char *) (fromVal->addr);
1218 unsigned char *pchNext;
1221 Boolean fHit = False;
1222 Boolean fAddNext = True;
1225 * Names of feedback options
1228 #define SHOW_FB_ALL_STR (unsigned char *)"all"
1229 #define SHOW_FB_BEHAVIOR_STR (unsigned char *)"behavior"
1230 #define SHOW_FB_KILL_STR (unsigned char *)"kill"
1231 #define SHOW_FB_MOVE_STR (unsigned char *)"move"
1232 #define SHOW_FB_NONE_STR (unsigned char *)"none"
1233 #define SHOW_FB_PLACEMENT_STR (unsigned char *)"placement"
1234 #define SHOW_FB_QUIT_STR (unsigned char *)"quit"
1235 #define SHOW_FB_RESIZE_STR (unsigned char *)"resize"
1236 #define SHOW_FB_RESTART_STR (unsigned char *)"restart"
1239 * Check first token. If '-' we subtract from all functions.
1240 * Otherwise, we start with no functions and add things in.
1244 (NextToken (pch, &len, &pchNext)) &&
1247 cval = WM_SHOW_FB_DEFAULT;
1252 cval = WM_SHOW_FB_NONE;
1257 * Convert the feedback option resource value:
1261 while (*pch && NextToken (pch, &len, &pchNext))
1264 * Strip off "sign" if prepended to another token, and process
1265 * that token the next time through.
1277 else if (*pch == '-')
1286 if ((*pch == 'A') || (*pch == 'a'))
1288 if (StringsAreEqual (pch, SHOW_FB_ALL_STR, len))
1290 cval = fAddNext ? (cval | WM_SHOW_FB_ALL) :
1291 (cval & ~WM_SHOW_FB_ALL);
1296 else if ((*pch == 'B') || (*pch == 'b'))
1298 if (StringsAreEqual (pch, SHOW_FB_BEHAVIOR_STR, len))
1300 cval = fAddNext ? (cval | WM_SHOW_FB_BEHAVIOR) :
1301 (cval & ~WM_SHOW_FB_BEHAVIOR);
1306 else if ((*pch == 'K') || (*pch == 'k'))
1308 if (StringsAreEqual (pch, SHOW_FB_KILL_STR, len))
1310 cval = fAddNext ? (cval | WM_SHOW_FB_KILL) :
1311 (cval & ~WM_SHOW_FB_KILL);
1316 else if ((*pch == 'M') || (*pch == 'm'))
1318 if (StringsAreEqual (pch, SHOW_FB_MOVE_STR, len))
1320 cval = fAddNext ? (cval | WM_SHOW_FB_MOVE) :
1321 (cval & ~WM_SHOW_FB_MOVE);
1326 else if ((*pch == 'N') || (*pch == 'n'))
1328 if (StringsAreEqual (pch, SHOW_FB_NONE_STR, len))
1330 /* don't bother adding or subtracting nothing */
1335 else if ((*pch == 'P') || (*pch == 'p'))
1337 if (StringsAreEqual (pch, SHOW_FB_PLACEMENT_STR, len))
1339 cval = fAddNext ? (cval | WM_SHOW_FB_PLACEMENT) :
1340 (cval & ~WM_SHOW_FB_PLACEMENT);
1345 else if ((*pch == 'Q') || (*pch == 'q'))
1347 if (StringsAreEqual (pch, SHOW_FB_QUIT_STR, len))
1349 cval = fAddNext ? (cval | WM_SHOW_FB_QUIT) :
1350 (cval & ~WM_SHOW_FB_QUIT);
1355 else if ((*pch == 'R') || (*pch == 'r'))
1357 if (StringsAreEqual (pch, SHOW_FB_RESIZE_STR, len))
1359 cval = fAddNext ? (cval | WM_SHOW_FB_RESIZE) :
1360 (cval & ~WM_SHOW_FB_RESIZE);
1363 else if (StringsAreEqual (pch, SHOW_FB_RESTART_STR, len))
1365 cval = fAddNext ? (cval | WM_SHOW_FB_RESTART) :
1366 (cval & ~WM_SHOW_FB_RESTART);
1376 * If we didn't match anything then set to default.
1380 cval = WM_SHOW_FB_DEFAULT;
1384 (*toVal).size = sizeof (int);
1385 (*toVal).addr = (caddr_t) &cval;
1387 } /* END OF FUNCTION WmCvtStringToShowFeedback */
1391 /*************************************<->*************************************
1393 * WmCvtStringToUsePPosition (args, numArgs, fromVal, toVal)
1398 * This function converts a string to a keyboard focus policy description.
1403 * args = NULL (don't care)
1405 * numArgs = 0 (don't care)
1407 * fromVal = resource value to convert
1412 * toVal = descriptor to use to return converted value
1414 *************************************<->***********************************/
1416 void WmCvtStringToUsePPosition (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
1418 unsigned char *pch = (unsigned char *) (fromVal->addr);
1419 unsigned char *pchNext;
1422 Boolean fHit = False;
1425 #define USE_PPOSITION_NONZERO_STR (unsigned char *)"nonzero"
1426 #define USE_PPOSITION_ON_STR (unsigned char *)"on"
1427 #define USE_PPOSITION_OFF_STR (unsigned char *)"off"
1430 * Convert the use PPosition resource value:
1433 if (*pch && NextToken (pch, &len, &pchNext))
1435 if ((*pch == 'N') || (*pch == 'n'))
1437 if (StringsAreEqual (pch, USE_PPOSITION_NONZERO_STR, len))
1439 cval = USE_PPOSITION_NONZERO;
1443 else if (StringsAreEqual (pch, USE_PPOSITION_OFF_STR, len))
1445 cval = USE_PPOSITION_OFF;
1448 else if (StringsAreEqual (pch, USE_PPOSITION_ON_STR, len))
1450 cval = USE_PPOSITION_ON;
1457 cval = USE_PPOSITION_NONZERO;
1460 (*toVal).size = sizeof (int);
1461 (*toVal).addr = (caddr_t)&cval;
1464 } /* END OF FUNCTION WmCvtStringToUsePPosition */
1467 /*************************************<->*************************************
1469 * NextToken (pchIn, pLen, ppchNext)
1479 * pchIn = pointer to start of next token
1484 * pLen = pointer to integer containing number of characters in next token
1485 * ppchNext = address of pointer to following token
1487 * Return = next token or NULL
1494 *************************************<->***********************************/
1496 unsigned char *NextToken (unsigned char *pchIn, int *pLen,
1497 unsigned char **ppchNext)
1499 unsigned char *pchR = pchIn;
1505 ((chlen = mblen((char *)pchIn, MB_CUR_MAX)) > 0) && (pchIn[0] != '\0');
1507 /* find end of word: requires singlebyte whitespace terminator */
1509 if ((chlen == 1) && isspace (*pchIn))
1516 /* skip to next word */
1517 ScanWhitespace (&pchIn);
1530 } /* END OF FUNCTION NextToken */
1534 /*************************************<->*************************************
1536 * StringsAreEqual (pch1, pch2, len)
1553 * Return = (Boolean) True iff strings match (case insensitive)
1560 *************************************<->***********************************/
1562 Boolean StringsAreEqual (unsigned char *pch1, unsigned char *pch2, int len)
1570 ((chlen1 = mbtowc (&wch1, (char *) pch1, MB_CUR_MAX)) > 0) &&
1571 ((chlen2 = mbtowc (&wch2, (char *) pch2, MB_CUR_MAX)) == chlen1) )
1574 /* singlebyte characters -- make case insensitive */
1576 if ((isupper (*pch1) ? tolower(*pch1) : *pch1) !=
1577 (isupper (*pch2) ? tolower(*pch2) : *pch2))
1583 /* multibyte characters */
1597 } /* END OF StringsAreEqual */
1600 /*************************************<->*************************************
1603 * DecStrToL (str, ptr)
1608 * Converts a decimal string to a long.
1613 * str = character string
1618 * *ptr = pointer to character terminating str or str
1619 * Return = long value
1624 * Leading whitespace is ignored.
1625 * Returns long value with *ptr pointing at character terminating the decimal
1627 * Returns 0 with *ptr == str if no integer can be formed.
1629 *************************************<->***********************************/
1631 long DecStrToL (unsigned char *str, unsigned char **ptr)
1636 while ((mblen ((char *)str, MB_CUR_MAX) == 1) && isspace (*str))
1637 /* Ignore leading whitespace */
1642 /* If we can start, we will reset *ptr */
1643 if ((mblen ((char *)str, MB_CUR_MAX) == 1) && isdigit (*str))
1645 while ((mblen ((char *)str, MB_CUR_MAX) == 1) && isdigit (*str))
1647 val = val * 10 + (*str - '0');
1656 } /* END OF FUNCTION DecStrToL */