diff options
Diffstat (limited to 'src/Keyboard.c')
-rw-r--r-- | src/Keyboard.c | 255 |
1 files changed, 124 insertions, 131 deletions
diff --git a/src/Keyboard.c b/src/Keyboard.c index 2f3db03..0d81e89 100644 --- a/src/Keyboard.c +++ b/src/Keyboard.c @@ -6,13 +6,13 @@ Copyright 1988 by Hewlett-Packard Company Copyright 1987, 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA. -Permission to use, copy, modify, and distribute this software -and its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that copyright notice and this permission -notice appear in supporting documentation, and that the names of -Hewlett-Packard, Digital, or Sun not be used in advertising or -publicity pertaining to distribution of the software without specific, +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that copyright notice and this permission +notice appear in supporting documentation, and that the names of +Hewlett-Packard, Digital, or Sun not be used in advertising or +publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING @@ -67,7 +67,6 @@ in this Software without prior written authorization from The Open Group. #include "EventI.h" #define _GetWindowedAncestor(w) (XtIsWidget(w) ? w : _XtWindowedAncestor(w)) -extern void _XtSendFocusEvent(); /* InActiveSubtree cache of the current focus source and its ancestors */ static Widget *pathTrace = NULL; @@ -79,18 +78,17 @@ static Widget *pseudoTrace = NULL; static int pseudoTraceDepth = 0; static int pseudoTraceMax = 0; -void _XtClearAncestorCache(widget) - Widget widget; +void _XtClearAncestorCache(Widget widget) { /* the caller must lock the process lock */ if (pathTraceDepth && pathTrace[0] == widget) pathTraceDepth = 0; } -static XtServerGrabPtr CheckServerGrabs(event, trace, traceDepth) - XEvent *event; - Widget *trace; - Cardinal traceDepth; +static XtServerGrabPtr CheckServerGrabs( + XEvent *event, + Widget *trace, + Cardinal traceDepth) { XtServerGrabPtr grab; Cardinal i; @@ -103,8 +101,7 @@ static XtServerGrabPtr CheckServerGrabs(event, trace, traceDepth) return (XtServerGrabPtr)0; } -static Boolean IsParent(a, b) - Widget a, b; +static Boolean IsParent(Widget a, Widget b) { for (b = XtParent(b); b; b = XtParent(b)) { if (b == a) return TRUE; @@ -115,11 +112,12 @@ static Boolean IsParent(a, b) #define RelRtn(lca, type) {*relTypeRtn = type; return lca;} -static Widget CommonAncestor(a, b, relTypeRtn) - register Widget a, b; - XtGeneology * relTypeRtn; +static Widget CommonAncestor( + register Widget a, + register Widget b, + XtGeneology * relTypeRtn) { - if (a == b) + if (a == b) { RelRtn(a, XtMySelf) } @@ -133,9 +131,9 @@ static Widget CommonAncestor(a, b, relTypeRtn) } else for (b = XtParent(b); - b && !XtIsShell(b); + b && !XtIsShell(b); b = XtParent(b)) - if (IsParent(b, a)) + if (IsParent(b, a)) { RelRtn(b, XtMyCousin) } @@ -143,21 +141,21 @@ static Widget CommonAncestor(a, b, relTypeRtn) } #undef RelRtn - - -static Widget _FindFocusWidget(widget, trace, traceDepth, activeCheck, isTarget) - Widget widget; - Widget *trace; - int traceDepth; - Boolean activeCheck; - Boolean *isTarget; + + +static Widget _FindFocusWidget( + Widget widget, + Widget *trace, + int traceDepth, + Boolean activeCheck, + Boolean *isTarget) { int src; Widget dst; XtPerWidgetInput pwi = NULL; - + /* For each ancestor, starting at the top, see if it's forwarded */ @@ -193,18 +191,17 @@ static Widget _FindFocusWidget(widget, trace, traceDepth, activeCheck, isTarget) } -static Widget FindFocusWidget(widget, pdi) - Widget widget; - XtPerDisplayInput pdi; +static Widget FindFocusWidget( + Widget widget, + XtPerDisplayInput pdi) { - if (pdi->focusWidget) + if (pdi->focusWidget) return pdi->focusWidget; else return _FindFocusWidget(widget, pdi->trace, pdi->traceDepth, FALSE, NULL); } -Widget XtGetKeyboardFocusWidget(widget) - Widget widget; +Widget XtGetKeyboardFocusWidget(Widget widget) { XtPerDisplayInput pdi; Widget retval; @@ -217,16 +214,16 @@ Widget XtGetKeyboardFocusWidget(widget) return retval; } -static Boolean IsOutside(e, w) - XKeyEvent *e; - Widget w; +static Boolean IsOutside( + XKeyEvent *e, + Widget w) { Position left, right, top, bottom; - + /* * if the pointer is outside the shell or inside * the window try to see if it would recieve the - * focus + * focus */ XtTranslateCoords(w, 0, 0, &left, &top); /* We need to take borders into consideration */ @@ -243,29 +240,26 @@ static Boolean IsOutside(e, w) return FALSE; } -static Widget FindKeyDestination(widget, event, - prevGrab, prevGrabType, - devGrab, devGrabType, - pdi) - Widget widget; - XKeyEvent *event; - XtServerGrabPtr prevGrab; - XtServerGrabType prevGrabType; - XtServerGrabPtr devGrab; - XtServerGrabType devGrabType; - XtPerDisplayInput pdi; +static Widget FindKeyDestination( + Widget widget, + XKeyEvent *event, + XtServerGrabPtr prevGrab, + XtServerGrabType prevGrabType, + XtServerGrabPtr devGrab, + XtServerGrabType devGrabType, + XtPerDisplayInput pdi) { - + Widget dspWidget; Widget focusWidget; LOCK_PROCESS; - dspWidget = - focusWidget = - pdi->focusWidget = + dspWidget = + focusWidget = + pdi->focusWidget = _GetWindowedAncestor(FindFocusWidget(widget, pdi)); - - + + /* * If a grab is active from a previous activation then dispatch * based on owner_events ala protocol but with focus being @@ -273,25 +267,25 @@ static Widget FindKeyDestination(widget, event, */ if (IsAnyGrab(prevGrabType)) { - if (prevGrab->ownerEvents) + if (prevGrab->ownerEvents) dspWidget = focusWidget; else dspWidget = prevGrab->widget; } - else + else { /* * If the focus widget is the event widget or a descendant * then we can avoid the rest of this. Else ugh... */ - if (focusWidget != widget) + if (focusWidget != widget) { XtGeneology ewRelFw; /* relationship of event widget to focusWidget */ Widget lca; lca = CommonAncestor(widget, focusWidget, &ewRelFw); - + /* * if the event widget is an ancestor of focus due to the pointer * and/or the grab being in an ancestor and it's a passive grab @@ -307,7 +301,7 @@ static Widget FindKeyDestination(widget, event, ) dspWidget = devGrab->widget; } - else + else { /* * if the grab widget is not an ancestor of the focus @@ -316,7 +310,7 @@ static Widget FindKeyDestination(widget, event, * through and if synch is set and the event widget * could turn it off we'll lock. check for it ? why not */ - if ((ewRelFw != XtMyAncestor) + if ((ewRelFw != XtMyAncestor) && (devGrabType == XtPassiveServerGrab) && (!IsAnyGrab(prevGrabType)) ) @@ -329,7 +323,7 @@ static Widget FindKeyDestination(widget, event, * if there isn't a grab with then check * for a logical grab that would have been activated * if the server was using Xt focus instead of server - * focus + * focus */ if ( (event->type != KeyPress) || @@ -340,7 +334,7 @@ static Widget FindKeyDestination(widget, event, { XtServerGrabPtr grab; - if (!pseudoTraceDepth || + if (!pseudoTraceDepth || !(focusWidget == pseudoTrace[0]) || !(lca == pseudoTrace[pseudoTraceDepth])) { @@ -349,8 +343,8 @@ static Widget FindKeyDestination(widget, event, * (non-inclusive)to focusWidget by * passing in lca as breakWidget */ - _XtFillAncestorList(&pseudoTrace, - &pseudoTraceMax, + _XtFillAncestorList(&pseudoTrace, + &pseudoTraceMax, &pseudoTraceDepth, focusWidget, lca); @@ -362,12 +356,12 @@ static Widget FindKeyDestination(widget, event, pseudoTraceDepth))) { XtDevice device = &pdi->keyboard; - + device->grabType = XtPseudoPassiveServerGrab; pdi->activatingKey = event->keycode; device->grab = *grab; - if (grab + if (grab ) dspWidget = grab->widget; else @@ -381,11 +375,11 @@ static Widget FindKeyDestination(widget, event, return dspWidget; } -Widget _XtProcessKeyboardEvent(event, widget, pdi) - XKeyEvent *event; - Widget widget; - XtPerDisplayInput pdi; -{ +Widget _XtProcessKeyboardEvent( + XKeyEvent *event, + Widget widget, + XtPerDisplayInput pdi) +{ XtDevice device = &pdi->keyboard; XtServerGrabPtr newGrab, devGrab = &device->grab; XtServerGrabRec prevGrabRec; @@ -400,7 +394,7 @@ Widget _XtProcessKeyboardEvent(event, widget, pdi) case KeyPress: { if (event->keycode != 0 && /* Xlib XIM composed input */ - !IsServerGrab(device->grabType) && + !IsServerGrab(device->grabType) && (newGrab = CheckServerGrabs((XEvent*)event, pdi->trace, pdi->traceDepth))) @@ -422,10 +416,10 @@ Widget _XtProcessKeyboardEvent(event, widget, pdi) } } break; - + case KeyRelease: { - if (IsEitherPassiveGrab(device->grabType) && + if (IsEitherPassiveGrab(device->grabType) && (event->keycode == pdi->activatingKey)) deactivateGrab = TRUE; } @@ -442,14 +436,13 @@ Widget _XtProcessKeyboardEvent(event, widget, pdi) pdi->activatingKey = 0; } return dspWidget; -} - -static Widget GetShell(widget) - Widget widget; +} + +static Widget GetShell(Widget widget) { Widget shell; - for (shell = widget; + for (shell = widget; shell && !XtIsShell(shell); shell = XtParent(shell)){} return shell; @@ -458,26 +451,25 @@ static Widget GetShell(widget) /* * Check that widget really has Xt focus due to it having recieved an - * event + * event */ typedef enum {NotActive = 0, IsActive, IsTarget} ActiveType; -static ActiveType InActiveSubtree(widget) - Widget widget; +static ActiveType InActiveSubtree(Widget widget) { Boolean isTarget; ActiveType retval; LOCK_PROCESS; if (!pathTraceDepth || widget != pathTrace[0]) { - _XtFillAncestorList(&pathTrace, - &pathTraceMax, + _XtFillAncestorList(&pathTrace, + &pathTraceMax, &pathTraceDepth, widget, NULL); } - if (widget == _FindFocusWidget(widget, + if (widget == _FindFocusWidget(widget, pathTrace, - pathTraceDepth, + pathTraceDepth, TRUE, &isTarget)) retval = (isTarget ? IsTarget : IsActive); @@ -491,11 +483,11 @@ static ActiveType InActiveSubtree(widget) /* ARGSUSED */ -void _XtHandleFocus(widget, client_data, event, cont) - Widget widget; - XtPointer client_data; /* child who wants focus */ - XEvent *event; - Boolean *cont; /* unused */ +void _XtHandleFocus( + Widget widget, + XtPointer client_data, /* child who wants focus */ + XEvent *event, + Boolean *cont) /* unused */ { XtPerDisplayInput pdi = _XtGetPerDisplayInput(XtDisplay(widget)); XtPerWidgetInput pwi = (XtPerWidgetInput)client_data; @@ -503,7 +495,7 @@ void _XtHandleFocus(widget, client_data, event, cont) XtGeneology newFocalPoint = pwi->focalPoint; switch( event->type ) { - + case KeyPress: case KeyRelease: /* @@ -514,14 +506,14 @@ void _XtHandleFocus(widget, client_data, event, cont) case EnterNotify: case LeaveNotify: - + /* * If operating in a focus driven model, then enter and * leave events do not affect the keyboard focus. */ if ((event->xcrossing.detail != NotifyInferior) && (event->xcrossing.focus)) - { + { switch (oldFocalPoint) { case XtMyAncestor: @@ -536,8 +528,8 @@ void _XtHandleFocus(widget, client_data, event, cont) break; case XtMyDescendant: break; - - } + + } } break; case FocusIn: @@ -574,7 +566,7 @@ void _XtHandleFocus(widget, client_data, event, cont) } break; } - + if (newFocalPoint != oldFocalPoint) { Boolean add; @@ -613,12 +605,13 @@ void _XtHandleFocus(widget, client_data, event, cont) } -static void AddFocusHandler(widget, descendant, pwi, psi, pdi, oldEventMask) - Widget widget, descendant; - XtPerWidgetInput pwi; - XtPerWidgetInput psi; - XtPerDisplayInput pdi; - EventMask oldEventMask; +static void AddFocusHandler( + Widget widget, + Widget descendant, + XtPerWidgetInput pwi, + XtPerWidgetInput psi, + XtPerDisplayInput pdi, + EventMask oldEventMask) { EventMask eventMask, targetEventMask; Widget target; @@ -640,12 +633,12 @@ static void AddFocusHandler(widget, descendant, pwi, psi, pdi, oldEventMask) oldEventMask |= FocusChangeMask | EnterWindowMask | LeaveWindowMask; if (oldEventMask != eventMask) - XtRemoveEventHandler(widget, (oldEventMask & ~eventMask), + XtRemoveEventHandler(widget, (oldEventMask & ~eventMask), False, _XtHandleFocus, (XtPointer)pwi); } if (oldEventMask != eventMask) - XtAddEventHandler(widget, eventMask, False, + XtAddEventHandler(widget, eventMask, False, _XtHandleFocus, (XtPointer)pwi); /* What follows is too much grief to go through if the @@ -707,11 +700,11 @@ static void AddFocusHandler(widget, descendant, pwi, psi, pdi, oldEventMask) /* ARGSUSED */ -static void QueryEventMask(widget, client_data, event, cont) - Widget widget; /* child who gets focus */ - XtPointer client_data; /* ancestor giving it */ - XEvent *event; - Boolean *cont; /* unused */ +static void QueryEventMask( + Widget widget, /* child who gets focus */ + XtPointer client_data, /* ancestor giving it */ + XEvent *event, + Boolean *cont) /* unused */ { /* widget was once the target of an XtSetKeyboardFocus but * was unrealized at the time. Make sure ancestor still wants @@ -736,17 +729,17 @@ static void QueryEventMask(widget, client_data, event, cont) /* ARGSUSED */ -static void FocusDestroyCallback(widget, closure, call_data) - Widget widget; - XtPointer closure; /* Widget */ - XtPointer call_data; +static void FocusDestroyCallback( + Widget widget, + XtPointer closure, /* Widget */ + XtPointer call_data) { XtSetKeyboardFocus((Widget)closure, None); } -void XtSetKeyboardFocus(widget, descendant) - Widget widget; - Widget descendant; +void XtSetKeyboardFocus( + Widget widget, + Widget descendant) { XtPerDisplayInput pdi; XtPerWidgetInput pwi; @@ -763,21 +756,21 @@ void XtSetKeyboardFocus(widget, descendant) target = descendant ? _GetWindowedAncestor(descendant) : NULL; oldTarget = oldDesc ? _GetWindowedAncestor(oldDesc) : NULL; - + if (descendant != oldDesc) { - + /* update the forward path */ pwi->focusKid = descendant; /* all the rest handles focus ins and focus outs and misc gunk */ - + if (oldDesc) { /* invalidate FindKeyDestination's ancestor list */ if (pseudoTraceDepth && oldTarget == pseudoTrace[0]) pseudoTraceDepth = 0; - XtRemoveCallback(oldDesc, XtNdestroyCallback, + XtRemoveCallback(oldDesc, XtNdestroyCallback, FocusDestroyCallback, (XtPointer)widget); if (!oldTarget->core.being_destroyed) { @@ -807,16 +800,16 @@ void XtSetKeyboardFocus(widget, descendant) * will continue to dynamically assign focus for this widget. */ if (!XtIsShell(widget) && !descendant) { - XtRemoveEventHandler(widget, XtAllEvents, True, + XtRemoveEventHandler(widget, XtAllEvents, True, _XtHandleFocus, (XtPointer)pwi); pwi->haveFocus = FALSE; } } - + if (descendant) { Widget shell = GetShell(widget); XtPerWidgetInput psi = _XtGetPerWidgetInput(shell, TRUE); - XtAddCallback (descendant, XtNdestroyCallback, + XtAddCallback (descendant, XtNdestroyCallback, FocusDestroyCallback, (XtPointer) widget); AddFocusHandler(widget, descendant, pwi, psi, pdi, @@ -846,8 +839,8 @@ void XtSetKeyboardFocus(widget, descendant) call_data.type = XtHsetKeyboardFocus; call_data.widget = widget; call_data.event_data = (XtPointer) descendant; - XtCallCallbackList(hookobj, - ((HookObject)hookobj)->hooks.changehook_callbacks, + XtCallCallbackList(hookobj, + ((HookObject)hookobj)->hooks.changehook_callbacks, (XtPointer)&call_data); } UNLOCK_PROCESS; |