Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(760)

Unified Diff: ui/views/widget/desktop_aura/x11_desktop_handler.cc

Issue 1135693006: Fix X11DesktopHandler::ActivateWindow on Unity for known user gestures Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/views/widget/desktop_aura/x11_desktop_handler.cc
diff --git a/ui/views/widget/desktop_aura/x11_desktop_handler.cc b/ui/views/widget/desktop_aura/x11_desktop_handler.cc
index 33b6347958efd04a654db25e6edc6ef636047394..b772d24b3b604c01cfdc79ffc28ce1a2c97a4c54 100644
--- a/ui/views/widget/desktop_aura/x11_desktop_handler.cc
+++ b/ui/views/widget/desktop_aura/x11_desktop_handler.cc
@@ -74,7 +74,8 @@ X11DesktopHandler::~X11DesktopHandler() {
ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
}
-void X11DesktopHandler::ActivateWindow(::Window window) {
+void X11DesktopHandler::ActivateWindow(::Window window,
+ bool for_user_gesture) {
if ((current_window_ == None || current_window_ == window) &&
current_window_active_state_ == NOT_ACTIVE) {
// |window| is most likely still active wrt to the X server. Undo the
@@ -91,13 +92,29 @@ void X11DesktopHandler::ActivateWindow(::Window window) {
if (wm_supports_active_window_) {
DCHECK_EQ(gfx::GetXDisplay(), xdisplay_);
+ // According to
+ // http://standards.freedesktop.org/wm-spec/wm-spec-latest.html#sourceindication
+ // "Some requests from Clients include type of the Client, for example the
+ // _NET_ACTIVE_WINDOW message. Currently the types can be 1 for normal
+ // applications, and 2 for pagers and other Clients that represent direct
+ // user actions (the Window Manager may decide to treat requests from
+ // applications differently than requests that are result of direct user
+ // actions)."
+ //
+ // Normally we set the source indication to 1 (normal application), but when
+ // we know activation is being triggered from a user gesture, then we set it
+ // to 2 so the WM properly prioritizes our request. Without this, Unity on
+ // Ubuntu 14.04 ignores requests to activate a window unless some other
+ // Chrome window is already the active window (see issues 470830 & 411702).
+ long source_indication = for_user_gesture ? 2 : 1;
+
XEvent xclient;
memset(&xclient, 0, sizeof(xclient));
xclient.type = ClientMessage;
xclient.xclient.window = window;
xclient.xclient.message_type = atom_cache_.GetAtom("_NET_ACTIVE_WINDOW");
xclient.xclient.format = 32;
- xclient.xclient.data.l[0] = 1; // Specified we are an app.
+ xclient.xclient.data.l[0] = source_indication;
xclient.xclient.data.l[1] = wm_user_time_ms_;
xclient.xclient.data.l[2] = None;
xclient.xclient.data.l[3] = 0;

Powered by Google App Engine
This is Rietveld 408576698