mirror of
https://github.com/moonlight-stream/moonlight-chrome.git
synced 2025-08-17 16:46:31 +00:00
Add direct touchscreen mouse support
This commit is contained in:
parent
d9a09fe450
commit
37cdf16834
36
input.cpp
36
input.cpp
@ -8,6 +8,9 @@
|
|||||||
|
|
||||||
#define KEY_PREFIX 0x80
|
#define KEY_PREFIX 0x80
|
||||||
|
|
||||||
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
static int ConvertPPButtonToLiButton(PP_InputEvent_MouseButton ppButton) {
|
static int ConvertPPButtonToLiButton(PP_InputEvent_MouseButton ppButton) {
|
||||||
switch (ppButton) {
|
switch (ppButton) {
|
||||||
case PP_INPUTEVENT_MOUSEBUTTON_LEFT:
|
case PP_INPUTEVENT_MOUSEBUTTON_LEFT:
|
||||||
@ -231,6 +234,39 @@ bool MoonlightInstance::HandleInputEvent(const pp::InputEvent& event) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case PP_INPUTEVENT_TYPE_TOUCHMOVE:
|
||||||
|
case PP_INPUTEVENT_TYPE_TOUCHSTART: {
|
||||||
|
pp::TouchInputEvent touchEvent(event);
|
||||||
|
|
||||||
|
pp::FloatPoint touchPoint = touchEvent.GetTouchByIndex(PP_TOUCHLIST_TYPE_TARGETTOUCHES, 0).position();
|
||||||
|
|
||||||
|
// Scale the touch coordinates to the video rect
|
||||||
|
//
|
||||||
|
// For some reason, the x coordinate is already relative to the plugin rect,
|
||||||
|
// while the y coordinate is not. No clue why that is the case but oh well...
|
||||||
|
short x = MIN(MAX(touchPoint.x(), 0), m_PluginRect.width());
|
||||||
|
short y = MIN(MAX(touchPoint.y() - m_PluginRect.y(), 0), m_PluginRect.height());
|
||||||
|
|
||||||
|
// Update the mouse position prior to sending the button down
|
||||||
|
LiSendMousePositionEvent(x, y, m_PluginRect.width(), m_PluginRect.height());
|
||||||
|
|
||||||
|
if (event.GetType() == PP_INPUTEVENT_TYPE_TOUCHSTART &&
|
||||||
|
touchEvent.GetTouchCount(PP_TOUCHLIST_TYPE_TARGETTOUCHES) == 1) {
|
||||||
|
LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_LEFT);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case PP_INPUTEVENT_TYPE_TOUCHCANCEL:
|
||||||
|
case PP_INPUTEVENT_TYPE_TOUCHEND: {
|
||||||
|
pp::TouchInputEvent touchEvent(event);
|
||||||
|
|
||||||
|
if (touchEvent.GetTouchCount(PP_TOUCHLIST_TYPE_TARGETTOUCHES) == 1) {
|
||||||
|
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_LEFT);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
7
main.cpp
7
main.cpp
@ -40,7 +40,7 @@ void MoonlightInstance::OnConnectionStarted(uint32_t unused) {
|
|||||||
PostMessage(response);
|
PostMessage(response);
|
||||||
|
|
||||||
// Start receiving input events
|
// Start receiving input events
|
||||||
RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL);
|
RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL | PP_INPUTEVENT_CLASS_TOUCH);
|
||||||
|
|
||||||
// Filtering is suboptimal but it ensures that we can pass keyboard events
|
// Filtering is suboptimal but it ensures that we can pass keyboard events
|
||||||
// to the browser when mouse lock is disabled. This is neccessary for Esc
|
// to the browser when mouse lock is disabled. This is neccessary for Esc
|
||||||
@ -53,7 +53,10 @@ void MoonlightInstance::OnConnectionStopped(uint32_t error) {
|
|||||||
m_Running = false;
|
m_Running = false;
|
||||||
|
|
||||||
// Stop receiving input events
|
// Stop receiving input events
|
||||||
ClearInputEventRequest(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL | PP_INPUTEVENT_CLASS_KEYBOARD);
|
ClearInputEventRequest(PP_INPUTEVENT_CLASS_MOUSE |
|
||||||
|
PP_INPUTEVENT_CLASS_WHEEL |
|
||||||
|
PP_INPUTEVENT_CLASS_KEYBOARD |
|
||||||
|
PP_INPUTEVENT_CLASS_TOUCH);
|
||||||
|
|
||||||
// Unlock the mouse
|
// Unlock the mouse
|
||||||
UnlockMouse();
|
UnlockMouse();
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit f489c9d725d22517d3b3a017f6bbb0a22ed43707
|
Subproject commit 247b1fe0e32d80ce02ede4c2b4a835b9c085abe4
|
@ -143,6 +143,7 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
|||||||
void PaintPicture(void);
|
void PaintPicture(void);
|
||||||
bool InitializeRenderingSurface(int width, int height);
|
bool InitializeRenderingSurface(int width, int height);
|
||||||
void DidChangeFocus(bool got_focus);
|
void DidChangeFocus(bool got_focus);
|
||||||
|
void DidChangeView(const pp::View& view);
|
||||||
|
|
||||||
static int 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 void VidDecCleanup(void);
|
||||||
@ -185,6 +186,8 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock {
|
|||||||
bool m_IsPainting;
|
bool m_IsPainting;
|
||||||
bool m_RequestIdrFrame;
|
bool m_RequestIdrFrame;
|
||||||
|
|
||||||
|
pp::Rect m_PluginRect;
|
||||||
|
|
||||||
OpusMSDecoder* m_OpusDecoder;
|
OpusMSDecoder* m_OpusDecoder;
|
||||||
pp::Audio m_AudioPlayer;
|
pp::Audio m_AudioPlayer;
|
||||||
|
|
||||||
|
@ -66,6 +66,10 @@ void MoonlightInstance::DidChangeFocus(bool got_focus) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MoonlightInstance::DidChangeView(const pp::View& view) {
|
||||||
|
m_PluginRect = view.GetRect();
|
||||||
|
}
|
||||||
|
|
||||||
bool MoonlightInstance::InitializeRenderingSurface(int width, int height) {
|
bool MoonlightInstance::InitializeRenderingSurface(int width, int height) {
|
||||||
if (!glInitializePPAPI(pp::Module::Get()->get_browser_interface())) {
|
if (!glInitializePPAPI(pp::Module::Get()->get_browser_interface())) {
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user