You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.4 KiB
58 lines
1.4 KiB
#include "platform/switch/docking.h" |
|
|
|
#include <SDL.h> |
|
#include <switch.h> |
|
|
|
#include "utils/display.h" |
|
|
|
namespace devilution { |
|
namespace { |
|
enum class OperationMode : int8_t { |
|
Handheld, |
|
Docked, |
|
Uninitialized = -1 |
|
}; |
|
} |
|
|
|
/** |
|
* @brief Do a manual window resize when docking/undocking the Switch |
|
*/ |
|
void HandleDocking() |
|
{ |
|
static OperationMode currentMode = OperationMode::Uninitialized; // keep track of docked or handheld mode |
|
|
|
OperationMode newMode; |
|
switch (appletGetOperationMode()) { |
|
case AppletOperationMode_Console: |
|
newMode = OperationMode::Docked; |
|
break; |
|
case AppletOperationMode_Handheld: |
|
default: |
|
newMode = OperationMode::Handheld; |
|
} |
|
|
|
if (currentMode != newMode) { |
|
int display_width; |
|
int display_height; |
|
|
|
// docked mode has changed, update window size |
|
if (newMode == OperationMode::Docked) { |
|
display_width = 1920; |
|
display_height = 1080; |
|
} else { |
|
display_width = 1280; |
|
display_height = 720; |
|
} |
|
currentMode = newMode; |
|
|
|
// remove leftover-garbage on screen. Need to perform three clears to ensure all buffers get cleared, otherwise |
|
// the display flickers showing a stale frame at certain refresh rates/dock modes. |
|
for (auto i = 0; i < 3; i++) { |
|
SDL_RenderClear(renderer); |
|
SDL_RenderPresent(renderer); |
|
} |
|
SDL_SetWindowSize(ghMainWnd, display_width, display_height); |
|
} |
|
} |
|
|
|
} // namespace devilution
|
|
|