| Index: ui/aura/hostwm/host_window_manager_x11.h
|
| diff --git a/ui/aura/hostwm/host_window_manager_x11.h b/ui/aura/hostwm/host_window_manager_x11.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..59db716d37f3a31fcc7adc250cbfe243914d60cc
|
| --- /dev/null
|
| +++ b/ui/aura/hostwm/host_window_manager_x11.h
|
| @@ -0,0 +1,262 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef UI_AURA_HOSTWM_HOST_WINDOW_MANAGER_X11_H
|
| +#define UI_AURA_HOSTWM_HOST_WINDOW_MANAGER_X11_H
|
| +
|
| +#include <X11/Xlib.h>
|
| +
|
| +// Xlib.h defines RootWindow.
|
| +#undef RootWindow
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/message_loop.h"
|
| +#include "ui/aura/env_observer.h"
|
| +#include "ui/aura/focus_change_observer.h"
|
| +#include "ui/aura/hostwm/host_window_delegate.h"
|
| +#include "ui/aura/hostwm/host_window_manager_client.h"
|
| +#include "ui/aura/root_window_observer.h"
|
| +#include "ui/aura/x11_atom_cache.h"
|
| +#include "ui/aura/window_observer.h"
|
| +
|
| +#include <map>
|
| +
|
| +namespace aura {
|
| +class HostWindowManagerX11;
|
| +class RedirectedHostWindowX11;
|
| +
|
| +void SetBaseX11ErrorHandler(XErrorHandler error_handler);
|
| +int CallBaseX11ErrorHandler(Display* d, XErrorEvent* e);
|
| +
|
| +class HostWindowManagerX11WindowObserver : public EnvObserver,
|
| + public WindowObserver {
|
| + public:
|
| + HostWindowManagerX11WindowObserver(HostWindowManagerX11* manager);
|
| + virtual ~HostWindowManagerX11WindowObserver() {}
|
| +
|
| + // Implements EnvObserver:
|
| + virtual void OnWindowInitialized(Window* window) OVERRIDE;
|
| +
|
| + // Implements WindowObserver:
|
| + virtual void OnWillRemoveWindow(Window* window) OVERRIDE;
|
| + virtual void OnWindowDestroyed(Window* window) OVERRIDE;
|
| + virtual void OnWindowStackingChanged(Window* window) OVERRIDE;
|
| + virtual void OnWindowVisibilityChanged(Window* window, bool visible)
|
| + OVERRIDE;
|
| + virtual void OnWindowBoundsChanged(Window* window,
|
| + const gfx::Rect& old_bounds,
|
| + const gfx::Rect& new_bounds) OVERRIDE;
|
| +
|
| + private:
|
| + HostWindowManagerX11* host_window_manager_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(HostWindowManagerX11WindowObserver);
|
| +};
|
| +
|
| +class HostWindowX11
|
| + : public base::RefCounted<HostWindowX11>,
|
| + public HostWindowDelegate {
|
| + public:
|
| + HostWindowX11(::XID xwindow, unsigned state);
|
| +
|
| + // Implements HostWindowDelegate:
|
| + virtual void CloseWindow() OVERRIDE {}
|
| + virtual bool CanResize() OVERRIDE;
|
| +
|
| + virtual bool CanConfigure();
|
| + virtual bool CanActivate();
|
| + virtual void OnMapNotify() {}
|
| + virtual void OnUnmapNotify() {}
|
| + virtual void OnConfigureNotify(gfx::Rect bounds, ::Window above) {}
|
| +
|
| + ::XID xid() { return xwindow_; }
|
| +
|
| + unsigned state() { return state_; }
|
| + // TODO(reveman): Update WM_STATE property.
|
| + void set_state(unsigned state) { state_ = state; }
|
| +
|
| + protected:
|
| + virtual ~HostWindowX11();
|
| +
|
| + Display* xdisplay_;
|
| + ::XID xwindow_;
|
| + unsigned state_;
|
| +
|
| + private:
|
| + friend class base::RefCounted<HostWindowX11>;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(HostWindowX11);
|
| +};
|
| +
|
| +class InputHostWindowX11 : public HostWindowX11 {
|
| + public:
|
| + InputHostWindowX11(::XID xwindow);
|
| +
|
| + // Implements HostWindowDelegate:
|
| + virtual void CloseWindow() OVERRIDE;
|
| + virtual bool CanResize() OVERRIDE;
|
| +
|
| + // Overridden from HostWindowX11:
|
| + virtual bool CanConfigure() OVERRIDE;
|
| + virtual bool CanActivate() OVERRIDE;
|
| +
|
| + private:
|
| + virtual ~InputHostWindowX11();
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(InputHostWindowX11);
|
| +};
|
| +
|
| +class RedirectedHostWindowX11 : public HostWindowX11,
|
| + public MessageLoop::Dispatcher {
|
| +public:
|
| + RedirectedHostWindowX11(HostWindowManagerX11* manager,
|
| + ::Window xwindow,
|
| + const gfx::Size& size);
|
| +
|
| + // Implements HostWindowDelegate:
|
| + virtual void CloseWindow() OVERRIDE {}
|
| + virtual bool CanResize() OVERRIDE;
|
| +
|
| + // Overridden from HostWindowX11:
|
| + virtual bool CanConfigure() OVERRIDE;
|
| + virtual bool CanActivate() OVERRIDE;
|
| + virtual void OnMapNotify() OVERRIDE;
|
| + virtual void OnUnmapNotify() OVERRIDE;
|
| + virtual void OnConfigureNotify(gfx::Rect bounds, ::Window above) OVERRIDE;
|
| +
|
| + // Overridden from Dispatcher:
|
| + virtual bool Dispatch(const base::NativeEvent& xev) OVERRIDE;
|
| +
|
| + void UpdateExternalTexture();
|
| + void SetSize(const gfx::Size& size);
|
| + void SetVisible(bool visible);
|
| +
|
| +protected:
|
| + virtual ~RedirectedHostWindowX11();
|
| +
|
| + HostWindowManagerX11* host_window_manager_;
|
| + gfx::Size size_;
|
| + bool visible_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(RedirectedHostWindowX11);
|
| +};
|
| +
|
| +class ManagedRedirectedHostWindowX11 : public RedirectedHostWindowX11 {
|
| +public:
|
| + ManagedRedirectedHostWindowX11(HostWindowManagerX11* manager,
|
| + ::Window xwindow,
|
| + const gfx::Size& size);
|
| +
|
| + // Implements HostWindowDelegate:
|
| + virtual void CloseWindow() OVERRIDE;
|
| + virtual bool CanResize() OVERRIDE;
|
| +
|
| + // Overridden from HostWindowX11:
|
| + virtual bool CanConfigure() OVERRIDE;
|
| + virtual bool CanActivate() OVERRIDE;
|
| + virtual void OnMapNotify() OVERRIDE;
|
| + virtual void OnUnmapNotify() OVERRIDE;
|
| + virtual void OnConfigureNotify(gfx::Rect bounds, ::Window above) OVERRIDE;
|
| +
|
| +private:
|
| + virtual ~ManagedRedirectedHostWindowX11();
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ManagedRedirectedHostWindowX11);
|
| +};
|
| +
|
| +class HostWindowManagerX11RootEventObserver
|
| + : public MessageLoop::Dispatcher,
|
| + public RootWindowObserver,
|
| + public FocusChangeObserver {
|
| +public:
|
| + HostWindowManagerX11RootEventObserver(HostWindowManagerX11* manager);
|
| + virtual ~HostWindowManagerX11RootEventObserver() {}
|
| +
|
| + // Overridden from Dispatcher:
|
| + virtual bool Dispatch(const base::NativeEvent& xev) OVERRIDE;
|
| +
|
| + // Overridden from RootWindowObserver:
|
| + virtual void OnCursorChanged(
|
| + const RootWindow* root, ui::PlatformCursor cursor) OVERRIDE;
|
| +
|
| + // Overridden from FocusChangeObserver:
|
| + virtual void OnWindowFocused(Window* window) OVERRIDE;
|
| +
|
| +private:
|
| + HostWindowManagerX11* host_window_manager_;
|
| + Display* xdisplay_;
|
| +
|
| + bool ProcessHostWindowUpdate(const base::NativeEvent& xev);
|
| + bool ProcessHostWindowRequest(const base::NativeEvent& xev);
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(HostWindowManagerX11RootEventObserver);
|
| +};
|
| +
|
| +class AURA_EXPORT HostWindowManagerX11
|
| + : public base::SupportsWeakPtr<HostWindowManagerX11> {
|
| +public:
|
| + HostWindowManagerX11(client::HostWindowManagerClient* client);
|
| + virtual ~HostWindowManagerX11();
|
| +
|
| + void Init();
|
| + void HostWindowNeedsConfigure(Window* window);
|
| +
|
| + int damage_event_base() { return damage_event_base_; };
|
| +
|
| + private:
|
| + void RegisterNewTopLevel(::Window xwindow);
|
| + void RegisterNewTopLevel(
|
| + ::Window xwindow, const gfx::Rect bounds, bool managed);
|
| + ::Window GetTopHostWindow(Window* window);
|
| + ::Window FindHostWindowToStackAbove(Window* window);
|
| + void RecursiveConfigureHostWindow(
|
| + Window* window,
|
| + gfx::Point origin,
|
| + ::Window& sibling_to_stack_above,
|
| + ::Window& focus_window,
|
| + bool has_focus);
|
| + void CreateHostInputWindowIfNeeded(Window* window);
|
| +
|
| + // Configure all host windows in |configure_window_| subtree.
|
| + void ConfigureHostWindows();
|
| +
|
| + Display* xdisplay_;
|
| +
|
| + ::Window x_root_window_;
|
| + Window* configure_window_;
|
| + int damage_event_base_;
|
| +
|
| + scoped_ptr<HostWindowManagerX11WindowObserver> window_observer_;
|
| + scoped_ptr<HostWindowManagerX11RootEventObserver> event_observer_;
|
| +
|
| + // This holds all host windows being redirected, with a mapping from native
|
| + // representation to the host window id.
|
| + std::map<gfx::NativeWindow, ::Window> host_windows_;
|
| +
|
| + // Holds a TopLevel struct for each redirected window, with a mapping from
|
| + // host window id to struct.
|
| + std::map< ::Window, scoped_refptr<HostWindowX11> >
|
| + top_level_windows_;
|
| +
|
| + // Mapping from the native representation to host window id.
|
| + std::map< ::Window, gfx::NativeWindow> native_windows_;
|
| +
|
| + // This holds all input only host windows, with a mapping from the native
|
| + // representation to host window struct.
|
| + std::map<gfx::NativeWindow, scoped_refptr<InputHostWindowX11> >
|
| + input_host_windows_;
|
| +
|
| + X11AtomCache atom_cache_;
|
| +
|
| + client::HostWindowManagerClient* client_;
|
| +
|
| + friend class HostWindowManagerX11WindowObserver;
|
| + friend class HostWindowManagerX11RootEventObserver;
|
| + friend class RedirectedHostWindowX11;
|
| + friend class ManagedRedirectedHostWindowX11;
|
| +};
|
| +
|
| +} // namespace aura
|
| +
|
| +#endif // UI_AURA_HOSTWM_HOST_WINDOW_MANAGER_X11_H
|
|
|