Client: Fix keyboard focus logic and crash

The previous solution did not check for nullptr before dereferencing, which
caused a crash. Furthermore, it checked the new ShellSurface's
shellManagesActiveState before deciding whether to unfocus the old one.

Task-number: QTBUG-55526
Change-Id: I410b6200a5b7b86806f70970730045a4a25f21db
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
This commit is contained in:
Johan Klokkhammer Helsing 2016-08-24 16:08:56 +02:00 committed by Jani Heikkinen
parent 895b46e394
commit 01234b85f8
3 changed files with 17 additions and 7 deletions

View File

@ -399,13 +399,16 @@ void QWaylandDisplay::handleKeyboardFocusChanged(QWaylandInputDevice *inputDevic
{
QWaylandWindow *keyboardFocus = inputDevice->keyboardFocus();
if (!keyboardFocus->shellSurface()->shellManagesActiveState() && mLastKeyboardFocus != keyboardFocus) {
if (keyboardFocus)
handleWindowActivated(keyboardFocus);
if (mLastKeyboardFocus)
handleWindowDeactivated(mLastKeyboardFocus);
}
mLastKeyboardFocus = inputDevice->keyboardFocus();
if (mLastKeyboardFocus == keyboardFocus)
return;
if (keyboardFocus && !keyboardFocus->shellManagesActiveState())
handleWindowActivated(keyboardFocus);
if (mLastKeyboardFocus && !mLastKeyboardFocus->shellManagesActiveState())
handleWindowDeactivated(mLastKeyboardFocus);
mLastKeyboardFocus = keyboardFocus;
}
void QWaylandDisplay::handleWaylandSync()

View File

@ -500,6 +500,11 @@ QWaylandSubSurface *QWaylandWindow::subSurfaceWindow() const
return mSubSurfaceWindow;
}
bool QWaylandWindow::shellManagesActiveState() const
{
return mShellSurface && mShellSurface->shellManagesActiveState();
}
void QWaylandWindow::handleContentOrientationChange(Qt::ScreenOrientation orientation)
{
if (mDisplay->compositorVersion() < 2)

View File

@ -136,6 +136,8 @@ public:
QWaylandSubSurface *subSurfaceWindow() const;
QWaylandScreen *screen() const { return mScreen; }
bool shellManagesActiveState() const;
void handleContentOrientationChange(Qt::ScreenOrientation orientation) Q_DECL_OVERRIDE;
void setOrientationMask(Qt::ScreenOrientations mask);