[X11] Set WM_CLASS property
authorthefiddler <stapostol@gmail.com>
Sat, 26 Apr 2014 18:27:00 +0000 (20:27 +0200)
committerthefiddler <stapostol@gmail.com>
Sat, 26 Apr 2014 18:27:00 +0000 (20:27 +0200)
This allows Ubuntu Unity and Gnome Shell to detect and display
the correct application name.

Source/OpenTK/Platform/X11/Functions.cs
Source/OpenTK/Platform/X11/Structs.cs
Source/OpenTK/Platform/X11/X11GLNative.cs

index 4a22d66..6fae04f 100644 (file)
@@ -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")]
index f105d57..3deefa1 100644 (file)
@@ -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,
index 37becf4..5c32458 100644 (file)
@@ -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",