Browse Source

X11: fix invisible window when un-minimizing (#21614)

pull/21624/head
Julien Lebosquain 4 months ago
committed by GitHub
parent
commit
3fd2da5701
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 21
      src/Avalonia.X11/X11Window.cs
  2. 5
      src/Avalonia.X11/X11WindowModes/DefaultWindowMode.cs
  3. 3
      src/Avalonia.X11/X11WindowModes/WindowMode.cs

21
src/Avalonia.X11/X11Window.cs

@ -62,6 +62,7 @@ namespace Avalonia.X11
private XSyncState _xSyncState = 0; private XSyncState _xSyncState = 0;
private bool _mapped; private bool _mapped;
private bool _wasMappedAtLeastOnce = false; private bool _wasMappedAtLeastOnce = false;
private bool _shown;
private double? _scalingOverride; private double? _scalingOverride;
private bool _disabled; private bool _disabled;
private TransparencyHelper? _transparencyHelper; private TransparencyHelper? _transparencyHelper;
@ -797,13 +798,21 @@ namespace Avalonia.X11
get => _lastWindowState; get => _lastWindowState;
set set
{ {
if(_lastWindowState == value) var previousState = _lastWindowState;
if (previousState == value)
return; return;
if (value == WindowState.Minimized) if (value == WindowState.Minimized)
{ {
XIconifyWindow(_x11.Display, _handle, _x11.DefaultScreen); XIconifyWindow(_x11.Display, _handle, _x11.DefaultScreen);
return;
} }
else if (value == WindowState.Maximized)
// When going from Minimized to any other state programatically, we might need to re-map the window.
// Not doing that will leave the window invisible.
var needsRemap = _shown && previousState == WindowState.Minimized && !_mapped;
if (value == WindowState.Maximized)
{ {
ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_HIDDEN); ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_HIDDEN);
ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_FULLSCREEN); ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_FULLSCREEN);
@ -823,9 +832,13 @@ namespace Avalonia.X11
ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_FULLSCREEN); ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_FULLSCREEN);
ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_MAXIMIZED_VERT, ChangeWMAtoms(false, _x11.Atoms._NET_WM_STATE_MAXIMIZED_VERT,
_x11.Atoms._NET_WM_STATE_MAXIMIZED_HORZ); _x11.Atoms._NET_WM_STATE_MAXIMIZED_HORZ);
SendNetWMMessage(_x11.Atoms._NET_ACTIVE_WINDOW, (IntPtr)1, _x11.LastActivityTimestamp,
IntPtr.Zero);
} }
if (needsRemap)
XMapWindow(_x11.Display, _handle);
if (_shown)
SendNetWMMessage(_x11.Atoms._NET_ACTIVE_WINDOW, 1, _x11.LastActivityTimestamp, 0);
} }
} }

5
src/Avalonia.X11/X11WindowModes/DefaultWindowMode.cs

@ -30,7 +30,9 @@ partial class X11Window
} }
public override void Show(bool activate, bool isDialog) public override void Show(bool activate, bool isDialog)
{ {
base.Show(activate, isDialog);
Window._wasMappedAtLeastOnce = true; Window._wasMappedAtLeastOnce = true;
if (!activate) if (!activate)
@ -42,7 +44,6 @@ partial class X11Window
XMapWindow(X11.Display, Handle); XMapWindow(X11.Display, Handle);
XFlush(X11.Display); XFlush(X11.Display);
base.Show(activate, isDialog);
} }
public override void Hide() public override void Hide()

3
src/Avalonia.X11/X11WindowModes/WindowMode.cs

@ -47,7 +47,7 @@ partial class X11Window
public virtual void Show(bool activate, bool isDialog) public virtual void Show(bool activate, bool isDialog)
{ {
Window._shown = true;
} }
public abstract PixelPoint PointToScreen(Point pt); public abstract PixelPoint PointToScreen(Point pt);
@ -55,6 +55,7 @@ partial class X11Window
public virtual void Hide() public virtual void Hide()
{ {
Window._shown = false;
} }
} }
} }

Loading…
Cancel
Save