Blame lib/Xm/Direction.c

Packit b099d7
/* $XConsortium: Direction.c /main/6 1996/03/28 15:14:33 daniel $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 * 
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include "XmI.h"
Packit b099d7
#include <Xm/ManagerP.h>
Packit b099d7
#include <Xm/GadgetP.h>
Packit b099d7
#include <Xm/PrimitiveP.h>
Packit b099d7
#include <Xm/TraitP.h>
Packit b099d7
#include <Xm/LayoutT.h>
Packit b099d7
Packit b099d7
/*********************************************************************
Packit b099d7
 *
Packit b099d7
 * _XmDirectionDefault
Packit b099d7
 *    This procedure provides the dynamic resource default for
Packit b099d7
 *    the layout direction resource dependent on the parent's value.
Packit b099d7
 *
Packit b099d7
 *********************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
void 
Packit b099d7
_XmDirectionDefault(Widget widget,
Packit b099d7
		    int offset, /* unused */
Packit b099d7
		    XrmValue *value )
Packit b099d7
{
Packit b099d7
  static XmDirection direction;
Packit b099d7
  
Packit b099d7
  value->addr = (XPointer) &direction;
Packit b099d7
Packit b099d7
  /* This is an ugly hack, but what to do when user sets stringDirection
Packit b099d7
     in resource file. Dependent on that stringDirection comes before
Packit b099d7
     layoutDirection in resource list. Part of the reason is that this is
Packit b099d7
     the same field. Yuck! */
Packit b099d7
  if (XmIsManager(widget) && 
Packit b099d7
      (((XmManagerWidget)widget)->manager.string_direction !=
Packit b099d7
       XmSTRING_DIRECTION_DEFAULT))
Packit b099d7
    direction =
Packit b099d7
      XmStringDirectionToDirection(((XmManagerWidget)widget)->manager.
Packit b099d7
				   string_direction);
Packit b099d7
  else
Packit b099d7
    direction = _XmGetLayoutDirection(XtParent(widget));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
void 
Packit b099d7
_XmFromLayoutDirection(
Packit b099d7
        Widget wid,
Packit b099d7
        int resource_offset,	/* unused */
Packit b099d7
        XtArgVal *value )
Packit b099d7
{   
Packit b099d7
  if (XmIsManager(wid))
Packit b099d7
    *value = (XtArgVal)XmDirectionToStringDirection((XmDirection)*value);
Packit b099d7
  else if (XmIsLabel(wid) || XmIsLabelGadget(wid) || XmIsList(wid))
Packit b099d7
    *value = 
Packit b099d7
      (XtArgVal)XmDirectionToStringDirection(_XmGetLayoutDirection(wid));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
XmImportOperator 
Packit b099d7
_XmToLayoutDirection(
Packit b099d7
        Widget wid,
Packit b099d7
        int resource_offset,	/* unused */
Packit b099d7
        XtArgVal *value )
Packit b099d7
{   
Packit b099d7
  if (XmIsManager(wid)) {
Packit b099d7
    *value = (XtArgVal)XmStringDirectionToDirection((XmStringDirection)*value);
Packit b099d7
    return XmSYNTHETIC_LOAD;
Packit b099d7
  } else if (XmIsLabel(wid) || XmIsList(wid)) {
Packit b099d7
    XmPrim_layout_direction(((XmPrimitiveWidget)wid)) = 
Packit b099d7
      XmStringDirectionToDirection((XmStringDirection)*value);
Packit b099d7
    return XmSYNTHETIC_NONE;
Packit b099d7
  } else if (XmIsLabelGadget(wid)) {
Packit b099d7
    ((XmGadget)wid)->gadget.layout_direction = 
Packit b099d7
      XmStringDirectionToDirection((XmStringDirection)*value);
Packit b099d7
    return XmSYNTHETIC_NONE;
Packit b099d7
  }
Packit b099d7
  return XmSYNTHETIC_LOAD;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
XmStringDirection
Packit b099d7
XmDirectionToStringDirection(XmDirection dir)
Packit b099d7
{
Packit b099d7
  if (XmDirectionMatch(dir, XmLEFT_TO_RIGHT))
Packit b099d7
    return XmSTRING_DIRECTION_L_TO_R;
Packit b099d7
  else if (XmDirectionMatch(dir, XmRIGHT_TO_LEFT))
Packit b099d7
    return XmSTRING_DIRECTION_R_TO_L;
Packit b099d7
  return XmSTRING_DIRECTION_DEFAULT;
Packit b099d7
}
Packit b099d7

Packit b099d7
XmDirection
Packit b099d7
XmStringDirectionToDirection(XmStringDirection dir)
Packit b099d7
{
Packit b099d7
  switch (dir) {
Packit b099d7
  case XmSTRING_DIRECTION_L_TO_R:
Packit b099d7
    return XmLEFT_TO_RIGHT;
Packit b099d7
  case XmSTRING_DIRECTION_R_TO_L:
Packit b099d7
    return XmRIGHT_TO_LEFT;
Packit b099d7
  default:
Packit b099d7
    return XmDEFAULT_DIRECTION;
Packit b099d7
  }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
XmDirection
Packit b099d7
_XmGetLayoutDirection( Widget w )
Packit b099d7
{
Packit b099d7
  XmSpecifyLayoutDirectionTrait layoutT = NULL;
Packit b099d7
Packit b099d7
  while (w && !(layoutT = (XmSpecifyLayoutDirectionTrait)
Packit b099d7
		XmeTraitGet((XtPointer) XtClass(w),
Packit b099d7
			    XmQTspecifyLayoutDirection)))
Packit b099d7
    w = XtParent(w);
Packit b099d7
Packit b099d7
  if (w && layoutT && layoutT->get_direction)
Packit b099d7
    return layoutT->get_direction(w);
Packit b099d7
  else
Packit b099d7
    return XmLEFT_TO_RIGHT;
Packit b099d7
} 
Packit b099d7
Packit b099d7
Packit b099d7
/* Handle compatibility with XmStringDirection */
Packit b099d7
#define Fixdir(d) (((d) <= 1) ? (~((d)+1)) : ((d) | XmDIRECTION_IGNORED))
Packit b099d7
Packit b099d7
Boolean 
Packit b099d7
XmDirectionMatch(XmDirection d1,
Packit b099d7
		 XmDirection d2)
Packit b099d7
{
Packit b099d7
  d1 = Fixdir(d1);
Packit b099d7
  d2 = Fixdir(d2);
Packit b099d7
  return (((XmDirection)(d1 & d2) == (XmDirection)d1) ||
Packit b099d7
	  ((XmDirection)(d1 & d2) == (XmDirection)d2));
Packit b099d7
}
Packit b099d7
Packit b099d7
Boolean 
Packit b099d7
XmDirectionMatchPartial(XmDirection d1,
Packit b099d7
		 XmDirection d2,
Packit b099d7
		 XmDirection dmask)
Packit b099d7
{
Packit b099d7
  return XmDirectionMatch(d1 & dmask, d2 & dmask);
Packit b099d7
}
Packit b099d7