| 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 aa3c234553df05cf3bd820eee1eb0bc0b273c5a7..0e2855d4dbd8683aa0ad7d90dd65be96a8266bb4 100644
 | 
| --- a/ui/views/widget/desktop_aura/x11_desktop_handler.cc
 | 
| +++ b/ui/views/widget/desktop_aura/x11_desktop_handler.cc
 | 
| @@ -21,7 +21,6 @@
 | 
|  namespace {
 | 
|  
 | 
|  const char* const kAtomsToCache[] = {
 | 
| -  "_NET_ACTIVE_WINDOW",
 | 
|    "_NET_CURRENT_DESKTOP",
 | 
|    nullptr
 | 
|  };
 | 
| @@ -44,12 +43,7 @@ X11DesktopHandler* X11DesktopHandler::get() {
 | 
|  X11DesktopHandler::X11DesktopHandler()
 | 
|      : xdisplay_(gfx::GetXDisplay()),
 | 
|        x_root_window_(DefaultRootWindow(xdisplay_)),
 | 
| -      x_active_window_(None),
 | 
| -      wm_user_time_ms_(CurrentTime),
 | 
| -      current_window_(None),
 | 
| -      current_window_active_state_(NOT_ACTIVE),
 | 
| -      atom_cache_(xdisplay_, kAtomsToCache),
 | 
| -      wm_supports_active_window_(false) {
 | 
| +      atom_cache_(xdisplay_, kAtomsToCache) {
 | 
|    if (ui::PlatformEventSource::GetInstance())
 | 
|      ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
 | 
|    aura::Env::GetInstance()->AddObserver(this);
 | 
| @@ -59,15 +53,6 @@ X11DesktopHandler::X11DesktopHandler()
 | 
|    XSelectInput(xdisplay_, x_root_window_,
 | 
|                 attr.your_event_mask | PropertyChangeMask |
 | 
|                 StructureNotifyMask | SubstructureNotifyMask);
 | 
| -
 | 
| -  if (ui::GuessWindowManager() == ui::WM_WMII) {
 | 
| -    // wmii says that it supports _NET_ACTIVE_WINDOW but does not.
 | 
| -    // https://code.google.com/p/wmii/issues/detail?id=266
 | 
| -    wm_supports_active_window_ = false;
 | 
| -  } else {
 | 
| -    wm_supports_active_window_ =
 | 
| -        ui::WmSupportsHint(atom_cache_.GetAtom("_NET_ACTIVE_WINDOW"));
 | 
| -  }
 | 
|  }
 | 
|  
 | 
|  X11DesktopHandler::~X11DesktopHandler() {
 | 
| @@ -76,56 +61,6 @@ X11DesktopHandler::~X11DesktopHandler() {
 | 
|      ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
 | 
|  }
 | 
|  
 | 
| -void X11DesktopHandler::ActivateWindow(::Window window) {
 | 
| -  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
 | 
| -    // changes made in DeactivateWindow().
 | 
| -    OnActiveWindowChanged(window, ACTIVE);
 | 
| -
 | 
| -    // Go through the regular activation path such that calling
 | 
| -    // DeactivateWindow() and ActivateWindow() immediately afterwards results
 | 
| -    // in an active X window.
 | 
| -  }
 | 
| -
 | 
| -  if (wm_supports_active_window_) {
 | 
| -    DCHECK_EQ(gfx::GetXDisplay(), xdisplay_);
 | 
| -
 | 
| -    // If the window is not already active, send a hint to activate it
 | 
| -    if (x_active_window_ != window) {
 | 
| -      if (wm_user_time_ms_ == CurrentTime) {
 | 
| -        set_wm_user_time_ms(
 | 
| -            ui::X11EventSource::GetInstance()->UpdateLastSeenServerTime());
 | 
| -      }
 | 
| -      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] = wm_user_time_ms_;
 | 
| -      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);
 | 
| -    } else {
 | 
| -      OnActiveWindowChanged(window, ACTIVE);
 | 
| -    }
 | 
| -  } else {
 | 
| -    XRaiseWindow(xdisplay_, window);
 | 
| -    // Directly ask the X server to give focus to the window. Note
 | 
| -    // that the call will raise an X error if the window is not
 | 
| -    // mapped.
 | 
| -    XSetInputFocus(xdisplay_, window, RevertToParent, CurrentTime);
 | 
| -
 | 
| -    OnActiveWindowChanged(window, ACTIVE);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  void X11DesktopHandler::AddObserver(X11DesktopHandlerObserver* observer) {
 | 
|    observers_.AddObserver(observer);
 | 
|  }
 | 
| @@ -149,57 +84,6 @@ bool X11DesktopHandler::UpdateWorkspace() {
 | 
|    return false;
 | 
|  }
 | 
|  
 | 
| -void X11DesktopHandler::set_wm_user_time_ms(Time time_ms) {
 | 
| -  if (time_ms != CurrentTime) {
 | 
| -    int64_t event_time_64 = time_ms;
 | 
| -    int64_t time_difference = wm_user_time_ms_ - event_time_64;
 | 
| -    // Ignore timestamps that go backwards. However, X server time is a 32-bit
 | 
| -    // millisecond counter, so if the time goes backwards by more than half the
 | 
| -    // range of the 32-bit counter, treat it as a rollover.
 | 
| -    if (time_difference < 0 || time_difference > (UINT32_MAX >> 1))
 | 
| -      wm_user_time_ms_ = time_ms;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void X11DesktopHandler::DeactivateWindow(::Window window) {
 | 
| -  if (!IsActiveWindow(window))
 | 
| -    return;
 | 
| -
 | 
| -  XLowerWindow(xdisplay_, window);
 | 
| -
 | 
| -  // Per ICCCM: http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.7
 | 
| -  // "Clients should not give up the input focus of their own volition.
 | 
| -  // They should ignore input that they receive instead."
 | 
| -  //
 | 
| -  // There is nothing else that we can do. Pretend that we have been
 | 
| -  // deactivated and ignore keyboard input in DesktopWindowTreeHostX11.
 | 
| -  OnActiveWindowChanged(window, NOT_ACTIVE);
 | 
| -}
 | 
| -
 | 
| -bool X11DesktopHandler::IsActiveWindow(::Window window) const {
 | 
| -  return window == current_window_ && current_window_active_state_ == ACTIVE;
 | 
| -}
 | 
| -
 | 
| -void X11DesktopHandler::ProcessXEvent(XEvent* event) {
 | 
| -  // Ignore focus events that are being sent only because the pointer is over
 | 
| -  // our window, even if the input focus is in a different window.
 | 
| -  if (event->xfocus.detail == NotifyPointer)
 | 
| -    return;
 | 
| -
 | 
| -  switch (event->type) {
 | 
| -    case FocusIn:
 | 
| -      if (current_window_ != event->xfocus.window)
 | 
| -        OnActiveWindowChanged(event->xfocus.window, ACTIVE);
 | 
| -      break;
 | 
| -    case FocusOut:
 | 
| -      if (current_window_ == event->xfocus.window)
 | 
| -        OnActiveWindowChanged(None, NOT_ACTIVE);
 | 
| -      break;
 | 
| -    default:
 | 
| -      NOTREACHED();
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  bool X11DesktopHandler::CanDispatchEvent(const ui::PlatformEvent& event) {
 | 
|    return event->type == CreateNotify || event->type == DestroyNotify ||
 | 
|           (event->type == PropertyNotify &&
 | 
| @@ -209,17 +93,8 @@ bool X11DesktopHandler::CanDispatchEvent(const ui::PlatformEvent& event) {
 | 
|  uint32_t X11DesktopHandler::DispatchEvent(const ui::PlatformEvent& event) {
 | 
|    switch (event->type) {
 | 
|      case PropertyNotify: {
 | 
| -      if (event->xproperty.atom == atom_cache_.GetAtom("_NET_ACTIVE_WINDOW")) {
 | 
| -        ::Window window;
 | 
| -        if (ui::GetXIDProperty(x_root_window_, "_NET_ACTIVE_WINDOW", &window) &&
 | 
| -            window) {
 | 
| -          x_active_window_ = window;
 | 
| -          OnActiveWindowChanged(window, ACTIVE);
 | 
| -        } else {
 | 
| -          x_active_window_ = None;
 | 
| -        }
 | 
| -      } else if (event->xproperty.atom ==
 | 
| -                 atom_cache_.GetAtom("_NET_CURRENT_DESKTOP")) {
 | 
| +      if (event->xproperty.atom ==
 | 
| +          atom_cache_.GetAtom("_NET_CURRENT_DESKTOP")) {
 | 
|          if (UpdateWorkspace()) {
 | 
|            FOR_EACH_OBSERVER(views::X11DesktopHandlerObserver, observers_,
 | 
|                              OnWorkspaceChanged(workspace_));
 | 
| @@ -232,10 +107,6 @@ uint32_t X11DesktopHandler::DispatchEvent(const ui::PlatformEvent& event) {
 | 
|        break;
 | 
|      case DestroyNotify:
 | 
|        OnWindowCreatedOrDestroyed(event->type, event->xdestroywindow.window);
 | 
| -      // If the current active window is being destroyed, reset our tracker.
 | 
| -      if (x_active_window_ == event->xdestroywindow.window) {
 | 
| -        x_active_window_ = None;
 | 
| -      }
 | 
|        break;
 | 
|      default:
 | 
|        NOTREACHED();
 | 
| @@ -252,30 +123,6 @@ void X11DesktopHandler::OnWillDestroyEnv() {
 | 
|    delete this;
 | 
|  }
 | 
|  
 | 
| -void X11DesktopHandler::OnActiveWindowChanged(::Window xid,
 | 
| -                                              ActiveState active_state) {
 | 
| -  if (current_window_ == xid && current_window_active_state_ == active_state)
 | 
| -    return;
 | 
| -
 | 
| -  if (current_window_active_state_ == ACTIVE) {
 | 
| -    DesktopWindowTreeHostX11* old_host =
 | 
| -        views::DesktopWindowTreeHostX11::GetHostForXID(current_window_);
 | 
| -    if (old_host)
 | 
| -      old_host->HandleNativeWidgetActivationChanged(false);
 | 
| -  }
 | 
| -
 | 
| -  // Update the current window ID to effectively change the active widget.
 | 
| -  current_window_ = xid;
 | 
| -  current_window_active_state_ = active_state;
 | 
| -
 | 
| -  if (active_state == ACTIVE) {
 | 
| -    DesktopWindowTreeHostX11* new_host =
 | 
| -        views::DesktopWindowTreeHostX11::GetHostForXID(xid);
 | 
| -    if (new_host)
 | 
| -      new_host->HandleNativeWidgetActivationChanged(true);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  void X11DesktopHandler::OnWindowCreatedOrDestroyed(int event_type,
 | 
|                                                     XID window) {
 | 
|    // Menus created by Chrome can be drag and drop targets. Since they are
 | 
| 
 |