|
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 |
|