10cc2eac3Smrg/*
26c321187Smrg
36c321187SmrgCopyright 1989, 1998  The Open Group
46c321187Smrg
56c321187SmrgPermission to use, copy, modify, distribute, and sell this software and its
66c321187Smrgdocumentation for any purpose is hereby granted without fee, provided that
76c321187Smrgthe above copyright notice appear in all copies and that both that
86c321187Smrgcopyright notice and this permission notice appear in supporting
96c321187Smrgdocumentation.
106c321187Smrg
116c321187SmrgThe above copyright notice and this permission notice shall be included in
126c321187Smrgall copies or substantial portions of the Software.
136c321187Smrg
146c321187SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
156c321187SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
166c321187SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
176c321187SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
186c321187SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
196c321187SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
206c321187Smrg
216c321187SmrgExcept as contained in this notice, the name of The Open Group shall not be
226c321187Smrgused in advertising or otherwise to promote the sale, use or other dealings
236c321187Smrgin this Software without prior written authorization from The Open Group.
246c321187Smrg
256c321187Smrg*/
266c321187Smrg
276c321187Smrg#ifdef HAVE_CONFIG_H
286c321187Smrg#include <config.h>
296c321187Smrg#endif
306c321187Smrg#include <X11/Intrinsic.h>
316c321187Smrg#include <X11/Xmu/Converters.h>
326c321187Smrg#include <X11/Xmu/CharSet.h>
336c321187Smrg
346c321187Smrg#define done(address, type) \
356c321187Smrg{ (*toVal).size = sizeof(type); (*toVal).addr = (XPointer) address; }
366c321187Smrg
376c321187Smrg/*
386c321187Smrg * Initialization
396c321187Smrg */
406c321187Smrgstatic struct _namepair {
416c321187Smrg    XrmQuark quark;
420cc2eac3Smrg    _Xconst char *name;
436c321187Smrg    XtGravity gravity;
446c321187Smrg} names[] = {
456c321187Smrg    { NULLQUARK, XtEForget, ForgetGravity },
466c321187Smrg    { NULLQUARK, XtENorthWest, NorthWestGravity },
476c321187Smrg    { NULLQUARK, XtENorth, NorthGravity },
486c321187Smrg    { NULLQUARK, XtENorthEast, NorthEastGravity },
496c321187Smrg    { NULLQUARK, XtEWest, WestGravity },
506c321187Smrg    { NULLQUARK, XtECenter, CenterGravity },
516c321187Smrg    { NULLQUARK, XtEEast, EastGravity },
526c321187Smrg    { NULLQUARK, XtESouthWest, SouthWestGravity },
536c321187Smrg    { NULLQUARK, XtESouth, SouthGravity },
546c321187Smrg    { NULLQUARK, XtESouthEast, SouthEastGravity },
556c321187Smrg    { NULLQUARK, XtEStatic, StaticGravity },
566c321187Smrg    { NULLQUARK, XtEUnmap, UnmapGravity },
576c321187Smrg    { NULLQUARK, XtEleft, WestGravity },
586c321187Smrg    { NULLQUARK, XtEtop, NorthGravity },
596c321187Smrg    { NULLQUARK, XtEright, EastGravity },
606c321187Smrg    { NULLQUARK, XtEbottom, SouthGravity },
616c321187Smrg    { NULLQUARK, NULL, ForgetGravity }
626c321187Smrg};
636c321187Smrg
646c321187Smrg/*
650cc2eac3Smrg * This function is deprecated as of the addition of
666c321187Smrg * XtCvtStringToGravity in R6
676c321187Smrg */
686c321187Smrgvoid
696c321187SmrgXmuCvtStringToGravity(XrmValuePtr args, Cardinal *num_args,
706c321187Smrg		      XrmValuePtr fromVal, XrmValuePtr toVal)
716c321187Smrg{
726c321187Smrg  static Boolean haveQuarks = False;
736c321187Smrg  char name[10];
746c321187Smrg    XrmQuark q;
756c321187Smrg    struct _namepair *np;
766c321187Smrg
776c321187Smrg    if (*num_args != 0)
786c321187Smrg        XtWarningMsg("wrongParameters","cvtStringToGravity","XtToolkitError",
796c321187Smrg                  "String to Gravity conversion needs no extra arguments",
806c321187Smrg		 (String *)NULL, (Cardinal *)NULL);
816c321187Smrg
826c321187Smrg  if (!haveQuarks)
836c321187Smrg    {
846c321187Smrg      for (np = names; np->name; np++)
856c321187Smrg	np->quark = XrmPermStringToQuark(np->name);
866c321187Smrg      haveQuarks = True;
876c321187Smrg    }
886c321187Smrg
896c321187Smrg  XmuNCopyISOLatin1Lowered(name, (char *)fromVal->addr, sizeof(name));
906c321187Smrg  q = XrmStringToQuark(name);
916c321187Smrg
926c321187Smrg  for (np = names; np->name; np++)
936c321187Smrg    {
946c321187Smrg      if (np->quark == q)
956c321187Smrg	{
966c321187Smrg	  done(&np->gravity, XtGravity);
976c321187Smrg		return;
986c321187Smrg	    }
996c321187Smrg	}
1006c321187Smrg
1016c321187Smrg  XtStringConversionWarning((char *)fromVal->addr, XtRGravity);
1026c321187Smrg}
1036c321187Smrg
1046c321187Smrg/*ARGSUSED*/
1056c321187SmrgBoolean
1066c321187SmrgXmuCvtGravityToString(Display *dpy, XrmValue *args, Cardinal *num_args,
1076c321187Smrg		      XrmValue *fromVal, XrmValue *toVal, XtPointer *data)
1086c321187Smrg{
1099e7a9804Smrg  static const char *buffer;
1106c321187Smrg  Cardinal size;
1116c321187Smrg  struct _namepair *np;
1126c321187Smrg  XtGravity gravity;
1136c321187Smrg
1146c321187Smrg  gravity = *(XtGravity *)fromVal->addr;
1156c321187Smrg  buffer = NULL;
1166c321187Smrg  for (np = names; np->name; np++)
1176c321187Smrg    if (np->gravity == gravity)
1186c321187Smrg      {
1196c321187Smrg	buffer = np->name;
1206c321187Smrg	break;
1216c321187Smrg      }
1226c321187Smrg
1236c321187Smrg  if (!buffer)
1246c321187Smrg    {
1256c321187Smrg      XtAppWarning(XtDisplayToApplicationContext(dpy),
1266c321187Smrg		   "Cannot convert Gravity to String");
1276c321187Smrg      toVal->addr = NULL;
1286c321187Smrg      toVal->size = 0;
1296c321187Smrg
1306c321187Smrg      return (False);
1316c321187Smrg    }
1326c321187Smrg
1336c321187Smrg  size = strlen(buffer) + 1;
1346c321187Smrg  if (toVal->addr != NULL)
1356c321187Smrg    {
1366c321187Smrg      if (toVal->size <= size)
1376c321187Smrg	{
1386c321187Smrg	  toVal->size = size;
1396c321187Smrg	  return (False);
1406c321187Smrg	}
1416c321187Smrg      strcpy((char *)toVal->addr, buffer);
1426c321187Smrg    }
1436c321187Smrg  else
1446c321187Smrg    toVal->addr = (XPointer)buffer;
1456c321187Smrg  toVal->size = size;
1466c321187Smrg
1476c321187Smrg  return (True);
1486c321187Smrg}
149