diff --git a/libs/android/source/native_app.cpp b/libs/android/source/native_app.cpp index 2bc6917f..e7e94b43 100644 --- a/libs/android/source/native_app.cpp +++ b/libs/android/source/native_app.cpp @@ -72,6 +72,7 @@ extern "C" jlong Java_psemek_app_PsemekApplication_createNativeApp(JNIEnv * env, psemek::app::application::context context; context.show_cursor = [](bool){}; context.vsync = [](bool){}; + context.windowed = [](bool){}; auto app = factory->create(factory->options(), context).release(); return reinterpret_cast(app); diff --git a/libs/app/include/psemek/app/application.hpp b/libs/app/include/psemek/app/application.hpp index 2c9c3d29..1fb513e0 100644 --- a/libs/app/include/psemek/app/application.hpp +++ b/libs/app/include/psemek/app/application.hpp @@ -25,6 +25,7 @@ namespace psemek::app std::vector args; std::function show_cursor; std::function vsync; + std::function windowed; }; struct factory diff --git a/libs/sdl2/include/psemek/sdl2/window.hpp b/libs/sdl2/include/psemek/sdl2/window.hpp index 9beaaf69..8ae5748e 100644 --- a/libs/sdl2/include/psemek/sdl2/window.hpp +++ b/libs/sdl2/include/psemek/sdl2/window.hpp @@ -18,6 +18,7 @@ namespace psemek::sdl2 void swap(); void show_cursor(bool show); void vsync(bool on); + void windowed(bool on); private: std::shared_ptr sdl_init_; diff --git a/libs/sdl2/source/main.cpp b/libs/sdl2/source/main.cpp index a6b4cc16..1115c9ee 100644 --- a/libs/sdl2/source/main.cpp +++ b/libs/sdl2/source/main.cpp @@ -49,6 +49,7 @@ int main(int argc, char ** argv) try context.args.push_back(argv[i]); context.show_cursor = [&](bool show){ window.show_cursor(show); }; context.vsync = [&](bool on){ window.vsync(on); }; + context.windowed = [&](bool on){ window.windowed(on); }; auto application = factory->create(options, context); diff --git a/libs/sdl2/source/window.cpp b/libs/sdl2/source/window.cpp index 13fbe273..0bcbdbd6 100644 --- a/libs/sdl2/source/window.cpp +++ b/libs/sdl2/source/window.cpp @@ -28,7 +28,7 @@ namespace psemek::sdl2 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, options.multisampling); } - std::uint32_t flags = SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_MAXIMIZED | SDL_WINDOW_BORDERLESS | SDL_WINDOW_FULLSCREEN_DESKTOP; + std::uint32_t flags = SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN | SDL_WINDOW_RESIZABLE; if (options.highdpi) flags |= SDL_WINDOW_ALLOW_HIGHDPI; SDL_DisplayMode display_mode; @@ -85,6 +85,27 @@ namespace psemek::sdl2 } } + void window::windowed(bool on) + { + SDL_DisplayMode display_mode; + SDL_GetCurrentDisplayMode(0, &display_mode); + + SDL_Rect display_usable_bounds; + SDL_GetDisplayUsableBounds(0, &display_usable_bounds); + + SDL_SetWindowFullscreen(window_, on ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP); + SDL_SetWindowBordered(window_, on ? SDL_TRUE : SDL_FALSE); + SDL_RestoreWindow(window_); + if (on) + { + int top_border, left_border, bottom_border, right_border; + SDL_GetWindowBordersSize(window_, &top_border, &left_border, &bottom_border, &right_border); + + SDL_SetWindowSize(window_, display_usable_bounds.w - left_border - right_border, display_usable_bounds.h - top_border - bottom_border); + SDL_SetWindowPosition(window_, left_border, top_border); + } + } + window::~window() { if (gl_context_)