From 4087627b12c4dc4f43500ad4dad263aa788e7a4c Mon Sep 17 00:00:00 2001 From: Jon Gjengset Date: Thu, 4 May 2017 17:34:45 -0400 Subject: [PATCH] Set WM_CLASS and WM_NAME before mapping window ICCCM 4.1.2.5 (https://tronche.com/gui/x/icccm/sec-4.html#WM_CLASS) states that: > This property must be present when the window leaves the Withdrawn > state and may be changed only while the window is in the Withdrawn > state. Previously, we would first map the window, and then set these properties, causing sadness for window managers (#167, tomaka/glutin#879). This patch changes that by setting the class and name attributes immediately after the window is created, and before it is mapped. Fixes #167. --- src/platform/linux/x11/window.rs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/platform/linux/x11/window.rs b/src/platform/linux/x11/window.rs index deca3d2c..c808e85f 100644 --- a/src/platform/linux/x11/window.rs +++ b/src/platform/linux/x11/window.rs @@ -403,6 +403,19 @@ impl Window { win }; + // Set ICCCM WM_CLASS property based on initial window title + // Must be done *before* mapping the window by ICCCM 4.1.2.5 + unsafe { + with_c_str(&*window_attrs.title, |c_name| { + let hint = (display.xlib.XAllocClassHint)(); + (*hint).res_name = c_name as *mut libc::c_char; + (*hint).res_class = c_name as *mut libc::c_char; + (display.xlib.XSetClassHint)(display.display, window, hint); + display.check_errors().expect("Failed to call XSetClassHint"); + (display.xlib.XFree)(hint as *mut _); + }); + } + // set visibility if window_attrs.visible { unsafe { @@ -466,18 +479,6 @@ impl Window { } } - // Set ICCCM WM_CLASS property based on initial window title - unsafe { - with_c_str(&*window_attrs.title, |c_name| { - let hint = (display.xlib.XAllocClassHint)(); - (*hint).res_name = c_name as *mut libc::c_char; - (*hint).res_class = c_name as *mut libc::c_char; - (display.xlib.XSetClassHint)(display.display, window, hint); - display.check_errors().expect("Failed to call XSetClassHint"); - (display.xlib.XFree)(hint as *mut _); - }); - } - let is_fullscreen = window_attrs.monitor.is_some(); if is_fullscreen {