| Index: ui/views/widget/x11_window_event_filter.cc
|
| ===================================================================
|
| --- ui/views/widget/x11_window_event_filter.cc (revision 167419)
|
| +++ ui/views/widget/x11_window_event_filter.cc (working copy)
|
| @@ -1,189 +0,0 @@
|
| -// 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.
|
| -
|
| -#include "ui/views/widget/x11_window_event_filter.h"
|
| -
|
| -#include <X11/extensions/XInput.h>
|
| -#include <X11/extensions/XInput2.h>
|
| -#include <X11/Xatom.h>
|
| -#include <X11/Xlib.h>
|
| -
|
| -#include "base/message_pump_aurax11.h"
|
| -#include "ui/aura/root_window.h"
|
| -#include "ui/aura/window_delegate.h"
|
| -#include "ui/base/events/event.h"
|
| -#include "ui/base/hit_test.h"
|
| -#include "ui/views/widget/desktop_aura/desktop_activation_client.h"
|
| -#include "ui/views/widget/native_widget_aura.h"
|
| -
|
| -namespace {
|
| -
|
| -// These constants are defined in the Extended Window Manager Hints
|
| -// standard...and aren't in any header that I can find.
|
| -const int k_NET_WM_MOVERESIZE_SIZE_TOPLEFT = 0;
|
| -const int k_NET_WM_MOVERESIZE_SIZE_TOP = 1;
|
| -const int k_NET_WM_MOVERESIZE_SIZE_TOPRIGHT = 2;
|
| -const int k_NET_WM_MOVERESIZE_SIZE_RIGHT = 3;
|
| -const int k_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT = 4;
|
| -const int k_NET_WM_MOVERESIZE_SIZE_BOTTOM = 5;
|
| -const int k_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT = 6;
|
| -const int k_NET_WM_MOVERESIZE_SIZE_LEFT = 7;
|
| -const int k_NET_WM_MOVERESIZE_MOVE = 8;
|
| -
|
| -// This data structure represents additional hints that we send to the window
|
| -// manager and has a direct lineage back to Motif, which defined this de facto
|
| -// standard. This struct doesn't seem 64-bit safe though, but it's what GDK
|
| -// does.
|
| -typedef struct {
|
| - unsigned long flags;
|
| - unsigned long functions;
|
| - unsigned long decorations;
|
| - long input_mode;
|
| - unsigned long status;
|
| -} MotifWmHints;
|
| -
|
| -// The bitflag in |flags| in MotifWmHints that signals that the reader should
|
| -// pay attention to the value in |decorations|.
|
| -const unsigned long kHintsDecorations = (1L << 1);
|
| -
|
| -const char* kAtomsToCache[] = {
|
| - "_MOTIF_WM_HINTS",
|
| - "_NET_WM_MOVERESIZE",
|
| - NULL
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -namespace views {
|
| -
|
| -X11WindowEventFilter::X11WindowEventFilter(
|
| - aura::RootWindow* root_window,
|
| - DesktopActivationClient* activation_client)
|
| - : activation_client_(activation_client),
|
| - xdisplay_(base::MessagePumpAuraX11::GetDefaultXDisplay()),
|
| - xwindow_(root_window->GetAcceleratedWidget()),
|
| - x_root_window_(DefaultRootWindow(xdisplay_)),
|
| - atom_cache_(xdisplay_, kAtomsToCache),
|
| - is_active_(false) {
|
| -}
|
| -
|
| -X11WindowEventFilter::~X11WindowEventFilter() {
|
| -}
|
| -
|
| -void X11WindowEventFilter::SetUseHostWindowBorders(bool use_os_border) {
|
| - MotifWmHints motif_hints;
|
| - memset(&motif_hints, 0, sizeof(motif_hints));
|
| - motif_hints.flags = kHintsDecorations;
|
| - motif_hints.decorations = use_os_border ? 1 : 0;
|
| -
|
| - ::Atom hint_atom = atom_cache_.GetAtom("_MOTIF_WM_HINTS");
|
| - XChangeProperty(base::MessagePumpAuraX11::GetDefaultXDisplay(),
|
| - xwindow_,
|
| - hint_atom,
|
| - hint_atom,
|
| - 32,
|
| - PropModeReplace,
|
| - reinterpret_cast<unsigned char*>(&motif_hints),
|
| - sizeof(MotifWmHints)/sizeof(long));
|
| -}
|
| -
|
| -bool X11WindowEventFilter::PreHandleKeyEvent(aura::Window* target,
|
| - ui::KeyEvent* event) {
|
| - return false;
|
| -}
|
| -
|
| -bool X11WindowEventFilter::PreHandleMouseEvent(aura::Window* target,
|
| - ui::MouseEvent* event) {
|
| - if (event->type() != ui::ET_MOUSE_PRESSED)
|
| - return false;
|
| -
|
| - if (!event->IsLeftMouseButton())
|
| - return false;
|
| -
|
| - int component =
|
| - target->delegate()->GetNonClientComponent(event->location());
|
| - if (component == HTCLIENT)
|
| - return false;
|
| -
|
| - // Get the |x_root_window_| location out of the native event.
|
| - gfx::Point root_location = event->system_location();
|
| - return DispatchHostWindowDragMovement(component, root_location);
|
| -}
|
| -
|
| -ui::EventResult X11WindowEventFilter::PreHandleTouchEvent(
|
| - aura::Window* target,
|
| - ui::TouchEvent* event) {
|
| - return ui::ER_UNHANDLED;
|
| -}
|
| -
|
| -ui::EventResult X11WindowEventFilter::PreHandleGestureEvent(
|
| - aura::Window* target,
|
| - ui::GestureEvent* event) {
|
| - return ui::ER_UNHANDLED;
|
| -}
|
| -
|
| -bool X11WindowEventFilter::DispatchHostWindowDragMovement(
|
| - int hittest,
|
| - const gfx::Point& screen_location) {
|
| - int direction = -1;
|
| - switch (hittest) {
|
| - case HTBOTTOM:
|
| - direction = k_NET_WM_MOVERESIZE_SIZE_BOTTOM;
|
| - break;
|
| - case HTBOTTOMLEFT:
|
| - direction = k_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT;
|
| - break;
|
| - case HTBOTTOMRIGHT:
|
| - direction = k_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT;
|
| - break;
|
| - case HTCAPTION:
|
| - direction = k_NET_WM_MOVERESIZE_MOVE;
|
| - break;
|
| - case HTLEFT:
|
| - direction = k_NET_WM_MOVERESIZE_SIZE_LEFT;
|
| - break;
|
| - case HTRIGHT:
|
| - direction = k_NET_WM_MOVERESIZE_SIZE_RIGHT;
|
| - break;
|
| - case HTTOP:
|
| - direction = k_NET_WM_MOVERESIZE_SIZE_TOP;
|
| - break;
|
| - case HTTOPLEFT:
|
| - direction = k_NET_WM_MOVERESIZE_SIZE_TOPLEFT;
|
| - break;
|
| - case HTTOPRIGHT:
|
| - direction = k_NET_WM_MOVERESIZE_SIZE_TOPRIGHT;
|
| - break;
|
| - default:
|
| - return false;
|
| - }
|
| -
|
| - // We most likely have an implicit grab right here. We need to dump it
|
| - // because what we're about to do is tell the window manager
|
| - // that it's now responsible for moving the window around; it immediately
|
| - // grabs when it receives the event below.
|
| - XUngrabPointer(xdisplay_, CurrentTime);
|
| -
|
| - XEvent event;
|
| - memset(&event, 0, sizeof(event));
|
| - event.xclient.type = ClientMessage;
|
| - event.xclient.display = xdisplay_;
|
| - event.xclient.window = xwindow_;
|
| - event.xclient.message_type = atom_cache_.GetAtom("_NET_WM_MOVERESIZE");
|
| - event.xclient.format = 32;
|
| - event.xclient.data.l[0] = screen_location.x();
|
| - event.xclient.data.l[1] = screen_location.y();
|
| - event.xclient.data.l[2] = direction;
|
| - event.xclient.data.l[3] = 0;
|
| - event.xclient.data.l[4] = 0;
|
| -
|
| - XSendEvent(xdisplay_, x_root_window_, False,
|
| - SubstructureRedirectMask | SubstructureNotifyMask,
|
| - &event);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -} // namespace views
|
| -
|
|
|