Skip to content

Commit

Permalink
Merge pull request #10600 from AvaloniaUI/fixes/x11window-nre
Browse files Browse the repository at this point in the history
Add nullable reference checking to X11Window.
  • Loading branch information
maxkatz6 authored Mar 8, 2023
2 parents e3d94db + f55e7af commit 68d680c
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 34 deletions.
2 changes: 1 addition & 1 deletion src/Avalonia.Controls/Platform/IPopupImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace Avalonia.Platform
[Unstable]
public interface IPopupImpl : IWindowBaseImpl
{
IPopupPositioner PopupPositioner { get; }
IPopupPositioner? PopupPositioner { get; }

void SetWindowManagerAddShadowHint(bool enabled);
}
Expand Down
2 changes: 1 addition & 1 deletion src/Avalonia.Controls/Primitives/PopupRoot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public void Dispose()

private void UpdatePosition()
{
PlatformImpl?.PopupPositioner.Update(_positionerParameters);
PlatformImpl?.PopupPositioner?.Update(_positionerParameters);
}

public void ConfigurePosition(Visual target, PlacementMode placement, Point offset,
Expand Down
76 changes: 44 additions & 32 deletions src/Avalonia.X11/X11Window.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
using static Avalonia.X11.XLib;
// ReSharper disable IdentifierTypo
// ReSharper disable StringLiteralTypo

#nullable enable

namespace Avalonia.X11
{
internal unsafe partial class X11Window : IWindowImpl, IPopupImpl, IXI2Client
Expand All @@ -35,11 +38,11 @@ internal unsafe partial class X11Window : IWindowImpl, IPopupImpl, IXI2Client
private XConfigureEvent? _configure;
private PixelPoint? _configurePoint;
private bool _triggeredExpose;
private IInputRoot _inputRoot;
private IInputRoot? _inputRoot;
private readonly MouseDevice _mouse;
private readonly TouchDevice _touch;
private readonly IKeyboardDevice _keyboard;
private readonly ITopLevelNativeMenuExporter _nativeMenuExporter;
private readonly ITopLevelNativeMenuExporter? _nativeMenuExporter;
private readonly IStorageProvider _storageProvider;
private readonly X11NativeControlHost _nativeControlHost;
private PixelPoint? _position;
Expand All @@ -54,8 +57,8 @@ internal unsafe partial class X11Window : IWindowImpl, IPopupImpl, IXI2Client
private bool _wasMappedAtLeastOnce = false;
private double? _scalingOverride;
private bool _disabled;
private TransparencyHelper _transparencyHelper;
private RawEventGrouper _rawEventGrouper;
private TransparencyHelper? _transparencyHelper;
private RawEventGrouper? _rawEventGrouper;
private bool _useRenderWindow = false;
private bool _usePositioningFlags = false;

Expand All @@ -66,7 +69,7 @@ private enum XSyncState
WaitPaint
}

public X11Window(AvaloniaX11Platform platform, IWindowImpl popupParent)
public X11Window(AvaloniaX11Platform platform, IWindowImpl? popupParent)
{
_platform = platform;
_popup = popupParent != null;
Expand Down Expand Up @@ -196,7 +199,7 @@ public X11Window(AvaloniaX11Platform platform, IWindowImpl popupParent)

XFlush(_x11.Display);
if(_popup)
PopupPositioner = new ManagedPopupPositioner(new ManagedPopupPositionerPopupImplHelper(popupParent, MoveResize));
PopupPositioner = new ManagedPopupPositioner(new ManagedPopupPositionerPopupImplHelper(popupParent!, MoveResize));
if (platform.Options.UseDBusMenu)
_nativeMenuExporter = DBusMenuExporter.TryCreateTopLevelNativeMenu(_handle);
_nativeControlHost = new X11NativeControlHost(_platform, this);
Expand All @@ -214,7 +217,7 @@ public X11Window(AvaloniaX11Platform platform, IWindowImpl popupParent)

_storageProvider = new CompositeStorageProvider(new[]
{
() => _platform.Options.UseDBusFilePicker ? DBusSystemDialog.TryCreateAsync(Handle) : Task.FromResult<IStorageProvider>(null),
() => _platform.Options.UseDBusFilePicker ? DBusSystemDialog.TryCreateAsync(Handle) : Task.FromResult<IStorageProvider?>(null),
() => GtkSystemDialog.TryCreate(this)
});
}
Expand Down Expand Up @@ -351,17 +354,17 @@ public double RenderScaling
public double DesktopScaling => RenderScaling;

public IEnumerable<object> Surfaces { get; }
public Action<RawInputEventArgs> Input { get; set; }
public Action<Rect> Paint { get; set; }
public Action<Size, PlatformResizeReason> Resized { get; set; }
public Action<RawInputEventArgs>? Input { get; set; }
public Action<Rect>? Paint { get; set; }
public Action<Size, PlatformResizeReason>? Resized { get; set; }
//TODO
public Action<double> ScalingChanged { get; set; }
public Action Deactivated { get; set; }
public Action Activated { get; set; }
public Func<WindowCloseReason, bool> Closing { get; set; }
public Action<WindowState> WindowStateChanged { get; set; }
public Action<double>? ScalingChanged { get; set; }
public Action? Deactivated { get; set; }
public Action? Activated { get; set; }
public Func<WindowCloseReason, bool>? Closing { get; set; }
public Action<WindowState>? WindowStateChanged { get; set; }

public Action<WindowTransparencyLevel> TransparencyLevelChanged
public Action<WindowTransparencyLevel>? TransparencyLevelChanged
{
get => _transparencyHelper?.TransparencyLevelChanged;
set
Expand All @@ -371,23 +374,26 @@ public Action<WindowTransparencyLevel> TransparencyLevelChanged
}
}

