mirror of
https://github.com/FreeRDP/FreeRDP.git
synced 2025-06-03 00:00:20 +00:00
shadow: add X11 cursor monitoring
This commit is contained in:
parent
e1e8da9490
commit
f90f859f49
@ -178,6 +178,76 @@ void x11_shadow_input_extended_mouse_event(x11ShadowSubsystem* subsystem, UINT16
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int x11_shadow_query_cursor(x11ShadowSubsystem* subsystem, BOOL getImage)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (getImage)
|
||||||
|
{
|
||||||
|
#ifdef WITH_XFIXES
|
||||||
|
XFixesCursorImage* ci;
|
||||||
|
|
||||||
|
ci = XFixesGetCursorImage(subsystem->display);
|
||||||
|
|
||||||
|
x = ci->x;
|
||||||
|
y = ci->y;
|
||||||
|
|
||||||
|
if (ci->width > subsystem->cursorMaxWidth)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (ci->height > subsystem->cursorMaxHeight)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
subsystem->cursorWidth = ci->width;
|
||||||
|
subsystem->cursorHeight = ci->height;
|
||||||
|
|
||||||
|
subsystem->cursorId = ci->cursor_serial;
|
||||||
|
|
||||||
|
CopyMemory(subsystem->cursorPixels, ci->pixels, ci->width * ci->height * 4);
|
||||||
|
|
||||||
|
XFree(ci);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UINT32 mask;
|
||||||
|
int win_x, win_y;
|
||||||
|
int root_x, root_y;
|
||||||
|
Window root, child;
|
||||||
|
|
||||||
|
if (!XQueryPointer(subsystem->display, subsystem->root_window,
|
||||||
|
&root, &child, &root_x, &root_y, &win_x, &win_y, &mask))
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
x = root_x;
|
||||||
|
y = root_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
subsystem->cursorX = x;
|
||||||
|
subsystem->cursorY = y;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int x11_shadow_handle_xevent(x11ShadowSubsystem* subsystem, XEvent* xevent)
|
||||||
|
{
|
||||||
|
if (xevent->type == MotionNotify)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_XFIXES
|
||||||
|
if (xevent->type == subsystem->xfixes_cursor_notify_event)
|
||||||
|
{
|
||||||
|
x11_shadow_query_cursor(subsystem, TRUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void x11_shadow_validate_region(x11ShadowSubsystem* subsystem, int x, int y, int width, int height)
|
void x11_shadow_validate_region(x11ShadowSubsystem* subsystem, int x, int y, int width, int height)
|
||||||
{
|
{
|
||||||
XRectangle region;
|
XRectangle region;
|
||||||
@ -329,6 +399,7 @@ int x11_shadow_screen_grab(x11ShadowSubsystem* subsystem)
|
|||||||
void* x11_shadow_subsystem_thread(x11ShadowSubsystem* subsystem)
|
void* x11_shadow_subsystem_thread(x11ShadowSubsystem* subsystem)
|
||||||
{
|
{
|
||||||
int fps;
|
int fps;
|
||||||
|
XEvent xevent;
|
||||||
DWORD status;
|
DWORD status;
|
||||||
DWORD nCount;
|
DWORD nCount;
|
||||||
UINT64 cTime;
|
UINT64 cTime;
|
||||||
@ -360,8 +431,15 @@ void* x11_shadow_subsystem_thread(x11ShadowSubsystem* subsystem)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (WaitForSingleObject(subsystem->event, 0) == WAIT_OBJECT_0)
|
||||||
|
{
|
||||||
|
XNextEvent(subsystem->display, &xevent);
|
||||||
|
x11_shadow_handle_xevent(subsystem, &xevent);
|
||||||
|
}
|
||||||
|
|
||||||
if ((status == WAIT_TIMEOUT) || (GetTickCount64() > frameTime))
|
if ((status == WAIT_TIMEOUT) || (GetTickCount64() > frameTime))
|
||||||
{
|
{
|
||||||
|
x11_shadow_query_cursor(subsystem, FALSE);
|
||||||
x11_shadow_screen_grab(subsystem);
|
x11_shadow_screen_grab(subsystem);
|
||||||
|
|
||||||
dwInterval = 1000 / fps;
|
dwInterval = 1000 / fps;
|
||||||
@ -386,7 +464,7 @@ int x11_shadow_xfixes_init(x11ShadowSubsystem* subsystem)
|
|||||||
if (!XFixesQueryVersion(subsystem->display, &major, &minor))
|
if (!XFixesQueryVersion(subsystem->display, &major, &minor))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
subsystem->xfixes_notify_event = xfixes_event + XFixesCursorNotify;
|
subsystem->xfixes_cursor_notify_event = xfixes_event + XFixesCursorNotify;
|
||||||
|
|
||||||
XFixesSelectCursorInput(subsystem->display, DefaultRootWindow(subsystem->display), XFixesDisplayCursorNotifyMask);
|
XFixesSelectCursorInput(subsystem->display, DefaultRootWindow(subsystem->display), XFixesDisplayCursorNotifyMask);
|
||||||
|
|
||||||
@ -609,9 +687,6 @@ int x11_shadow_subsystem_init(x11ShadowSubsystem* subsystem)
|
|||||||
if (subsystem->composite)
|
if (subsystem->composite)
|
||||||
subsystem->use_xdamage = FALSE;
|
subsystem->use_xdamage = FALSE;
|
||||||
|
|
||||||
if (!subsystem->use_xdamage)
|
|
||||||
subsystem->use_xfixes = FALSE;
|
|
||||||
|
|
||||||
subsystem->xfds = ConnectionNumber(subsystem->display);
|
subsystem->xfds = ConnectionNumber(subsystem->display);
|
||||||
subsystem->number = DefaultScreen(subsystem->display);
|
subsystem->number = DefaultScreen(subsystem->display);
|
||||||
subsystem->screen = ScreenOfDisplay(subsystem->display, subsystem->number);
|
subsystem->screen = ScreenOfDisplay(subsystem->display, subsystem->number);
|
||||||
@ -667,6 +742,15 @@ int x11_shadow_subsystem_init(x11ShadowSubsystem* subsystem)
|
|||||||
|
|
||||||
XSelectInput(subsystem->display, subsystem->root_window, SubstructureNotifyMask);
|
XSelectInput(subsystem->display, subsystem->root_window, SubstructureNotifyMask);
|
||||||
|
|
||||||
|
subsystem->cursorMaxWidth = 96;
|
||||||
|
subsystem->cursorMaxHeight = 96;
|
||||||
|
subsystem->cursorPixels = _aligned_malloc(subsystem->cursorMaxWidth * subsystem->cursorMaxHeight * 4, 16);
|
||||||
|
|
||||||
|
if (!subsystem->cursorPixels)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
x11_shadow_query_cursor(subsystem, TRUE);
|
||||||
|
|
||||||
if (subsystem->use_xfixes)
|
if (subsystem->use_xfixes)
|
||||||
{
|
{
|
||||||
if (x11_shadow_xfixes_init(subsystem) < 0)
|
if (x11_shadow_xfixes_init(subsystem) < 0)
|
||||||
@ -734,6 +818,12 @@ int x11_shadow_subsystem_uninit(x11ShadowSubsystem* subsystem)
|
|||||||
subsystem->event = NULL;
|
subsystem->event = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (subsystem->cursorPixels)
|
||||||
|
{
|
||||||
|
_aligned_free(subsystem->cursorPixels);
|
||||||
|
subsystem->cursorPixels = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,6 +80,15 @@ struct x11_shadow_subsystem
|
|||||||
Window root_window;
|
Window root_window;
|
||||||
XShmSegmentInfo fb_shm_info;
|
XShmSegmentInfo fb_shm_info;
|
||||||
|
|
||||||
|
int cursorX;
|
||||||
|
int cursorY;
|
||||||
|
int cursorWidth;
|
||||||
|
int cursorHeight;
|
||||||
|
UINT32 cursorId;
|
||||||
|
BYTE* cursorPixels;
|
||||||
|
int cursorMaxWidth;
|
||||||
|
int cursorMaxHeight;
|
||||||
|
|
||||||
#ifdef WITH_XDAMAGE
|
#ifdef WITH_XDAMAGE
|
||||||
GC xshm_gc;
|
GC xshm_gc;
|
||||||
Damage xdamage;
|
Damage xdamage;
|
||||||
@ -88,7 +97,7 @@ struct x11_shadow_subsystem
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WITH_XFIXES
|
#ifdef WITH_XFIXES
|
||||||
int xfixes_notify_event;
|
int xfixes_cursor_notify_event;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user