Commit aad96f85 authored by Michel Dänzer's avatar Michel Dänzer Committed by Michel Dänzer

xfree86/modes: Fix HW cursor clipping for driverIsPerformingTransform (v2)

Even if the driver is handling the transform, we still need to transform
the cursor position for clipping, otherwise we may hide the HW cursor
when the cursor is actually inside the area covered by the CRTC.

v2: Use crtc_x/y local variables for clarity
Reviewed-by: Adam Jackson's avatarAdam Jackson <ajax@redhat.com>
parent 828887b6
...@@ -394,24 +394,25 @@ xf86_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y) ...@@ -394,24 +394,25 @@ xf86_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
DisplayModePtr mode = &crtc->mode; DisplayModePtr mode = &crtc->mode;
int crtc_x = x, crtc_y = y;
Bool in_range; Bool in_range;
/* /*
* Transform position of cursor on screen * Transform position of cursor on screen
*/ */
if (crtc->transform_in_use && !crtc->driverIsPerformingTransform) if (crtc->transform_in_use)
xf86CrtcTransformCursorPos(crtc, &x, &y); xf86CrtcTransformCursorPos(crtc, &crtc_x, &crtc_y);
else { else {
x -= crtc->x; crtc_x -= crtc->x;
y -= crtc->y; crtc_y -= crtc->y;
} }
/* /*
* Disable the cursor when it is outside the viewport * Disable the cursor when it is outside the viewport
*/ */
in_range = TRUE; in_range = TRUE;
if (x >= mode->HDisplay || y >= mode->VDisplay || if (crtc_x >= mode->HDisplay || crtc_y >= mode->VDisplay ||
x <= -cursor_info->MaxWidth || y <= -cursor_info->MaxHeight) { crtc_x <= -cursor_info->MaxWidth || crtc_y <= -cursor_info->MaxHeight) {
in_range = FALSE; in_range = FALSE;
x = 0; x = 0;
y = 0; y = 0;
...@@ -420,7 +421,10 @@ xf86_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y) ...@@ -420,7 +421,10 @@ xf86_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
crtc->cursor_in_range = in_range; crtc->cursor_in_range = in_range;
if (in_range) { if (in_range) {
crtc->funcs->set_cursor_position(crtc, x, y); if (crtc->driverIsPerformingTransform)
crtc->funcs->set_cursor_position(crtc, x, y);
else
crtc->funcs->set_cursor_position(crtc, crtc_x, crtc_y);
xf86_crtc_show_cursor(crtc); xf86_crtc_show_cursor(crtc);
} }
else else
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment