Index: content/browser/gamepad/gamepad_service.cc |
diff --git a/content/browser/gamepad/gamepad_service.cc b/content/browser/gamepad/gamepad_service.cc |
index 11a6964b3ab5cf9953569d5aa0b6b8c53be6b51f..204d62e1702ab9c65c42514ced580d307e0f3b4c 100644 |
--- a/content/browser/gamepad/gamepad_service.cc |
+++ b/content/browser/gamepad/gamepad_service.cc |
@@ -7,18 +7,19 @@ |
#include "base/bind.h" |
#include "base/logging.h" |
#include "base/memory/singleton.h" |
+#include "content/browser/gamepad/gamepad_consumer.h" |
#include "content/browser/gamepad/gamepad_data_fetcher.h" |
#include "content/browser/gamepad/gamepad_provider.h" |
+#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/render_process_host.h" |
namespace content { |
-GamepadService::GamepadService() : num_readers_(0) { |
+GamepadService::GamepadService() { |
} |
GamepadService::GamepadService(scoped_ptr<GamepadDataFetcher> fetcher) |
- : num_readers_(0), |
- provider_(new GamepadProvider(fetcher.Pass())) { |
+ : provider_(new GamepadProvider(fetcher.Pass())) { |
thread_checker_.DetachFromThread(); |
} |
@@ -30,28 +31,52 @@ GamepadService* GamepadService::GetInstance() { |
LeakySingletonTraits<GamepadService> >::get(); |
} |
-void GamepadService::AddConsumer() { |
+void GamepadService::AddConsumer(GamepadConsumer* consumer) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- num_readers_++; |
- DCHECK(num_readers_ > 0); |
+ DCHECK(consumers_.count(ConsumerInfo(consumer)) == 0); |
+ consumers_.insert(ConsumerInfo(consumer)); |
if (!provider_) |
provider_.reset(new GamepadProvider); |
+ provider_->RegisterForUserGesture( |
+ base::Bind(&GamepadService::OnUserGesture, |
+ base::Unretained(this))); |
provider_->Resume(); |
} |
-void GamepadService::RemoveConsumer() { |
+void GamepadService::OnUserGesture() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- --num_readers_; |
- DCHECK(num_readers_ >= 0); |
+ if (!provider_) |
+ return; |
+ |
+ for (ConsumerSet::iterator it = consumers_.begin(); |
+ it != consumers_.end(); ++it) { |
+ if (!it->did_observe_user_gesture) { |
+ ConsumerInfo& info = const_cast<ConsumerInfo&>(*it); |
+ info.did_observe_user_gesture = true; |
+ blink::WebGamepads gamepads; |
+ provider_->GetCurrentGamepadData(&gamepads); |
+ for (unsigned i = 0; i < blink::WebGamepads::itemsLengthCap; ++i) { |
+ const blink::WebGamepad& pad = gamepads.items[i]; |
+ if (pad.connected) |
+ info.consumer->OnGamepadConnected(i, pad); |
+ } |
+ } |
+ } |
+} |
+ |
+void GamepadService::RemoveConsumer(GamepadConsumer* consumer) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
- if (num_readers_ == 0) |
+ DCHECK(consumers_.count(ConsumerInfo(consumer)) > 0); |
+ consumers_.erase(ConsumerInfo(consumer)); |
+ if (consumers_.size() == 0) |
provider_->Pause(); |
} |
void GamepadService::RegisterForUserGesture(const base::Closure& closure) { |
- DCHECK(num_readers_ > 0); |
+ DCHECK(consumers_.size() > 0); |
DCHECK(thread_checker_.CalledOnValidThread()); |
provider_->RegisterForUserGesture(closure); |
} |
@@ -60,6 +85,30 @@ void GamepadService::Terminate() { |
provider_.reset(); |
} |
+void GamepadService::OnGamepadConnected( |
+ int index, |
+ const blink::WebGamepad& pad) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ for (ConsumerSet::iterator it = consumers_.begin(); |
+ it != consumers_.end(); ++it) { |
+ if (it->did_observe_user_gesture) |
+ it->consumer->OnGamepadConnected(index, pad); |
+ } |
+} |
+ |
+void GamepadService::OnGamepadDisconnected( |
+ int index, |
+ const blink::WebGamepad& pad) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ for (ConsumerSet::iterator it = consumers_.begin(); |
+ it != consumers_.end(); ++it) { |
+ if (it->did_observe_user_gesture) |
+ it->consumer->OnGamepadDisconnected(index, pad); |
+ } |
+} |
+ |
base::SharedMemoryHandle GamepadService::GetSharedMemoryHandleForProcess( |
base::ProcessHandle handle) { |
DCHECK(thread_checker_.CalledOnValidThread()); |