Blame lib/Xm/MapEvents.c

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
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: MapEvents.c /main/12 1995/09/19 23:05:22 cde-sun $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
/* (c) Copyright 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY  */
Packit b099d7
Packit b099d7
#include <X11/Intrinsic.h>
Packit b099d7
#include <X11/IntrinsicP.h>
Packit b099d7
#include <X11/Xutil.h>
Packit b099d7
#include <X11/Xatom.h>
Packit b099d7
#include <Xm/XmP.h>
Packit b099d7
#include "XmI.h"
Packit b099d7
#include "MapEventsI.h"
Packit b099d7
Packit b099d7
typedef String (*XmEventParseProc)(String str, 
Packit b099d7
				   unsigned int closure,
Packit b099d7
				   unsigned long *detail,
Packit b099d7
				   Boolean *status);
Packit b099d7
Packit b099d7
typedef struct {
Packit b099d7
   XmConst char    *event;
Packit b099d7
   XrmQuark         signature;
Packit b099d7
   int              eventType;
Packit b099d7
   XmEventParseProc parseProc;
Packit b099d7
   unsigned int     closure;
Packit b099d7
} EventKey;
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static int StrToHex( 
Packit b099d7
                        String str) ;
Packit b099d7
static int StrToOct( 
Packit b099d7
                        String str) ;
Packit b099d7
static int StrToNum( 
Packit b099d7
                        String str) ;
Packit b099d7
static void FillInQuarks( 
Packit b099d7
                        EventKey *table) ;
Packit b099d7
static Boolean LookupModifier( 
Packit b099d7
                        String name,
Packit b099d7
                        Modifiers *valueP) ;
Packit b099d7
static String ScanAlphanumeric( 
Packit b099d7
                        register String str) ;
Packit b099d7
static String ScanWhitespace( 
Packit b099d7
                        register String str) ;
Packit b099d7
static String ParseImmed( 
Packit b099d7
                        String str,
Packit b099d7
                        unsigned int closure,
Packit b099d7
                        unsigned long *detail,
Packit b099d7
			Boolean *status) ;
Packit b099d7
static String ParseKeySym( 
Packit b099d7
                        String str,
Packit b099d7
                        unsigned int closure,
Packit b099d7
                        unsigned long *detail,
Packit b099d7
			Boolean *status) ;
Packit b099d7
static String ParseModifiers( 
Packit b099d7
                        register String str,
Packit b099d7
                        Modifiers *modifiers,
Packit b099d7
                        Boolean *status) ;
Packit b099d7
static String ParseEventType( 
Packit b099d7
                        register String str,
Packit b099d7
                        EventKey *table,
Packit b099d7
                        int *eventType,
Packit b099d7
                        Cardinal *_index,
Packit b099d7
                        Boolean *status) ;
Packit b099d7
static String _MapEvent( 
Packit b099d7
                        register String str,
Packit b099d7
                        EventKey *table,
Packit b099d7
                        int *eventType,
Packit b099d7
                        unsigned long *detail,
Packit b099d7
                        Modifiers *modifiers,
Packit b099d7
			Boolean *status) ;
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
static EventKey modifierStrings[] = {
Packit b099d7
Packit b099d7
/* Modifier,	Quark,		Mask */
Packit b099d7
Packit b099d7
{"None",	NULLQUARK,	0,		NULL,		None},
Packit b099d7
{"Shift",	NULLQUARK,	0,		NULL,		ShiftMask},
Packit b099d7
{"Lock",	NULLQUARK,	0,		NULL,		LockMask},
Packit b099d7
{"Ctrl",	NULLQUARK,	0,		NULL,		ControlMask},
Packit b099d7
{"Meta",	NULLQUARK,	0,		NULL,		Mod1Mask},
Packit b099d7
{"Alt",		NULLQUARK,	0,		NULL,		Mod1Mask},
Packit b099d7
{"Mod1",	NULLQUARK,	0,		NULL,		Mod1Mask},
Packit b099d7
{"Mod2",	NULLQUARK,	0,		NULL,		Mod2Mask},
Packit b099d7
{"Mod3",	NULLQUARK,	0,		NULL,		Mod3Mask},
Packit b099d7
{"Mod4",	NULLQUARK,	0,		NULL,		Mod4Mask},
Packit b099d7
{"Mod5",	NULLQUARK,	0,		NULL,		Mod5Mask},
Packit b099d7
{NULL,		NULLQUARK,	0,		NULL,		0}};
Packit b099d7

