| Summary: | [rfe] implement console switching | ||
|---|---|---|---|
| Product: | SDL | Reporter: | Stas Sergeev <stsp2> |
| Component: | events | Assignee: | Manuel Alfayate Corchete <redwindwanderer> |
| Status: | ASSIGNED --- | QA Contact: | Sam Lantinga <slouken> |
| Severity: | enhancement | ||
| Priority: | P2 | ||
| Version: | 2.0.12 | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
|
Description
Stas Sergeev
2020-10-09 16:15:28 UTC
Isn't this happening because SDL2 is getting the input instead of TTY? In other words, I guess that non-working TTY switching while a program is running is the intended behaviour, if I am not mistaken. I don't even start to guess how to do this, if possible at all. > Isn't this happening because SDL2 is getting the input instead of TTY? Yes, this is the reason why native switching is disabled. But it won't work anyway. It just doesn't look like DRM console can switch the rendered content on its own. I tried to enable the native switching, but it never restores the graphical content when I switch back. > I don't even start to guess how to do this, if possible at all. Classic gfx console switching works as follows. ioctl(0, VT_GETSTATE, &vts); our_vt_num = vts.v_active; // get our console num ioctl(0, VT_SETMODE, VT_PROCESS); // enter manual console switching ioctl(0, KDSKBMODE, KD_GRAPHICS); // switch console to gfx mode /* do some gfx rendering here */ /* detect Ctrl-Alt-fN presses */ ioctl(0, VT_ACTIVATE, N); // activate console N usleep(10000); /* some kernel bug, hangs without this */ ioctl(0, VT_RELDISP, 1); // confirm console release ioctl(0, VT_WAITACTIVE, N); // wait activation of console N ioctl(0, VT_WAITACTIVE, our_vt_num); // wait until our console is switched on again when user hits Ctrl-Alt-f<our_vt_num> /* restore the gfx image here, as it gets destroyed */ /* return back to client code */ I hope DRM console have some better techniques than all that crap. In particular, it would be cool if it could at least save/restore image itself. But my experiment shows its not the case, so perhaps you'll have to execute the entire sequence above. :( Even after googling for the whole day, I can't find any docs on drm VT switching, other than that you need to "drop master" via drmDropMaster(). But you do not seem to be doing drmSetMaster() anyway. Maybe you just need to do drmDropMaster() before ioctl(0, VT_RELDISP, 1), and do the classical switching? Or should it be something entirely different? Is this drm stuff that much undocumented... |