public Action<bool> ExtendClientAreaToDecorationsChanged { get; set; }
public Action<bool>? ExtendClientAreaToDecorationsChanged { get; set; }

public Thickness ExtendedMargins { get; } = new Thickness();

public Thickness OffScreenMargin { get; } = new Thickness();

public bool IsClientAreaExtendedToDecorations { get; }

public Action Closed { get; set; }
public Action<PixelPoint> PositionChanged { get; set; }
public Action LostFocus { get; set; }
public Action? Closed { get; set; }
public Action<PixelPoint>? PositionChanged { get; set; }
public Action? LostFocus { get; set; }

public IRenderer CreateRenderer(IRenderRoot root) =>
new CompositingRenderer(root, _platform.Compositor, () => Surfaces);

private void OnEvent(ref XEvent ev)
{
if (_inputRoot is null)
return;

if (ev.type == XEventName.MapNotify)
{
_mapped = true;
Expand Down Expand Up @@ -434,7 +440,8 @@ private void OnEvent(ref XEvent ev)
2 => RawPointerEventType.MiddleButtonDown,
3 => RawPointerEventType.RightButtonDown,
8 => RawPointerEventType.XButton1Down,
9 => RawPointerEventType.XButton2Down
9 => RawPointerEventType.XButton2Down,
_ => throw new NotSupportedException("Unexepected RawPointerEventType.")
},
ref ev, ev.ButtonEvent.state);
else
Expand Down Expand Up @@ -462,7 +469,8 @@ private void OnEvent(ref XEvent ev)
2 => RawPointerEventType.MiddleButtonUp,
3 => RawPointerEventType.RightButtonUp,
8 => RawPointerEventType.XButton1Up,
9 => RawPointerEventType.XButton2Up
9 => RawPointerEventType.XButton2Up,
_ => throw new NotSupportedException("Unexepected RawPointerEventType.")
},
ref ev, ev.ButtonEvent.state);
}
Expand Down Expand Up @@ -618,7 +626,7 @@ private void OnPropertyChange(IntPtr atom, bool hasValue)
{
// Occurs once the window has been mapped, which is the earliest the extents
// can be retrieved, so invoke event to force update of TopLevel.FrameSize.
Resized.Invoke(ClientSize, PlatformResizeReason.Unspecified);
Resized?.Invoke(ClientSize, PlatformResizeReason.Unspecified);
}

