|
Packit |
b099d7 |
/* $TOG: Trait.c /main/9 1997/07/07 11:36:10 cshi $ */
|
|
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 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/* #define DEBUG */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <X11/Xlib.h>
|
|
Packit |
b099d7 |
#include <X11/Xutil.h>
|
|
Packit |
b099d7 |
#include <X11/IntrinsicP.h>
|
|
Packit |
b099d7 |
#include <Xm/XmP.h>
|
|
Packit |
b099d7 |
#include <Xm/VendorSP.h>
|
|
Packit |
b099d7 |
#include <Xm/TraitP.h>
|
|
Packit |
b099d7 |
#include "HashI.h"
|
|
Packit |
b099d7 |
#include "TraitI.h"
|
|
Packit |
b099d7 |
#include "XmI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Internal data structures
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmHashTable TraitTable;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
typedef struct _XmTraitEntry {
|
|
Packit |
b099d7 |
XtPointer obj;
|
|
Packit |
b099d7 |
XrmQuark name;
|
|
Packit |
b099d7 |
} XmTraitEntryRec, *XmTraitEntry;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Static functions
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Boolean TraitCompare(XmHashKey, XmHashKey);
|
|
Packit |
b099d7 |
static XmHashValue TraitHash(XmHashKey);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* List all quarks here
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTmotifTrait = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTmenuSystem = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTtransfer = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTaccessTextual = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTmenuSavvy = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTnavigator = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTscrollFrame = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTactivatable = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTdialogShellSavvy = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTjoinSide = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTcareParentVisual = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTspecifyRenderTable = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTtakesDefault = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTcontainerItem = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTcontainer = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTspecifyLayoutDirection = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTaccessColors = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTspecifyUnitType = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTtraversalControl = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTspecifyUnhighlight = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTpointIn = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark _XmQTclipWindow = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTtoolTipConfig = NULLQUARK;
|
|
Packit |
b099d7 |
externaldef(traits) XrmQuark XmQTtoolTip = NULLQUARK;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Initialize traits system
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* This routine sets up all quarks used by the traits in
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void _XmInitializeTraits()
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* avoid initializing more than once */
|
|
Packit |
b099d7 |
if(TraitTable != NULL) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Create Hash Table */
|
|
Packit |
b099d7 |
TraitTable = _XmAllocHashTable(200, TraitCompare, TraitHash);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmQTmotifTrait = XrmPermStringToQuark("XmQTmotifTrait");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Menu system manipulation and status */
|
|
Packit |
b099d7 |
XmQTmenuSystem = XrmPermStringToQuark("XmTmenuSystem");
|
|
Packit |
b099d7 |
XmQTmenuSavvy = XrmPermStringToQuark("XmTmenuSavvy");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Transfer Trait */
|
|
Packit |
b099d7 |
XmQTtransfer = XrmPermStringToQuark("XmTtransfer");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* String get/set */
|
|
Packit |
b099d7 |
XmQTaccessTextual = XrmPermStringToQuark("XmTaccessTextual");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Navigator/Scrolling trait */
|
|
Packit |
b099d7 |
XmQTnavigator = XrmPermStringToQuark("XmTnavigator");
|
|
Packit |
b099d7 |
XmQTscrollFrame = XrmPermStringToQuark("XmTscrollFrame");
|
|
Packit |
b099d7 |
_XmQTclipWindow= XrmPermStringToQuark("_XmTclipWindow");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Activatable trait */
|
|
Packit |
b099d7 |
XmQTactivatable = XrmPermStringToQuark("XmTactivatable");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* JoinSide trait */
|
|
Packit |
b099d7 |
XmQTjoinSide = XrmPermStringToQuark("XmTjoinSide");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* DialogShellSavvy trait */
|
|
Packit |
b099d7 |
XmQTdialogShellSavvy = XrmPermStringToQuark("XmTdialogShellSavvy");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Care about Parent Visual trait */
|
|
Packit |
b099d7 |
XmQTcareParentVisual = XrmPermStringToQuark("XmTcareParentVisual");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* SpecifyRenderTable trait */
|
|
Packit |
b099d7 |
XmQTspecifyRenderTable = XrmPermStringToQuark("XmTspecifyRenderTable");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* TakesDefault trait */
|
|
Packit |
b099d7 |
XmQTtakesDefault = XrmPermStringToQuark("XmTtakesDefault");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Container/Item trait */
|
|
Packit |
b099d7 |
XmQTcontainerItem = XrmPermStringToQuark("XmTcontainerItem");
|
|
Packit |
b099d7 |
XmQTcontainer = XrmPermStringToQuark("XmTcontainer");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* LayoutDirection trait */
|
|
Packit |
b099d7 |
XmQTspecifyLayoutDirection =
|
|
Packit |
b099d7 |
XrmPermStringToQuark("XmTspecifyLayoutDirection");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* get colors */
|
|
Packit |
b099d7 |
XmQTaccessColors = XrmPermStringToQuark("XmTaccessColors");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Unit type */
|
|
Packit |
b099d7 |
XmQTspecifyUnitType = XrmPermStringToQuark("XmTspecifyUnitType");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Traversal control. */
|
|
Packit |
b099d7 |
XmQTtraversalControl = XrmPermStringToQuark("XmTtraversalControl");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Specify UnHighlight GC trait */
|
|
Packit |
b099d7 |
XmQTspecifyUnhighlight = XrmPermStringToQuark("XmTspecifyUnhighlight");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* PointIn trait */
|
|
Packit |
b099d7 |
XmQTpointIn = XrmPermStringToQuark("XmTpointIn");
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ToolTip traits */
|
|
Packit |
b099d7 |
XmQTtoolTipConfig = XrmPermStringToQuark("XmTtoolTipConfig");
|
|
Packit |
b099d7 |
XmQTtoolTip = XrmPermStringToQuark("XmTtoolTip");
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtPointer
|
|
Packit |
b099d7 |
XmeTraitGet(XtPointer obj, XrmQuark name)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtPointer trait;
|
|
Packit |
b099d7 |
XmTraitEntryRec entry;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
entry.obj = obj;
|
|
Packit |
b099d7 |
entry.name = name;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
trait = _XmGetHashEntry(TraitTable, &entry);
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(trait);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
XmeTraitSet(XtPointer object, XrmQuark name, XtPointer data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTraitEntry entry;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Create key, this will be freed if the record is removed */
|
|
Packit |
b099d7 |
entry = (XmTraitEntry) XtMalloc(sizeof(XmTraitEntryRec));
|
|
Packit |
b099d7 |
entry -> obj = object;
|
|
Packit |
b099d7 |
entry -> name = name;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
if (data != NULL) {
|
|
Packit |
b099d7 |
_XmAddHashEntry(TraitTable, entry, data);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else { /* if data == NULL then remove the context */
|
|
Packit |
b099d7 |
XtPointer key;
|
|
Packit |
b099d7 |
key = _XmRemoveHashEntry(TraitTable, entry);
|
|
Packit |
b099d7 |
XtFree((char*) entry);
|
|
Packit |
b099d7 |
XtFree((char*) key);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
TraitCompare(XmHashKey key1, XmHashKey key2)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTraitEntry entry1, entry2;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
entry1 = (XmTraitEntry) key1;
|
|
Packit |
b099d7 |
entry2 = (XmTraitEntry) key2;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(entry1 -> obj == entry2 -> obj &&
|
|
Packit |
b099d7 |
entry1 -> name == entry2 -> name);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XmHashValue
|
|
Packit |
b099d7 |
TraitHash(XmHashKey key)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmTraitEntry entry = (XmTraitEntry) key;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(((long) entry -> obj) + ((long) entry -> name));
|
|
Packit |
b099d7 |
}
|