[Spice-devel] [PATCH spice] spicec-x11: Fix window management under KDE

Hans de Goede hdegoede at redhat.com
Sun Oct 17 06:01:01 PDT 2010


There were 2 issues with window management under KDE
1) When an app does its own focus management like we do, kwin expects
   an explicit raise for the app to get to the top, so we did have focus,
   but would have other windows (partially) covering the client window
   -> do a raise after setting focus to ourselves
2) When switching from fullscreen <-> window, we unmap and remap our
   window, then set focus to ourselves. kwin thinks this means we're trying
   to steal the focus without the user asking for it. This patch makes us
   set the _NET_WM_USER_TIME property on our window, this helps kwin's
   focus stealing code to see that we are really not stealing the focus,
   just responding to a user event.
---
 client/x11/red_window.cpp |   12 ++++++++++++
 client/x11/red_window_p.h |    1 +
 2 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/client/x11/red_window.cpp b/client/x11/red_window.cpp
index 8f6535b..7cdf684 100644
--- a/client/x11/red_window.cpp
+++ b/client/x11/red_window.cpp
@@ -801,6 +801,10 @@ void RedWindow_p::win_proc(XEvent& event)
     }
     case KeyPress:
         red_window->handle_key_press_event(*red_window, &event.xkey);
+        red_window->last_event_time = event.xkey.time;
+        XChangeProperty(x_display, red_window->_win, wm_user_time,
+                        XA_CARDINAL, 32, PropModeReplace,
+                        (unsigned char *)&event.xkey.time, 1);
         break;
     case KeyRelease: {
         RedKey key = to_red_key_code(event.xkey.keycode);
@@ -829,6 +833,10 @@ void RedWindow_p::win_proc(XEvent& event)
             break;
         }
         red_window->get_listener().on_mouse_button_press(button, state);
+        red_window->last_event_time = event.xkey.time;
+        XChangeProperty(x_display, red_window->_win, wm_user_time,
+                        XA_CARDINAL, 32, PropModeReplace,
+                        (unsigned char *)&event.xbutton.time, 1);
         break;
     }
     case ButtonRelease: {
@@ -1526,6 +1534,8 @@ void RedWindow::show(int screen_id)
         XDeleteProperty(x_display, _win, wm_state);
         wait_parent = true;
     }
+    XChangeProperty(x_display, _win, wm_user_time, XA_CARDINAL, 32,
+                    PropModeReplace, (unsigned char *)&last_event_time, 1);
     XMapWindow(x_display, _win);
     move_to_current_desktop();
     _expect_parent = wait_parent;
@@ -1664,6 +1674,8 @@ void RedWindow::activate()
 {
     //todo: use _NET_ACTIVE_WINDOW
     XSetInputFocus(x_display, _win, RevertToParent, CurrentTime);
+    /* kwin won't raise on focus */
+    XRaiseWindow(x_display, _win);
 }
 
 void RedWindow::minimize()
diff --git a/client/x11/red_window_p.h b/client/x11/red_window_p.h
index 8f14d4e..4ad5451 100644
--- a/client/x11/red_window_p.h
+++ b/client/x11/red_window_p.h
@@ -82,6 +82,7 @@ protected:
     RedWindow *_red_window;
     int _width;
     int _height;
+    Time last_event_time;
 };
 
 #endif
-- 
1.7.3.1



More information about the Spice-devel mailing list