mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-26 20:25:34 +08:00
Fix mouse control
This commit is contained in:
@@ -175,8 +175,8 @@ inline int ProcessMouseKeyEven(SDL_Event &ev) {
|
|||||||
|
|
||||||
SendData(peer, DATA_TYPE::DATA, (const char *)&remote_action,
|
SendData(peer, DATA_TYPE::DATA, (const char *)&remote_action,
|
||||||
sizeof(remote_action));
|
sizeof(remote_action));
|
||||||
// std::cout << remote_action.type << " " << remote_action.type << " "
|
std::cout << remote_action.type << " " << remote_action.m.flag << " "
|
||||||
// << remote_action.px << " " << remote_action.py << std::endl;
|
<< remote_action.m.x << " " << remote_action.m.y << std::endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,6 +105,9 @@ inline int ProcessMouseKeyEven(SDL_Event &ev) {
|
|||||||
remote_action.m.x = ev.button.x * ratio;
|
remote_action.m.x = ev.button.x * ratio;
|
||||||
remote_action.m.y = ev.button.y * ratio;
|
remote_action.m.y = ev.button.y * ratio;
|
||||||
|
|
||||||
|
SendData(peer, DATA_TYPE::DATA, (const char *)&remote_action,
|
||||||
|
sizeof(remote_action));
|
||||||
|
|
||||||
} else if (SDL_BUTTON_RIGHT == ev.button.button) {
|
} else if (SDL_BUTTON_RIGHT == ev.button.button) {
|
||||||
int px = ev.button.x;
|
int px = ev.button.x;
|
||||||
int py = ev.button.y;
|
int py = ev.button.y;
|
||||||
@@ -114,6 +117,9 @@ inline int ProcessMouseKeyEven(SDL_Event &ev) {
|
|||||||
remote_action.m.flag = MouseFlag::right_down;
|
remote_action.m.flag = MouseFlag::right_down;
|
||||||
remote_action.m.x = ev.button.x * ratio;
|
remote_action.m.x = ev.button.x * ratio;
|
||||||
remote_action.m.y = ev.button.y * ratio;
|
remote_action.m.y = ev.button.y * ratio;
|
||||||
|
|
||||||
|
SendData(peer, DATA_TYPE::DATA, (const char *)&remote_action,
|
||||||
|
sizeof(remote_action));
|
||||||
}
|
}
|
||||||
} else if (SDL_MOUSEBUTTONUP == ev.type) {
|
} else if (SDL_MOUSEBUTTONUP == ev.type) {
|
||||||
if (SDL_BUTTON_LEFT == ev.button.button) {
|
if (SDL_BUTTON_LEFT == ev.button.button) {
|
||||||
@@ -126,6 +132,9 @@ inline int ProcessMouseKeyEven(SDL_Event &ev) {
|
|||||||
remote_action.m.x = ev.button.x * ratio;
|
remote_action.m.x = ev.button.x * ratio;
|
||||||
remote_action.m.y = ev.button.y * ratio;
|
remote_action.m.y = ev.button.y * ratio;
|
||||||
|
|
||||||
|
SendData(peer, DATA_TYPE::DATA, (const char *)&remote_action,
|
||||||
|
sizeof(remote_action));
|
||||||
|
|
||||||
} else if (SDL_BUTTON_RIGHT == ev.button.button) {
|
} else if (SDL_BUTTON_RIGHT == ev.button.button) {
|
||||||
int px = ev.button.x;
|
int px = ev.button.x;
|
||||||
int py = ev.button.y;
|
int py = ev.button.y;
|
||||||
@@ -135,6 +144,9 @@ inline int ProcessMouseKeyEven(SDL_Event &ev) {
|
|||||||
remote_action.m.flag = MouseFlag::right_up;
|
remote_action.m.flag = MouseFlag::right_up;
|
||||||
remote_action.m.x = ev.button.x * ratio;
|
remote_action.m.x = ev.button.x * ratio;
|
||||||
remote_action.m.y = ev.button.y * ratio;
|
remote_action.m.y = ev.button.y * ratio;
|
||||||
|
|
||||||
|
SendData(peer, DATA_TYPE::DATA, (const char *)&remote_action,
|
||||||
|
sizeof(remote_action));
|
||||||
}
|
}
|
||||||
} else if (SDL_MOUSEMOTION == ev.type) {
|
} else if (SDL_MOUSEMOTION == ev.type) {
|
||||||
int px = ev.motion.x;
|
int px = ev.motion.x;
|
||||||
@@ -146,6 +158,9 @@ inline int ProcessMouseKeyEven(SDL_Event &ev) {
|
|||||||
remote_action.m.flag = MouseFlag::move;
|
remote_action.m.flag = MouseFlag::move;
|
||||||
remote_action.m.x = ev.button.x * ratio;
|
remote_action.m.x = ev.button.x * ratio;
|
||||||
remote_action.m.y = ev.button.y * ratio;
|
remote_action.m.y = ev.button.y * ratio;
|
||||||
|
|
||||||
|
SendData(peer, DATA_TYPE::DATA, (const char *)&remote_action,
|
||||||
|
sizeof(remote_action));
|
||||||
} else if (SDL_QUIT == ev.type) {
|
} else if (SDL_QUIT == ev.type) {
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
event.type = SDL_QUIT;
|
event.type = SDL_QUIT;
|
||||||
@@ -154,11 +169,6 @@ inline int ProcessMouseKeyEven(SDL_Event &ev) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SendData(peer, DATA_TYPE::DATA, (const char *)&remote_action,
|
|
||||||
sizeof(remote_action));
|
|
||||||
// std::cout << remote_action.type << " " << remote_action.type << " "
|
|
||||||
// << remote_action.px << " " << remote_action.py << std::endl;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,29 +354,6 @@ int main() {
|
|||||||
// Main loop
|
// Main loop
|
||||||
bool done = false;
|
bool done = false;
|
||||||
while (!done) {
|
while (!done) {
|
||||||
// Poll and handle events (inputs, window resize, etc.)
|
|
||||||
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to
|
|
||||||
// tell if dear imgui wants to use your inputs.
|
|
||||||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to
|
|
||||||
// your main application, or clear/overwrite your copy of the mouse data.
|
|
||||||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input
|
|
||||||
// data to your main application, or clear/overwrite your copy of the
|
|
||||||
// keyboard data. Generally you may always pass all inputs to dear imgui,
|
|
||||||
// and hide them from your application based on those two flags.
|
|
||||||
SDL_Event event;
|
|
||||||
while (SDL_PollEvent(&event)) {
|
|
||||||
ImGui_ImplSDL2_ProcessEvent(&event);
|
|
||||||
if (event.type == SDL_QUIT) {
|
|
||||||
done = true;
|
|
||||||
} else if (event.type == SDL_WINDOWEVENT &&
|
|
||||||
event.window.event == SDL_WINDOWEVENT_CLOSE &&
|
|
||||||
event.window.windowID == SDL_GetWindowID(window)) {
|
|
||||||
done = true;
|
|
||||||
} else {
|
|
||||||
ProcessMouseKeyEven(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the Dear ImGui frame
|
// Start the Dear ImGui frame
|
||||||
ImGui_ImplSDLRenderer2_NewFrame();
|
ImGui_ImplSDLRenderer2_NewFrame();
|
||||||
ImGui_ImplSDL2_NewFrame();
|
ImGui_ImplSDL2_NewFrame();
|
||||||
@@ -416,20 +403,53 @@ int main() {
|
|||||||
SDL_RenderSetScale(sdlRenderer, io.DisplayFramebufferScale.x,
|
SDL_RenderSetScale(sdlRenderer, io.DisplayFramebufferScale.x,
|
||||||
io.DisplayFramebufferScale.y);
|
io.DisplayFramebufferScale.y);
|
||||||
|
|
||||||
sdlRect.x = 0;
|
SDL_Event event;
|
||||||
sdlRect.y = 0;
|
while (SDL_PollEvent(&event)) {
|
||||||
sdlRect.w = screen_w;
|
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||||
sdlRect.h = screen_h;
|
if (event.type == SDL_QUIT) {
|
||||||
|
done = true;
|
||||||
|
} else if (event.type == SDL_WINDOWEVENT &&
|
||||||
|
event.window.event == SDL_WINDOWEVENT_RESIZED) {
|
||||||
|
int new_screen_w = 0;
|
||||||
|
int new_screen_h = 0;
|
||||||
|
SDL_GetWindowSize(window, &new_screen_w, &new_screen_h);
|
||||||
|
|
||||||
|
if (new_screen_w != screen_w) {
|
||||||
|
screen_w = new_screen_w;
|
||||||
|
screen_h = new_screen_w * 9 / 16;
|
||||||
|
} else if (new_screen_h != screen_h) {
|
||||||
|
screen_w = new_screen_h * 16 / 9;
|
||||||
|
screen_h = new_screen_h;
|
||||||
|
}
|
||||||
|
SDL_SetWindowSize(window, screen_w, screen_h);
|
||||||
|
printf("Resize windows: %dx%d\n", screen_w, screen_h);
|
||||||
|
} else if (event.type == SDL_WINDOWEVENT &&
|
||||||
|
event.window.event == SDL_WINDOWEVENT_CLOSE &&
|
||||||
|
event.window.windowID == SDL_GetWindowID(window)) {
|
||||||
|
done = true;
|
||||||
|
} else if (event.type == REFRESH_EVENT) {
|
||||||
|
sdlRect.x = 0;
|
||||||
|
sdlRect.y = 0;
|
||||||
|
sdlRect.w = screen_w;
|
||||||
|
sdlRect.h = screen_h;
|
||||||
|
|
||||||
|
SDL_UpdateTexture(sdlTexture, NULL, dst_buffer, pixel_w);
|
||||||
|
SDL_RenderClear(sdlRenderer);
|
||||||
|
SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect);
|
||||||
|
} else {
|
||||||
|
if (joined) {
|
||||||
|
ProcessMouseKeyEven(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SDL_UpdateTexture(sdlTexture, NULL, dst_buffer, pixel_w);
|
|
||||||
SDL_RenderClear(sdlRenderer);
|
|
||||||
if (!joined || !received_frame) {
|
if (!joined || !received_frame) {
|
||||||
|
SDL_RenderClear(sdlRenderer);
|
||||||
SDL_SetRenderDrawColor(
|
SDL_SetRenderDrawColor(
|
||||||
sdlRenderer, (Uint8)(clear_color.x * 0), (Uint8)(clear_color.y * 0),
|
sdlRenderer, (Uint8)(clear_color.x * 0), (Uint8)(clear_color.y * 0),
|
||||||
(Uint8)(clear_color.z * 0), (Uint8)(clear_color.w * 0));
|
(Uint8)(clear_color.z * 0), (Uint8)(clear_color.w * 0));
|
||||||
} else {
|
|
||||||
SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData());
|
ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData());
|
||||||
SDL_RenderPresent(sdlRenderer);
|
SDL_RenderPresent(sdlRenderer);
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,10 @@ void RemoteDeskServer::ReceiveDataBuffer(const char *data, size_t size,
|
|||||||
RemoteAction remote_action;
|
RemoteAction remote_action;
|
||||||
memcpy(&remote_action, data, sizeof(remote_action));
|
memcpy(&remote_action, data, sizeof(remote_action));
|
||||||
|
|
||||||
|
std::cout << "remote_action: " << remote_action.type << " "
|
||||||
|
<< remote_action.m.flag << " " << remote_action.m.x << " "
|
||||||
|
<< remote_action.m.y << std::endl;
|
||||||
|
|
||||||
INPUT ip;
|
INPUT ip;
|
||||||
|
|
||||||
if (remote_action.type == ControlType::mouse) {
|
if (remote_action.type == ControlType::mouse) {
|
||||||
@@ -114,6 +118,8 @@ void RemoteDeskServer::ReceiveDataBuffer(const char *data, size_t size,
|
|||||||
ip.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_ABSOLUTE;
|
ip.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_ABSOLUTE;
|
||||||
} else if (remote_action.m.flag == MouseFlag::right_up) {
|
} else if (remote_action.m.flag == MouseFlag::right_up) {
|
||||||
ip.mi.dwFlags = MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_ABSOLUTE;
|
ip.mi.dwFlags = MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_ABSOLUTE;
|
||||||
|
} else {
|
||||||
|
ip.mi.dwFlags = MOUSEEVENTF_MOVE;
|
||||||
}
|
}
|
||||||
ip.mi.mouseData = 0;
|
ip.mi.mouseData = 0;
|
||||||
ip.mi.time = 0;
|
ip.mi.time = 0;
|
||||||
@@ -121,7 +127,9 @@ void RemoteDeskServer::ReceiveDataBuffer(const char *data, size_t size,
|
|||||||
// Set cursor pos
|
// Set cursor pos
|
||||||
SetCursorPos(ip.mi.dx, ip.mi.dy);
|
SetCursorPos(ip.mi.dx, ip.mi.dy);
|
||||||
// Send the press
|
// Send the press
|
||||||
SendInput(1, &ip, sizeof(INPUT));
|
if (ip.mi.dwFlags != MOUSEEVENTF_MOVE) {
|
||||||
|
SendInput(1, &ip, sizeof(INPUT));
|
||||||
|
}
|
||||||
|
|
||||||
std::cout << "Receive data from [" << user << "], " << ip.type << " "
|
std::cout << "Receive data from [" << user << "], " << ip.type << " "
|
||||||
<< ip.mi.dwFlags << " " << ip.mi.dx << " " << ip.mi.dy
|
<< ip.mi.dwFlags << " " << ip.mi.dx << " " << ip.mi.dy
|
||||||
|
|||||||
Reference in New Issue
Block a user