mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-22 05:27:20 +00:00
[client] sync the mouse position on startup with the host
This commit is contained in:
parent
09ce136346
commit
be792f33ce
@ -30,9 +30,9 @@ struct KVMGFXHeader
|
||||
uint32_t width; // the width
|
||||
uint32_t height; // the height
|
||||
uint32_t stride; // the row stride
|
||||
uint64_t frames; // total frame count
|
||||
uint64_t clientFrame; // current client frame
|
||||
uint32_t dataLen; // total lengh of the data after this header
|
||||
int32_t mouseX; // the initial mouse X position
|
||||
int32_t mouseY; // the initial mouse Y position
|
||||
uint64_t dataLen; // total lengh of the data after this header
|
||||
};
|
||||
|
||||
#pragma pack(push,1)
|
||||
|
@ -39,6 +39,7 @@ CopyJob;
|
||||
struct KVMGFXState
|
||||
{
|
||||
bool running;
|
||||
bool started;
|
||||
SDL_Window * window;
|
||||
SDL_Renderer * renderer;
|
||||
struct KVMGFXHeader * shm;
|
||||
@ -197,9 +198,6 @@ void drawFunc_XOR(CompFunc compFunc, SDL_Texture * texture, uint8_t * dst, const
|
||||
ivshmem_kick_irq(state.shm->guestID, 0);
|
||||
|
||||
SDL_UnlockTexture(texture);
|
||||
if (state.shm->frames == 1)
|
||||
SDL_RenderClear(state.renderer);
|
||||
|
||||
SDL_RenderCopy(state.renderer, texture, NULL, NULL);
|
||||
SDL_RenderPresent(state.renderer);
|
||||
|
||||
@ -238,7 +236,6 @@ int renderThread(void * unused)
|
||||
format.width = 0;
|
||||
format.height = 0;
|
||||
format.stride = 0;
|
||||
format.frames = 0;
|
||||
|
||||
while(state.running)
|
||||
{
|
||||
@ -321,13 +318,9 @@ int renderThread(void * unused)
|
||||
memcpy(&format, state.shm, sizeof(format));
|
||||
}
|
||||
|
||||
if (format.frames != state.shm->frames - 1)
|
||||
DEBUG_INFO("dropped %lu", state.shm->frames - format.frames);
|
||||
format.frames = state.shm->frames;
|
||||
|
||||
glDisable(GL_COLOR_LOGIC_OP);
|
||||
drawFunc(compFunc, texture, texPixels, pixels);
|
||||
state.shm->clientFrame = format.frames;
|
||||
state.started = true;
|
||||
}
|
||||
|
||||
SDL_DestroyTexture(texture);
|
||||
@ -381,29 +374,40 @@ static inline const uint32_t mapScancode(SDL_Scancode scancode)
|
||||
|
||||
int eventThread(void * arg)
|
||||
{
|
||||
bool serverMode = false;
|
||||
int mouseX = 0;
|
||||
int mouseY = 0;
|
||||
int repeatCount = 0;
|
||||
bool init = false;
|
||||
|
||||
// ensure mouse acceleration is identical in server mode
|
||||
SDL_SetHintWithPriority(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "1", SDL_HINT_OVERRIDE);
|
||||
|
||||
// default to server mode
|
||||
bool serverMode = true;
|
||||
spice_mouse_mode(true);
|
||||
SDL_SetRelativeMouseMode(true);
|
||||
|
||||
SDL_Event event;
|
||||
while(state.running)
|
||||
{
|
||||
SDL_Event event;
|
||||
while(SDL_PollEvent(&event))
|
||||
{
|
||||
if (event.type == SDL_QUIT)
|
||||
{
|
||||
state.running = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!state.started)
|
||||
continue;
|
||||
|
||||
if (!init)
|
||||
{
|
||||
mouseX = state.shm->mouseX;
|
||||
mouseY = state.shm->mouseY;
|
||||
spice_mouse_mode(false);
|
||||
SDL_WarpMouseInWindow(state.window, mouseX, mouseY);
|
||||
init = true;
|
||||
}
|
||||
|
||||
switch(event.type)
|
||||
{
|
||||
case SDL_QUIT:
|
||||
state.running = false;
|
||||
break;
|
||||
|
||||
case SDL_KEYDOWN:
|
||||
{
|
||||
SDL_Scancode sc = event.key.keysym.scancode;
|
||||
|
Loading…
Reference in New Issue
Block a user