diff --git a/package.json b/package.json index 309b85c5..9e93f2b9 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "url": "https://github.com/greenheartgames/greenworks/blob/master/LICENSE" }], "dependencies": { - "nan": "2.0.8" + "nan": "^2.0.8" }, "devDependencies": { "mocha": "1.21.4" diff --git a/src/greenworks_api.cc b/src/greenworks_api.cc index 3046e145..a3113eb0 100644 --- a/src/greenworks_api.cc +++ b/src/greenworks_api.cc @@ -35,6 +35,7 @@ class SteamEvent : public greenworks::SteamClient::Observer { virtual void OnSteamServersDisconnected(); virtual void OnSteamServerConnectFailure(int status_code); virtual void OnSteamShutdown(); + virtual void OnGamepadTextInputDismissed(bool submitted, uint32 text); }; void SteamEvent::OnGameOverlayActivated(bool is_active) { @@ -78,6 +79,16 @@ void SteamEvent::OnSteamShutdown() { Nan::New(g_persistent_steam_events), "on", 1, argv); } +void SteamEvent::OnGamepadTextInputDismissed(bool submitted, uint32 text) { + Nan::HandleScope scope; + v8::Local argv[] = { + Nan::New("gamepad-text-input-dismissed").ToLocalChecked(), + Nan::New(submitted), + Nan::New(text) }; + Nan::MakeCallback( + Nan::New(g_persistent_steam_events), "on", 3, argv); +} + v8::Local GetSteamUserCountType(int type_id) { v8::Local account_type = Nan::New(); std::string name; @@ -703,6 +714,45 @@ NAN_METHOD(GetEncryptedAppTicket) { info.GetReturnValue().Set(Nan::Undefined()); } +NAN_METHOD(ShowGamepadTextInput) { + Nan::HandleScope scope; + if (info.Length() < 5 || !info[0]->IsInt32() || !info[1]->IsInt32() || + !info[2]->IsString() || !info[3]->IsInt32() || !info[4]->IsString()) { + THROW_BAD_ARGS("Bad arguments"); + } + EGamepadTextInputMode input_mode = static_cast( + info[0]->Int32Value()); + EGamepadTextInputLineMode input_line_mode = + static_cast(info[1]->Int32Value()); + char* description = + *(static_cast(info[2]->ToString())); + int char_max = info[3]->Int32Value(); + char* existing_text = + *(static_cast(info[4]->ToString())); + bool success = SteamUtils()->ShowGamepadTextInput( + input_mode, input_line_mode, description, char_max, existing_text); + info.GetReturnValue().Set(Nan::New(success)); +} + +NAN_METHOD(GetEnteredGamepadTextLength) { + Nan::HandleScope scope; + info.GetReturnValue().Set( + Nan::New(SteamUtils()->GetEnteredGamepadTextLength())); +} + +NAN_METHOD(GetEnteredGamepadTextInput) { + Nan::HandleScope scope; + if (info.Length() < 1 || !info[0]->IsInt32()) { + THROW_BAD_ARGS("Bad arguments"); + } + int length = SteamUtils()->GetEnteredGamepadTextLength(); + char* text = new char[length+1]; + text[length] = '\0'; + SteamUtils()->GetEnteredGamepadTextInput(text, info[0]->Int32Value()); + info.GetReturnValue().Set(Nan::New(text).ToLocalChecked()); + delete text; +} + NAN_METHOD(ActivateGameOverlayToWebPage) { Nan::HandleScope scope; if (info.Length() < 1 || !info[0]->IsString()) { @@ -847,12 +897,24 @@ NAN_MODULE_INIT(init) { GetEncryptedAppTicket)->GetFunction()); Nan::Set(target, Nan::New("cancelAuthTicket").ToLocalChecked(), - Nan::New(CancelAuthTicket)->GetFunction()); + Nan::New(CancelAuthTicket)->GetFunction()); + // Gamepad APIs. + Nan::Set(target, + Nan::New("showGamepadTextInput").ToLocalChecked(), + Nan::New(ShowGamepadTextInput)->GetFunction()); + Nan::Set(target, + Nan::New("getEnteredGamepadTextLength").ToLocalChecked(), + Nan::New(GetEnteredGamepadTextLength)->GetFunction()); + Nan::Set(target, + Nan::New("getEnteredGamepadTextInput").ToLocalChecked(), + Nan::New(GetEnteredGamepadTextInput)->GetFunction()); utils::InitUgcMatchingTypes(target); utils::InitUgcQueryTypes(target); utils::InitUserUgcListSortOrder(target); utils::InitUserUgcList(target); + utils::InitGamepadTextInputMode(target); + utils::InitGamepadTextInputLineMode(target); // Utils related APIs. InitUtilsObject(target); diff --git a/src/greenworks_utils.cc b/src/greenworks_utils.cc index b8cd50b3..088e10a4 100644 --- a/src/greenworks_utils.cc +++ b/src/greenworks_utils.cc @@ -118,6 +118,30 @@ void InitUserUgcList(v8::Handle exports) { Nan::Set(exports, Nan::New("UserUGCList").ToLocalChecked(), ugc_list); } +void InitGamepadTextInputMode(v8::Handle exports) { + v8::Local mode = Nan::New(); + mode->Set(Nan::New("Normal").ToLocalChecked(), + Nan::New(k_EGamepadTextInputModeNormal)); + mode->Set(Nan::New("Password").ToLocalChecked(), + Nan::New(k_EGamepadTextInputModePassword)); + Nan::Persistent constructor; + constructor.Reset(mode); + Nan::Set(exports, Nan::New("GamepadTextInputMode").ToLocalChecked(), mode); +} + +void InitGamepadTextInputLineMode(v8::Handle exports) { + v8::Local line_mode = Nan::New(); + line_mode->Set(Nan::New("SingleLine").ToLocalChecked(), + Nan::New(k_EGamepadTextInputLineModeSingleLine)); + line_mode->Set(Nan::New("MultipleLines").ToLocalChecked(), + Nan::New(k_EGamepadTextInputLineModeMultipleLines)); + Nan::Persistent constructor; + constructor.Reset(line_mode); + Nan::Set(exports, + Nan::New("GamepadTextInputLineMode").ToLocalChecked(), + line_mode); +} + void InitUserUgcListSortOrder(v8::Handle exports) { v8::Local ugc_list_sort_order = Nan::New(); ugc_list_sort_order->Set(Nan::New("CreationOrderDesc").ToLocalChecked(), diff --git a/src/greenworks_utils.h b/src/greenworks_utils.h index 7c87c3e8..26e25f31 100644 --- a/src/greenworks_utils.h +++ b/src/greenworks_utils.h @@ -21,6 +21,10 @@ void InitUserUgcListSortOrder(v8::Handle exports); void InitUserUgcList(v8::Handle exports); +void InitGamepadTextInputMode(v8::Handle exports); + +void InitGamepadTextInputLineMode(v8::Handle exports); + void sleep(int milliseconds); bool ReadFile(const char* path, char* &content, int& length); diff --git a/src/steam_client.cc b/src/steam_client.cc index 547d8c5c..316aafce 100644 --- a/src/steam_client.cc +++ b/src/steam_client.cc @@ -36,6 +36,8 @@ SteamClient::SteamClient() : steam_servers_disconnected_(this, &SteamClient::OnSteamServersDisconnected), steam_server_connect_failure_(this, &SteamClient::OnSteamServerConnectFailure), + gamepad_text_input_dismissed_(this, + &SteamClient::OnGamepadTextInputDismissed), steam_shutdown_(this, &SteamClient::OnSteamShutdown) { } @@ -85,6 +87,14 @@ void SteamClient::OnSteamServerConnectFailure( } } +void SteamClient::OnGamepadTextInputDismissed( + GamepadTextInputDismissed_t* callback) { + for (size_t i = 0; i < observer_list_.size(); ++i) { + observer_list_[i]->OnGamepadTextInputDismissed( + callback->m_bSubmitted, callback->m_unSubmittedText); + } +} + void SteamClient::OnSteamShutdown(SteamShutdown_t* callback) { for (size_t i = 0; i < observer_list_.size(); ++i) { observer_list_[i]->OnSteamShutdown(); diff --git a/src/steam_client.h b/src/steam_client.h index 3d98a948..b8b4bff2 100644 --- a/src/steam_client.h +++ b/src/steam_client.h @@ -21,6 +21,7 @@ class SteamClient { virtual void OnSteamServersDisconnected() = 0; virtual void OnSteamServerConnectFailure(int status_code) = 0; virtual void OnSteamShutdown() = 0; + virtual void OnGamepadTextInputDismissed(bool submitted, uint32 text) = 0; virtual ~Observer() {} }; @@ -45,6 +46,8 @@ class SteamClient { SteamServersDisconnected_t, steam_servers_disconnected_); STEAM_CALLBACK(SteamClient, OnSteamServerConnectFailure, SteamServerConnectFailure_t, steam_server_connect_failure_); + STEAM_CALLBACK(SteamClient, OnGamepadTextInputDismissed, + GamepadTextInputDismissed_t, gamepad_text_input_dismissed_); STEAM_CALLBACK(SteamClient, OnSteamShutdown, SteamShutdown_t, steam_shutdown_); };