/* ** Part of dialog mnemonic processing. Search the widget tree under w ** for widgets with mnemonics. When found, add a passive grab to the ** dialog widget for the mnemonic character, thus directing mnemonic ** events to the dialog widget. */ static void addMnemonicGrabs(Widget dialog, Widget w) { char mneString[2]; WidgetList children; int numChildren, i, isMenu; KeySym mnemonic = '\0'; unsigned char rowColType; if (XtIsComposite(w)) { if (XtClass(w) == xmRowColumnWidgetClass) { XtVaGetValues(w, XmNrowColumnType, &rowColType, 0); isMenu = rowColType != XmWORK_AREA; } else isMenu = False; if (!isMenu) { XtVaGetValues(w, XmNchildren, &children, XmNnumChildren, &numChildren, 0); for (i=0; i<numChildren; i++) addMnemonicGrabs(dialog, children[i]); } } else { XtVaGetValues(w, XmNmnemonic, &mnemonic, 0); if (mnemonic != '\0') { mneString[0] = mnemonic; mneString[1] = '\0'; XtGrabKey(dialog, XKeysymToKeycode(XtDisplay(dialog), XStringToKeysym(mneString)), Mod1Mask, True, GrabModeAsync, GrabModeAsync); } } }
static void GrabAllCorrectKeys( Widget widget, TMTypeMatch typeMatch, TMModifierMatch modMatch, GrabActionRec* grabP) { Display *dpy = XtDisplay(widget); KeyCode *keycodes, *keycodeP; Cardinal keycount; Modifiers careOn = 0; Modifiers careMask = 0; if (modMatch->lateModifiers) { Boolean resolved; resolved = _XtComputeLateBindings(dpy, modMatch->lateModifiers, &careOn, &careMask); if (!resolved) return; } careOn |= modMatch->modifiers; careMask |= modMatch->modifierMask; XtKeysymToKeycodeList( dpy, (KeySym)typeMatch->eventCode, &keycodes, &keycount ); if (keycount == 0) return; for (keycodeP = keycodes; keycount--; keycodeP++) { if (modMatch->standard) { /* find standard modifiers that produce this keysym */ KeySym keysym; int std_mods, least_mod; Modifiers modifiers_return; XtTranslateKeycode( dpy, *keycodeP, (Modifiers)0, &modifiers_return, &keysym ); if (careOn & modifiers_return) return; if (keysym == typeMatch->eventCode) { XtGrabKey(widget, *keycodeP, careOn, grabP->owner_events, grabP->pointer_mode, grabP->keyboard_mode ); /* continue; */ /* grab all modifier combinations */ } least_mod = modifiers_return & (~modifiers_return + 1); for (std_mods = modifiers_return; std_mods >= least_mod; std_mods--) { Modifiers dummy; /* check all useful combinations of modifier bits */ if (modifiers_return & std_mods && !(~modifiers_return & std_mods)) { XtTranslateKeycode( dpy, *keycodeP, (Modifiers)std_mods, &dummy, &keysym ); if (keysym == typeMatch->eventCode) { XtGrabKey(widget, *keycodeP, careOn | (Modifiers) std_mods, grabP->owner_events, grabP->pointer_mode, grabP->keyboard_mode ); /* break; */ /* grab all modifier combinations */ } } } } else /* !event->standard */ { XtGrabKey(widget, *keycodeP, careOn, grabP->owner_events, grabP->pointer_mode, grabP->keyboard_mode ); } } XtFree((char *)keycodes); }