Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1315)

Unified Diff: content/browser/gamepad/gamepad_service.cc

Issue 200873002: Gamepad API: add support for connection events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());
« no previous file with comments | « content/browser/gamepad/gamepad_service.h ('k') | content/browser/renderer_host/gamepad_browser_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698