From 711d8a82e7ce1fc9531fed9311b21ea707e78b8e Mon Sep 17 00:00:00 2001 From: "sadrul@chromium.org" Date: Mon, 22 Aug 2011 16:01:19 +0000 Subject: aura: Desktop-host implementation for linux in pure X. Also, make DesktopHost the entry point for events into aura from the message-pump. BUG=none TEST=none Review URL: http://codereview.chromium.org/7686019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@97650 0039d316-1c4b-4281-b951-d872f2087c98 --- aura/aura.gyp | 1 + aura/demo/demo_main.cc | 6 ++- aura/desktop_host.h | 3 +- aura/desktop_host_linux.cc | 102 +++++++++++++++++++++++++++++++++++++++++++++ aura/desktop_host_win.cc | 5 +++ aura/desktop_host_win.h | 5 ++- aura/event.h | 3 ++ 7 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 aura/desktop_host_linux.cc (limited to 'aura') diff --git a/aura/aura.gyp b/aura/aura.gyp index 3f24b3e..fa76c99 100644 --- a/aura/aura.gyp +++ b/aura/aura.gyp @@ -21,6 +21,7 @@ ], 'sources': [ 'desktop_host.h', + 'desktop_host_linux.cc', 'desktop_host_win.cc', 'desktop_host_win.h', 'desktop.cc', diff --git a/aura/demo/demo_main.cc b/aura/demo/demo_main.cc index 2c8091d..908e63b 100644 --- a/aura/demo/demo_main.cc +++ b/aura/demo/demo_main.cc @@ -59,6 +59,10 @@ int main(int argc, char** argv) { icu_util::Initialize(); ResourceBundle::InitSharedInstance("en-US"); +#if defined(USE_X11) + base::MessagePumpX::DisableGtkMessagePump(); +#endif + // Create the DesktopHost and Desktop. scoped_ptr host( aura::DesktopHost::Create(gfx::Rect(200, 200, 1024, 768))); @@ -96,6 +100,6 @@ int main(int argc, char** argv) { host->Show(); MessageLoop main_message_loop(MessageLoop::TYPE_UI); - MessageLoopForUI::current()->Run(NULL); + MessageLoopForUI::current()->Run(host.get()); return 0; } diff --git a/aura/desktop_host.h b/aura/desktop_host.h index d0e7d4a..f7ba295 100644 --- a/aura/desktop_host.h +++ b/aura/desktop_host.h @@ -6,6 +6,7 @@ #define AURA_DESKTOP_HOST_H_ #pragma once +#include "base/message_loop.h" #include "ui/gfx/native_widget_types.h" namespace gfx { @@ -19,7 +20,7 @@ class Desktop; // DesktopHost bridges between a native window and the embedded Desktop. It // provides the accelerated widget and maps events from the native os to aura. -class DesktopHost { +class DesktopHost : public MessageLoop::Dispatcher { public: virtual ~DesktopHost() {} diff --git a/aura/desktop_host_linux.cc b/aura/desktop_host_linux.cc new file mode 100644 index 0000000..746be03 --- /dev/null +++ b/aura/desktop_host_linux.cc @@ -0,0 +1,102 @@ +// Copyright (c) 2011 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. + +#include "aura/desktop_host.h" + +#include "aura/desktop.h" +#include "base/message_loop.h" +#include "base/message_pump_x.h" + +#include + +namespace aura { + +namespace { + +class DesktopHostLinux : public DesktopHost { + public: + explicit DesktopHostLinux(const gfx::Rect& bounds); + virtual ~DesktopHostLinux(); + + private: + // base::MessageLoop::Dispatcher Override. + virtual DispatchStatus Dispatch(XEvent* xev) OVERRIDE; + + // DesktopHost Overrides. + virtual void SetDesktop(Desktop* desktop) OVERRIDE; + virtual gfx::AcceleratedWidget GetAcceleratedWidget() OVERRIDE; + virtual void Show() OVERRIDE; + virtual gfx::Size GetSize() OVERRIDE; + + Desktop* desktop_; + + // The display and the native X window hosting the desktop. + Display* xdisplay_; + ::Window xwindow_; + + // The size of |xwindow_|. + gfx::Rect bounds_; + + DISALLOW_COPY_AND_ASSIGN(DesktopHostLinux); +}; + +DesktopHostLinux::DesktopHostLinux(const gfx::Rect& bounds) + : desktop_(NULL), + xdisplay_(NULL), + xwindow_(0), + bounds_(bounds) { + // This assumes that the message-pump creates and owns the display. + xdisplay_ = base::MessagePumpX::GetDefaultXDisplay(); + xwindow_ = XCreateSimpleWindow(xdisplay_, DefaultRootWindow(xdisplay_), + bounds.x(), bounds.y(), + bounds.width(), bounds.height(), + 0, 0, 0); + XMapWindow(xdisplay_, xwindow_); + + long event_mask = ButtonPressMask | ButtonReleaseMask | + KeyPressMask | KeyReleaseMask | + ExposureMask | VisibilityChangeMask | + StructureNotifyMask | PropertyChangeMask; + XSelectInput(xdisplay_, xwindow_, event_mask); + XFlush(xdisplay_); +} + +DesktopHostLinux::~DesktopHostLinux() { + XDestroyWindow(xdisplay_, xwindow_); +} + +base::MessagePumpDispatcher::DispatchStatus DesktopHostLinux::Dispatch( + XEvent* xev) { + // TODO(sad): Create events and dispatch to the appropriate window. + switch (xev->type) { + case Expose: + desktop_->Draw(); + break; + } + return EVENT_IGNORED; +} + +void DesktopHostLinux::SetDesktop(Desktop* desktop) { + desktop_ = desktop; +} + +gfx::AcceleratedWidget DesktopHostLinux::GetAcceleratedWidget() { + return xwindow_; +} + +void DesktopHostLinux::Show() { +} + +gfx::Size DesktopHostLinux::GetSize() { + return bounds_.size(); +} + +} // namespace + +// static +DesktopHost* DesktopHost::Create(const gfx::Rect& bounds) { + return new DesktopHostLinux(bounds); +} + +} // namespace aura diff --git a/aura/desktop_host_win.cc b/aura/desktop_host_win.cc index 70489ea..d418150 100644 --- a/aura/desktop_host_win.cc +++ b/aura/desktop_host_win.cc @@ -22,6 +22,11 @@ DesktopHostWin::~DesktopHostWin() { DestroyWindow(hwnd()); } +bool DesktopHostWin::Dispatch(const MSG& msg) { + // TODO(ben): + return true; +} + void DesktopHostWin::SetDesktop(Desktop* desktop) { desktop_ = desktop; } diff --git a/aura/desktop_host_win.h b/aura/desktop_host_win.h index 9513a37..0f0d68f 100644 --- a/aura/desktop_host_win.h +++ b/aura/desktop_host_win.h @@ -14,9 +14,12 @@ namespace aura { class DesktopHostWin : public DesktopHost, public ui::WindowImpl { public: - DesktopHostWin(const gfx::Rect& bounds); + explicit DesktopHostWin(const gfx::Rect& bounds); virtual ~DesktopHostWin(); + // MessageLoop::Dispatcher: + virtual bool Dispatch(const MSG& msg); + // DesktopHost: virtual void SetDesktop(Desktop* desktop) OVERRIDE; virtual gfx::AcceleratedWidget GetAcceleratedWidget() OVERRIDE; diff --git a/aura/event.h b/aura/event.h index c717fc9..27a8f30 100644 --- a/aura/event.h +++ b/aura/event.h @@ -16,6 +16,9 @@ namespace aura { #if defined(OS_WIN) typedef MSG NativeEvent; +#elif defined(USE_X11) +typedef union _XEvent XEvent; +typedef XEvent* NativeEvent; #endif class Event { -- cgit v1.1