| Index: ui/aura/desktop_host_linux.cc
|
| ===================================================================
|
| --- ui/aura/desktop_host_linux.cc (revision 113258)
|
| +++ ui/aura/desktop_host_linux.cc (working copy)
|
| @@ -12,8 +12,6 @@
|
|
|
| #include <algorithm>
|
|
|
| -#include "base/event_types.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop.h"
|
| #include "base/message_pump_x.h"
|
| #include "ui/aura/cursor.h"
|
| @@ -28,12 +26,6 @@
|
| #include <X11/extensions/XInput2.h>
|
| #include <X11/Xlib.h>
|
|
|
| -#if defined(HAVE_IBUS)
|
| -#include "ui/base/ime/input_method_ibus.h"
|
| -#else
|
| -#include "ui/base/ime/mock_input_method.h"
|
| -#endif
|
| -
|
| using std::max;
|
| using std::min;
|
|
|
| @@ -238,6 +230,47 @@
|
| return num_coalesed;
|
| }
|
|
|
| +// We emulate Windows' WM_KEYDOWN and WM_CHAR messages. WM_CHAR events are only
|
| +// generated for certain keys; see
|
| +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646268.aspx.
|
| +bool ShouldSendCharEventForKeyboardCode(ui::KeyboardCode keycode) {
|
| + if ((keycode >= ui::VKEY_0 && keycode <= ui::VKEY_9) ||
|
| + (keycode >= ui::VKEY_A && keycode <= ui::VKEY_Z) ||
|
| + (keycode >= ui::VKEY_NUMPAD0 && keycode <= ui::VKEY_NUMPAD9)) {
|
| + return true;
|
| + }
|
| +
|
| + switch (keycode) {
|
| + case ui::VKEY_BACK:
|
| + case ui::VKEY_RETURN:
|
| + case ui::VKEY_ESCAPE:
|
| + case ui::VKEY_SPACE:
|
| + case ui::VKEY_TAB:
|
| + // In addition to the keys listed at MSDN, we include other
|
| + // graphic-character and numpad keys.
|
| + case ui::VKEY_MULTIPLY:
|
| + case ui::VKEY_ADD:
|
| + case ui::VKEY_SUBTRACT:
|
| + case ui::VKEY_DECIMAL:
|
| + case ui::VKEY_DIVIDE:
|
| + case ui::VKEY_OEM_1:
|
| + case ui::VKEY_OEM_2:
|
| + case ui::VKEY_OEM_3:
|
| + case ui::VKEY_OEM_4:
|
| + case ui::VKEY_OEM_5:
|
| + case ui::VKEY_OEM_6:
|
| + case ui::VKEY_OEM_7:
|
| + case ui::VKEY_OEM_102:
|
| + case ui::VKEY_OEM_PLUS:
|
| + case ui::VKEY_OEM_COMMA:
|
| + case ui::VKEY_OEM_MINUS:
|
| + case ui::VKEY_OEM_PERIOD:
|
| + return true;
|
| + default:
|
| + return false;
|
| + }
|
| +}
|
| +
|
| class DesktopHostLinux : public DesktopHost,
|
| public MessageLoop::DestructionObserver {
|
| public:
|
| @@ -259,15 +292,7 @@
|
| virtual void SetCursor(gfx::NativeCursor cursor_type) OVERRIDE;
|
| virtual gfx::Point QueryMouseLocation() OVERRIDE;
|
| virtual void PostNativeEvent(const base::NativeEvent& event) OVERRIDE;
|
| - virtual void SetInputMethod(ui::InputMethod*) OVERRIDE;
|
| - virtual ui::InputMethod* GetInputMethod() const OVERRIDE;
|
|
|
| - // ui::internal::InputMethodDelegate Override.
|
| - virtual void DispatchKeyEventPostIME(const base::NativeEvent& event) OVERRIDE;
|
| - virtual void DispatchFabricatedKeyEventPostIME(ui::EventType type,
|
| - ui::KeyboardCode key_code,
|
| - int flags) OVERRIDE;
|
| -
|
| // MessageLoop::DestructionObserver Overrides.
|
| virtual void WillDestroyCurrentMessageLoop() OVERRIDE;
|
|
|
| @@ -285,9 +310,6 @@
|
| // The native root window.
|
| ::Window root_window_;
|
|
|
| - // The input method for the desktop.
|
| - scoped_ptr<ui::InputMethod> input_method_;
|
| -
|
| // Current Aura cursor.
|
| gfx::NativeCursor current_cursor_;
|
|
|
| @@ -302,14 +324,6 @@
|
| xdisplay_(base::MessagePumpX::GetDefaultXDisplay()),
|
| xwindow_(0),
|
| root_window_(DefaultRootWindow(xdisplay_)),
|
| -#if defined(HAVE_IBUS)
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(
|
| - input_method_(new ui::InputMethodIBus(this))),
|
| -#else
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(
|
| - input_method_(new ui::MockInputMethod(this))),
|
| -#endif
|
| -
|
| current_cursor_(aura::kCursorNull),
|
| bounds_(bounds) {
|
| xwindow_ = XCreateSimpleWindow(xdisplay_, root_window_,
|
| @@ -317,7 +331,7 @@
|
| bounds.width(), bounds.height(),
|
| 0, 0, 0);
|
|
|
| - long event_mask = ButtonPressMask | ButtonReleaseMask | FocusChangeMask |
|
| + long event_mask = ButtonPressMask | ButtonReleaseMask |
|
| KeyPressMask | KeyReleaseMask |
|
| EnterWindowMask | LeaveWindowMask |
|
| ExposureMask | VisibilityChangeMask |
|
| @@ -335,11 +349,6 @@
|
|
|
| base::MessagePumpX::SetDefaultDispatcher(this);
|
| MessageLoopForUI::current()->AddDestructionObserver(this);
|
| -
|
| - ::Window focused_window = None;
|
| - int revert_to = 0;
|
| - XGetInputFocus(xdisplay_, &focused_window, &revert_to);
|
| - input_method_->Init(focused_window == xwindow_);
|
| }
|
|
|
| DesktopHostLinux::~DesktopHostLinux() {
|
| @@ -363,10 +372,19 @@
|
| desktop_->ScheduleDraw();
|
| handled = true;
|
| break;
|
| - case KeyPress:
|
| + case KeyPress: {
|
| + KeyEvent keydown_event(xev, false);
|
| + handled = desktop_->DispatchKeyEvent(&keydown_event);
|
| + if (ShouldSendCharEventForKeyboardCode(keydown_event.key_code())) {
|
| + KeyEvent char_event(xev, true);
|
| + handled |= desktop_->DispatchKeyEvent(&char_event);
|
| + }
|
| + break;
|
| + }
|
| case KeyRelease: {
|
| - input_method_->DispatchKeyEvent(xev);
|
| - handled = true;
|
| + KeyEvent keyup_event(xev, false);
|
| + handled = desktop_->DispatchKeyEvent(&keyup_event);
|
| + break;
|
| }
|
| case ButtonPress:
|
| case ButtonRelease: {
|
| @@ -444,14 +462,6 @@
|
| XFreeEventData(xev->xgeneric.display, &last_event.xcookie);
|
| break;
|
| }
|
| - case FocusIn: {
|
| - input_method_->OnFocus();
|
| - break;
|
| - }
|
| - case FocusOut: {
|
| - input_method_->OnBlur();
|
| - break;
|
| - }
|
| case MapNotify: {
|
| // If there's no window manager running, we need to assign the X input
|
| // focus to our host window.
|
| @@ -601,27 +611,6 @@
|
| return XGetSelectionOwner(xdisplay_, wm_s0_atom) != None;
|
| }
|
|
|
| -void DesktopHostLinux::SetInputMethod(ui::InputMethod* input_method) {
|
| - input_method_.reset(input_method);
|
| -}
|
| -
|
| -ui::InputMethod* DesktopHostLinux::GetInputMethod() const {
|
| - return input_method_.get();
|
| -}
|
| -
|
| -void DesktopHostLinux::DispatchKeyEventPostIME(const base::NativeEvent& event) {
|
| - KeyEvent aura_event(event, false /* is_char */);
|
| - desktop_->DispatchKeyEvent(&aura_event);
|
| - // We don't send a Char event here since the input method takes care of it.
|
| -}
|
| -
|
| -void DesktopHostLinux::DispatchFabricatedKeyEventPostIME(
|
| - ui::EventType type, ui::KeyboardCode key_code, int flags) {
|
| - // Dispatch a ui::VKEY_PROCESSKEY event etc. generated by |input_method_|.
|
| - KeyEvent aura_event(type, key_code, flags);
|
| - desktop_->DispatchKeyEvent(&aura_event);
|
| -}
|
| -
|
| } // namespace
|
|
|
| // static
|
|
|