Packit b099d7
static EventKey buttonEvents[] = {
Packit b099d7
Packit b099d7
/* Event Name,	Quark,		Event Type,	DetailProc,	Closure */
Packit b099d7
Packit b099d7
{"Btn1Down",	NULLQUARK,	ButtonPress,	ParseImmed,	Button1},
Packit b099d7
{"Button1",	NULLQUARK,	ButtonPress,	ParseImmed,	Button1},
Packit b099d7
{"Btn1",	NULLQUARK,	ButtonPress,	ParseImmed,	Button1},
Packit b099d7
{"Btn2Down",	NULLQUARK,	ButtonPress,	ParseImmed,	Button2},
Packit b099d7
{"Button2",	NULLQUARK,	ButtonPress,	ParseImmed,	Button2},
Packit b099d7
{"Btn2",	NULLQUARK,	ButtonPress,	ParseImmed,	Button2},
Packit b099d7
{"Btn3Down",	NULLQUARK,	ButtonPress,	ParseImmed,	Button3},
Packit b099d7
{"Button3",	NULLQUARK,	ButtonPress,	ParseImmed,	Button3},
Packit b099d7
{"Btn3",	NULLQUARK,	ButtonPress,	ParseImmed,	Button3},
Packit b099d7
{"Btn4Down",	NULLQUARK,	ButtonPress,	ParseImmed,	Button4},
Packit b099d7
{"Button4",	NULLQUARK,	ButtonPress,	ParseImmed,	Button4},
Packit b099d7
{"Btn4",	NULLQUARK,	ButtonPress,	ParseImmed,	Button4},
Packit b099d7
{"Btn5Down",	NULLQUARK,	ButtonPress,	ParseImmed,	Button5},
Packit b099d7
{"Button5",	NULLQUARK,	ButtonPress,	ParseImmed,	Button5},
Packit b099d7
{"Btn5",	NULLQUARK,	ButtonPress,	ParseImmed,	Button5},
Packit b099d7
{NULL,		NULLQUARK,	0,		NULL,		0}};
Packit b099d7
Packit b099d7
Packit b099d7
static EventKey keyEvents[] = {
Packit b099d7
Packit b099d7
/* Event Name,	Quark,		Event Type,	DetailProc	Closure */
Packit b099d7
Packit b099d7
{"KeyPress",	NULLQUARK,	KeyPress,	ParseKeySym,	0},
Packit b099d7
{"Key",		NULLQUARK,	KeyPress,	ParseKeySym,	0},
Packit b099d7
{"KeyDown",	NULLQUARK,	KeyPress,	ParseKeySym,	0},
Packit b099d7
{"KeyUp",	NULLQUARK,	KeyRelease,	ParseKeySym,	0},
Packit b099d7
{"KeyRelease",	NULLQUARK,	KeyRelease,	ParseKeySym,	0},
Packit b099d7
{NULL,		NULLQUARK,	0,		NULL,		0}};
Packit b099d7
Packit b099d7
static XmConst Modifiers buttonModifierMasks[] = {
Packit b099d7
    0, Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask
Packit b099d7
};
Packit b099d7
Packit b099d7
static Boolean initialized = FALSE;
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  Numeric convertion routines
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     StrToHex = Parse an ASCII string as a hexadecimal integer.
Packit b099d7
 *     StrToOct = Parse an ASCII string as an octal integer.
Packit b099d7
 *     StrToNum = Parse an ASCII string as a hex, octal or decimal integer
Packit b099d7
 *         based on leading "0", "0x", or "0X" characters.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     str = A null-terminated span of digits.
Packit b099d7
 *         StrToNum handles C prefix conventions (0d = octal, 0xd = hex),
