mirror of https://github.com/encounter/SDL.git
[KMSDRM] Improve cursor management.
This commit is contained in:
parent
3f40396d33
commit
100166d7d7
|
@ -341,24 +341,6 @@ cleanup:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* When we create a window, we have to test if we have to show the cursor,
|
|
||||||
and explicily do so if necessary.
|
|
||||||
This is because when we destroy a window, we take the cursor away from the
|
|
||||||
cursor plane, and destroy the cusror GBM BO. So we have to re-show it,
|
|
||||||
so to say. */
|
|
||||||
void
|
|
||||||
KMSDRM_InitCursor()
|
|
||||||
{
|
|
||||||
SDL_Mouse *mouse = SDL_GetMouse();
|
|
||||||
|
|
||||||
if (!mouse || !mouse->cur_cursor || !mouse->cursor_shown) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Re-dump cursor buffer to the GBM BO of the focused window display. */
|
|
||||||
KMSDRM_ShowCursor(mouse->cur_cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Show the specified cursor, or hide if cursor is NULL or has no focus. */
|
/* Show the specified cursor, or hide if cursor is NULL or has no focus. */
|
||||||
static int
|
static int
|
||||||
KMSDRM_ShowCursor(SDL_Cursor * cursor)
|
KMSDRM_ShowCursor(SDL_Cursor * cursor)
|
||||||
|
@ -477,8 +459,12 @@ KMSDRM_InitMouse(_THIS, SDL_VideoDisplay *display)
|
||||||
mouse->WarpMouse = KMSDRM_WarpMouse;
|
mouse->WarpMouse = KMSDRM_WarpMouse;
|
||||||
mouse->WarpMouseGlobal = KMSDRM_WarpMouseGlobal;
|
mouse->WarpMouseGlobal = KMSDRM_WarpMouseGlobal;
|
||||||
|
|
||||||
SDL_SetDefaultCursor(KMSDRM_CreateDefaultCursor());
|
/* Only create the default cursor for this display if we haven't done so before,
|
||||||
dispdata->set_default_cursor_pending = SDL_FALSE;
|
we don't want several cursors to be created for the same display. */
|
||||||
|
if (!dispdata->default_cursor_init) {
|
||||||
|
SDL_SetDefaultCursor(KMSDRM_CreateDefaultCursor());
|
||||||
|
dispdata->default_cursor_init = SDL_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -540,7 +540,7 @@ void KMSDRM_AddDisplay (_THIS, drmModeConnector *connector, drmModeRes *resource
|
||||||
if the display used by the window already has a default cursor or not.
|
if the display used by the window already has a default cursor or not.
|
||||||
If we don't, new default cursors would stack up on mouse->cursors and SDL
|
If we don't, new default cursors would stack up on mouse->cursors and SDL
|
||||||
would have to hide and delete them at quit, not to mention the memory leak... */
|
would have to hide and delete them at quit, not to mention the memory leak... */
|
||||||
dispdata->set_default_cursor_pending = SDL_TRUE;
|
dispdata->default_cursor_init = SDL_FALSE;
|
||||||
|
|
||||||
/* Try to find the connector's current encoder */
|
/* Try to find the connector's current encoder */
|
||||||
for (i = 0; i < resources->count_encoders; i++) {
|
for (i = 0; i < resources->count_encoders; i++) {
|
||||||
|
@ -1081,7 +1081,7 @@ KMSDRM_DestroyWindow(_THIS, SDL_Window *window)
|
||||||
|
|
||||||
if ( !is_vulkan && viddata->gbm_init) {
|
if ( !is_vulkan && viddata->gbm_init) {
|
||||||
|
|
||||||
/* Destroy the window display's cursor GBM BO. */
|
/* Destroy cursor GBM BO of the display of this window. */
|
||||||
KMSDRM_DestroyCursorBO(_this, SDL_GetDisplayForWindow(window));
|
KMSDRM_DestroyCursorBO(_this, SDL_GetDisplayForWindow(window));
|
||||||
|
|
||||||
/* Destroy GBM surface and buffers. */
|
/* Destroy GBM surface and buffers. */
|
||||||
|
@ -1207,27 +1207,13 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Init the cursor stuff for the window display, but ONLY if we haven't done so
|
/* Create the cursor BO for the display of this window,
|
||||||
on this display before. */
|
now that we know this is not a VK window. */
|
||||||
if (!dispdata->set_default_cursor_pending) {
|
KMSDRM_CreateCursorBO(display);
|
||||||
|
|
||||||
/* Create the cursor BO for the display of this window,
|
/* Create and set the default cursor for the display
|
||||||
now that we know this is not a VK window. */
|
of this window, now that we know this is not a VK window. */
|
||||||
KMSDRM_CreateCursorBO(display);
|
KMSDRM_InitMouse(_this, display);
|
||||||
|
|
||||||
/* Create and set the default cursor now that we know
|
|
||||||
this is not a VK window. */
|
|
||||||
KMSDRM_InitMouse(_this, display);
|
|
||||||
|
|
||||||
/* When we destroy a window, we remove the cursor buffer from
|
|
||||||
the cursor plane and destroy the cursor GBM BO, but SDL expects
|
|
||||||
that we keep showing the visible cursors bewteen window
|
|
||||||
destruction/creation cycles. So we must manually re-show the
|
|
||||||
visible cursors, if necessary, when we create a window. */
|
|
||||||
KMSDRM_InitCursor();
|
|
||||||
|
|
||||||
dispdata->set_default_cursor_pending = SDL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The FULLSCREEN flags are cut out from window->flags at this point,
|
/* The FULLSCREEN flags are cut out from window->flags at this point,
|
||||||
so we can't know if a window is fullscreen or not, hence all windows
|
so we can't know if a window is fullscreen or not, hence all windows
|
||||||
|
@ -1283,7 +1269,8 @@ KMSDRM_CreateWindow(_THIS, SDL_Window * window)
|
||||||
/* If we have just created a Vulkan window, establish that we are in Vulkan mode now. */
|
/* If we have just created a Vulkan window, establish that we are in Vulkan mode now. */
|
||||||
viddata->vulkan_mode = is_vulkan;
|
viddata->vulkan_mode = is_vulkan;
|
||||||
|
|
||||||
/* Focus on the newly created window */
|
/* Focus on the newly created window.
|
||||||
|
SDL_SetMouseFocus() also takes care of calling KMSDRM_ShowCursor() if necessary. */
|
||||||
SDL_SetMouseFocus(window);
|
SDL_SetMouseFocus(window);
|
||||||
SDL_SetKeyboardFocus(window);
|
SDL_SetKeyboardFocus(window);
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ typedef struct SDL_DisplayData
|
||||||
struct gbm_bo *cursor_bo;
|
struct gbm_bo *cursor_bo;
|
||||||
uint64_t cursor_w, cursor_h;
|
uint64_t cursor_w, cursor_h;
|
||||||
|
|
||||||
SDL_bool set_default_cursor_pending;
|
SDL_bool default_cursor_init;
|
||||||
SDL_bool modeset_pending;
|
SDL_bool modeset_pending;
|
||||||
|
|
||||||
} SDL_DisplayData;
|
} SDL_DisplayData;
|
||||||
|
|
Loading…
Reference in New Issue