cacaa8c
qt-bugs@ issue : none
cacaa8c
bugs.kde.org number : none
cacaa8c
applied: no
cacaa8c
author: Lubos Lunak <l.lunak@kde.org>
cacaa8c
cacaa8c
This patch makes override-redirect windows (popup menu, dropdown menu,
cacaa8c
tooltip, combobox, etc.) also have more window properties like WM_CLASS,
cacaa8c
so they can be used when compositing.
cacaa8c
cacaa8c
--- src/kernel/qwidget_x11.cpp.sav	2007-06-25 10:36:42.000000000 +0200
cacaa8c
+++ src/kernel/qwidget_x11.cpp	2007-10-02 15:30:13.000000000 +0200
cacaa8c
@@ -557,7 +557,10 @@ void QWidget::create( WId window, bool i
cacaa8c
 	wsa.save_under = True;
cacaa8c
 	XChangeWindowAttributes( dpy, id, CWOverrideRedirect | CWSaveUnder,
cacaa8c
 				 &wsa );
cacaa8c
-	x11SetWindowType();
cacaa8c
+	XClassHint class_hint;
cacaa8c
+	class_hint.res_name = (char *) qAppName(); // application name
cacaa8c
+	class_hint.res_class = (char *) qAppClass();	// application class
cacaa8c
+        XSetClassHint( dpy, id, &class_hint );
cacaa8c
     } else if ( topLevel && !desktop ) {	// top-level widget
cacaa8c
 	QWidget *p = parentWidget();	// real parent
cacaa8c
 	if (p)
cacaa8c
@@ -620,8 +623,6 @@ void QWidget::create( WId window, bool i
cacaa8c
         else
cacaa8c
             XDeleteProperty(dpy, id, qt_xa_motif_wm_hints);
cacaa8c
 
cacaa8c
-	x11SetWindowType();
cacaa8c
-
cacaa8c
 	// set _NET_WM_WINDOW_STATE
cacaa8c
 	if (curr_winstate > 0)
cacaa8c
 	    XChangeProperty(dpy, id, qt_net_wm_state, XA_ATOM, 32, PropModeReplace,
cacaa8c
@@ -629,11 +630,6 @@ void QWidget::create( WId window, bool i
cacaa8c
         else
cacaa8c
             XDeleteProperty(dpy, id, qt_net_wm_state);
cacaa8c
 
cacaa8c
-	// set _NET_WM_PID
cacaa8c
-	long curr_pid = getpid();
cacaa8c
-	XChangeProperty(dpy, id, qt_net_wm_pid, XA_CARDINAL, 32, PropModeReplace,
cacaa8c
-			(unsigned char *) &curr_pid, 1);
cacaa8c
-
cacaa8c
 #ifndef QT_NO_XSYNC
cacaa8c
         // set _NET_WM_SYNC_COUNTER
cacaa8c
         createSyncCounter();
cacaa8c
@@ -645,19 +641,31 @@ void QWidget::create( WId window, bool i
cacaa8c
 	// when we create a toplevel widget, the frame strut should be dirty
cacaa8c
 	fstrut_dirty = 1;
cacaa8c
 
cacaa8c
+    } else {
cacaa8c
+	// non-toplevel widgets don't have a frame, so no need to
cacaa8c
+	// update the strut
cacaa8c
+	fstrut_dirty = 0;
cacaa8c
+    }
cacaa8c
+
cacaa8c
+    if (initializeWindow && (popup || (topLevel && !desktop))) { // properties set on all toplevel windows
cacaa8c
+	x11SetWindowType();
cacaa8c
+
cacaa8c
+	// set _NET_WM_PID
cacaa8c
+	long curr_pid = getpid();
cacaa8c
+	XChangeProperty(dpy, id, qt_net_wm_pid, XA_CARDINAL, 32, PropModeReplace,
cacaa8c
+			(unsigned char *) &curr_pid, 1);
cacaa8c
+
cacaa8c
 	// declare the widget's object name as window role
cacaa8c
 	XChangeProperty( dpy, id,
cacaa8c
 			 qt_window_role, XA_STRING, 8, PropModeReplace,
cacaa8c
 			 (unsigned char *)name(), qstrlen( name() ) );
cacaa8c
 
cacaa8c
 	// set client leader property
cacaa8c
+	if ( !qt_x11_wm_client_leader )
cacaa8c
+	    qt_x11_create_wm_client_leader();
cacaa8c
 	XChangeProperty( dpy, id, qt_wm_client_leader,
cacaa8c
 			 XA_WINDOW, 32, PropModeReplace,
cacaa8c
 			 (unsigned char *)&qt_x11_wm_client_leader, 1 );
cacaa8c
-    } else {
cacaa8c
-	// non-toplevel widgets don't have a frame, so no need to
cacaa8c
-	// update the strut
cacaa8c
-	fstrut_dirty = 0;
cacaa8c
     }
cacaa8c
 
cacaa8c
     if ( initializeWindow ) {