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
24 * (c) Copyright 1989, 1990, 1991, 1992, 1993, 1994 OPEN SOFTWARE FOUNDATION, INC.
32 static char rcsid[] = "$XConsortium: WmResCvt.c /main/4 1995/11/01 11:49:54 rswiston $"
36 * (c) Copyright 1987, 1988, 1989, 1990 HEWLETT-PACKARD COMPANY */
43 #include "WmResNames.h"
51 #ifndef MOTIF_ONE_DOT_ONE
56 * include extern functions
59 #include "WmResParse.h"
62 * Function Declarations:
65 unsigned char *NextToken ();
73 /*************************************<->*************************************
75 * AddWmResourceConverters (args)
80 * This function adds resource type converters for mwm specific resource
81 * types to the X Toolkit collection.
100 *************************************<->***********************************/
102 void AddWmResourceConverters (void)
105 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRAbsentMapBehavior,
106 (XtConverter)WmCvtStringToAMBehavior, NULL, 0);
108 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRCFocusPolicy,
109 (XtConverter)WmCvtStringToCFocus, NULL, 0);
110 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRClientDecor,
111 (XtConverter)WmCvtStringToCDecor, NULL, 0);
112 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRClientFunction,
113 (XtConverter)WmCvtStringToCFunc, NULL, 0);
114 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRFrameStyle,
115 (XtConverter)WmCvtStringToFrameStyle, NULL, 0);
116 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRIconDecor,
117 (XtConverter)WmCvtStringToIDecor, NULL, 0);
118 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRIconPlacement,
119 (XtConverter)WmCvtStringToIPlace, NULL, 0);
120 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRKFocusPolicy,
121 (XtConverter)WmCvtStringToKFocus, NULL, 0);
122 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRSize,
123 (XtConverter)WmCvtStringToSize, NULL, 0);
124 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRShowFeedback,
125 (XtConverter)WmCvtStringToShowFeedback, NULL, 0);
126 XtAppAddConverter (wmGD.mwmAppContext, XtRString, WmRUsePPosition,
127 (XtConverter)WmCvtStringToUsePPosition, NULL, 0);
129 } /* END OF FUNCTION AddWmResourceConverters */
133 /*************************************<->*************************************
135 * WmCvtStringToAMBehavior (args, numArgs, fromVal, toVal)
140 * This function converts a string to an absent map behavior description.
145 * args = additional XrmValue arguments to the converter - NULL here
147 * numArgs = number of XrmValue arguments - 0 here
149 * fromVal = resource value to convert
154 * toVal = descriptor to use to return converted value
156 *************************************<->***********************************/
158 void WmCvtStringToAMBehavior (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
160 unsigned char *pch = (unsigned char *) (fromVal->addr);
161 unsigned char *pchNext;
164 Boolean fHit = False;
167 * Absent map behavior policies:
169 #define AMAP_BEHAVIOR_ADD_STR (unsigned char *)"add"
170 #define AMAP_BEHAVIOR_MOVE_STR (unsigned char *)"move"
171 #define AMAP_BEHAVIOR_IGNORE_STR (unsigned char *)"ignore"
174 * Convert the absent map behavior policy resource value:
177 if (*pch && NextToken (pch, &len, &pchNext))
179 if ((*pch == 'A') || (*pch == 'a'))
181 if (StringsAreEqual (pch, AMAP_BEHAVIOR_ADD_STR, len))
183 cval = AMAP_BEHAVIOR_ADD;
188 else if ((*pch == 'M') || (*pch == 'm'))
190 if (StringsAreEqual (pch, AMAP_BEHAVIOR_MOVE_STR, len))
192 cval = AMAP_BEHAVIOR_MOVE;
197 else if ((*pch == 'I') || (*pch == 'i'))
199 if (StringsAreEqual (pch, AMAP_BEHAVIOR_IGNORE_STR, len))
201 cval = AMAP_BEHAVIOR_IGNORE;
209 cval = AMAP_BEHAVIOR_ADD;
213 (*toVal).size = sizeof (int);
214 (*toVal).addr = (caddr_t)&cval;
217 } /* END OF FUNCTION WmCvtStringToAMBehavior */
221 /*************************************<->*************************************
223 * WmCvtStringToCFocus (args, numArgs, fromVal, toVal)
228 * This function converts a string to a colormap focus policy description.
233 * args = additional XrmValue arguments to the converter - NULL here
235 * numArgs = number of XrmValue arguments - 0 here
237 * fromVal = resource value to convert
242 * toVal = descriptor to use to return converted value
244 *************************************<->***********************************/
246 void WmCvtStringToCFocus (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
248 unsigned char *pch = (unsigned char *) (fromVal->addr);
249 unsigned char *pchNext;
252 Boolean fHit = False;
255 * Colormap focus policies:
258 #define CMAP_FOCUS_EXPLICIT_STR (unsigned char *)"explicit"
259 #define CMAP_FOCUS_KEYBOARD_STR (unsigned char *)"keyboard"
260 #define CMAP_FOCUS_POINTER_STR (unsigned char *)"pointer"
264 * Convert the colormap focus policy resource value:
267 if (*pch && NextToken (pch, &len, &pchNext))
269 if ((*pch == 'E') || (*pch == 'e'))
271 if (StringsAreEqual (pch, CMAP_FOCUS_EXPLICIT_STR, len))
273 cval = CMAP_FOCUS_EXPLICIT;
278 else if ((*pch == 'K') || (*pch == 'k'))
280 if (StringsAreEqual (pch, CMAP_FOCUS_KEYBOARD_STR, len))
282 cval = CMAP_FOCUS_KEYBOARD;
287 else if ((*pch == 'P') || (*pch == 'p'))
289 if (StringsAreEqual (pch, CMAP_FOCUS_POINTER_STR, len))
291 cval = CMAP_FOCUS_POINTER;
299 cval = CMAP_FOCUS_KEYBOARD;
303 (*toVal).size = sizeof (int);
304 (*toVal).addr = (caddr_t)&cval;
307 } /* END OF FUNCTION WmCvtStringToCFocus */
311 /*************************************<->*************************************
313 * WmCvtStringToCDecor (args, numArgs, fromVal, toVal)
318 * This function converts a string to a mwm client window frame decoration
324 * args = NULL (don't care)
326 * numArgs = 0 (don't care)
328 * fromVal = resource value to convert
333 * toVal = descriptor to use to return converted value
338 * o Accepts the following syntax:
340 * CDecor ::= [sign] decor_spec [decor_spec ...]
342 * sign ::= ['+' | '-']
344 * decor_spec ::= [sign] decor_name
346 * decor_name ::= "all" | "none" | "title" | "titlebar" |
347 * "menu" | "minimize" | "maximize" | "resize"
349 *************************************<->***********************************/
351 void WmCvtStringToCDecor (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
353 unsigned char *pch = (unsigned char *) (fromVal->addr);
354 unsigned char *pchNext;
357 Boolean fHit = False;
358 Boolean fAddNext = True;
360 * Client decoration parts:
363 #define WM_DECOR_ALL_STR (unsigned char *)"all"
364 #define WM_DECOR_NONE_STR (unsigned char *)"none"
365 #define WM_DECOR_BORDER_STR (unsigned char *)"border"
366 #define WM_DECOR_RESIZEH_STR (unsigned char *)"resizeh"
367 #define WM_DECOR_TITLE_STR (unsigned char *)"title"
368 #define WM_DECOR_TITLEBAR_STR (unsigned char *)"titlebar"
369 #define WM_DECOR_MINIMIZE_STR (unsigned char *)"minimize"
370 #define WM_DECOR_MAXIMIZE_STR (unsigned char *)"maximize"
371 #define WM_DECOR_MENU_STR (unsigned char *)"menu"
372 #define WM_DECOR_RESIZE_STR (unsigned char *)"resize"
375 * Check first token. If '-' we subtract from all decoration.
376 * Otherwise, we start with no decoration and add things in.
379 (NextToken (pch, &len, &pchNext)) &&
387 cval = WM_DECOR_NONE;
391 while (*pch && NextToken(pch, &len, &pchNext))
394 * Strip off "sign" if prepended to another token, and process
395 * that token the next time through.
407 else if (*pch == '-')
416 else if ((*pch == 'A') || (*pch == 'a'))
418 if (StringsAreEqual(pch, WM_DECOR_ALL_STR,len))
420 cval = fAddNext ? (cval | WM_DECOR_ALL) :
421 (cval & ~WM_DECOR_ALL);
426 else if ((*pch == 'N') || (*pch == 'n'))
428 if (StringsAreEqual(pch, WM_DECOR_NONE_STR,len))
430 /* don't bother adding or subtracting nothing */
435 else if ((*pch == 'T') || (*pch == 't'))
437 if (StringsAreEqual(pch, WM_DECOR_TITLE_STR,len))
439 cval = fAddNext ? (cval | WM_DECOR_TITLE) :
440 (cval & ~WM_DECOR_TITLEBAR);
443 else if (StringsAreEqual(pch, WM_DECOR_TITLEBAR_STR,len))
445 cval = fAddNext ? (cval | WM_DECOR_TITLEBAR) :
446 (cval & ~WM_DECOR_TITLEBAR);
451 else if ((*pch == 'M') || (*pch == 'm'))
453 if (StringsAreEqual(pch, WM_DECOR_MINIMIZE_STR,len))
455 cval = fAddNext ? (cval | WM_DECOR_MINIMIZE) :
456 (cval & ~MWM_DECOR_MINIMIZE);
459 else if (StringsAreEqual(pch, WM_DECOR_MAXIMIZE_STR,len))
461 cval = fAddNext ? (cval | WM_DECOR_MAXIMIZE) :
462 (cval & ~MWM_DECOR_MAXIMIZE);
465 else if (StringsAreEqual(pch, WM_DECOR_MENU_STR,len))
467 cval = fAddNext ? (cval | WM_DECOR_SYSTEM) :
468 (cval & ~MWM_DECOR_MENU);
473 else if ((*pch == 'R') || (*pch == 'r'))
475 if (StringsAreEqual(pch, WM_DECOR_RESIZE_STR,len) ||
476 StringsAreEqual(pch, WM_DECOR_RESIZEH_STR,len))
478 cval = fAddNext ? (cval | WM_DECOR_RESIZEH) :
479 (cval & ~MWM_DECOR_RESIZEH);
484 else if ((*pch == 'B') || (*pch == 'b'))
486 if (StringsAreEqual(pch, WM_DECOR_BORDER_STR,len))
488 cval = fAddNext ? (cval | WM_DECOR_BORDER) :
489 (cval & ~WM_DECOR_BORDER);
497 if (!fHit) cval = WM_DECOR_ALL;
499 (*toVal).size = sizeof (int);
500 (*toVal).addr = (caddr_t) &cval;
502 } /* END OF FUNCTION WmCvtStringToCDecor */
506 /*************************************<->*************************************
508 * WmCvtStringToCFunc (args, numArgs, fromVal, toVal)
513 * This function converts a string to a mwm client-applicable function
519 * args = NULL (don't care)
521 * numArgs = 0 (don't care)
523 * fromVal = resource value to convert
528 * toVal = descriptor to use to return converted value
533 * o Accepts the following syntax:
535 * CFunc ::= [sign] func_spec [func_spec ...]
537 * sign ::= ['+' | '-']
539 * func_spec ::= [sign] func_name
541 * func_name ::= "all" | "none" | "resize" | "move" | "minimize" |
542 * "maximize" | "close"
544 *************************************<->***********************************/
546 void WmCvtStringToCFunc (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
548 unsigned char *pch = (unsigned char *) (fromVal->addr);
549 unsigned char *pchNext;
552 Boolean fHit = False;
553 Boolean fAddNext = True;
556 * Client-applicable functions:
559 #define WM_FUNC_ALL_STR (unsigned char *)"all"
560 #define WM_FUNC_NONE_STR (unsigned char *)"none"
561 #define WM_FUNC_RESIZE_STR (unsigned char *)"resize"
562 #define WM_FUNC_MOVE_STR (unsigned char *)"move"
563 #define WM_FUNC_MINIMIZE_STR (unsigned char *)"minimize"
564 #define WM_FUNC_MAXIMIZE_STR (unsigned char *)"maximize"
565 #define WM_FUNC_CLOSE_STR (unsigned char *)"close"
568 * Check first token. If '-' we subtract from all functions.
569 * Otherwise, we start with no functions and add things in.
573 (NextToken (pch, &len, &pchNext)) &&
585 while (*pch && NextToken(pch, &len, &pchNext))
588 * Strip off "sign" if prepended to another token, and process
589 * that token the next time through.
601 else if (*pch == '-')
610 else if ((*pch == 'A') || (*pch == 'a'))
612 if (StringsAreEqual(pch, WM_FUNC_ALL_STR,len))
614 cval = fAddNext ? (cval | WM_FUNC_ALL) :
615 (cval & ~WM_FUNC_ALL);
620 else if ((*pch == 'N') || (*pch == 'n'))
622 if (StringsAreEqual(pch, WM_FUNC_NONE_STR,len))
624 /* don't bother adding or subtracting nothing */
629 else if ((*pch == 'R') || (*pch == 'r'))
631 if (StringsAreEqual(pch, WM_FUNC_RESIZE_STR,len))
633 cval = fAddNext ? (cval | MWM_FUNC_RESIZE) :
634 (cval & ~MWM_FUNC_RESIZE);
639 else if ((*pch == 'M') || (*pch == 'm'))
641 if (StringsAreEqual(pch, WM_FUNC_MINIMIZE_STR,len))
643 cval = fAddNext ? (cval | MWM_FUNC_MINIMIZE) :
644 (cval & ~MWM_FUNC_MINIMIZE);
647 else if (StringsAreEqual(pch, WM_FUNC_MAXIMIZE_STR,len))
649 cval = fAddNext ? (cval | MWM_FUNC_MAXIMIZE) :
650 (cval & ~MWM_FUNC_MAXIMIZE);
653 else if (StringsAreEqual(pch, WM_FUNC_MOVE_STR,len))
655 cval = fAddNext ? (cval | MWM_FUNC_MOVE) :
656 (cval & ~MWM_FUNC_MOVE);
661 else if ((*pch == 'C') || (*pch == 'c'))
663 if (StringsAreEqual(pch, WM_FUNC_CLOSE_STR,len))
665 cval = fAddNext ? (cval | MWM_FUNC_CLOSE) :
666 (cval & ~MWM_FUNC_CLOSE);
674 if (!fHit) cval = WM_FUNC_ALL;
676 (*toVal).size = sizeof (int);
677 (*toVal).addr = (caddr_t) &cval;
679 } /* END OF FUNCTION WmCvtStringToCFunc */
682 /*************************************<->*************************************
684 * WmCvtStringToFrameStyle (args, numArgs, fromVal, toVal)
689 * This function converts a string to a frame style description.
694 * args = NULL (don't care)
696 * numArgs = 0 (don't care)
698 * fromVal = resource value to convert
703 * toVal = descriptor to use to return converted value
705 *************************************<->***********************************/
707 void WmCvtStringToFrameStyle (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
709 unsigned char *pch = (unsigned char *) (fromVal->addr);
710 unsigned char *pchNext;
712 static FrameStyle frameStyle;
713 Boolean fHit = False;
716 #define FRAME_STYLE_RECESSED_STR (unsigned char *)"recessed"
717 #define FRAME_STYLE_SLAB_STR (unsigned char *)"slab"
720 * Convert the resource value:
723 if (*pch && NextToken (pch, &len, &pchNext))
725 if ((*pch == 'R') || (*pch == 'r'))
727 if (StringsAreEqual (pch, FRAME_STYLE_RECESSED_STR, len))
729 frameStyle = WmRECESSED;
733 else if (StringsAreEqual (pch, FRAME_STYLE_SLAB_STR, len))
742 frameStyle = WmRECESSED;
745 (*toVal).size = sizeof (FrameStyle);
746 (*toVal).addr = (caddr_t)&frameStyle;
749 } /* END OF FUNCTION WmCvtStringToFrameStyle */
753 /*************************************<->*************************************
755 * WmCvtStringToIDecor (args, numArgs, fromVal, toVal)
760 * This function converts a string to an icon decoration description.
765 * args = NULL (don't care)
767 * numArgs = 0 (don't care)
769 * fromVal = resource value to convert
774 * toVal = descriptor to use to return converted value
776 *************************************<->***********************************/
778 void WmCvtStringToIDecor (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
780 unsigned char *pch = (unsigned char *) (fromVal->addr);
781 unsigned char *pchNext;
784 Boolean fHit = False;
787 * Icon decoration parts:
790 #define ICON_DECOR_IMAGE_STR (unsigned char *)"image"
791 #define ICON_DECOR_LABEL_STR (unsigned char *)"label"
792 #define ICON_DECOR_ACTIVE_LABEL_STR (unsigned char *)"activelabel"
796 * Convert the icon decoration resource value:
801 while (*pch && NextToken (pch, &len, &pchNext))
803 if ((*pch == 'A') || (*pch == 'a'))
805 if (StringsAreEqual (pch, ICON_DECOR_ACTIVE_LABEL_STR, len))
807 cval |= ICON_ACTIVE_LABEL_PART;
812 else if ((*pch == 'I') || (*pch == 'i'))
814 if (StringsAreEqual (pch, ICON_DECOR_IMAGE_STR, len))
816 cval |= ICON_IMAGE_PART;
821 else if ((*pch == 'L') || (*pch == 'l'))
823 if (StringsAreEqual (pch, ICON_DECOR_LABEL_STR, len))
825 cval |= ICON_LABEL_PART;
834 * If we didn't match anything or only have the active label
835 * (which is just a modifier) then give 'em the whole ball of wax.
837 if (!fHit || cval == ICON_ACTIVE_LABEL_PART)
839 cval = ICON_LABEL_PART | ICON_IMAGE_PART | ICON_ACTIVE_LABEL_PART;
843 (*toVal).size = sizeof (int);
844 (*toVal).addr = (caddr_t) &cval;
846 } /* END OF FUNCTION WmCvtStringToIDecor */
850 /*************************************<->*************************************
852 * WmCvtStringToIPlace (args, numArgs, fromVal, toVal)
857 * This function converts a string to an icon placement scheme description.
862 * args = NULL (don't care)
864 * numArgs = 0 (don't care)
866 * fromVal = resource value to convert
871 * toVal = descriptor to use to return converted value
873 *************************************<->***********************************/
875 void WmCvtStringToIPlace (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
877 unsigned char *pch = (unsigned char *) (fromVal->addr);
878 unsigned char *pchNext;
881 Boolean fPrimarySet = False;
882 Boolean fSecondarySet = False;
885 * Icon placement layout values:
888 #define ICON_PLACE_BOTTOM_STR (unsigned char *)"bottom"
889 #define ICON_PLACE_LEFT_STR (unsigned char *)"left"
890 #define ICON_PLACE_RIGHT_STR (unsigned char *)"right"
891 #define ICON_PLACE_TOP_STR (unsigned char *)"top"
892 #define ICON_PLACE_TIGHT_STR (unsigned char *)"tight"
896 * Convert the icon placement resource value:
901 while (*pch && NextToken (pch, &len, &pchNext))
903 if ((*pch == 'B') || (*pch == 'b'))
905 if (StringsAreEqual (pch, ICON_PLACE_BOTTOM_STR, len))
909 cval |= ICON_PLACE_BOTTOM_PRIMARY;
912 else if (!fSecondarySet)
915 (ICON_PLACE_BOTTOM_PRIMARY | ICON_PLACE_TOP_PRIMARY)))
917 cval |= ICON_PLACE_BOTTOM_SECONDARY;
918 fSecondarySet = True;
923 else if ((*pch == 'L') || (*pch == 'l'))
925 if (StringsAreEqual (pch, ICON_PLACE_LEFT_STR, len))
929 cval |= ICON_PLACE_LEFT_PRIMARY;
932 else if (!fSecondarySet)
935 (ICON_PLACE_LEFT_PRIMARY | ICON_PLACE_RIGHT_PRIMARY)))
937 cval |= ICON_PLACE_LEFT_SECONDARY;
938 fSecondarySet = True;
944 else if ((*pch == 'R') || (*pch == 'r'))
946 if (StringsAreEqual (pch, ICON_PLACE_RIGHT_STR, len))
950 cval |= ICON_PLACE_RIGHT_PRIMARY;
953 else if (!fSecondarySet)
956 (ICON_PLACE_RIGHT_PRIMARY | ICON_PLACE_LEFT_PRIMARY)))
958 cval |= ICON_PLACE_RIGHT_SECONDARY;
959 fSecondarySet = True;
965 else if ((*pch == 'T') || (*pch == 't'))
967 if (StringsAreEqual (pch, ICON_PLACE_TOP_STR, len))
971 cval |= ICON_PLACE_TOP_PRIMARY;
974 else if (!fSecondarySet)
977 (ICON_PLACE_TOP_PRIMARY | ICON_PLACE_BOTTOM_PRIMARY)))
979 cval |= ICON_PLACE_TOP_SECONDARY;
980 fSecondarySet = True;
985 else if (StringsAreEqual (pch, ICON_PLACE_TIGHT_STR, len))
987 cval |= ICON_PLACE_TIGHT;
996 cval = ICON_PLACE_LEFT_PRIMARY;
1000 if (cval & (ICON_PLACE_LEFT_PRIMARY | ICON_PLACE_RIGHT_PRIMARY))
1002 cval |= ICON_PLACE_BOTTOM_SECONDARY;
1006 cval |= ICON_PLACE_LEFT_SECONDARY;
1011 (*toVal).size = sizeof (int);
1012 (*toVal).addr = (caddr_t) &cval;
1014 } /* END OF FUNCTION WmCvtStringToIPlace */
1018 /*************************************<->*************************************
1020 * WmCvtStringToKFocus (args, numArgs, fromVal, toVal)
1025 * This function converts a string to a keyboard focus policy description.
1030 * args = NULL (don't care)
1032 * numArgs = 0 (don't care)
1034 * fromVal = resource value to convert
1039 * toVal = descriptor to use to return converted value
1041 *************************************<->***********************************/
1043 void WmCvtStringToKFocus (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
1045 unsigned char *pch = (unsigned char *) (fromVal->addr);
1046 unsigned char *pchNext;
1049 Boolean fHit = False;
1052 * Keyboard focus policies:
1055 #define KEYBOARD_FOCUS_EXPLICIT_STR (unsigned char *)"explicit"
1056 #define KEYBOARD_FOCUS_POINTER_STR (unsigned char *)"pointer"
1060 * Convert the keyboard focus policy resource value:
1063 if (*pch && NextToken (pch, &len, &pchNext))
1065 if ((*pch == 'E') || (*pch == 'e'))
1067 if (StringsAreEqual (pch, KEYBOARD_FOCUS_EXPLICIT_STR, len))
1069 cval = KEYBOARD_FOCUS_EXPLICIT;
1074 else if ((*pch == 'P') || (*pch == 'p'))
1076 if (StringsAreEqual (pch, KEYBOARD_FOCUS_POINTER_STR, len))
1078 cval = KEYBOARD_FOCUS_POINTER;
1086 cval = KEYBOARD_FOCUS_EXPLICIT;
1090 (*toVal).size = sizeof (int);
1091 (*toVal).addr = (caddr_t)&cval;
1094 } /* END OF FUNCTION WmCvtStringToKFocus */
1098 /*************************************<->*************************************
1100 * WmCvtStringToSize (args, numArgs, fromVal, toVal)
1105 * This function converts a string to a size description (<width>x<height>).
1110 * args = NULL (don't care)
1112 * numArgs = 0 (don't care)
1114 * fromVal = resource value to convert
1119 * toVal = descriptor to use to return converted value
1121 *************************************<->***********************************/
1123 void WmCvtStringToSize (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
1125 unsigned char *pch = (unsigned char *) (fromVal->addr);
1126 unsigned char *pchNext;
1131 * Convenience values for WmSize:
1134 #define VERTICAL_STR (unsigned char *)"vertical"
1135 #define HORIZONTAL_STR (unsigned char *)"horizontal"
1139 * Convert the size resource value. The syntax is "<width>[xX]<height>"
1140 * OR it is the string 'vertical' or 'horizontal'. It's kinda neat that
1141 * BIGSIZE is a legal Dimension so that we get vertical and horizontal
1150 cval.width = (int) DecStrToL (pch, &pchNext);
1151 if (!((cval.width == 0) && (pchNext == pch)))
1154 * Width was converted.
1155 * Check for a delimiter (must be 'x' or 'X'):
1159 if (*pch && ((*pch == 'x') || (*pch == 'X')))
1162 * Delimiter found now get the height:
1166 cval.height = (int) DecStrToL (pch, &pchNext);
1171 if (*pch && NextToken (pch, &len, &pchNext))
1173 if ((*pch == 'V') || (*pch == 'v'))
1175 if (StringsAreEqual (pch, VERTICAL_STR, len))
1177 cval.height = BIGSIZE;
1180 else if ((*pch == 'H') || (*pch == 'h'))
1182 if (StringsAreEqual (pch, HORIZONTAL_STR, len))
1184 cval.width = BIGSIZE;
1191 /* !!! check for the maximum maximum sizes !!! */
1193 (*toVal).size = sizeof (WHSize);
1194 (*toVal).addr = (caddr_t)&cval;
1197 } /* END OF FUNCTION WmCvtStringToSize */
1200 /*************************************<->*************************************
1202 * WmCvtStringToShowFeedback (args, numArgs, fromVal, toVal)
1207 * This function converts a string to a value for the showFeedback flag set.
1212 * args = NULL (don't care)
1214 * numArgs = 0 (don't care)
1216 * fromVal = resource value to convert
1221 * toVal = descriptor to use to return converted value
1223 *************************************<->***********************************/
1225 void WmCvtStringToShowFeedback (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
1227 unsigned char *pch = (unsigned char *) (fromVal->addr);
1228 unsigned char *pchNext;
1231 Boolean fHit = False;
1232 Boolean fAddNext = True;
1235 * Names of feedback options
1238 #define SHOW_FB_ALL_STR (unsigned char *)"all"
1239 #define SHOW_FB_BEHAVIOR_STR (unsigned char *)"behavior"
1240 #define SHOW_FB_KILL_STR (unsigned char *)"kill"
1241 #define SHOW_FB_MOVE_STR (unsigned char *)"move"
1242 #define SHOW_FB_NONE_STR (unsigned char *)"none"
1243 #define SHOW_FB_PLACEMENT_STR (unsigned char *)"placement"
1244 #define SHOW_FB_QUIT_STR (unsigned char *)"quit"
1245 #define SHOW_FB_RESIZE_STR (unsigned char *)"resize"
1246 #define SHOW_FB_RESTART_STR (unsigned char *)"restart"
1249 * Check first token. If '-' we subtract from all functions.
1250 * Otherwise, we start with no functions and add things in.
1254 (NextToken (pch, &len, &pchNext)) &&
1257 cval = WM_SHOW_FB_DEFAULT;
1262 cval = WM_SHOW_FB_NONE;
1267 * Convert the feedback option resource value:
1271 while (*pch && NextToken (pch, &len, &pchNext))
1274 * Strip off "sign" if prepended to another token, and process
1275 * that token the next time through.
1287 else if (*pch == '-')
1296 if ((*pch == 'A') || (*pch == 'a'))
1298 if (StringsAreEqual (pch, SHOW_FB_ALL_STR, len))
1300 cval = fAddNext ? (cval | WM_SHOW_FB_ALL) :
1301 (cval & ~WM_SHOW_FB_ALL);
1306 else if ((*pch == 'B') || (*pch == 'b'))
1308 if (StringsAreEqual (pch, SHOW_FB_BEHAVIOR_STR, len))
1310 cval = fAddNext ? (cval | WM_SHOW_FB_BEHAVIOR) :
1311 (cval & ~WM_SHOW_FB_BEHAVIOR);
1316 else if ((*pch == 'K') || (*pch == 'k'))
1318 if (StringsAreEqual (pch, SHOW_FB_KILL_STR, len))
1320 cval = fAddNext ? (cval | WM_SHOW_FB_KILL) :
1321 (cval & ~WM_SHOW_FB_KILL);
1326 else if ((*pch == 'M') || (*pch == 'm'))
1328 if (StringsAreEqual (pch, SHOW_FB_MOVE_STR, len))
1330 cval = fAddNext ? (cval | WM_SHOW_FB_MOVE) :
1331 (cval & ~WM_SHOW_FB_MOVE);
1336 else if ((*pch == 'N') || (*pch == 'n'))
1338 if (StringsAreEqual (pch, SHOW_FB_NONE_STR, len))
1340 /* don't bother adding or subtracting nothing */
1345 else if ((*pch == 'P') || (*pch == 'p'))
1347 if (StringsAreEqual (pch, SHOW_FB_PLACEMENT_STR, len))
1349 cval = fAddNext ? (cval | WM_SHOW_FB_PLACEMENT) :
1350 (cval & ~WM_SHOW_FB_PLACEMENT);
1355 else if ((*pch == 'Q') || (*pch == 'q'))
1357 if (StringsAreEqual (pch, SHOW_FB_QUIT_STR, len))
1359 cval = fAddNext ? (cval | WM_SHOW_FB_QUIT) :
1360 (cval & ~WM_SHOW_FB_QUIT);
1365 else if ((*pch == 'R') || (*pch == 'r'))
1367 if (StringsAreEqual (pch, SHOW_FB_RESIZE_STR, len))
1369 cval = fAddNext ? (cval | WM_SHOW_FB_RESIZE) :
1370 (cval & ~WM_SHOW_FB_RESIZE);
1373 else if (StringsAreEqual (pch, SHOW_FB_RESTART_STR, len))
1375 cval = fAddNext ? (cval | WM_SHOW_FB_RESTART) :
1376 (cval & ~WM_SHOW_FB_RESTART);
1386 * If we didn't match anything then set to default.
1390 cval = WM_SHOW_FB_DEFAULT;
1394 (*toVal).size = sizeof (int);
1395 (*toVal).addr = (caddr_t) &cval;
1397 } /* END OF FUNCTION WmCvtStringToShowFeedback */
1401 /*************************************<->*************************************
1403 * WmCvtStringToUsePPosition (args, numArgs, fromVal, toVal)
1408 * This function converts a string to a keyboard focus policy description.
1413 * args = NULL (don't care)
1415 * numArgs = 0 (don't care)
1417 * fromVal = resource value to convert
1422 * toVal = descriptor to use to return converted value
1424 *************************************<->***********************************/
1426 void WmCvtStringToUsePPosition (XrmValue *args, Cardinal numArgs, XrmValue *fromVal, XrmValue *toVal)
1428 unsigned char *pch = (unsigned char *) (fromVal->addr);
1429 unsigned char *pchNext;
1432 Boolean fHit = False;
1435 #define USE_PPOSITION_NONZERO_STR (unsigned char *)"nonzero"
1436 #define USE_PPOSITION_ON_STR (unsigned char *)"on"
1437 #define USE_PPOSITION_OFF_STR (unsigned char *)"off"
1440 * Convert the use PPosition resource value:
1443 if (*pch && NextToken (pch, &len, &pchNext))
1445 if ((*pch == 'N') || (*pch == 'n'))
1447 if (StringsAreEqual (pch, USE_PPOSITION_NONZERO_STR, len))
1449 cval = USE_PPOSITION_NONZERO;
1453 else if (StringsAreEqual (pch, USE_PPOSITION_OFF_STR, len))
1455 cval = USE_PPOSITION_OFF;
1458 else if (StringsAreEqual (pch, USE_PPOSITION_ON_STR, len))
1460 cval = USE_PPOSITION_ON;
1467 cval = USE_PPOSITION_NONZERO;
1470 (*toVal).size = sizeof (int);
1471 (*toVal).addr = (caddr_t)&cval;
1474 } /* END OF FUNCTION WmCvtStringToUsePPosition */
1477 /*************************************<->*************************************
1479 * NextToken (pchIn, pLen, ppchNext)
1489 * pchIn = pointer to start of next token
1494 * pLen = pointer to integer containing number of characters in next token
1495 * ppchNext = address of pointer to following token
1497 * Return = next token or NULL
1504 *************************************<->***********************************/
1506 unsigned char *NextToken (unsigned char *pchIn, int *pLen,
1507 unsigned char **ppchNext)
1509 unsigned char *pchR = pchIn;
1512 #ifndef NO_MULTIBYTE
1516 ((chlen = mblen((char *)pchIn, MB_CUR_MAX)) > 0) && (pchIn[0] != '\0');
1518 /* find end of word: requires singlebyte whitespace terminator */
1520 if ((chlen == 1) && isspace (*pchIn))
1528 for (i = 0; *pchIn && !isspace (*pchIn); i++, pchIn++)
1529 /* find end of word */
1534 /* skip to next word */
1535 ScanWhitespace (&pchIn);
1548 } /* END OF FUNCTION NextToken */
1552 /*************************************<->*************************************
1554 * StringsAreEqual (pch1, pch2, len)
1571 * Return = (Boolean) True iff strings match (case insensitive)
1578 *************************************<->***********************************/
1580 Boolean StringsAreEqual (unsigned char *pch1, unsigned char *pch2, int len)
1582 #ifndef NO_MULTIBYTE
1589 ((chlen1 = mbtowc (&wch1, (char *) pch1, MB_CUR_MAX)) > 0) &&
1590 ((chlen2 = mbtowc (&wch2, (char *) pch2, MB_CUR_MAX)) == chlen1) )
1593 /* singlebyte characters -- make case insensitive */
1595 if ((isupper (*pch1) ? tolower(*pch1) : *pch1) !=
1596 (isupper (*pch2) ? tolower(*pch2) : *pch2))
1602 /* multibyte characters */
1615 while (len && *pch1 && *pch2 &&
1616 ((isupper (*pch1) ? tolower(*pch1++) : *pch1++) ==
1617 (isupper (*pch2) ? tolower(*pch2++) : *pch2++)))
1625 } /* END OF StringsAreEqual */
1628 /*************************************<->*************************************
1631 * DecStrToL (str, ptr)
1636 * Converts a decimal string to a long.
1641 * str = character string
1646 * *ptr = pointer to character terminating str or str
1647 * Return = long value
1652 * Leading whitespace is ignored.
1653 * Returns long value with *ptr pointing at character terminating the decimal
1655 * Returns 0 with *ptr == str if no integer can be formed.
1657 *************************************<->***********************************/
1659 long DecStrToL (unsigned char *str, unsigned char **ptr)
1664 #ifndef NO_MULTIBYTE
1665 while ((mblen ((char *)str, MB_CUR_MAX) == 1) && isspace (*str))
1667 while (isspace (*str))
1669 /* Ignore leading whitespace */
1674 /* If we can start, we will reset *ptr */
1675 #ifndef NO_MULTIBYTE
1676 if ((mblen ((char *)str, MB_CUR_MAX) == 1) && isdigit (*str))
1678 while ((mblen ((char *)str, MB_CUR_MAX) == 1) && isdigit (*str))
1682 while (isdigit (*str))
1685 val = val * 10 + (*str - '0');
1694 } /* END OF FUNCTION DecStrToL */