Chromium Code Reviews| 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 179bc759a171c2f4c0cf5cd0b0e9bf1062286be9..b1d4f1bd874a5c0fbb574bb984fd1d0157c67e50 100644 |
| --- a/ui/views/widget/desktop_aura/x11_desktop_handler.cc |
| +++ b/ui/views/widget/desktop_aura/x11_desktop_handler.cc |
| @@ -4,6 +4,9 @@ |
| #include "ui/views/widget/desktop_aura/x11_desktop_handler.h" |
| +#include <X11/Xatom.h> |
| +#include <X11/Xlib.h> |
| + |
| #include "base/message_loop/message_loop.h" |
| #include "ui/aura/env.h" |
| #include "ui/aura/root_window.h" |
| @@ -18,6 +21,7 @@ namespace { |
| const char* kAtomsToCache[] = { |
| "_NET_ACTIVE_WINDOW", |
| + "_NET_SUPPORTED", |
| NULL |
| }; |
| @@ -40,7 +44,8 @@ X11DesktopHandler::X11DesktopHandler() |
| : xdisplay_(gfx::GetXDisplay()), |
| x_root_window_(DefaultRootWindow(xdisplay_)), |
| current_window_(None), |
| - atom_cache_(xdisplay_, kAtomsToCache) { |
| + atom_cache_(xdisplay_, kAtomsToCache), |
| + wm_supports_active_window_(false) { |
| base::MessagePumpX11::Current()->AddDispatcherForRootWindow(this); |
| aura::Env::GetInstance()->AddObserver(this); |
| @@ -49,6 +54,18 @@ X11DesktopHandler::X11DesktopHandler() |
| XSelectInput(xdisplay_, x_root_window_, |
| attr.your_event_mask | PropertyChangeMask | |
| StructureNotifyMask | SubstructureNotifyMask); |
| + |
| + std::vector<Atom> atoms; |
| + if (ui::GetAtomArrayProperty(x_root_window_, "_NET_ACTIVE_WINDOW", &atoms)) { |
| + Atom active_window = atom_cache_.GetAtom("_NET_ACTIVE_WINDOW"); |
| + for (std::vector<Atom>::iterator iter = atoms.begin(); iter != atoms.end(); |
| + ++iter) { |
| + if (*(iter) == active_window) { |
| + wm_supports_active_window_ = true; |
| + break; |
| + } |
| + } |
| + } |
| } |
| X11DesktopHandler::~X11DesktopHandler() { |
| @@ -57,23 +74,28 @@ X11DesktopHandler::~X11DesktopHandler() { |
| } |
| void X11DesktopHandler::ActivateWindow(::Window window) { |
| - DCHECK_EQ(gfx::GetXDisplay(), xdisplay_); |
| - |
| - 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[1] = CurrentTime; |
| - xclient.xclient.data.l[2] = None; |
| - xclient.xclient.data.l[3] = 0; |
| - xclient.xclient.data.l[4] = 0; |
| - |
| - XSendEvent(xdisplay_, x_root_window_, False, |
| - SubstructureRedirectMask | SubstructureNotifyMask, |
| - &xclient); |
| + if (wm_supports_active_window_) { |
| + DCHECK_EQ(gfx::GetXDisplay(), xdisplay_); |
| + |
| + 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[1] = CurrentTime; |
| + xclient.xclient.data.l[2] = None; |
| + xclient.xclient.data.l[3] = 0; |
| + xclient.xclient.data.l[4] = 0; |
| + |
| + XSendEvent(xdisplay_, x_root_window_, False, |
| + SubstructureRedirectMask | SubstructureNotifyMask, |
| + (XEvent*)&xclient); |
|
Elliot Glaysher
2013/11/14 19:11:24
The c-style cast is still here.
sadrul
2013/11/14 19:15:14
Doh! Fixed.
|
| + } else { |
| + XRaiseWindow(xdisplay_, window); |
| + OnActiveWindowChanged(window); |
| + } |
| } |
| bool X11DesktopHandler::IsActiveWindow(::Window window) const { |