Index: ui/platform_window/x11/x11_window.cc |
diff --git a/ui/platform_window/x11/x11_window.cc b/ui/platform_window/x11/x11_window.cc |
index 6900a448915dfebde9e73ef2d7b1c5e07600f404..53e637e5b719222183dcc8ba534a92fc883b3875 100644 |
--- a/ui/platform_window/x11/x11_window.cc |
+++ b/ui/platform_window/x11/x11_window.cc |
@@ -9,13 +9,14 @@ |
#include <X11/Xlib.h> |
#include <X11/Xutil.h> |
+#include <string> |
+ |
#include "base/strings/utf_string_conversions.h" |
#include "ui/events/devices/x11/touch_factory_x11.h" |
#include "ui/events/event.h" |
#include "ui/events/event_utils.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/geometry/rect.h" |
#include "ui/gfx/x/x11_atom_cache.h" |
#include "ui/gfx/x/x11_types.h" |
@@ -34,13 +35,6 @@ const char* kAtomsToCache[] = { |
NULL |
}; |
-XID FindXEventTarget(XEvent* xevent) { |
- XID target = xevent->xany.window; |
- if (xevent->type == GenericEvent) |
- target = static_cast<XIDeviceEvent*>(xevent->xcookie.data)->event; |
- return target; |
-} |
- |
bool g_override_redirect = false; |
} // namespace |
@@ -50,8 +44,7 @@ X11Window::X11Window(PlatformWindowDelegate* delegate) |
xdisplay_(gfx::GetXDisplay()), |
xwindow_(None), |
xroot_window_(DefaultRootWindow(xdisplay_)), |
- atom_cache_(xdisplay_, kAtomsToCache), |
- window_mapped_(false) { |
+ atom_cache_(xdisplay_, kAtomsToCache) { |
CHECK(delegate_); |
TouchFactory::SetTouchDeviceListFromCommandLine(); |
} |
@@ -75,57 +68,13 @@ void X11Window::Destroy() { |
XDestroyWindow(xdisplay, xwindow); |
} |
-void X11Window::ProcessXInput2Event(XEvent* xev) { |
- if (!TouchFactory::GetInstance()->ShouldProcessXI2Event(xev)) |
- return; |
- EventType event_type = EventTypeFromNative(xev); |
- switch (event_type) { |
- case ET_KEY_PRESSED: |
- case ET_KEY_RELEASED: { |
- KeyEvent key_event(xev); |
- delegate_->DispatchEvent(&key_event); |
- break; |
- } |
- case ET_MOUSE_PRESSED: |
- case ET_MOUSE_MOVED: |
- case ET_MOUSE_DRAGGED: |
- case ET_MOUSE_RELEASED: { |
- MouseEvent mouse_event(xev); |
- delegate_->DispatchEvent(&mouse_event); |
- break; |
- } |
- case ET_MOUSEWHEEL: { |
- MouseWheelEvent wheel_event(xev); |
- delegate_->DispatchEvent(&wheel_event); |
- break; |
- } |
- case ET_SCROLL_FLING_START: |
- case ET_SCROLL_FLING_CANCEL: |
- case ET_SCROLL: { |
- ScrollEvent scroll_event(xev); |
- delegate_->DispatchEvent(&scroll_event); |
- break; |
- } |
- case ET_TOUCH_MOVED: |
- case ET_TOUCH_PRESSED: |
- case ET_TOUCH_CANCELLED: |
- case ET_TOUCH_RELEASED: { |
- TouchEvent touch_event(xev); |
- delegate_->DispatchEvent(&touch_event); |
- break; |
- } |
- default: |
- break; |
- } |
-} |
- |
-void X11Window::Show() { |
- if (window_mapped_) |
- return; |
- |
- CHECK(PlatformEventSource::GetInstance()); |
+void X11Window::Create() { |
+ DCHECK(PlatformEventSource::GetInstance()); |
PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); |
+ DCHECK(X11EventSource::GetInstance()); |
+ X11EventSource::GetInstance()->AddXEventDispatcher(this); |
+ |
XSetWindowAttributes swa; |
memset(&swa, 0, sizeof(swa)); |
swa.background_pixmap = None; |
@@ -205,6 +154,16 @@ void X11Window::Show() { |
size_hints.win_gravity = StaticGravity; |
XSetWMNormalHints(xdisplay_, xwindow_, &size_hints); |
+ // TODO(sky): provide real scale factor. |
+ delegate_->OnAcceleratedWidgetAvailable(xwindow_, 1.f); |
+} |
+ |
+void X11Window::Show() { |
+ if (window_mapped_) |
+ return; |
+ if (xwindow_ == None) |
+ Create(); |
+ |
XMapWindow(xdisplay_, xwindow_); |
// We now block until our window is mapped. Some X11 APIs will crash and |
@@ -213,9 +172,6 @@ void X11Window::Show() { |
if (X11EventSource::GetInstance()) |
X11EventSource::GetInstance()->BlockUntilWindowMapped(xwindow_); |
window_mapped_ = true; |
- |
- // TODO(sky): provide real scale factor. |
- delegate_->OnAcceleratedWidgetAvailable(xwindow_, 1.f); |
} |
void X11Window::Hide() { |
@@ -231,7 +187,7 @@ void X11Window::Close() { |
void X11Window::SetBounds(const gfx::Rect& bounds) { |
requested_bounds_ = bounds; |
- if (!window_mapped_) |
+ if (!window_mapped_ || bounds == confirmed_bounds_) |
return; |
XWindowChanges changes = {0}; |
unsigned value_mask = CWX | CWY | CWWidth | CWHeight; |
@@ -260,7 +216,7 @@ void X11Window::SetTitle(const base::string16& title) { |
reinterpret_cast<const unsigned char*>(utf8str.c_str()), |
utf8str.size()); |
XTextProperty xtp; |
- char *c_utf8_str = const_cast<char *>(utf8str.c_str()); |
+ char* c_utf8_str = const_cast<char*>(utf8str.c_str()); |
if (Xutf8TextListToTextProperty(xdisplay_, &c_utf8_str, 1, |
XUTF8StringStyle, &xtp) == Success) { |
XSetWMName(xdisplay_, xwindow_, &xtp); |
@@ -280,10 +236,6 @@ void X11Window::Minimize() {} |
void X11Window::Restore() {} |
-void X11Window::SetCursor(PlatformCursor cursor) { |
- XDefineCursor(xdisplay_, xwindow_, cursor); |
-} |
- |
void X11Window::MoveCursorTo(const gfx::Point& location) {} |
void X11Window::ConfineCursorToBounds(const gfx::Rect& bounds) { |
@@ -293,80 +245,25 @@ PlatformImeController* X11Window::GetPlatformImeController() { |
return nullptr; |
} |
-bool X11Window::CanDispatchEvent(const PlatformEvent& event) { |
- return FindXEventTarget(event) == xwindow_; |
-} |
- |
-uint32_t X11Window::DispatchEvent(const PlatformEvent& event) { |
- XEvent* xev = event; |
- switch (xev->type) { |
- case EnterNotify: { |
- // EnterNotify creates ET_MOUSE_MOVED. Mark as synthesized as this is |
- // not real mouse move event. |
- MouseEvent mouse_event(xev); |
- CHECK_EQ(ET_MOUSE_MOVED, mouse_event.type()); |
- mouse_event.set_flags(mouse_event.flags() | EF_IS_SYNTHESIZED); |
- delegate_->DispatchEvent(&mouse_event); |
- break; |
- } |
- case LeaveNotify: { |
- MouseEvent mouse_event(xev); |
- delegate_->DispatchEvent(&mouse_event); |
- break; |
- } |
- |
+void X11Window::ProcessXWindowEvent(const XEvent& xev) { |
+ switch (xev.type) { |
case Expose: { |
- gfx::Rect damage_rect(xev->xexpose.x, |
- xev->xexpose.y, |
- xev->xexpose.width, |
- xev->xexpose.height); |
+ gfx::Rect damage_rect(xev.xexpose.x, xev.xexpose.y, xev.xexpose.width, |
+ xev.xexpose.height); |
delegate_->OnDamageRect(damage_rect); |
break; |
} |
- case KeyPress: |
- case KeyRelease: { |
- KeyEvent key_event(xev); |
- delegate_->DispatchEvent(&key_event); |
- break; |
- } |
- |
- case ButtonPress: |
- case ButtonRelease: { |
- switch (EventTypeFromNative(xev)) { |
- case ET_MOUSEWHEEL: { |
- MouseWheelEvent mouseev(xev); |
- delegate_->DispatchEvent(&mouseev); |
- break; |
- } |
- case ET_MOUSE_PRESSED: |
- case ET_MOUSE_RELEASED: { |
- MouseEvent mouseev(xev); |
- delegate_->DispatchEvent(&mouseev); |
- break; |
- } |
- case ET_UNKNOWN: |
- // No event is created for X11-release events for mouse-wheel |
- // buttons. |
- break; |
- default: |
- NOTREACHED(); |
- } |
- break; |
- } |
- |
case FocusOut: |
- if (xev->xfocus.mode != NotifyGrab) |
+ if (xev.xfocus.mode != NotifyGrab) |
delegate_->OnLostCapture(); |
break; |
case ConfigureNotify: { |
- DCHECK_EQ(xwindow_, xev->xconfigure.event); |
- DCHECK_EQ(xwindow_, xev->xconfigure.window); |
- gfx::Rect bounds(xev->xconfigure.x, |
- xev->xconfigure.y, |
- xev->xconfigure.width, |
- xev->xconfigure.height); |
+ DCHECK_EQ(xwindow_, xev.xconfigure.event); |
+ DCHECK_EQ(xwindow_, xev.xconfigure.window); |
+ gfx::Rect bounds(xev.xconfigure.x, xev.xconfigure.y, xev.xconfigure.width, |
+ xev.xconfigure.height); |
if (confirmed_bounds_ != bounds) { |
confirmed_bounds_ = bounds; |
delegate_->OnBoundsChanged(confirmed_bounds_); |
@@ -375,11 +272,11 @@ uint32_t X11Window::DispatchEvent(const PlatformEvent& event) { |
} |
case ClientMessage: { |
- Atom message = static_cast<Atom>(xev->xclient.data.l[0]); |
+ Atom message = static_cast<Atom>(xev.xclient.data.l[0]); |
if (message == atom_cache_.GetAtom("WM_DELETE_WINDOW")) { |
delegate_->OnCloseRequest(); |
} else if (message == atom_cache_.GetAtom("_NET_WM_PING")) { |
- XEvent reply_event = *xev; |
+ XEvent reply_event = xev; |
reply_event.xclient.window = xroot_window_; |
XSendEvent(xdisplay_, |
@@ -391,13 +288,7 @@ uint32_t X11Window::DispatchEvent(const PlatformEvent& event) { |
} |
break; |
} |
- |
- case GenericEvent: { |
- ProcessXInput2Event(xev); |
- break; |
- } |
} |
- return POST_DISPATCH_STOP_PROPAGATION; |
} |
namespace test { |