Skip to content

Commit

Permalink
Add Seat object to exo
Browse files Browse the repository at this point in the history
Seat is corresponding to wl_saet and will be used to synchronize
wl_data_device#selection and wl_keyboard#enter events

Bug: 773978
Change-Id: Iaca10177f95aebac3822e6e534b9e640852e4ead
Reviewed-on: https://chromium-review.googlesource.com/770453
Reviewed-by: Yoshiki Iguchi <yoshiki@chromium.org>
Reviewed-by: David Reveman <reveman@chromium.org>
Commit-Queue: Daichi Hirono <hirono@chromium.org>
Cr-Commit-Position: refs/heads/master@{#517743}
  • Loading branch information
hirono-chromium authored and Commit Bot committed Nov 20, 2017
1 parent 7bfd0bc commit 3d3468d
Show file tree
Hide file tree
Showing 13 changed files with 255 additions and 67 deletions.
4 changes: 4 additions & 0 deletions components/exo/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ source_set("exo") {
"pointer.cc",
"pointer.h",
"pointer_delegate.h",
"seat.cc",
"seat.h",
"seat_observer.h",
"shared_memory.cc",
"shared_memory.h",
"shell_surface.cc",
Expand Down Expand Up @@ -125,6 +128,7 @@ source_set("unit_tests") {
"gaming_seat_unittest.cc",
"keyboard_unittest.cc",
"pointer_unittest.cc",
"seat_unittest.cc",
"shared_memory_unittest.cc",
"shell_surface_unittest.cc",
"sub_surface_unittest.cc",
Expand Down
5 changes: 5 additions & 0 deletions components/exo/display.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "base/macros.h"
#include "base/memory/shared_memory_handle.h"
#include "components/exo/seat.h"

#if defined(USE_OZONE)
#include "base/files/scoped_file.h"
Expand Down Expand Up @@ -86,9 +87,13 @@ class Display {
// Creates a data device for a |delegate|.
std::unique_ptr<DataDevice> CreateDataDevice(DataDeviceDelegate* delegate);

// Obtains seat instance.
Seat* seat() { return &seat_; }

private:
NotificationSurfaceManager* const notification_surface_manager_;
std::unique_ptr<FileHelper> file_helper_;
Seat seat_;

#if defined(USE_OZONE)
std::vector<gfx::BufferFormat> overlay_formats_;
Expand Down
68 changes: 28 additions & 40 deletions components/exo/keyboard.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include "base/threading/thread_task_runner_handle.h"
#include "components/exo/keyboard_delegate.h"
#include "components/exo/keyboard_device_configuration_delegate.h"
#include "components/exo/shell_surface.h"
#include "components/exo/seat.h"
#include "components/exo/surface.h"
#include "components/exo/wm_helper.h"
#include "ui/aura/client/focus_client.h"
Expand Down Expand Up @@ -126,17 +126,18 @@ bool IsReservedAccelerator(const ui::KeyEvent* event) {
////////////////////////////////////////////////////////////////////////////////
// Keyboard, public:

Keyboard::Keyboard(KeyboardDelegate* delegate)
Keyboard::Keyboard(KeyboardDelegate* delegate, Seat* seat)
: delegate_(delegate),
seat_(seat),
expiration_delay_for_pending_key_acks_(base::TimeDelta::FromMilliseconds(
kExpirationDelayForPendingKeyAcksMs)),
weak_ptr_factory_(this) {
auto* helper = WMHelper::GetInstance();
AddEventHandler();
helper->AddFocusObserver(this);
seat_->AddObserver(this);
helper->AddTabletModeObserver(this);
helper->AddInputDeviceEventObserver(this);
OnWindowFocused(helper->GetFocusedWindow(), nullptr);
OnSurfaceFocused(seat_->GetFocusedSurface());
}

Keyboard::~Keyboard() {
Expand All @@ -146,7 +147,7 @@ Keyboard::~Keyboard() {
focus_->RemoveSurfaceObserver(this);
auto* helper = WMHelper::GetInstance();
RemoveEventHandler();
helper->RemoveFocusObserver(this);
seat_->RemoveObserver(this);
helper->RemoveTabletModeObserver(this);
helper->RemoveInputDeviceEventObserver(this);
}
Expand Down Expand Up @@ -267,29 +268,6 @@ void Keyboard::OnKeyEvent(ui::KeyEvent* event) {
ScheduleProcessExpiredPendingKeyAcks(expiration_delay_for_pending_key_acks_);
}

////////////////////////////////////////////////////////////////////////////////
// aura::client::FocusChangeObserver overrides:

void Keyboard::OnWindowFocused(aura::Window* gained_focus,
aura::Window* lost_focus) {
Surface* gained_focus_surface =
gained_focus ? GetEffectiveFocus(gained_focus) : nullptr;
if (gained_focus_surface != focus_) {
if (focus_) {
delegate_->OnKeyboardLeave(focus_);
focus_->RemoveSurfaceObserver(this);
focus_ = nullptr;
pending_key_acks_.clear();
}
if (gained_focus_surface) {
delegate_->OnKeyboardModifiers(modifier_flags_);
delegate_->OnKeyboardEnter(gained_focus_surface, pressed_keys_);
focus_ = gained_focus_surface;
focus_->AddSurfaceObserver(this);
}
}
}

////////////////////////////////////////////////////////////////////////////////
// SurfaceObserver overrides:

Expand Down Expand Up @@ -323,22 +301,32 @@ void Keyboard::OnTabletModeEnded() {
}

////////////////////////////////////////////////////////////////////////////////
// Keyboard, private:
// SeatObserver overrides:

Surface* Keyboard::GetEffectiveFocus(aura::Window* window) const {
// Use window surface as effective focus.
Surface* focus = Surface::AsSurface(window);
if (!focus) {
// Fallback to main surface.
aura::Window* top_level_window = window->GetToplevelWindow();
if (top_level_window)
focus = ShellSurface::GetMainSurface(top_level_window);
void Keyboard::OnSurfaceFocused(Surface* gained_focus) {
Surface* gained_focus_surface =
gained_focus && delegate_->CanAcceptKeyboardEventsForSurface(gained_focus)
? gained_focus
: nullptr;
if (gained_focus_surface != focus_) {
if (focus_) {
delegate_->OnKeyboardLeave(focus_);
focus_->RemoveSurfaceObserver(this);
focus_ = nullptr;
pending_key_acks_.clear();
}
if (gained_focus_surface) {
delegate_->OnKeyboardModifiers(modifier_flags_);
delegate_->OnKeyboardEnter(gained_focus_surface, pressed_keys_);
focus_ = gained_focus_surface;
focus_->AddSurfaceObserver(this);
}
}

return focus && delegate_->CanAcceptKeyboardEventsForSurface(focus) ? focus
: nullptr;
}

////////////////////////////////////////////////////////////////////////////////
// Keyboard, private:

void Keyboard::ProcessExpiredPendingKeyAcks() {
DCHECK(process_expired_pending_key_acks_pending_);
process_expired_pending_key_acks_pending_ = false;
Expand Down
21 changes: 11 additions & 10 deletions components/exo/keyboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
#include "base/macros.h"
#include "base/observer_list.h"
#include "components/exo/keyboard_observer.h"
#include "components/exo/seat_observer.h"
#include "components/exo/surface_observer.h"
#include "ui/aura/client/focus_change_observer.h"
#include "ui/events/devices/input_device_event_observer.h"
#include "ui/events/event.h"
#include "ui/events/event_handler.h"
Expand All @@ -26,17 +26,18 @@ class KeyEvent;
namespace exo {
class KeyboardDelegate;
class KeyboardDeviceConfigurationDelegate;
class Seat;
class Surface;

// This class implements a client keyboard that represents one or more keyboard
// devices.
class Keyboard : public ui::EventHandler,
public aura::client::FocusChangeObserver,
public ui::InputDeviceEventObserver,
public ash::TabletModeObserver,
public SurfaceObserver {
public SurfaceObserver,
public SeatObserver {
public:
explicit Keyboard(KeyboardDelegate* delegate);
Keyboard(KeyboardDelegate* delegate, Seat* seat);
~Keyboard() override;

bool HasDeviceConfigurationDelegate() const;
Expand All @@ -56,9 +57,6 @@ class Keyboard : public ui::EventHandler,
// Overridden from ui::EventHandler:
void OnKeyEvent(ui::KeyEvent* event) override;

// Overridden ui::aura::client::FocusChangeObserver:
void OnWindowFocused(aura::Window* gained_focus,
aura::Window* lost_focus) override;

// Overridden from SurfaceObserver:
void OnSurfaceDestroying(Surface* surface) override;
Expand All @@ -71,10 +69,10 @@ class Keyboard : public ui::EventHandler,
void OnTabletModeEnding() override;
void OnTabletModeEnded() override;

private:
// Returns the effective focus for |window|.
Surface* GetEffectiveFocus(aura::Window* window) const;
// Overridden from SeatObserver:
void OnSurfaceFocused(Surface* gained_focus) override;

private:
// Processes expired key state changes in |pending_key_acks_| as they have not
// been acknowledged.
void ProcessExpiredPendingKeyAcks();
Expand All @@ -94,6 +92,9 @@ class Keyboard : public ui::EventHandler,
// configuration are dispatched to.
KeyboardDelegate* const delegate_;

// Seat that the Keyboard recieves focus events from.
Seat* const seat_;

// The delegate instance that events about device configuration are dispatched
// to.
KeyboardDeviceConfigurationDelegate* device_configuration_delegate_ = nullptr;
Expand Down
34 changes: 23 additions & 11 deletions components/exo/keyboard_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "components/exo/keyboard_delegate.h"
#include "components/exo/keyboard_device_configuration_delegate.h"
#include "components/exo/keyboard_observer.h"
#include "components/exo/seat.h"
#include "components/exo/shell_surface.h"
#include "components/exo/surface.h"
#include "components/exo/test/exo_test_base.h"
Expand Down Expand Up @@ -83,7 +84,8 @@ TEST_F(KeyboardTest, OnKeyboardEnter) {
MockKeyboardDelegate delegate;
EXPECT_CALL(delegate, CanAcceptKeyboardEventsForSurface(surface.get()))
.WillOnce(testing::Return(false));
std::unique_ptr<Keyboard> keyboard(new Keyboard(&delegate));
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);

ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
generator.PressKey(ui::VKEY_A, 0);
Expand Down Expand Up @@ -120,7 +122,8 @@ TEST_F(KeyboardTest, OnKeyboardLeave) {
focus_client->FocusWindow(nullptr);

MockKeyboardDelegate delegate;
std::unique_ptr<Keyboard> keyboard(new Keyboard(&delegate));
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);

EXPECT_CALL(delegate, CanAcceptKeyboardEventsForSurface(surface.get()))
.WillOnce(testing::Return(true));
Expand Down Expand Up @@ -149,7 +152,8 @@ TEST_F(KeyboardTest, OnKeyboardKey) {
focus_client->FocusWindow(nullptr);

MockKeyboardDelegate delegate;
std::unique_ptr<Keyboard> keyboard(new Keyboard(&delegate));
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);

EXPECT_CALL(delegate, CanAcceptKeyboardEventsForSurface(surface.get()))
.WillOnce(testing::Return(true));
Expand Down Expand Up @@ -187,7 +191,8 @@ TEST_F(KeyboardTest, OnKeyboardModifiers) {
focus_client->FocusWindow(nullptr);

MockKeyboardDelegate delegate;
std::unique_ptr<Keyboard> keyboard(new Keyboard(&delegate));
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);

EXPECT_CALL(delegate, CanAcceptKeyboardEventsForSurface(surface.get()))
.WillOnce(testing::Return(true));
Expand Down Expand Up @@ -242,7 +247,8 @@ TEST_F(KeyboardTest, OnKeyboardTypeChanged) {
tablet_mode_controller->EnableTabletModeWindowManager(true);

MockKeyboardDelegate delegate;
std::unique_ptr<Keyboard> keyboard(new Keyboard(&delegate));
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);
MockKeyboardDeviceConfigurationDelegate configuration_delegate;

EXPECT_CALL(configuration_delegate, OnKeyboardTypeChanged(true));
Expand Down Expand Up @@ -278,7 +284,8 @@ TEST_F(KeyboardTest, KeyboardObserver) {
focus_client->FocusWindow(nullptr);

MockKeyboardDelegate delegate;
auto keyboard = std::make_unique<Keyboard>(&delegate);
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);
MockKeyboardObserver observer;
keyboard->AddObserver(&observer);

Expand All @@ -300,7 +307,8 @@ TEST_F(KeyboardTest, NeedKeyboardKeyAcks) {
focus_client->FocusWindow(nullptr);

MockKeyboardDelegate delegate;
auto keyboard = std::make_unique<Keyboard>(&delegate);
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);

EXPECT_FALSE(keyboard->AreKeyboardKeyAcksNeeded());
keyboard->SetNeedKeyboardKeyAcks(true);
Expand All @@ -325,7 +333,8 @@ TEST_F(KeyboardTest, AckKeyboardKey) {
focus_client->FocusWindow(nullptr);

MockKeyboardDelegate delegate;
std::unique_ptr<Keyboard> keyboard(new Keyboard(&delegate));
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);

EXPECT_CALL(delegate, CanAcceptKeyboardEventsForSurface(surface.get()))
.WillOnce(testing::Return(true));
Expand Down Expand Up @@ -403,7 +412,8 @@ TEST_F(KeyboardTest, AckKeyboardKeyMoveFocus) {
focus_client->FocusWindow(nullptr);

MockKeyboardDelegate delegate;
std::unique_ptr<Keyboard> keyboard(new Keyboard(&delegate));
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);

EXPECT_CALL(delegate, CanAcceptKeyboardEventsForSurface(surface.get()))
.WillOnce(testing::Return(true));
Expand Down Expand Up @@ -445,7 +455,8 @@ TEST_F(KeyboardTest, AckKeyboardKeyExpired) {
focus_client->FocusWindow(nullptr);

MockKeyboardDelegate delegate;
std::unique_ptr<Keyboard> keyboard(new Keyboard(&delegate));
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);

EXPECT_CALL(delegate, CanAcceptKeyboardEventsForSurface(surface.get()))
.WillOnce(testing::Return(true));
Expand Down Expand Up @@ -517,7 +528,8 @@ TEST_F(KeyboardTest, AckKeyboardKeyExpiredWithMovingFocusAccelerator) {
focus_client->FocusWindow(nullptr);

MockKeyboardDelegate delegate;
std::unique_ptr<Keyboard> keyboard(new Keyboard(&delegate));
Seat seat;
auto keyboard = std::make_unique<Keyboard>(&delegate, &seat);

EXPECT_CALL(delegate, CanAcceptKeyboardEventsForSurface(surface.get()))
.WillOnce(testing::Return(true));
Expand Down
Loading

0 comments on commit 3d3468d

Please sign in to comment.