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