Fix window auto-focus on Linux
This commit is contained in:
@@ -1691,6 +1691,15 @@ void LinuxPlatform::Tick()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MapNotify:
|
||||||
|
// Auto-focus shown windows
|
||||||
|
window = WindowsManager::GetByNativePtr((void*)event.xmap.window);
|
||||||
|
if (window && window->_focusOnMapped)
|
||||||
|
{
|
||||||
|
window->_focusOnMapped = false;
|
||||||
|
window->Focus();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case FocusIn:
|
case FocusIn:
|
||||||
// Update input context focus
|
// Update input context focus
|
||||||
X11::XSetICFocus(IC);
|
X11::XSetICFocus(IC);
|
||||||
|
|||||||
@@ -242,10 +242,7 @@ void LinuxWindow::Show()
|
|||||||
LINUX_WINDOW_PROLOG;
|
LINUX_WINDOW_PROLOG;
|
||||||
X11::XMapWindow(display, window);
|
X11::XMapWindow(display, window);
|
||||||
X11::XFlush(display);
|
X11::XFlush(display);
|
||||||
if (_settings.AllowInput && _settings.ActivateWhenFirstShown)
|
_focusOnMapped = _settings.AllowInput && _settings.ActivateWhenFirstShown;
|
||||||
{
|
|
||||||
Focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Base
|
// Base
|
||||||
WindowBase::Show();
|
WindowBase::Show();
|
||||||
@@ -306,6 +303,11 @@ bool LinuxWindow::IsClosed() const
|
|||||||
return _isClosing;
|
return _isClosing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LinuxWindow::IsForegroundWindow() const
|
||||||
|
{
|
||||||
|
return _focused || _focusOnMapped;
|
||||||
|
}
|
||||||
|
|
||||||
void LinuxWindow::SetClientBounds(const Rectangle& clientArea)
|
void LinuxWindow::SetClientBounds(const Rectangle& clientArea)
|
||||||
{
|
{
|
||||||
int32 x = Math::TruncToInt(clientArea.GetX());
|
int32 x = Math::TruncToInt(clientArea.GetX());
|
||||||
@@ -673,7 +675,14 @@ void LinuxWindow::SetOpacity(const float opacity)
|
|||||||
|
|
||||||
void LinuxWindow::Focus()
|
void LinuxWindow::Focus()
|
||||||
{
|
{
|
||||||
// TODO: impl this
|
if (_focused || !IsWindowMapped())
|
||||||
|
return;
|
||||||
|
|
||||||
|
LINUX_WINDOW_PROLOG;
|
||||||
|
|
||||||
|
X11::XSetInputFocus(display, window, RevertToPointerRoot, CurrentTime);
|
||||||
|
X11::XFlush(display);
|
||||||
|
X11::XSync(display, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LinuxWindow::SetTitle(const StringView& title)
|
void LinuxWindow::SetTitle(const StringView& title)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
bool _resizeDisabled;
|
bool _resizeDisabled, _focusOnMapped = false;
|
||||||
float _opacity = 1.0f;
|
float _opacity = 1.0f;
|
||||||
HandleType _window;
|
HandleType _window;
|
||||||
|
|
||||||
@@ -74,6 +74,7 @@ public:
|
|||||||
void Maximize() override;
|
void Maximize() override;
|
||||||
void Restore() override;
|
void Restore() override;
|
||||||
bool IsClosed() const override;
|
bool IsClosed() const override;
|
||||||
|
bool IsForegroundWindow() const override;
|
||||||
void BringToFront(bool force = false) override;
|
void BringToFront(bool force = false) override;
|
||||||
void SetClientBounds(const Rectangle& clientArea) override;
|
void SetClientBounds(const Rectangle& clientArea) override;
|
||||||
void SetPosition(const Vector2& position) override;
|
void SetPosition(const Vector2& position) override;
|
||||||
|
|||||||
Reference in New Issue
Block a user