diff --git a/src/servers/app/DefaultWindowBehaviour.cpp b/src/servers/app/DefaultWindowBehaviour.cpp index ec648b9dec..7ccbc4f649 100644 --- a/src/servers/app/DefaultWindowBehaviour.cpp +++ b/src/servers/app/DefaultWindowBehaviour.cpp @@ -859,6 +859,12 @@ DefaultWindowBehaviour::MouseMoved(BMessage *message, BPoint where, bool isFake) } +void +DefaultWindowBehaviour::ModifiersChanged(int32 modifiers) +{ +} + + bool DefaultWindowBehaviour::_IsWindowModifier(int32 modifiers) const { diff --git a/src/servers/app/DefaultWindowBehaviour.h b/src/servers/app/DefaultWindowBehaviour.h index 7de4865dca..fc33983c6d 100644 --- a/src/servers/app/DefaultWindowBehaviour.h +++ b/src/servers/app/DefaultWindowBehaviour.h @@ -34,6 +34,8 @@ public: virtual void MouseMoved(BMessage *message, BPoint where, bool isFake); + virtual void ModifiersChanged(int32 modifiers); + private: enum Region { REGION_NONE, diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 5b866ec81b..a9901f0a02 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -490,6 +490,19 @@ Desktop::BroadcastToAllWindows(int32 code) void Desktop::KeyEvent(uint32 what, int32 key, int32 modifiers) { + if (LockAllWindows()) { + Window* window = MouseEventWindow(); + if (window == NULL) + window = WindowAt(fLastMousePosition); + + if (window != NULL) { + if (what == B_MODIFIERS_CHANGED) + window->ModifiersChanged(modifiers); + } + + UnlockAllWindows(); + } + NotifyKeyPressed(what, key, modifiers); } diff --git a/src/servers/app/Window.cpp b/src/servers/app/Window.cpp index 2513f3ed05..d21f8816c1 100644 --- a/src/servers/app/Window.cpp +++ b/src/servers/app/Window.cpp @@ -867,6 +867,13 @@ Window::MouseMoved(BMessage *message, BPoint where, int32* _viewToken, } +void +Window::ModifiersChanged(int32 modifiers) +{ + fWindowBehaviour->ModifiersChanged(modifiers); +} + + // #pragma mark - @@ -1046,7 +1053,7 @@ Window::SetTabLocation(float location, BRegion& dirty) { if (fDecorator) return fDecorator->SetTabLocation(location, &dirty); - + return false; } diff --git a/src/servers/app/Window.h b/src/servers/app/Window.h index f63c53b773..7f55ec0e55 100644 --- a/src/servers/app/Window.h +++ b/src/servers/app/Window.h @@ -151,6 +151,8 @@ public: int32* _viewToken, bool isLatestMouseMoved, bool isFake); + void ModifiersChanged(int32 modifiers); + // some hooks to inform the client window // TODO: move this to ServerWindow maybe? void WorkspaceActivated(int32 index, bool active); diff --git a/src/servers/app/WindowBehaviour.cpp b/src/servers/app/WindowBehaviour.cpp index d9c73dcb13..f26e0788a2 100644 --- a/src/servers/app/WindowBehaviour.cpp +++ b/src/servers/app/WindowBehaviour.cpp @@ -15,11 +15,15 @@ WindowBehaviour::WindowBehaviour() fIsResizing(false), fIsDragging(false) { - } WindowBehaviour::~WindowBehaviour() { - +} + + +void +WindowBehaviour::ModifiersChanged(int32 modifiers) +{ } diff --git a/src/servers/app/WindowBehaviour.h b/src/servers/app/WindowBehaviour.h index 6ba6636c3a..46503e2b5a 100644 --- a/src/servers/app/WindowBehaviour.h +++ b/src/servers/app/WindowBehaviour.h @@ -26,6 +26,8 @@ public: virtual void MouseMoved(BMessage *message, BPoint where, bool isFake) = 0; + virtual void ModifiersChanged(int32 modifiers); + bool IsDragging() const { return fIsDragging; } bool IsResizing() const { return fIsResizing; }