Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(563)

Unified Diff: mojo/services/native_viewport/native_viewport_x11.cc

Issue 293033003: Hook up platform events in Mojo shell on Linux desktop (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: whitespace Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/services/native_viewport/native_viewport_service.cc ('k') | mojo/shell/context.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/services/native_viewport/native_viewport_x11.cc
diff --git a/mojo/services/native_viewport/native_viewport_x11.cc b/mojo/services/native_viewport/native_viewport_x11.cc
index 50397b87d23ecabdc329254940b4e65e7a61da33..9903523525880d58a95adae67aae95044edf1517 100644
--- a/mojo/services/native_viewport/native_viewport_x11.cc
+++ b/mojo/services/native_viewport/native_viewport_x11.cc
@@ -5,10 +5,13 @@
#include "mojo/services/native_viewport/native_viewport.h"
#include <X11/Xlib.h>
+#include <X11/Xutil.h>
#include "base/message_loop/message_loop.h"
+#include "ui/events/event.h"
#include "ui/events/platform/platform_event_dispatcher.h"
#include "ui/events/platform/platform_event_source.h"
+#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/x/x11_types.h"
@@ -23,7 +26,7 @@ class NativeViewportX11 : public NativeViewport,
}
virtual ~NativeViewportX11() {
- ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
+ event_source_->RemovePlatformEventDispatcher(this);
XDestroyWindow(gfx::GetXDisplay(), window_);
}
@@ -53,10 +56,21 @@ class NativeViewportX11 : public NativeViewport,
atom_wm_delete_window_ = XInternAtom(display, "WM_DELETE_WINDOW", 1);
XSetWMProtocols(display, window_, &atom_wm_delete_window_, 1);
- event_source_.reset(ui::PlatformEventSource::GetInstance());
- if (!event_source_.get())
- event_source_ = ui::PlatformEventSource::CreateDefault();
- ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
+ event_source_ = ui::PlatformEventSource::CreateDefault();
+ event_source_->AddPlatformEventDispatcher(this);
+
+ long event_mask = ButtonPressMask | ButtonReleaseMask | FocusChangeMask |
+ KeyPressMask | KeyReleaseMask | EnterWindowMask | LeaveWindowMask |
+ ExposureMask | VisibilityChangeMask | StructureNotifyMask |
+ PropertyChangeMask | PointerMotionMask;
+ XSelectInput(display, window_, event_mask);
+
+ // We need a WM_CLIENT_MACHINE and WM_LOCALE_NAME value so we integrate with
+ // the desktop environment.
+ XSetWMProperties(display, window_, NULL, NULL, NULL, 0, NULL, NULL, NULL);
+
+ // TODO(aa): Setup xinput2 events.
+ // See desktop_aura/desktop_window_tree_host_x11.cc.
delegate_->OnAcceleratedWidgetAvailable(window_);
}
@@ -64,6 +78,8 @@ class NativeViewportX11 : public NativeViewport,
virtual void Show() OVERRIDE {
XDisplay* display = gfx::GetXDisplay();
XMapWindow(display, window_);
+ static_cast<ui::X11EventSource*>(
+ event_source_.get())->BlockUntilWindowMapped(window_);
XFlush(display);
}
@@ -94,14 +110,35 @@ class NativeViewportX11 : public NativeViewport,
// ui::PlatformEventDispatcher:
virtual bool CanDispatchEvent(const ui::PlatformEvent& event) OVERRIDE {
- return event->type == ClientMessage &&
- event->xclient.message_type == atom_wm_protocols_;
+ // TODO(aa): This is going to have to be thought through more carefully.
+ // Which events are appropriate to pass to clients?
+ switch (event->type) {
+ case KeyPress:
+ case KeyRelease:
+ case ButtonPress:
+ case ButtonRelease:
+ case MotionNotify:
+ return true;
+ case ClientMessage:
+ return event->xclient.message_type != atom_wm_protocols_;
+ default:
+ return false;
+ }
}
virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE {
- Atom protocol = static_cast<Atom>(event->xclient.data.l[0]);
- if (protocol == atom_wm_delete_window_)
- delegate_->OnDestroyed();
+ if (event->type == ClientMessage) {
+ Atom protocol = static_cast<Atom>(event->xclient.data.l[0]);
+ if (protocol == atom_wm_delete_window_)
+ delegate_->OnDestroyed();
+ } else if (event->type == KeyPress || event->type == KeyRelease) {
+ ui::KeyEvent key_event(event, true);
+ delegate_->OnEvent(&key_event);
+ } else if (event->type == ButtonPress || event->type == ButtonRelease ||
+ event->type == MotionNotify) {
+ ui::MouseEvent mouse_event(event);
+ delegate_->OnEvent(&mouse_event);
+ }
return ui::POST_DISPATCH_NONE;
}
« no previous file with comments | « mojo/services/native_viewport/native_viewport_service.cc ('k') | mojo/shell/context.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698