Packit b099d7
 *	   but no other non-digits are allowed.
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     Returns -1 if conversion fails, otherwise the numeric value.
Packit b099d7
 *         Empty strings convert to 0.
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *     None.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static int 
Packit b099d7
StrToHex(
Packit b099d7
        String str )
Packit b099d7
{
Packit b099d7
    register char   c;
Packit b099d7
    register int    val = 0;
Packit b099d7
Packit b099d7
    while ((c = *str) != '\0') {
Packit b099d7
	if ('0' <= c && c <= '9') val = val*16+c-'0';
Packit b099d7
	else if ('a' <= c && c <= 'f') val = val*16+c-'a'+10;
Packit b099d7
	else if ('A' <= c && c <= 'F') val = val*16+c-'A'+10;
Packit b099d7
	else return -1;
Packit b099d7
	str++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return val;
Packit b099d7
}
Packit b099d7
Packit b099d7
static int 
Packit b099d7
StrToOct(
Packit b099d7
        String str )
Packit b099d7
{
Packit b099d7
    register char c;
Packit b099d7
    register int  val = 0;
Packit b099d7
Packit b099d7
    while ((c = *str) != '\0') {
Packit b099d7
        if ('0' <= c && c <= '7') val = val*8+c-'0'; else return -1;
Packit b099d7
	str++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return val;
Packit b099d7
}
Packit b099d7
Packit b099d7
static int 
Packit b099d7
StrToNum(
Packit b099d7
        String str )
Packit b099d7
{
Packit b099d7
    register char c;
Packit b099d7
    register int val = 0;
Packit b099d7
Packit b099d7
    if (*str == '0') {
Packit b099d7
	str++;
Packit b099d7
	if (*str == 'x' || *str == 'X') return StrToHex(++str);
Packit b099d7
	else return StrToOct(str);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    while ((c = *str) != '\0') {
Packit b099d7
	if ('0' <= c && c <= '9') val = val*10+c-'0';
Packit b099d7
	else return -1;
Packit b099d7
	str++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return val;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  FillInQuarks (EventKey *table)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Converts each string entry in the modifier/event tables to a
Packit b099d7
 *     quark, thus facilitating faster comparisons.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     table[*].event = strings to be converted (NULL at end of table).
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     table[*].signature = quarks for each string.
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *     XrmStringToQuark.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
FillInQuarks(
Packit b099d7
        EventKey *table )
Packit b099d7
{
Packit b099d7
    register int i;
Packit b099d7
Packit b099d7
    for (i=0; table[i].event; i++)
Packit b099d7
        table[i].signature = XrmPermStringToQuark(table[i].event);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  LookupModifier (name, *valueP)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Compare the passed in string to the list of valid modifiers.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     name = string to be located in the global modiferStrings table.
Packit b099d7
 *     (modiferStrings = global table of valid modifiers).
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     *valueP = closure of modifierString with a matching signature.
Packit b099d7
 *     Return value indicates whether a match was found.
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *     XrmStringToQuark.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static Boolean 
Packit b099d7
LookupModifier(
Packit b099d7
        String name,
Packit b099d7
        Modifiers *valueP )
Packit b099d7
{
Packit b099d7
    register int i;
Packit b099d7
    register XrmQuark signature = XrmStringToQuark(name);
Packit b099d7
Packit b099d7
    for (i=0; modifierStrings[i].event != NULL; i++)
Packit b099d7
	if (modifierStrings[i].signature == signature) {
Packit b099d7
	    *valueP = modifierStrings[i].closure;
Packit b099d7
	    return TRUE;
Packit b099d7
	}
Packit b099d7
Packit b099d7
    return FALSE;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ScanAlphanumeric (String str)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Scan string until a non-alphanumeric character is encountered.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     str = string to be scanned.
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     Return value points to the first non-alphanumeric character in str.
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static String 
Packit b099d7
ScanAlphanumeric(
Packit b099d7
        register String str )
Packit b099d7
{
Packit b099d7
    while (
Packit b099d7
        ('A' <= *str && *str <= 'Z') || ('a' <= *str && *str <= 'z')
Packit b099d7
	|| ('0' <= *str && *str <= '9')) str++;
Packit b099d7
    return str;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ScanWhitespace (String str)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Scan the string, skipping over all white space characters.
Packit b099d7
 *     Whitespace is defined as tab or space.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     str = the string to be scanned.
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     Return value points to the first non-whitespace character in str.
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static String 
Packit b099d7
ScanWhitespace(
Packit b099d7
        register String str )
Packit b099d7
{
Packit b099d7
    while (*str == ' ' || *str == '\t') str++;
Packit b099d7
    return str;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ParseImmed
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     An XmEventParseProc.  Copy closure into detail.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static String
Packit b099d7
ParseImmed(
Packit b099d7
        String str,
Packit b099d7
        unsigned int closure,
Packit b099d7
        unsigned long *detail,
Packit b099d7
	Boolean *status)
Packit b099d7
{
Packit b099d7
   *detail = closure;
Packit b099d7
   *status = TRUE;
Packit b099d7
   return str;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ParseKeySym (parameters)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     An XmeventParseProc.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static String
Packit b099d7
ParseKeySym(
Packit b099d7
        String str,
Packit b099d7
        unsigned int closure,
Packit b099d7
        unsigned long *detail,
Packit b099d7
	Boolean *status)
Packit b099d7
{
Packit b099d7
  char keySymName[100];
Packit b099d7
  char *start = str;
Packit b099d7
  
Packit b099d7
  /* Initialize the return values. */
Packit b099d7
  *detail = NoSymbol;
Packit b099d7
  *status = FALSE;
Packit b099d7
Packit b099d7
  str = ScanWhitespace(str);
Packit b099d7
  
Packit b099d7
  if (*str == '\\') {
Packit b099d7
    /* "\x"; interpret "x" as a Keysym. */
Packit b099d7
    str++;
Packit b099d7
    keySymName[0] = *str++;
Packit b099d7
    keySymName[1] = '\0';
Packit b099d7
    *detail = XStringToKeysym(keySymName);
Packit b099d7
  } else if (*str == ',' || *str == ':') {
Packit b099d7
    /* No detail; return a failure */
Packit b099d7
    return str;
Packit b099d7
  } else {
Packit b099d7
    while (*str != ',' &&
Packit b099d7
	   *str != ':' &&
Packit b099d7
	   *str != ' ' &&
Packit b099d7
	   *str != '\t' &&
Packit b099d7
	   *str != '\n' &&
Packit b099d7
	   *str != '\0') str++;
Packit b099d7
    (void) strncpy(keySymName, start, str-start);
Packit b099d7
    keySymName[str-start] = '\0';
Packit b099d7
    *detail = XStringToKeysym(keySymName);
Packit b099d7
  }
Packit b099d7
  
Packit b099d7
  if (*detail == NoSymbol)
Packit b099d7
    {
Packit b099d7
      if (( '0' <= keySymName[0]) && (keySymName[0] <= '9'))
Packit b099d7
	{
Packit b099d7
	  int retval = StrToNum(keySymName);
Packit b099d7
	  if (-1 == retval) 
Packit b099d7
	    {
Packit b099d7
              *detail = 0;
Packit b099d7
              return str;
Packit b099d7
	    }
Packit b099d7
	  else
Packit b099d7
	    {
Packit b099d7
	      *detail = retval;
Packit b099d7
	      *status = TRUE;
Packit b099d7
	      return str;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
      return str;
Packit b099d7
    }
Packit b099d7
  else
Packit b099d7
    {
Packit b099d7
      *status = TRUE;
Packit b099d7
      return str;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ParseModifiers (parameters)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Parse the string, extracting all modifier specifications.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static String 
Packit b099d7
ParseModifiers(
Packit b099d7
        register String str,
Packit b099d7
        Modifiers *modifiers,
Packit b099d7
        Boolean *status )
Packit b099d7
{
Packit b099d7
    register String start;
Packit b099d7
    char modStr[100];
Packit b099d7
    Boolean notFlag;
Packit b099d7
    Modifiers maskBit;
Packit b099d7
Packit b099d7
    /* Initially assume all is going to go well */
Packit b099d7
    *status = TRUE;
Packit b099d7
    *modifiers = 0;
Packit b099d7
 
Packit b099d7
    /* Attempt to parse the first button modifier */
Packit b099d7
    str = ScanWhitespace(str);
Packit b099d7
    start = str;
Packit b099d7
    str = ScanAlphanumeric(str);
Packit b099d7
    if (start != str) {
Packit b099d7
         (void) strncpy(modStr, start, str-start);
Packit b099d7
          modStr[str-start] = '\0';
Packit b099d7
          if (LookupModifier(modStr, &maskBit))
Packit b099d7
          {
Packit b099d7
	    if (maskBit== None) {
Packit b099d7
		*modifiers = 0;
Packit b099d7
                str = ScanWhitespace(str);
Packit b099d7
	        return str;
Packit b099d7
            }
Packit b099d7
         }
Packit b099d7
         str = start;
Packit b099d7
    }
Packit b099d7
Packit b099d7
   
Packit b099d7
    /* Keep parsing modifiers, until the event specifier is encountered */
Packit b099d7
    while ((*str != '<') && (*str != '\0')) {
Packit b099d7
        if (*str == '~') {
Packit b099d7
             notFlag = TRUE;
Packit b099d7
             str++;
Packit b099d7
          } else 
Packit b099d7
              notFlag = FALSE;
Packit b099d7
Packit b099d7
	start = str;
Packit b099d7
        str = ScanAlphanumeric(str);
Packit b099d7
        if (start == str) {
Packit b099d7
           /* ERROR: Modifier or '<' missing */
Packit b099d7
           *status = FALSE;
Packit b099d7
           return str;
Packit b099d7
        }
Packit b099d7
        (void) strncpy(modStr, start, str-start);
Packit b099d7
        modStr[str-start] = '\0';
Packit b099d7
Packit b099d7
        if (!LookupModifier(modStr, &maskBit))
Packit b099d7
        {
Packit b099d7
           /* Unknown modifier name */
Packit b099d7
           *status = FALSE;
Packit b099d7
           return str;
Packit b099d7
        }
Packit b099d7
Packit b099d7
	if (notFlag) 
Packit b099d7
           *modifiers &= ~maskBit;
Packit b099d7
	else 
Packit b099d7
           *modifiers |= maskBit;
Packit b099d7
        str = ScanWhitespace(str);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return str;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ParseEventType (parameters)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     xxxxxxxxxxxxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static String 
Packit b099d7
ParseEventType(
Packit b099d7
        register String str,
Packit b099d7
        EventKey *table,
Packit b099d7
        int *eventType,
Packit b099d7
        Cardinal *_index,
Packit b099d7
        Boolean *status )
Packit b099d7
{
Packit b099d7
    String start = str;
Packit b099d7
    char eventTypeStr[100];
Packit b099d7
    register Cardinal   i;
Packit b099d7
    register XrmQuark	signature;
Packit b099d7
Packit b099d7
    /* Parse out the event string */
Packit b099d7
    str = ScanAlphanumeric(str);
Packit b099d7
    (void) strncpy(eventTypeStr, start, str-start);
Packit b099d7
    eventTypeStr[str-start] = '\0';
Packit b099d7
Packit b099d7
    /* Attempt to match the parsed event against our supported event set */
Packit b099d7
    signature = XrmStringToQuark(eventTypeStr);
Packit b099d7
    for (i = 0; table[i].signature != NULLQUARK; i++)
Packit b099d7
        if (table[i].signature == signature)
Packit b099d7
        {
Packit b099d7
           *_index = i;
Packit b099d7
           *eventType = table[*_index].eventType;
Packit b099d7
Packit b099d7
           *status = TRUE;
Packit b099d7
           return str; 
Packit b099d7
        }
Packit b099d7
Packit b099d7
    /* Unknown event specified */
Packit b099d7
    *status = FALSE;
Packit b099d7
    return (str);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  _MapEvent (parameters)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     xxxxxxxxxxxxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static String
Packit b099d7
_MapEvent(
Packit b099d7
        register String str,
Packit b099d7
        EventKey *table,
Packit b099d7
        int *eventType,
Packit b099d7
        unsigned long *detail,
Packit b099d7
        Modifiers *modifiers,
Packit b099d7
	Boolean *status)
Packit b099d7
{
Packit b099d7
  Cardinal index;
Packit b099d7
  
Packit b099d7
  /* Initialize, if first time called */
Packit b099d7
  _XmProcessLock();
Packit b099d7
  if (!initialized)
Packit b099d7
    {
Packit b099d7
      initialized = TRUE;
Packit b099d7
      FillInQuarks (buttonEvents);
Packit b099d7
      FillInQuarks (modifierStrings);
Packit b099d7
      FillInQuarks (keyEvents);
Packit b099d7
    }
Packit b099d7
  _XmProcessUnlock();
Packit b099d7
  
Packit b099d7
  /* Parse the modifiers and the '<' */
Packit b099d7
  str = ParseModifiers(str, modifiers, status);
Packit b099d7
  if (*str != '<')
Packit b099d7
    *status = FALSE;
Packit b099d7
  if (*status == FALSE)
Packit b099d7
    return str;
Packit b099d7
  str++;
Packit b099d7
  
Packit b099d7
  /* Parse the event type and detail and the '>' */
Packit b099d7
  str = ParseEventType(str, table, eventType, &index, status);
Packit b099d7
  if (*str != '>')
Packit b099d7
    *status = FALSE;
Packit b099d7
  if (*status == FALSE)
Packit b099d7
    return str;
Packit b099d7
  str++;
Packit b099d7
  
Packit b099d7
  /* Save the detail */
Packit b099d7
  return ((*(table[index].parseProc))(str, table[index].closure,
Packit b099d7
				       detail, status));
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  _MapBtnEvent (parameters)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     xxxxxxxxxxxxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Boolean 
Packit b099d7
_XmMapBtnEvent(
Packit b099d7
        register String str,
Packit b099d7
        int *eventType,
Packit b099d7
        unsigned int *button,
Packit b099d7
        Modifiers *modifiers )
Packit b099d7
{
Packit b099d7
  Boolean status;
Packit b099d7
  unsigned long detail;
Packit b099d7
  _MapEvent (str, buttonEvents, eventType, &detail, modifiers, &status);
Packit b099d7
  *button = detail;
Packit b099d7
  if (status == FALSE)
Packit b099d7
    return (FALSE);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * The following is a fix for an X11 deficiency in regards to
Packit b099d7
   * modifiers in grabs.
Packit b099d7
   */
Packit b099d7
  if (*eventType == ButtonRelease)
Packit b099d7
    {
Packit b099d7
      /* the button that is going up will always be in the modifiers... */
Packit b099d7
      *modifiers |= buttonModifierMasks[*button];
Packit b099d7
    }
Packit b099d7
  
Packit b099d7
  return (TRUE);
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  _XmMapKeyEvents (parameters)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Parse a comma-separated list of key events.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
int
Packit b099d7
_XmMapKeyEvents(String      str,
Packit b099d7
		int       **eventTypes,
Packit b099d7
		KeySym    **keysyms,
Packit b099d7
		Modifiers **modifiers)
Packit b099d7
{
Packit b099d7
  Boolean status = TRUE;
Packit b099d7
  int count = 0;
Packit b099d7
  char *ptr = str;
Packit b099d7
Packit b099d7
  *eventTypes = NULL;
Packit b099d7
  *keysyms = NULL;
Packit b099d7
  *modifiers = NULL;
Packit b099d7
  while (status)
Packit b099d7
    {
Packit b099d7
      int       	tmp_type;
Packit b099d7
      unsigned long	tmp_sym;
Packit b099d7
      Modifiers 	tmp_mods;
Packit b099d7
Packit b099d7
      /* Parse a single event. */
Packit b099d7
      ptr = _MapEvent(ptr, keyEvents, &tmp_type, &tmp_sym, &tmp_mods, &status);
Packit b099d7
      if (!status)
Packit b099d7
	break;
Packit b099d7
Packit b099d7
      /* Save this event. */
Packit b099d7
      *eventTypes = (int *)
Packit b099d7
	XtRealloc((char*) *eventTypes, (count + 1) * sizeof(int));
Packit b099d7
      (*eventTypes)[count] = tmp_type;
Packit b099d7
      *keysyms = (KeySym *)
Packit b099d7
	XtRealloc((char*) *keysyms, (count + 1) * sizeof(KeySym));
Packit b099d7
      (*keysyms)[count] = (KeySym)tmp_sym;
Packit b099d7
      *modifiers = (Modifiers *)
Packit b099d7
	XtRealloc((char*) *modifiers, (count + 1) * sizeof(Modifiers));
Packit b099d7
      (*modifiers)[count] = tmp_mods;
Packit b099d7
      count++;
Packit b099d7
Packit b099d7
      /* Skip the separator. */
Packit b099d7
      ptr = ScanWhitespace(ptr);
Packit b099d7
      if (*ptr == '\0')
Packit b099d7
	break;
Packit b099d7
      else if (*ptr == ',')
Packit b099d7
	ptr++;
Packit b099d7
      else
Packit b099d7
	status = FALSE;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /* Discard partial results if something fails. */
Packit b099d7
  if (!status)
Packit b099d7
    {
Packit b099d7
      count = 0;
Packit b099d7
      XtFree((char*) *eventTypes);
Packit b099d7
      *eventTypes = NULL;
Packit b099d7
      XtFree((char*) *keysyms);
Packit b099d7
      *keysyms = NULL;
Packit b099d7
      XtFree((char*) *modifiers);
Packit b099d7
      *modifiers = NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  return count;
Packit b099d7
}
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  _XmMatchBtnEvent (parameters)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Compare the passed in event to the event described by the parameter
Packit b099d7
 *     list.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Boolean 
Packit b099d7
_XmMatchBtnEvent(
Packit b099d7
        XEvent *event,
Packit b099d7
        int eventType,
Packit b099d7
        unsigned int button,
Packit b099d7
        Modifiers modifiers )
Packit b099d7
{
Packit b099d7
   register Modifiers state = 
Packit b099d7
     event->xbutton.state & (ShiftMask | LockMask | ControlMask | Mod1Mask | 
Packit b099d7
			     Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask);
Packit b099d7
   if (((eventType == XmIGNORE_EVENTTYPE)||(event->type == eventType)) &&
Packit b099d7
       (event->xbutton.button == button) &&
Packit b099d7
       ((modifiers == AnyModifier)||(state == modifiers)) )
Packit b099d7
      return (TRUE);
Packit b099d7
   else
Packit b099d7
      return (FALSE);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  _XmMatchKeyEvent (parameters)
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *     Compare the passed in event to the event described by the parameter
Packit b099d7
 *     list.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *   Inputs:
Packit b099d7
 *   ------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 * 
Packit b099d7
 *   Outputs:
Packit b099d7
 *   -------
Packit b099d7
 *     xxxxxxxxxxxx = xxxxxxxxxxxxx
Packit b099d7
 *
Packit b099d7
 *   Procedures Called
Packit b099d7
 *   -----------------
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Boolean 
Packit b099d7
_XmMatchKeyEvent(
Packit b099d7
        XEvent *event,
Packit b099d7
        int eventType,
Packit b099d7
        unsigned int key,
Packit b099d7
        Modifiers modifiers )
Packit b099d7
{
Packit b099d7
#ifdef FIX_345
Packit b099d7
   register Modifiers state, mods; 
Packit b099d7
   
Packit b099d7
   _XmCheckInitModifiers();
Packit b099d7
Packit b099d7
   state = event->xkey.state & ~(LockMask|ScrollLockMask|NumLockMask);
Packit b099d7
   mods  = modifiers & ~(LockMask|ScrollLockMask|NumLockMask);
Packit b099d7
#endif   
Packit b099d7
   if ((event->type == eventType) &&
Packit b099d7
       (event->xkey.keycode == key) &&
Packit b099d7
#ifdef FIX_345
Packit b099d7
       (state == mods))
Packit b099d7
#else
Packit b099d7
       (event->xkey.state == modifiers))
Packit b099d7
#endif
Packit b099d7
      return (TRUE);
Packit b099d7
   else
Packit b099d7
      return (FALSE);
Packit b099d7
}