From a79086bb20682139b1bc7e03494b0811057c8e08 Mon Sep 17 00:00:00 2001 From: thefiddler Date: Sat, 26 Apr 2014 20:27:00 +0200 Subject: [PATCH] [X11] Set WM_CLASS property This allows Ubuntu Unity and Gnome Shell to detect and display the correct application name. --- Source/OpenTK/Platform/X11/Functions.cs | 3 +++ Source/OpenTK/Platform/X11/Structs.cs | 8 ++++++++ Source/OpenTK/Platform/X11/X11GLNative.cs | 12 +++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Source/OpenTK/Platform/X11/Functions.cs b/Source/OpenTK/Platform/X11/Functions.cs index 4a22d660..6fae04fa 100644 --- a/Source/OpenTK/Platform/X11/Functions.cs +++ b/Source/OpenTK/Platform/X11/Functions.cs @@ -513,6 +513,9 @@ namespace OpenTK.Platform.X11 [DllImport("libX11")] public static extern void XFreeEventData(IntPtr display, ref XGenericEventCookie cookie); + [DllImport("libX11")] + public static extern void XSetClassHint(IntPtr display, IntPtr window, ref XClassHint hint); + [DllImport("libXi")] static extern int XISelectEvents(IntPtr dpy, Window win, [In] XIEventMask[] masks, int num_masks); [DllImport("libXi")] diff --git a/Source/OpenTK/Platform/X11/Structs.cs b/Source/OpenTK/Platform/X11/Structs.cs index f105d57b..3deefa1a 100644 --- a/Source/OpenTK/Platform/X11/Structs.cs +++ b/Source/OpenTK/Platform/X11/Structs.cs @@ -748,6 +748,14 @@ namespace OpenTK.Platform.X11 public IntPtr nitems; } + internal struct XClassHint + { + [MarshalAs(UnmanagedType.LPStr)] + public string Name; + [MarshalAs(UnmanagedType.LPStr)] + public string Class; + } + internal enum XWindowClass { InputOutput = 1, diff --git a/Source/OpenTK/Platform/X11/X11GLNative.cs b/Source/OpenTK/Platform/X11/X11GLNative.cs index 37becf4d..5c32458a 100644 --- a/Source/OpenTK/Platform/X11/X11GLNative.cs +++ b/Source/OpenTK/Platform/X11/X11GLNative.cs @@ -89,6 +89,8 @@ namespace OpenTK.Platform.X11 IntPtr _atom_net_frame_extents; + IntPtr _atom_wm_class; + readonly IntPtr _atom_xa_cardinal = new IntPtr(6); //IntPtr _atom_motif_wm_hints; @@ -194,12 +196,20 @@ namespace OpenTK.Platform.X11 hints.base_width = width; hints.base_height = height; hints.flags = (IntPtr)(XSizeHintsFlags.PSize | XSizeHintsFlags.PPosition); + + XClassHint class_hint = new XClassHint(); + class_hint.Name = Assembly.GetEntryAssembly().GetName().Name.ToLower(); + class_hint.Class = Assembly.GetEntryAssembly().GetName().Name; + using (new XLock(window.Display)) { Functions.XSetWMNormalHints(window.Display, window.Handle, ref hints); // Register for window destroy notification Functions.XSetWMProtocols(window.Display, window.Handle, new IntPtr[] { _atom_wm_destroy }, 1); + + // Set the window class hints + Functions.XSetClassHint(window.Display, window.Handle, ref class_hint); } // Set the initial window size to ensure X, Y, Width, Height and the rest @@ -296,7 +306,7 @@ namespace OpenTK.Platform.X11 _atom_net_frame_extents = Functions.XInternAtom(window.Display, "_NET_FRAME_EXTENTS", false); - + // string[] atom_names = new string[] // { // //"WM_TITLE",