From 6cf8ff66dcc1434304ca49dda9ba89a34f578a8f Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Thu, 22 Feb 2024 08:52:30 +0000 Subject: [PATCH] add x11 allowed actions atom --- src/Avalonia.X11/X11Atoms.cs | 10 ++++++++++ src/Avalonia.X11/X11Window.cs | 32 +++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.X11/X11Atoms.cs b/src/Avalonia.X11/X11Atoms.cs index b00879bd1d..fe5396d4c8 100644 --- a/src/Avalonia.X11/X11Atoms.cs +++ b/src/Avalonia.X11/X11Atoms.cs @@ -179,6 +179,16 @@ namespace Avalonia.X11 public IntPtr _NET_WM_WINDOW_TYPE_SPLASH; public IntPtr _NET_WM_WINDOW_TYPE_DIALOG; public IntPtr _NET_WM_WINDOW_TYPE_NORMAL; + public IntPtr _NET_WM_ACTION_MOVE; + public IntPtr _NET_WM_ACTION_RESIZE; + public IntPtr _NET_WM_ACTION_MINIMIZE; + public IntPtr _NET_WM_ACTION_SHADE; + public IntPtr _NET_WM_ACTION_STICK; + public IntPtr _NET_WM_ACTION_MAXIMIZE_HORZ; + public IntPtr _NET_WM_ACTION_MAXIMIZE_VERT; + public IntPtr _NET_WM_ACTION_FULLSCREEN; + public IntPtr _NET_WM_ACTION_CHANGE_DESKTOP; + public IntPtr _NET_WM_ACTION_CLOSE; public IntPtr CLIPBOARD; public IntPtr CLIPBOARD_MANAGER; public IntPtr SAVE_TARGETS; diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index f710ddab77..d2641c04bf 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -567,7 +567,7 @@ namespace Avalonia.X11 { if (ev.ClientMessageEvent.ptr1 == _x11.Atoms.WM_DELETE_WINDOW) { - if (Closing?.Invoke(WindowCloseReason.WindowClosing) != true) + if (!_disabled && Closing?.Invoke(WindowCloseReason.WindowClosing) != true) Dispose(); } else if (ev.ClientMessageEvent.ptr1 == _x11.Atoms._NET_WM_SYNC_REQUEST) @@ -1298,6 +1298,8 @@ namespace Avalonia.X11 { XFree(wmHintsPtr); } + + UpdateNetAllowedActions(); } public void SetExtendClientAreaToDecorationsHint(bool extendIntoClientAreaHint) @@ -1369,6 +1371,34 @@ namespace Avalonia.X11 ); } + private void UpdateNetAllowedActions() + { + var allowedActions = new HashSet() + { + _x11.Atoms._NET_WM_ACTION_MOVE, + _x11.Atoms._NET_WM_ACTION_RESIZE, + _x11.Atoms._NET_WM_ACTION_MINIMIZE, + _x11.Atoms._NET_WM_ACTION_SHADE, + _x11.Atoms._NET_WM_ACTION_STICK, + _x11.Atoms._NET_WM_ACTION_MAXIMIZE_HORZ, + _x11.Atoms._NET_WM_ACTION_MAXIMIZE_VERT, + _x11.Atoms._NET_WM_ACTION_FULLSCREEN, + _x11.Atoms._NET_WM_ACTION_CHANGE_DESKTOP, + _x11.Atoms._NET_WM_ACTION_CLOSE, + }; + + if(_disabled) + { + allowedActions.Remove(_x11.Atoms._NET_WM_ACTION_MINIMIZE); + allowedActions.Remove(_x11.Atoms._NET_WM_ACTION_MAXIMIZE_HORZ); + allowedActions.Remove(_x11.Atoms._NET_WM_ACTION_MAXIMIZE_VERT); + allowedActions.Remove(_x11.Atoms._NET_WM_ACTION_CLOSE); + } + + XChangeProperty(_x11.Display, _handle, _x11.Atoms._NET_WM_ALLOWED_ACTIONS, (IntPtr)Atom.XA_ATOM, 32, + PropertyMode.Replace, allowedActions.ToArray(), allowedActions.Count); + } + public IPopupPositioner? PopupPositioner { get; } public void SetTransparencyLevelHint(IReadOnlyList transparencyLevels)