]> cvs.zerfleddert.de Git - micropolis/blobdiff - src/tk/tkbind.c
Fixes for compilation with gcc 15
[micropolis] / src / tk / tkbind.c
index 14cad9f722a207664218342b4b3cfd74caff3a45..9c11224bf3c9564fae37148f9fab7369506f74b8 100644 (file)
@@ -229,11 +229,11 @@ static ModInfo modArray[] = {
     "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,
@@ -383,8 +383,8 @@ static PatSeq *             FindSequence _ANSI_ARGS_((Tcl_Interp *interp,
 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
 /*
  *--------------------------------------------------------------
@@ -403,11 +403,12 @@ static PatSeq *           MatchPatterns _ANSI_ARGS_((BindingTable *bindPtr,
  *--------------------------------------------------------------
  */
 
-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;
@@ -479,10 +480,11 @@ Tk_CreateBindingTable(interp)
  *--------------------------------------------------------------
  */
 
-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;
@@ -539,19 +541,20 @@ Tk_DeleteBindingTable(bindingTable)
  *--------------------------------------------------------------
  */
 
-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;
@@ -608,14 +611,15 @@ Tk_CreateBinding(interp, bindingTable, object, eventString, command, append)
  *--------------------------------------------------------------
  */
 
-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;
@@ -697,14 +701,15 @@ Tk_DeleteBinding(interp, bindingTable, object, eventString)
  */
 
 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;
@@ -737,12 +742,13 @@ Tk_GetBinding(interp, bindingTable, object, eventString)
  *--------------------------------------------------------------
  */
 
-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;
@@ -892,11 +898,12 @@ Tk_GetAllBindings(interp, bindingTable, object)
  *--------------------------------------------------------------
  */
 
-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;
@@ -963,17 +970,18 @@ Tk_DeleteAllBindings(bindingTable, object)
  *--------------------------------------------------------------
  */
 
-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;
@@ -1034,14 +1042,14 @@ Tk_BindEvent(bindingTable, eventPtr, tkwin, numObjects, objectPtr)
        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));
            }
        }
@@ -1121,21 +1129,22 @@ Tk_BindEvent(bindingTable, eventPtr, tkwin, numObjects, objectPtr)
  */
 
 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];
@@ -1436,11 +1445,12 @@ FindSequence(interp, bindPtr, object, eventString, create, maskPtr)
  */
 
 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)) {
@@ -1473,11 +1483,12 @@ GetField(p, copy, size)
  *----------------------------------------------------------------------
  */
 
-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;
@@ -1576,10 +1587,12 @@ GetKeySym(dispPtr, eventPtr)
  */
 
 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;
 
@@ -1640,9 +1653,52 @@ MatchPatterns(bindPtr, psPtr)
            } 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) {
@@ -1761,18 +1817,19 @@ MatchPatterns(bindPtr, psPtr)
  */
 
 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. */
@@ -2134,10 +2191,11 @@ ExpandPercents(before, eventPtr, keySym, after, afterSize)
  *----------------------------------------------------------------------
  */
 
-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;
Impressum, Datenschutz