if (atom == _x11.Atoms._NET_WM_STATE)
Expand Down Expand Up @@ -712,6 +720,8 @@ private void ScheduleInput(RawInputEventArgs args, ref XEvent xev)

private void DispatchInput(RawInputEventArgs args)
{
if (_inputRoot is null)
return;
Input?.Invoke(args);
if (!args.Handled && args is RawKeyEventArgsWithText text && !string.IsNullOrEmpty(text.Text))
Input?.Invoke(new RawTextInputEventArgs(_keyboard, args.Timestamp, _inputRoot, text.Text));
Expand Down Expand Up @@ -744,11 +754,13 @@ private void ScheduleInput(RawInputEventArgs args)
if (args is RawDragEvent drag)
drag.Location = drag.Location / RenderScaling;

_rawEventGrouper.HandleEvent(args);
_rawEventGrouper?.HandleEvent(args);
}

private void MouseEvent(RawPointerEventType type, ref XEvent ev, XModifierMask mods)
{
if (_inputRoot is null)
return;
var mev = new RawPointerEventArgs(
_mouse, (ulong)ev.ButtonEvent.time.ToInt64(), _inputRoot,
type, new Point(ev.ButtonEvent.x, ev.ButtonEvent.y), TranslateModifiers(mods));
Expand Down Expand Up @@ -783,7 +795,7 @@ public void Invalidate(Rect rect)

}

public IInputRoot InputRoot => _inputRoot;
public IInputRoot? InputRoot => _inputRoot;

public void SetInputRoot(IInputRoot inputRoot)
{
Expand All @@ -795,7 +807,7 @@ public void Dispose()
Cleanup();
}

public virtual object TryGetFeature(Type featureType)
public virtual object? TryGetFeature(Type featureType)
{
if (featureType == typeof(ITopLevelNativeMenuExporter))
{
Expand Down Expand Up @@ -953,7 +965,7 @@ public void CanResize(bool value)
UpdateSizeHints(null);
}

public void SetCursor(ICursorImpl cursor)
public void SetCursor(ICursorImpl? cursor)
{
if (cursor == null)
XDefineCursor(_x11.Display, _handle, _x11.DefaultCursor);
Expand Down Expand Up @@ -996,7 +1008,7 @@ public PixelPoint Position
public IMouseDevice MouseDevice => _mouse;
public TouchDevice TouchDevice => _touch;

public IPopupImpl CreatePopup()
public IPopupImpl? CreatePopup()
=> _platform.Options.OverlayPopups ? null : new X11Window(_platform, this);

public void Activate()
Expand Down Expand Up @@ -1082,7 +1094,7 @@ public void BeginResizeDrag(WindowEdge edge, PointerPressedEventArgs e)
BeginMoveResize(side, e);
}

public void SetTitle(string title)
public void SetTitle(string? title)
{
if (string.IsNullOrEmpty(title))
{
Expand Down Expand Up @@ -1161,9 +1173,9 @@ public void SetExtendClientAreaTitleBarHeightHint(double titleBarHeight)
{
}

public Action GotInputWhenDisabled { get; set; }
public Action? GotInputWhenDisabled { get; set; }

public void SetIcon(IWindowIconImpl icon)
public void SetIcon(IWindowIconImpl? icon)
{
if (icon != null)
{
Expand Down Expand Up @@ -1218,7 +1230,7 @@ private void ChangeWMAtoms(bool enable, params IntPtr[] atoms)
);
}

public IPopupPositioner PopupPositioner { get; }
public IPopupPositioner? PopupPositioner { get; }

public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) =>
_transparencyHelper?.SetTransparencyRequest(transparencyLevel);
Expand Down

0 comments on commit 68d680c

Please sign in to comment.