From 931cd377aade563781849d3e6f91a9b635cd6753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 7 Oct 2009 16:26:32 +0000 Subject: [PATCH] * Added a new flag kAcceptKeyboardFocusFlag that allows B_AVOID_FOCUS windows to still receive keyboard events. This is now used for menu windows (before, the menu feel alone would trigger that behaviour). * This also fixes bug #4691, as tool tip windows use the menu feel as well. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33481 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/interface/WindowPrivate.h | 2 ++ src/kits/interface/MenuWindow.cpp | 7 ++++--- src/servers/app/Desktop.cpp | 7 +++++-- src/servers/app/Window.cpp | 3 ++- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/headers/private/interface/WindowPrivate.h b/headers/private/interface/WindowPrivate.h index 571684d3e3..858bd9f7c6 100644 --- a/headers/private/interface/WindowPrivate.h +++ b/headers/private/interface/WindowPrivate.h @@ -28,5 +28,7 @@ const window_type kWindowScreenWindow = window_type(1026); /* Private window flags */ const uint32 kWindowScreenFlag = 0x10000; +const uint32 kAcceptKeyboardFocusFlag = 0x40000; + // Accept keyboard input even if B_AVOID_FOCUS is set #endif // _WINDOW_PRIVATE_H diff --git a/src/kits/interface/MenuWindow.cpp b/src/kits/interface/MenuWindow.cpp index 51980e4d5b..ad29e64361 100644 --- a/src/kits/interface/MenuWindow.cpp +++ b/src/kits/interface/MenuWindow.cpp @@ -250,7 +250,8 @@ BMenuFrame::Draw(BRect updateRect) BMenuWindow::BMenuWindow(const char *name) // The window will be resized by BMenu, so just pass a dummy rect : BWindow(BRect(0, 0, 0, 0), name, B_BORDERED_WINDOW_LOOK, kMenuWindowFeel, - B_NOT_MOVABLE | B_NOT_ZOOMABLE | B_AVOID_FOCUS), + B_NOT_MOVABLE | B_NOT_ZOOMABLE | B_AVOID_FOCUS + | kAcceptKeyboardFocusFlag), fMenu(NULL), fMenuFrame(NULL), fUpperScroller(NULL), @@ -424,14 +425,14 @@ BMenuWindow::_Scroll(const BPoint& where) delta = 1; else if (fUpperScroller->IsEnabled() && upperFrame.Contains(cursor)) delta = -1; - + if (delta == 0) return false; float smallStep; GetSteps(&smallStep, NULL); _ScrollBy(smallStep * delta); - + snooze(5000); return true; diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index dcbdd8ce28..346fb20fd1 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -1553,17 +1553,20 @@ Desktop::ViewUnderMouse(const Window* window) /*! Returns the current keyboard event target candidate - which is either the - top-most window (in case it's a menu), or the one having focus. + top-most window (in case it has the kAcceptKeyboardFocusFlag flag set), or + the one having focus. The window lock must be held when calling this function. */ EventTarget* Desktop::KeyboardEventTarget() { + // Get the top most non-hidden window Window* window = _CurrentWindows().LastWindow(); while (window != NULL && window->IsHidden()) { window = window->PreviousWindow(fCurrentWorkspace); } - if (window != NULL && window->Feel() == kMenuWindowFeel) + + if (window != NULL && (window->Flags() & kAcceptKeyboardFocusFlag) != 0) return &window->EventTarget(); if (FocusWindow() != NULL) diff --git a/src/servers/app/Window.cpp b/src/servers/app/Window.cpp index 3799bf2028..cb691b65bd 100644 --- a/src/servers/app/Window.cpp +++ b/src/servers/app/Window.cpp @@ -1867,7 +1867,8 @@ Window::ValidWindowFlags() | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE | B_NO_SERVER_SIDE_WINDOW_MODIFIERS - | kWindowScreenFlag; + | kWindowScreenFlag + | kAcceptKeyboardFocusFlag; }