"Button5", Button5Mask, 0,
"Mod1", Mod1Mask, 0,
"M1", Mod1Mask, 0,
- "Meta", Mod1Mask, 0,
- "M", Mod1Mask, 0,
+ "Meta", META_MASK, 0,
+ "M", META_MASK, 0,
"Mod2", Mod2Mask, 0,
"M2", Mod2Mask, 0,
- "Alt", Mod2Mask, 0,
+ "Alt", ALT_MASK, 0,
"Mod3", Mod3Mask, 0,
"M3", Mod3Mask, 0,
"Mod4", Mod4Mask, 0,
static char * GetField _ANSI_ARGS_((char *p, char *copy, int size));
static KeySym GetKeySym _ANSI_ARGS_((TkDisplay *dispPtr,
XEvent *eventPtr));
-static PatSeq * MatchPatterns _ANSI_ARGS_((BindingTable *bindPtr,
- PatSeq *psPtr));
+static PatSeq * MatchPatterns _ANSI_ARGS_((TkDisplay *dispPtr,
+ BindingTable *bindPtr, PatSeq *psPtr));
\f
/*
*--------------------------------------------------------------
*--------------------------------------------------------------
*/
-Tk_BindingTable
-Tk_CreateBindingTable(interp)
- Tcl_Interp *interp; /* Interpreter to associate with the binding
+Tk_BindingTable
+Tk_CreateBindingTable (
+ Tcl_Interp *interp /* Interpreter to associate with the binding
* table: commands are executed in this
* interpreter. */
+)
{
register BindingTable *bindPtr;
int i;
*--------------------------------------------------------------
*/
-void
-Tk_DeleteBindingTable(bindingTable)
- Tk_BindingTable bindingTable; /* Token for the binding table to
+void
+Tk_DeleteBindingTable (
+ Tk_BindingTable bindingTable /* Token for the binding table to
* destroy. */
+)
{
BindingTable *bindPtr = (BindingTable *) bindingTable;
PatSeq *psPtr, *nextPtr;
*--------------------------------------------------------------
*/
-unsigned long
-Tk_CreateBinding(interp, bindingTable, object, eventString, command, append)
- Tcl_Interp *interp; /* Used for error reporting. */
- Tk_BindingTable bindingTable; /* Table in which to create binding. */
- ClientData object; /* Token for object with which binding
+unsigned long
+Tk_CreateBinding (
+ Tcl_Interp *interp, /* Used for error reporting. */
+ Tk_BindingTable bindingTable, /* Table in which to create binding. */
+ ClientData object, /* Token for object with which binding
* is associated. */
- char *eventString; /* String describing event sequence
+ char *eventString, /* String describing event sequence
* that triggers binding. */
- char *command; /* Contains Tcl command to execute
+ char *command, /* Contains Tcl command to execute
* when binding triggers. */
- int append; /* 0 means replace any existing
+ int append /* 0 means replace any existing
* binding for eventString; 1 means
* append to that binding. */
+)
{
BindingTable *bindPtr = (BindingTable *) bindingTable;
register PatSeq *psPtr;
*--------------------------------------------------------------
*/
-int
-Tk_DeleteBinding(interp, bindingTable, object, eventString)
- Tcl_Interp *interp; /* Used for error reporting. */
- Tk_BindingTable bindingTable; /* Table in which to delete binding. */
- ClientData object; /* Token for object with which binding
+int
+Tk_DeleteBinding (
+ Tcl_Interp *interp, /* Used for error reporting. */
+ Tk_BindingTable bindingTable, /* Table in which to delete binding. */
+ ClientData object, /* Token for object with which binding
* is associated. */
- char *eventString; /* String describing event sequence
+ char *eventString /* String describing event sequence
* that triggers binding. */
+)
{
BindingTable *bindPtr = (BindingTable *) bindingTable;
register PatSeq *psPtr, *prevPtr;
*/
char *
-Tk_GetBinding(interp, bindingTable, object, eventString)
- Tcl_Interp *interp; /* Interpreter for error reporting. */
- Tk_BindingTable bindingTable; /* Table in which to look for
+Tk_GetBinding (
+ Tcl_Interp *interp, /* Interpreter for error reporting. */
+ Tk_BindingTable bindingTable, /* Table in which to look for
* binding. */
- ClientData object; /* Token for object with which binding
+ ClientData object, /* Token for object with which binding
* is associated. */
- char *eventString; /* String describing event sequence
+ char *eventString /* String describing event sequence
* that triggers binding. */
+)
{
BindingTable *bindPtr = (BindingTable *) bindingTable;
register PatSeq *psPtr;
*--------------------------------------------------------------
*/
-void
-Tk_GetAllBindings(interp, bindingTable, object)
- Tcl_Interp *interp; /* Interpreter for error reporting. */
- Tk_BindingTable bindingTable; /* Table in which to look for
+void
+Tk_GetAllBindings (
+ Tcl_Interp *interp, /* Interpreter for error reporting. */
+ Tk_BindingTable bindingTable, /* Table in which to look for
* bindings. */
- ClientData object; /* Token for object. */
+ ClientData object /* Token for object. */
+)
{
BindingTable *bindPtr = (BindingTable *) bindingTable;
*--------------------------------------------------------------
*/
-void
-Tk_DeleteAllBindings(bindingTable, object)
- Tk_BindingTable bindingTable; /* Table in which to delete
+void
+Tk_DeleteAllBindings (
+ Tk_BindingTable bindingTable, /* Table in which to delete
* bindings. */
- ClientData object; /* Token for object. */
+ ClientData object /* Token for object. */
+)
{
BindingTable *bindPtr = (BindingTable *) bindingTable;
register PatSeq *psPtr, *prevPtr;
*--------------------------------------------------------------
*/
-void
-Tk_BindEvent(bindingTable, eventPtr, tkwin, numObjects, objectPtr)
- Tk_BindingTable bindingTable; /* Table in which to look for
+void
+Tk_BindEvent (
+ Tk_BindingTable bindingTable, /* Table in which to look for
* bindings. */
- XEvent *eventPtr; /* What actually happened. */
- Tk_Window tkwin; /* Window on display where event
+ XEvent *eventPtr, /* What actually happened. */
+ Tk_Window tkwin, /* Window on display where event
* occurred (needed in order to
* locate display information). */
- int numObjects; /* Number of objects at *objectPtr. */
- ClientData *objectPtr; /* Array of one or more objects
+ int numObjects, /* Number of objects at *objectPtr. */
+ ClientData *objectPtr /* Array of one or more objects
* to check for a matching binding. */
+)
{
BindingTable *bindPtr = (BindingTable *) bindingTable;
TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
key.detail = detail;
hPtr = Tcl_FindHashEntry(&bindPtr->patternTable, (char *) &key);
if (hPtr != NULL) {
- matchPtr = MatchPatterns(bindPtr,
+ matchPtr = MatchPatterns(dispPtr, bindPtr,
(PatSeq *) Tcl_GetHashValue(hPtr));
}
if ((detail != 0) && (matchPtr == NULL)) {
key.detail = 0;
hPtr = Tcl_FindHashEntry(&bindPtr->patternTable, (char *) &key);
if (hPtr != NULL) {
- matchPtr = MatchPatterns(bindPtr,
+ matchPtr = MatchPatterns(dispPtr, bindPtr,
(PatSeq *) Tcl_GetHashValue(hPtr));
}
}
*/
static PatSeq *
-FindSequence(interp, bindPtr, object, eventString, create, maskPtr)
- Tcl_Interp *interp; /* Interpreter to use for error
+FindSequence (
+ Tcl_Interp *interp, /* Interpreter to use for error
* reporting. */
- BindingTable *bindPtr; /* Table to use for lookup. */
- ClientData object; /* Token for object(s) with which binding
+ BindingTable *bindPtr, /* Table to use for lookup. */
+ ClientData object, /* Token for object(s) with which binding
* is associated. */
- char *eventString; /* String description of pattern to
+ char *eventString, /* String description of pattern to
* match on. See user documentation
* for details. */
- int create; /* 0 means don't create the entry if
+ int create, /* 0 means don't create the entry if
* it doesn't already exist. Non-zero
* means create. */
- unsigned long *maskPtr; /* *maskPtr is filled in with the event
+ unsigned long *maskPtr /* *maskPtr is filled in with the event
* types on which this pattern sequence
* depends. */
+)
{
Pattern pats[EVENT_BUFFER_SIZE];
*/
static char *
-GetField(p, copy, size)
- register char *p; /* Pointer to part of pattern. */
- register char *copy; /* Place to copy field. */
- int size; /* Maximum number of characters to
+GetField (
+ register char *p, /* Pointer to part of pattern. */
+ register char *copy, /* Place to copy field. */
+ int size /* Maximum number of characters to
* copy. */
+)
{
while ((*p != '\0') && !isspace(*p) && (*p != '>')
&& (*p != '-') && (size > 1)) {
*----------------------------------------------------------------------
*/
-static KeySym
-GetKeySym(dispPtr, eventPtr)
- register TkDisplay *dispPtr; /* Display in which to
+static KeySym
+GetKeySym (
+ register TkDisplay *dispPtr, /* Display in which to
* map keycode. */
- register XEvent *eventPtr; /* Description of X event. */
+ register XEvent *eventPtr /* Description of X event. */
+)
{
KeySym *symPtr;
KeySym sym;
*/
static PatSeq *
-MatchPatterns(bindPtr, psPtr)
- BindingTable *bindPtr; /* Information about binding table, such
+MatchPatterns (
+ TkDisplay *dispPtr,
+ BindingTable *bindPtr, /* Information about binding table, such
* as ring of recent events. */
- register PatSeq *psPtr; /* List of pattern sequences. */
+ register PatSeq *psPtr /* List of pattern sequences. */
+)
{
register PatSeq *bestPtr = NULL;
if (ringCount <= 0) {
goto nextSequence;
}
- if (eventPtr->xany.window != window) {
- goto nextSequence;
- }
if (eventPtr->xany.type != patPtr->eventType) {
/*
* If the event is a mouse motion, button release,
|| (eventPtr->xany.type == ButtonRelease)
|| (eventPtr->xany.type == KeyRelease)
|| (eventPtr->xany.type == NoExpose)
+ || (eventPtr->xany.type == EnterNotify)
+ || (eventPtr->xany.type == LeaveNotify)
|| (eventPtr->xany.type == GraphicsExpose)) {
goto nextEvent;
}
goto nextSequence;
}
+ if (eventPtr->xany.window != window) {
+ goto nextSequence;
+ }
flags = flagArray[eventPtr->type];
if (flags & KEY_BUTTON_MOTION) {
} else {
state = 0;
}
- if ((state & patPtr->needMods)
- != patPtr->needMods) {
- goto nextSequence;
+ if (patPtr->needMods != 0) {
+ int modMask = patPtr->needMods;
+
+ if (!dispPtr->metaModMask && !dispPtr->altModMask && !dispPtr->modeModMask) {
+ int i, max;
+ XModifierKeymap *modMapPtr;
+ KeyCode *codePtr;
+ KeySym keysym;
+
+ modMapPtr = XGetModifierMapping(dispPtr->display);
+ codePtr = modMapPtr->modifiermap;
+ max = 8*modMapPtr->max_keypermod;
+
+ for (i = 0; i < max; i++, codePtr++) {
+ if (*codePtr == 0) {
+ continue;
+ }
+ keysym = XKeycodeToKeysym(dispPtr->display, *codePtr, 0);
+ if (keysym == XK_Mode_switch) {
+ dispPtr->modeModMask |= ShiftMask << (i/modMapPtr->max_keypermod);
+ }
+ if ((keysym == XK_Meta_L) || (keysym == XK_Meta_R)) {
+ dispPtr->metaModMask |= ShiftMask << (i/modMapPtr->max_keypermod);
+ }
+ if ((keysym == XK_Alt_L) || (keysym == XK_Alt_R)) {
+ dispPtr->altModMask |= ShiftMask << (i/modMapPtr->max_keypermod);
+ }
+ }
+ }
+ if ((modMask & META_MASK) && (dispPtr->metaModMask != 0)) {
+ modMask = (modMask & ~META_MASK) | dispPtr->metaModMask;
+ }
+ if ((modMask & ALT_MASK) && (dispPtr->altModMask != 0)) {
+ modMask = (modMask & ~ALT_MASK) | dispPtr->altModMask;
+ }
+
+ if ((state & META_MASK) && (dispPtr->metaModMask != 0)) {
+ state = (state & ~META_MASK) | dispPtr->metaModMask;
+ }
+ if ((state & ALT_MASK) && (dispPtr->altModMask != 0)) {
+ state = (state & ~ALT_MASK) | dispPtr->altModMask;
+ }
+
+ if ((state & modMask) != modMask) {
+ goto nextSequence;
+ }
}
+#if 0
if ((state & patPtr->hateMods) != 0) {
goto nextSequence;
}
+#endif
if ((patPtr->detail != 0)
&& (patPtr->detail != *detailPtr)) {
goto nextSequence;
*/
static char *
-ExpandPercents(before, eventPtr, keySym, after, afterSize)
- register char *before; /* Command containing percent
+ExpandPercents (
+ register char *before, /* Command containing percent
* expressions to be replaced. */
- register XEvent *eventPtr; /* X event containing information
+ register XEvent *eventPtr, /* X event containing information
* to be used in % replacements. */
- KeySym keySym; /* KeySym: only relevant for
+ KeySym keySym, /* KeySym: only relevant for
* KeyPress and KeyRelease events). */
- char *after; /* Place to generate new expanded
+ char *after, /* Place to generate new expanded
* command. Must contain at least
* "afterSize" bytes of space. */
- int afterSize; /* Number of bytes of space available at
+ int afterSize /* Number of bytes of space available at
* after. */
+)
{
register char *buffer; /* Pointer to buffer currently being used
* as destination. */
*----------------------------------------------------------------------
*/
-void
-TkBindError(interp)
- Tcl_Interp *interp; /* Interpreter in which an error has
+void
+TkBindError (
+ Tcl_Interp *interp /* Interpreter in which an error has
* occurred. */
+)
{
char *argv[2];
char *command;