Browse Source

Merge pull request #8597 from AvaloniaUI/feature/x11-wmclass-spec

Set WM_CLASS property according to ICCCM spec
pull/8601/head
Nikita Tsukanov 4 years ago
committed by GitHub
parent
commit
0614b86cef
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      src/Avalonia.X11/X11Platform.cs
  2. 23
      src/Avalonia.X11/X11Window.cs
  3. 14
      src/Avalonia.X11/XLib.cs

3
src/Avalonia.X11/X11Platform.cs

@ -277,7 +277,8 @@ namespace Avalonia
// and sometimes attempts to use GLX might cause a segfault // and sometimes attempts to use GLX might cause a segfault
"llvmpipe" "llvmpipe"
}; };
public string WmClass { get; set; } = Assembly.GetEntryAssembly()?.GetName()?.Name ?? "AvaloniaApplication";
public string WmClass { get; set; } = Assembly.GetEntryAssembly()?.GetName()?.Name;
/// <summary> /// <summary>
/// Enables multitouch support. The default value is true. /// Enables multitouch support. The default value is true.

23
src/Avalonia.X11/X11Window.cs

@ -168,8 +168,7 @@ namespace Avalonia.X11
XChangeProperty(_x11.Display, _handle, _x11.Atoms._NET_WM_WINDOW_TYPE, _x11.Atoms.XA_ATOM, XChangeProperty(_x11.Display, _handle, _x11.Atoms._NET_WM_WINDOW_TYPE, _x11.Atoms.XA_ATOM,
32, PropertyMode.Replace, new[] {_x11.Atoms._NET_WM_WINDOW_TYPE_NORMAL}, 1); 32, PropertyMode.Replace, new[] {_x11.Atoms._NET_WM_WINDOW_TYPE_NORMAL}, 1);
if (platform.Options.WmClass != null) SetWmClass(_platform.Options.WmClass);
SetWmClass(platform.Options.WmClass);
var surfaces = new List<object> var surfaces = new List<object>
{ {
@ -1082,12 +1081,24 @@ namespace Avalonia.X11
public void SetWmClass(string wmClass) public void SetWmClass(string wmClass)
{ {
var data = Encoding.ASCII.GetBytes(wmClass); // See https://tronche.com/gui/x/icccm/sec-4.html#WM_CLASS
fixed (void* pdata = data) // We don't actually parse the application's command line, so we only use RESOURCE_NAME and argv[0]
var appId = Environment.GetEnvironmentVariable("RESOURCE_NAME")
?? Process.GetCurrentProcess().ProcessName;
var encodedAppId = Encoding.ASCII.GetBytes(appId);
var encodedWmClass = Encoding.ASCII.GetBytes(wmClass ?? appId);
var hint = XAllocClassHint();
fixed(byte* pAppId = encodedAppId)
fixed (byte* pWmClass = encodedWmClass)
{ {
XChangeProperty(_x11.Display, _handle, _x11.Atoms.XA_WM_CLASS, _x11.Atoms.XA_STRING, 8, hint->res_name = pAppId;
PropertyMode.Replace, pdata, data.Length); hint->res_class = pWmClass;
XSetClassHint(_x11.Display, _handle, hint);
} }
XFree(hint);
} }
public void SetMinMaxSize(Size minSize, Size maxSize) public void SetMinMaxSize(Size minSize, Size maxSize)

14
src/Avalonia.X11/XLib.cs

@ -109,6 +109,9 @@ namespace Avalonia.X11
[DllImport(libX11)] [DllImport(libX11)]
public static extern int XFree(IntPtr data); public static extern int XFree(IntPtr data);
[DllImport(libX11)]
public static extern int XFree(void* data);
[DllImport(libX11)] [DllImport(libX11)]
public static extern int XRaiseWindow(IntPtr display, IntPtr window); public static extern int XRaiseWindow(IntPtr display, IntPtr window);
@ -628,6 +631,12 @@ namespace Avalonia.X11
return XISelectEvents(display, window, emasks, devices.Count); return XISelectEvents(display, window, emasks, devices.Count);
} }
[DllImport(libX11)]
public static extern XClassHint* XAllocClassHint();
[DllImport(libX11)]
public static extern int XSetClassHint(IntPtr display, IntPtr window, XClassHint* class_hints);
public struct XGeometry public struct XGeometry
{ {
@ -639,6 +648,11 @@ namespace Avalonia.X11
public int bw; public int bw;
public int d; public int d;
} }
public struct XClassHint
{
public byte* res_name;
public byte* res_class;
}
public struct XSyncValue { public struct XSyncValue {
public int Hi; public int Hi;

Loading…
Cancel
Save