| Summary: | [Raspberry Pi] No cursor displayed as of changeset 12433 | ||
|---|---|---|---|
| Product: | SDL | Reporter: | Joe LeVeque <joeleveque> |
| Component: | video | Assignee: | Ryan C. Gordon <icculus> |
| Status: | RESOLVED FIXED | QA Contact: | Sam Lantinga <slouken> |
| Severity: | major | ||
| Priority: | P2 | CC: | icculus |
| Version: | 2.0.10 | Keywords: | target-2.0.10 |
| Hardware: | ARM | ||
| OS: | Other | ||
Looking at this tonight. Should probably get this into 2.0.10. --ryan. This patch is now https://hg.libsdl.org/SDL/rev/db02dca46a9e, thanks! --ryan. Hi Ryan. Thanks for looking into this so quickly and merging the patch. I have not had a chance to test the new changes, but I believe the problem will still exist because the first lines of my patch were not applied:
- if (cursor == global_cursor) {
- return 0;
- }
-
Without removing this if statement, the function will still exit prematurely and the cursor will not be displayed. Can you please take another look?
Whoops, "hg record" error on my end, sorry! The missing patch fragment is now at https://hg.libsdl.org/SDL/rev/9cbdc68e4a5e, thank you again! --ryan. |
Starting with changeset 12433, the mouse cursor is not displayed on the Raspberry Pi platform, due to a bug in the handling of the new "global_cursor" in RPI_ShowCursor(). Currently, if cursor == global_cursor, the function immediately returns 0. The function should not return here. Instead, if cursor == global_cursor, it shouldn't try to hide the current cursor and update global_cursor = cursor. However, it *should* still continue through the rest of the function. Below is a small patch which fixes the issue: --- SDL_rpimouse.c 2019-06-29 15:42:36.724201038 -0700 +++ SDL_rpimouse.c 2019-06-29 15:48:03.772143536 -0700 @@ -128,23 +128,21 @@ return -1; } - if (cursor == global_cursor) { - return 0; - } - - if (global_cursor != NULL) { - curdata = (RPI_CursorData *) global_cursor->driverdata; - if (curdata && curdata->element > DISPMANX_NO_HANDLE) { - update = vc_dispmanx_update_start(0); - SDL_assert(update); - ret = vc_dispmanx_element_remove(update, curdata->element); - SDL_assert(ret == DISPMANX_SUCCESS); - ret = vc_dispmanx_update_submit_sync(update); - SDL_assert(ret == DISPMANX_SUCCESS); - curdata->element = DISPMANX_NO_HANDLE; + if (cursor != global_cursor) { + if (global_cursor != NULL) { + curdata = (RPI_CursorData *) global_cursor->driverdata; + if (curdata && curdata->element > DISPMANX_NO_HANDLE) { + update = vc_dispmanx_update_start(0); + SDL_assert(update); + ret = vc_dispmanx_element_remove(update, curdata->element); + SDL_assert(ret == DISPMANX_SUCCESS); + ret = vc_dispmanx_update_submit_sync(update); + SDL_assert(ret == DISPMANX_SUCCESS); + curdata->element = DISPMANX_NO_HANDLE; + } } + global_cursor = cursor; } - global_cursor = cursor; if (cursor == NULL) { return 0;