| Index: ui/aura/root_window_host_linux.cc | 
| diff --git a/ui/aura/root_window_host_linux.cc b/ui/aura/root_window_host_linux.cc | 
| index 9cdef7c07418010704470f472f9c032d3aca53be..ca2d60e30916f6f1f3ac69336ea34c7cc811feac 100644 | 
| --- a/ui/aura/root_window_host_linux.cc | 
| +++ b/ui/aura/root_window_host_linux.cc | 
| @@ -9,8 +9,10 @@ | 
| #include <X11/Xlib.h> | 
| #include <X11/cursorfont.h> | 
| #include <X11/extensions/XInput2.h> | 
| +#include <X11/extensions/Xcomposite.h> | 
| #include <X11/extensions/Xfixes.h> | 
| #include <X11/extensions/Xrandr.h> | 
| +#include <X11/extensions/shape.h> | 
| #include <algorithm> | 
|  | 
| #include "base/command_line.h" | 
| @@ -18,6 +20,7 @@ | 
| #include "base/stl_util.h" | 
| #include "base/stringprintf.h" | 
| #include "grit/ui_resources.h" | 
| +#include "ui/aura/aura_switches.h" | 
| #include "ui/aura/client/capture_client.h" | 
| #include "ui/aura/client/user_action_client.h" | 
| #include "ui/aura/dispatcher_linux.h" | 
| @@ -476,38 +479,61 @@ RootWindowHostLinux::RootWindowHostLinux(const gfx::Rect& bounds) | 
| : root_window_(NULL), | 
| xdisplay_(base::MessagePumpAuraX11::GetDefaultXDisplay()), | 
| xwindow_(0), | 
| +      x_output_window_(0), | 
| x_root_window_(DefaultRootWindow(xdisplay_)), | 
| current_cursor_(ui::kCursorNull), | 
| cursor_shown_(true), | 
| bounds_(bounds), | 
| -      focus_when_shown_(false), | 
| +      focus_when_shown_(true), | 
| pointer_barriers_(NULL), | 
| image_cursors_(new ImageCursors), | 
| atom_cache_(xdisplay_, kAtomsToCache) { | 
| XSetWindowAttributes swa; | 
| memset(&swa, 0, sizeof(swa)); | 
| swa.background_pixmap = None; | 
| -  xwindow_ = XCreateWindow( | 
| -      xdisplay_, x_root_window_, | 
| -      bounds.x(), bounds.y(), bounds.width(), bounds.height(), | 
| -      0,               // border width | 
| -      CopyFromParent,  // depth | 
| -      InputOutput, | 
| -      CopyFromParent,  // visual | 
| -      CWBackPixmap, | 
| -      &swa); | 
| +  long output_event_mask = ExposureMask | VisibilityChangeMask; | 
| +  long input_event_mask = ButtonPressMask | ButtonReleaseMask | | 
| +                          FocusChangeMask | KeyPressMask | KeyReleaseMask | | 
| +                          EnterWindowMask | LeaveWindowMask | | 
| +                          StructureNotifyMask | PropertyChangeMask | | 
| +                          PointerMotionMask; | 
| +  if (CommandLine::ForCurrentProcess()->HasSwitch( | 
| +        switches::kAuraHostWindowUseFullscreen)) { | 
| +    x_output_window_ = XCompositeGetOverlayWindow(xdisplay_, x_root_window_); | 
| +    XserverRegion region = XFixesCreateRegion(xdisplay_, NULL, 0); | 
| +    XFixesSetWindowShapeRegion( | 
| +        xdisplay_, x_output_window_, ShapeInput, 0, 0, region); | 
| +    XFixesDestroyRegion(xdisplay_, region); | 
| +    XSelectInput(xdisplay_, x_output_window_, output_event_mask); | 
| +    static_cast<DispatcherLinux*>(Env::GetInstance()->GetDispatcher())-> | 
| +        AddDispatcherForWindow(this, x_output_window_); | 
| +    xwindow_ = XCreateWindow( | 
| +        xdisplay_, x_root_window_, | 
| +        bounds.x(), bounds.y(), bounds.width(), bounds.height(), | 
| +        0,               // border width | 
| +        CopyFromParent,  // depth | 
| +        InputOnly, | 
| +        CopyFromParent,  // visual | 
| +        0, | 
| +        0); | 
| +    XSelectInput(xdisplay_, xwindow_, input_event_mask); | 
| +  } else { | 
| +    x_output_window_ = xwindow_ = XCreateWindow( | 
| +        xdisplay_, x_root_window_, | 
| +        bounds.x(), bounds.y(), bounds.width(), bounds.height(), | 
| +        0,               // border width | 
| +        CopyFromParent,  // depth | 
| +        InputOutput, | 
| +        CopyFromParent,  // visual | 
| +        CWBackPixmap, | 
| +        &swa); | 
| +    XSelectInput(xdisplay_, xwindow_, input_event_mask | output_event_mask); | 
| +  } | 
| static_cast<DispatcherLinux*>(Env::GetInstance()->GetDispatcher())-> | 
| AddDispatcherForWindow(this, xwindow_); | 
|  | 
| prop_.reset(new ui::ViewProp(xwindow_, kRootWindowHostLinuxKey, this)); | 
|  | 
| -  long event_mask = ButtonPressMask | ButtonReleaseMask | FocusChangeMask | | 
| -                    KeyPressMask | KeyReleaseMask | | 
| -                    EnterWindowMask | LeaveWindowMask | | 
| -                    ExposureMask | VisibilityChangeMask | | 
| -                    StructureNotifyMask | PropertyChangeMask | | 
| -                    PointerMotionMask; | 
| -  XSelectInput(xdisplay_, xwindow_, event_mask); | 
| XFlush(xdisplay_); | 
|  | 
| if (base::MessagePumpForUI::HasXInput2()) | 
| @@ -517,7 +543,7 @@ RootWindowHostLinux::RootWindowHostLinux(const gfx::Rect& bounds) | 
| char nodata[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; | 
| XColor black; | 
| black.red = black.green = black.blue = 0; | 
| -  Pixmap blank = XCreateBitmapFromData(xdisplay_, xwindow_, | 
| +  Pixmap blank = XCreateBitmapFromData(xdisplay_, x_output_window_, | 
| nodata, 8, 8); | 
| invisible_cursor_ = XCreatePixmapCursor(xdisplay_, blank, blank, | 
| &black, &black, 0, 0); | 
| @@ -567,6 +593,10 @@ RootWindowHostLinux::~RootWindowHostLinux() { | 
|  | 
| XDestroyWindow(xdisplay_, xwindow_); | 
|  | 
| +  if (CommandLine::ForCurrentProcess()->HasSwitch( | 
| +        switches::kAuraHostWindowUseFullscreen)) | 
| +    XCompositeReleaseOverlayWindow(xdisplay_, x_root_window_); | 
| + | 
| // Clears XCursorCache. | 
| ui::GetXCursor(ui::kCursorClearXCursorCache); | 
|  | 
| @@ -788,6 +818,11 @@ RootWindow* RootWindowHostLinux::GetRootWindow() { | 
| } | 
|  | 
| gfx::AcceleratedWidget RootWindowHostLinux::GetAcceleratedWidget() { | 
| +  return x_output_window_; | 
| +} | 
| + | 
| +gfx::AcceleratedWidget RootWindowHostLinux:: | 
| +    GetAcceleratedWidgetUsedForEvents() { | 
| return xwindow_; | 
| } | 
|  | 
| @@ -825,11 +860,18 @@ void RootWindowHostLinux::SetBounds(const gfx::Rect& bounds) { | 
| return; | 
| } | 
|  | 
| -  if (bounds.size() != bounds_.size()) | 
| +  if (bounds.size() != bounds_.size()) { | 
| XResizeWindow(xdisplay_, xwindow_, bounds.width(), bounds.height()); | 
| +    if (x_output_window_ != xwindow_) | 
| +      XResizeWindow( | 
| +          xdisplay_, x_output_window_, bounds.width(), bounds.height()); | 
| +  } | 
|  | 
| -  if (bounds.origin() != bounds_.origin()) | 
| +  if (bounds.origin() != bounds_.origin()) { | 
| XMoveWindow(xdisplay_, xwindow_, bounds.x(), bounds.y()); | 
| +    if (x_output_window_ != xwindow_) | 
| +      XMoveWindow(xdisplay_, x_output_window_, bounds.x(), bounds.y()); | 
| +  } | 
|  | 
| // Assume that the resize will go through as requested, which should be the | 
| // case if we're running without a window manager.  If there's a window | 
| @@ -953,7 +995,7 @@ bool RootWindowHostLinux::GrabSnapshot( | 
| const gfx::Rect& snapshot_bounds, | 
| std::vector<unsigned char>* png_representation) { | 
| XImage* image = XGetImage( | 
| -      xdisplay_, xwindow_, | 
| +      xdisplay_, x_output_window_, | 
| snapshot_bounds.x(), snapshot_bounds.y(), | 
| snapshot_bounds.width(), snapshot_bounds.height(), | 
| AllPlanes, ZPixmap); | 
| @@ -1034,6 +1076,11 @@ void RootWindowHostLinux::OnDeviceScaleFactorChanged( | 
| image_cursors_->Reload(device_scale_factor); | 
| } | 
|  | 
| +bool RootWindowHostLinux::DispatchNativeEvent( | 
| +    const base::NativeEvent& native_event) { | 
| +  return Dispatch(native_event); | 
| +} | 
| + | 
| bool RootWindowHostLinux::IsWindowManagerPresent() { | 
| // Per ICCCM 2.8, "Manager Selections", window managers should take ownership | 
| // of WM_Sn selections (where n is a screen number). | 
| @@ -1048,7 +1095,11 @@ void RootWindowHostLinux::SetCursorInternal(gfx::NativeCursor cursor) { | 
| (cursor == ui::kCursorNone ? invisible_cursor_ : | 
| (cursor == ui::kCursorCustom ? cursor.platform() : | 
| ui::GetXCursor(CursorShapeFromNative(cursor)))); | 
| -  XDefineCursor(xdisplay_, xwindow_, xcursor); | 
| +  if (x_output_window_ != xwindow_) | 
| +    XDefineCursor(xdisplay_, x_root_window_, xcursor); | 
| +  else | 
| +    XDefineCursor(xdisplay_, xwindow_, xcursor); | 
| +  GetRootWindow()->OnCursorChanged(xcursor); | 
| } | 
|  | 
| // static | 
|  |