Compare commits
55 Commits
v0.7
...
linting_an
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
678d4d038f | ||
|
|
ba66f5448d | ||
|
|
c2ec8f377e | ||
|
|
46e635cb6e | ||
|
|
c6390338e3 | ||
|
|
e0c4c01e44 | ||
|
|
3f244ff8e1 | ||
|
|
63731def4a | ||
|
|
9b4e7b661b | ||
|
|
f32a35607b | ||
|
|
f45a2c22d5 | ||
|
|
00e1511daf | ||
|
|
7c29774fbb | ||
|
|
3f7e3aa10b | ||
|
|
3157fb6923 | ||
|
|
fb5988ffec | ||
|
|
584d504273 | ||
|
|
498bff4b0b | ||
|
|
94df20bbee | ||
|
|
f485c8ce49 | ||
|
|
b4ba33f72a | ||
|
|
bdfc115a0a | ||
|
|
079126360d | ||
|
|
d5db081e7d | ||
|
|
e1616df7b4 | ||
|
|
7517e379c5 | ||
|
|
a34a0c492a | ||
|
|
66da3a7c87 | ||
|
|
12f0be4149 | ||
|
|
6257594085 | ||
|
|
cfaa0efde4 | ||
|
|
1c0a575ccc | ||
|
|
4108d696e4 | ||
|
|
2dfdf703fd | ||
|
|
d19ca54fda | ||
|
|
37387e151f | ||
|
|
2fc6b10cc9 | ||
|
|
59e3a104ba | ||
|
|
2456ec603c | ||
|
|
cae6b4a566 | ||
|
|
326b7d6aed | ||
|
|
d2a2542e5b | ||
|
|
59e7adb32f | ||
|
|
8e601a9577 | ||
|
|
8689032369 | ||
|
|
9cd90d5a8d | ||
|
|
850862c1d1 | ||
|
|
053cd9a830 | ||
|
|
38a7a058ab | ||
|
|
7d978ca131 | ||
|
|
c3d72f8c71 | ||
|
|
fb85ea15da | ||
|
|
3f0d2b9909 | ||
|
|
e4bec4133d | ||
|
|
c0d9ae87f2 |
14
auddec.cpp
@@ -34,7 +34,7 @@ static void AudioPlayerSampleCallback(void* samples, uint32_t buffer_size, void*
|
||||
}
|
||||
}
|
||||
|
||||
void MoonlightInstance::AudDecInit(int audioConfiguration, POPUS_MULTISTREAM_CONFIGURATION opusConfig) {
|
||||
int MoonlightInstance::AudDecInit(int audioConfiguration, POPUS_MULTISTREAM_CONFIGURATION opusConfig, void* context, int flags) {
|
||||
int rc;
|
||||
|
||||
g_Instance->m_OpusDecoder = opus_multistream_decoder_create(opusConfig->sampleRate,
|
||||
@@ -49,6 +49,8 @@ void MoonlightInstance::AudDecInit(int audioConfiguration, POPUS_MULTISTREAM_CON
|
||||
|
||||
// Start playback now
|
||||
g_Instance->m_AudioPlayer.StartPlayback();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void MoonlightInstance::AudDecCleanup(void) {
|
||||
@@ -83,8 +85,8 @@ void MoonlightInstance::AudDecDecodeAndPlaySample(char* sampleData, int sampleLe
|
||||
}
|
||||
|
||||
AUDIO_RENDERER_CALLBACKS MoonlightInstance::s_ArCallbacks = {
|
||||
MoonlightInstance::AudDecInit,
|
||||
MoonlightInstance::AudDecCleanup,
|
||||
MoonlightInstance::AudDecDecodeAndPlaySample,
|
||||
CAPABILITY_DIRECT_SUBMIT
|
||||
};
|
||||
.init = MoonlightInstance::AudDecInit,
|
||||
.cleanup = MoonlightInstance::AudDecCleanup,
|
||||
.decodeAndPlaySample = MoonlightInstance::AudDecDecodeAndPlaySample,
|
||||
.capabilities = CAPABILITY_DIRECT_SUBMIT
|
||||
};
|
||||
|
||||
@@ -38,12 +38,18 @@ void MoonlightInstance::ClDisplayTransientMessage(const char* message) {
|
||||
g_Instance->PostMessage(response);
|
||||
}
|
||||
|
||||
void MoonlightInstance::ClLogMessage(const char* format, ...) {
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
vfprintf(stderr, format, va);
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
CONNECTION_LISTENER_CALLBACKS MoonlightInstance::s_ClCallbacks = {
|
||||
MoonlightInstance::ClStageStarting,
|
||||
NULL,
|
||||
MoonlightInstance::ClStageFailed,
|
||||
MoonlightInstance::ClConnectionStarted,
|
||||
MoonlightInstance::ClConnectionTerminated,
|
||||
MoonlightInstance::ClDisplayMessage,
|
||||
MoonlightInstance::ClDisplayTransientMessage
|
||||
.stageStarting = MoonlightInstance::ClStageStarting,
|
||||
.stageFailed = MoonlightInstance::ClStageFailed,
|
||||
.connectionStarted = MoonlightInstance::ClConnectionStarted,
|
||||
.connectionTerminated = MoonlightInstance::ClConnectionTerminated,
|
||||
.displayMessage = MoonlightInstance::ClDisplayMessage,
|
||||
.displayTransientMessage = MoonlightInstance::ClDisplayTransientMessage
|
||||
};
|
||||
|
||||
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 13 KiB |
BIN
icons/icon16.png
|
Before Width: | Height: | Size: 809 B After Width: | Height: | Size: 859 B |
BIN
icons/icon32.png
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.3 KiB |
BIN
icons/icon48.png
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 2.5 KiB |
44
index.html
@@ -14,18 +14,17 @@
|
||||
<div class="mdl-layout mdl-js-layout">
|
||||
<header id="main-navigation" class="mdl-layout__header mdl-layout__header--transparent">
|
||||
<div class="mdl-layout__header-row">
|
||||
<span id='backIcon'><i class="material-icons">keyboard_arrow_left</i></span>
|
||||
<button id="backIcon" class="mdl-button mdl-js-button mdl-button--icon" role="link" aria-label="Host selection"><i class="material-icons">keyboard_arrow_left</i></button>
|
||||
<!-- Title -->
|
||||
<span class="mdl-layout-title">MOON<span>LIGHT</span></span>
|
||||
<!-- Add spacer, to align navigation to the right -->
|
||||
<div class="mdl-layout-spacer"></div>
|
||||
<!-- Navigation -->
|
||||
<nav class="mdl-navigation">
|
||||
|
||||
<div class="nav-menu-parent">
|
||||
<div id="resolutionMenu">
|
||||
<button id="selectResolution" data-value="1920:1080" class="mdl-button mdl-js-button">
|
||||
1080p
|
||||
<button id="selectResolution" data-value="1280:720" class="mdl-button mdl-js-button">
|
||||
720p
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -40,7 +39,6 @@
|
||||
Resolution
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="nav-menu-parent">
|
||||
<div id="framerateMenu">
|
||||
<button id="selectFramerate" data-value="60" class="mdl-button mdl-js-button">
|
||||
@@ -61,7 +59,7 @@
|
||||
|
||||
<div class="nav-menu-parent">
|
||||
<div id="bandwidthMenu">
|
||||
<button id='bitrateField' class="mdl-button">10 Mbps</button>
|
||||
<button id="bitrateField" class="mdl-button">10 Mbps</button>
|
||||
</div>
|
||||
|
||||
<div class="bitrateMenu mdl-menu mdl-js-menu mdl-js-ripple-effect" for="bandwidthMenu">
|
||||
@@ -73,15 +71,27 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label id="externalAudioBtn" class="mdl-icon-toggle mdl-js-icon-toggle mdl-js-ripple-effect" for="remoteAudioEnabledSwitch">
|
||||
<input type="checkbox" id="remoteAudioEnabledSwitch" class="mdl-icon-toggle__input" checked>
|
||||
<i class="mdl-icon-toggle__label material-icons">volume_up</i>
|
||||
</label>
|
||||
<div id="externalAudioTooltip" class="mdl-tooltip" for="externalAudioBtn">
|
||||
Remote audio is ON
|
||||
<div class="nav-menu-parent">
|
||||
<label id="externalAudioBtn" class="mdl-icon-toggle mdl-js-icon-toggle mdl-js-ripple-effect" for="remoteAudioEnabledSwitch">
|
||||
<input type="checkbox" id="remoteAudioEnabledSwitch" class="mdl-icon-toggle__input">
|
||||
<i class="mdl-icon-toggle__label material-icons">volume_up</i>
|
||||
</label>
|
||||
<div id="externalAudioTooltip" class="mdl-tooltip" for="externalAudioBtn">
|
||||
Play audio on the host PC speakers
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="button" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored mdl-js-ripple-effect" id="quitCurrentApp">
|
||||
<div class="nav-menu-parent">
|
||||
<label id="optimizeGamesBtn" class="mdl-icon-toggle mdl-js-icon-toggle mdl-js-ripple-effect" for="optimizeGamesSwitch">
|
||||
<input type="checkbox" id="optimizeGamesSwitch" class="mdl-icon-toggle__input">
|
||||
<i class="mdl-icon-toggle__label material-icons">timeline</i>
|
||||
</label>
|
||||
<div id="optimizeGamesTooltip" class="mdl-tooltip" for="optimizeGamesBtn">
|
||||
Allow GeForce Experience to optimize game settings for streaming
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="button" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored mdl-js-ripple-effect" id="quitCurrentApp" aria-label="Quit current app">
|
||||
<i class="material-icons">remove_circle_outline</i>
|
||||
Quit Current App
|
||||
</button>
|
||||
@@ -91,8 +101,8 @@
|
||||
<main id="main-content" class="mdl-layout__content">
|
||||
<div id="host-grid">
|
||||
<div class="page-title">Your PCs</div>
|
||||
<div class="add-host-card mdl-card mdl-shadow--4dp" id='addHostCell'>
|
||||
<div class="mdl-card__title mdl-card--expand" id="addHostIcon">
|
||||
<div class="add-host-card mdl-card mdl-shadow--4dp" id="addHostCell">
|
||||
<div class="mdl-card__title mdl-card--expand" id="addHostIcon" role="link" tabindex="0" aria-label="Add Host">
|
||||
<h2 class="mdl-card__title-text" >Add Host</h2>
|
||||
</div>
|
||||
</div>
|
||||
@@ -168,7 +178,7 @@
|
||||
</dialog>
|
||||
<div id="snackbar" class="mdl-snackbar mdl-js-snackbar">
|
||||
<div class="mdl-snackbar__text"></div>
|
||||
<button id='snackButton' class="mdl-snackbar__action" type="button"></button> <!-- this button exists to suppress the snackbar warning. we're really using a toast. -->
|
||||
<button id="snackButton" class="mdl-snackbar__action" type="button"></button> <!-- this button exists to suppress the snackbar warning. we're really using a toast. -->
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
12
input.cpp
@@ -51,6 +51,13 @@ static char GetModifierFlags(const pp::InputEvent& event) {
|
||||
return flags;
|
||||
}
|
||||
|
||||
void MoonlightInstance::ReportMouseMovement() {
|
||||
if (m_MouseDeltaX != 0 || m_MouseDeltaY != 0) {
|
||||
LiSendMouseMoveEvent(m_MouseDeltaX, m_MouseDeltaY);
|
||||
m_MouseDeltaX = m_MouseDeltaY = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool MoonlightInstance::HandleInputEvent(const pp::InputEvent& event) {
|
||||
switch (event.GetType()) {
|
||||
case PP_INPUTEVENT_TYPE_MOUSEDOWN: {
|
||||
@@ -77,7 +84,10 @@ bool MoonlightInstance::HandleInputEvent(const pp::InputEvent& event) {
|
||||
pp::MouseInputEvent mouseEvent(event);
|
||||
pp::Point posDelta = mouseEvent.GetMovement();
|
||||
|
||||
LiSendMouseMoveEvent(posDelta.x(), posDelta.y());
|
||||
// Wait to report mouse movement until the next input polling window
|
||||
// to allow batching to occur which reduces overall input lag.
|
||||
m_MouseDeltaX += posDelta.x();
|
||||
m_MouseDeltaY += posDelta.y();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
10
libchelper.c
@@ -1,5 +1,6 @@
|
||||
#include <sys/timeb.h>
|
||||
#include <sys/time.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// This function is defined but not implemented by newlib
|
||||
int ftime(struct timeb *tp) {
|
||||
@@ -15,4 +16,11 @@ int ftime(struct timeb *tp) {
|
||||
tp->dstflag = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// This function is required for libcurl to link but never
|
||||
// called using by any of the APIs we use
|
||||
unsigned alarm(unsigned seconds) {
|
||||
abort();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -80,8 +80,9 @@ int http_request(char* url, PHTTP_DATA data) {
|
||||
curl_easy_setopt(curl, CURLOPT_MAXCONNECTS, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5L);
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3L);
|
||||
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_ALPN, 0L);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, data);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
|
||||
|
||||
16
main.cpp
@@ -22,8 +22,6 @@
|
||||
|
||||
MoonlightInstance* g_Instance;
|
||||
|
||||
MoonlightInstance::~MoonlightInstance() {}
|
||||
|
||||
class MoonlightModule : public pp::Module {
|
||||
public:
|
||||
MoonlightModule() : pp::Module() {}
|
||||
@@ -85,18 +83,19 @@ void* MoonlightInstance::StopThreadFunc(void* context) {
|
||||
|
||||
// We also need to stop this thread after the connection thread, because it depends
|
||||
// on being initialized there.
|
||||
pthread_join(g_Instance->m_GamepadThread, NULL);
|
||||
pthread_join(g_Instance->m_InputThread, NULL);
|
||||
|
||||
// Stop the connection
|
||||
LiStopConnection();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void* MoonlightInstance::GamepadThreadFunc(void* context) {
|
||||
void* MoonlightInstance::InputThreadFunc(void* context) {
|
||||
MoonlightInstance* me = (MoonlightInstance*)context;
|
||||
|
||||
while (me->m_Running) {
|
||||
me->PollGamepads();
|
||||
me->ReportMouseMovement();
|
||||
|
||||
// Poll every 10 ms
|
||||
usleep(10 * 1000);
|
||||
@@ -123,6 +122,7 @@ void* MoonlightInstance::ConnectionThreadFunc(void* context) {
|
||||
&MoonlightInstance::s_ClCallbacks,
|
||||
&MoonlightInstance::s_DrCallbacks,
|
||||
&MoonlightInstance::s_ArCallbacks,
|
||||
NULL, 0,
|
||||
NULL, 0);
|
||||
if (err != 0) {
|
||||
// Notify the JS code that the stream has ended
|
||||
@@ -134,7 +134,7 @@ void* MoonlightInstance::ConnectionThreadFunc(void* context) {
|
||||
// Set running state before starting connection-specific threads
|
||||
me->m_Running = true;
|
||||
|
||||
pthread_create(&me->m_GamepadThread, NULL, MoonlightInstance::GamepadThreadFunc, me);
|
||||
pthread_create(&me->m_InputThread, NULL, MoonlightInstance::InputThreadFunc, me);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -256,13 +256,15 @@ void MoonlightInstance::HandleOpenURL(int32_t callbackId, pp::VarArray args) {
|
||||
std::string url = args.Get(0).AsString();
|
||||
bool binaryResponse = args.Get(1).AsBool();
|
||||
|
||||
openHttpThread.message_loop().PostWork(m_CallbackFactory.NewCallback(&MoonlightInstance::NvHTTPRequest, callbackId, url, binaryResponse));
|
||||
m_HttpThreadPool[m_HttpThreadPoolSequence++ % HTTP_HANDLER_THREADS]->message_loop().PostWork(
|
||||
m_CallbackFactory.NewCallback(&MoonlightInstance::NvHTTPRequest, callbackId, url, binaryResponse));
|
||||
|
||||
PostMessage(pp::Var (url.c_str()));
|
||||
}
|
||||
|
||||
void MoonlightInstance::HandlePair(int32_t callbackId, pp::VarArray args) {
|
||||
openHttpThread.message_loop().PostWork(m_CallbackFactory.NewCallback(&MoonlightInstance::PairCallback, callbackId, args));
|
||||
m_HttpThreadPool[m_HttpThreadPoolSequence++ % HTTP_HANDLER_THREADS]->message_loop().PostWork(
|
||||
m_CallbackFactory.NewCallback(&MoonlightInstance::PairCallback, callbackId, args));
|
||||
}
|
||||
|
||||
void MoonlightInstance::PairCallback(int32_t /*result*/, int32_t callbackId, pp::VarArray args) {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"manifest_version": 2,
|
||||
"name": "Moonlight Game Streaming",
|
||||
"short_name": "Moonlight",
|
||||
"version": "0.7.0",
|
||||
"version": "0.7.4",
|
||||
"description": "Open-source client for NVIDIA GameStream",
|
||||
"icons": {
|
||||
"128": "icons/icon128.png",
|
||||
@@ -26,6 +26,7 @@
|
||||
"pointerLock",
|
||||
"system.network",
|
||||
"fullscreen",
|
||||
"power",
|
||||
"overrideEscFullscreen", {
|
||||
"socket": [
|
||||
"tcp-connect",
|
||||
|
||||
@@ -38,6 +38,11 @@
|
||||
|
||||
#define DR_FLAG_FORCE_SW_DECODE 0x01
|
||||
|
||||
// These will mostly be I/O bound so we'll create
|
||||
// a bunch to allow more concurrent server requests
|
||||
// since our HTTP request libary is synchronous.
|
||||
#define HTTP_HANDLER_THREADS 8
|
||||
|
||||
struct Shader {
|
||||
Shader() : program(0), texcoord_scale_location(0) {}
|
||||
~Shader() {}
|
||||
@@ -59,7 +64,9 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
||||
m_MouseLocked(false),
|
||||
m_WaitingForAllModifiersUp(false),
|
||||
m_AccumulatedTicks(0),
|
||||
openHttpThread(this) {
|
||||
m_MouseDeltaX(0),
|
||||
m_MouseDeltaY(0),
|
||||
m_HttpThreadPoolSequence(0) {
|
||||
// This function MUST be used otherwise sockets don't work (nacl_io_init() doesn't work!)
|
||||
nacl_io_init_ppapi(pp_instance(), pp::Module::Get()->get_browser_interface());
|
||||
|
||||
@@ -69,10 +76,18 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
||||
|
||||
m_GamepadApi = static_cast<const PPB_Gamepad*>(pp::Module::Get()->GetBrowserInterface(PPB_GAMEPAD_INTERFACE));
|
||||
|
||||
openHttpThread.Start();
|
||||
for (int i = 0; i < HTTP_HANDLER_THREADS; i++) {
|
||||
m_HttpThreadPool[i] = new pp::SimpleThread(this);
|
||||
m_HttpThreadPool[i]->Start();
|
||||
}
|
||||
}
|
||||
|
||||
virtual ~MoonlightInstance();
|
||||
virtual ~MoonlightInstance() {
|
||||
for (int i = 0; i < HTTP_HANDLER_THREADS; i++) {
|
||||
m_HttpThreadPool[i]->Join();
|
||||
delete m_HttpThreadPool[i];
|
||||
}
|
||||
}
|
||||
|
||||
bool Init(uint32_t argc, const char* argn[], const char* argv[]);
|
||||
|
||||
@@ -85,6 +100,7 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
||||
void PairCallback(int32_t /*result*/, int32_t callbackId, pp::VarArray args);
|
||||
|
||||
bool HandleInputEvent(const pp::InputEvent& event);
|
||||
void ReportMouseMovement();
|
||||
|
||||
void PollGamepads();
|
||||
|
||||
@@ -105,7 +121,7 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
||||
static void ProfilerPrintWarning(const char* message);
|
||||
|
||||
static void* ConnectionThreadFunc(void* context);
|
||||
static void* GamepadThreadFunc(void* context);
|
||||
static void* InputThreadFunc(void* context);
|
||||
static void* StopThreadFunc(void* context);
|
||||
|
||||
static void ClStageStarting(int stage);
|
||||
@@ -114,6 +130,7 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
||||
static void ClConnectionTerminated(long errorCode);
|
||||
static void ClDisplayMessage(const char* message);
|
||||
static void ClDisplayTransientMessage(const char* message);
|
||||
static void ClLogMessage(const char* format, ...);
|
||||
|
||||
static Shader CreateProgram(const char* vertexShader, const char* fragmentShader);
|
||||
static void CreateShader(GLuint program, GLenum type, const char* source, int size);
|
||||
@@ -125,11 +142,11 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
||||
bool InitializeRenderingSurface(int width, int height);
|
||||
void DidChangeFocus(bool got_focus);
|
||||
|
||||
static void VidDecSetup(int videoFormat, int width, int height, int redrawRate, void* context, int drFlags);
|
||||
static int VidDecSetup(int videoFormat, int width, int height, int redrawRate, void* context, int drFlags);
|
||||
static void VidDecCleanup(void);
|
||||
static int VidDecSubmitDecodeUnit(PDECODE_UNIT decodeUnit);
|
||||
|
||||
static void AudDecInit(int audioConfiguration, POPUS_MULTISTREAM_CONFIGURATION opusConfig);
|
||||
static int AudDecInit(int audioConfiguration, POPUS_MULTISTREAM_CONFIGURATION opusConfig, void* context, int flags);
|
||||
static void AudDecCleanup(void);
|
||||
static void AudDecDecodeAndPlaySample(char* sampleData, int sampleLength);
|
||||
|
||||
@@ -150,7 +167,7 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
||||
bool m_Running;
|
||||
|
||||
pthread_t m_ConnectionThread;
|
||||
pthread_t m_GamepadThread;
|
||||
pthread_t m_InputThread;
|
||||
|
||||
pp::Graphics3D m_Graphics3D;
|
||||
pp::VideoDecoder* m_VideoDecoder;
|
||||
@@ -172,8 +189,10 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
||||
bool m_MouseLocked;
|
||||
bool m_WaitingForAllModifiersUp;
|
||||
float m_AccumulatedTicks;
|
||||
int32_t m_MouseDeltaX, m_MouseDeltaY;
|
||||
|
||||
pp::SimpleThread openHttpThread;
|
||||
pp::SimpleThread* m_HttpThreadPool[HTTP_HANDLER_THREADS];
|
||||
uint32_t m_HttpThreadPoolSequence;
|
||||
};
|
||||
|
||||
extern MoonlightInstance* g_Instance;
|
||||
|
||||