mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-10-30 23:15:32 +01:00 
			
		
		
		
	Allow toggling fullscreen without restart and add keybind (#14714)
This commit is contained in:
		| @@ -179,6 +179,11 @@ public: | ||||
| 	/** \return True if window is fullscreen. */ | ||||
| 	virtual bool isFullscreen() const = 0; | ||||
| 
 | ||||
| 	//! Enables or disables fullscreen mode.
 | ||||
| 	/** Only works on SDL.
 | ||||
| 	\return True on success. */ | ||||
| 	virtual bool setFullscreen(bool fullscreen) { return false; } | ||||
| 
 | ||||
| 	//! Checks if the window could possibly be visible.
 | ||||
| 	/** If this returns false, you should not do any rendering. */ | ||||
| 	virtual bool isWindowVisible() const { return true; }; | ||||
|   | ||||
| @@ -463,13 +463,7 @@ bool CIrrDeviceSDL::createWindowWithContext() | ||||
| { | ||||
| 	u32 SDL_Flags = 0; | ||||
| 
 | ||||
| 	if (CreationParams.Fullscreen) { | ||||
| #ifdef _IRR_EMSCRIPTEN_PLATFORM_ | ||||
| 		SDL_Flags |= SDL_WINDOW_FULLSCREEN; | ||||
| #else | ||||
| 		SDL_Flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; | ||||
| #endif | ||||
| 	} | ||||
| 	SDL_Flags |= getFullscreenFlag(CreationParams.Fullscreen); | ||||
| 	if (Resizable) | ||||
| 		SDL_Flags |= SDL_WINDOW_RESIZABLE; | ||||
| 	if (CreationParams.WindowMaximized) | ||||
| @@ -889,6 +883,14 @@ bool CIrrDeviceSDL::run() | ||||
| 			IsInBackground = false; | ||||
| 			break; | ||||
| 
 | ||||
| 		case SDL_RENDER_TARGETS_RESET: | ||||
| 			os::Printer::log("Received SDL_RENDER_TARGETS_RESET. Rendering is probably broken.", ELL_ERROR); | ||||
| 			break; | ||||
| 
 | ||||
| 		case SDL_RENDER_DEVICE_RESET: | ||||
| 			os::Printer::log("Received SDL_RENDER_DEVICE_RESET. Rendering is probably broken.", ELL_ERROR); | ||||
| 			break; | ||||
| 
 | ||||
| 		default: | ||||
| 			break; | ||||
| 		} // end switch
 | ||||
| @@ -1157,14 +1159,37 @@ bool CIrrDeviceSDL::isWindowMaximized() const | ||||
| 
 | ||||
| bool CIrrDeviceSDL::isFullscreen() const | ||||
| { | ||||
| #ifdef _IRR_EMSCRIPTEN_PLATFORM_ | ||||
| 	return SDL_GetWindowFlags(0) == SDL_WINDOW_FULLSCREEN; | ||||
| #else | ||||
| 	if (!Window) | ||||
| 		return false; | ||||
| 	u32 flags = SDL_GetWindowFlags(Window); | ||||
| 	return (flags & SDL_WINDOW_FULLSCREEN) != 0 || | ||||
| 			(flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != 0; | ||||
| } | ||||
| 
 | ||||
| 	return CIrrDeviceStub::isFullscreen(); | ||||
| u32 CIrrDeviceSDL::getFullscreenFlag(bool fullscreen) | ||||
| { | ||||
| 	if (!fullscreen) | ||||
| 		return 0; | ||||
| #ifdef _IRR_EMSCRIPTEN_PLATFORM_ | ||||
| 	return SDL_WINDOW_FULLSCREEN; | ||||
| #else | ||||
| 	return SDL_WINDOW_FULLSCREEN_DESKTOP; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| bool CIrrDeviceSDL::setFullscreen(bool fullscreen) | ||||
| { | ||||
| 	if (!Window) | ||||
| 		return false; | ||||
| 	// The SDL wiki says that this may trigger SDL_RENDER_TARGETS_RESET, but
 | ||||
| 	// looking at the SDL source, this only happens with D3D, so it's not
 | ||||
| 	// relevant to us.
 | ||||
| 	bool success = SDL_SetWindowFullscreen(Window, getFullscreenFlag(fullscreen)) == 0; | ||||
| 	if (!success) | ||||
| 		os::Printer::log("SDL_SetWindowFullscreen failed", SDL_GetError(), ELL_ERROR); | ||||
| 	return success; | ||||
| } | ||||
| 
 | ||||
| bool CIrrDeviceSDL::isWindowVisible() const | ||||
| { | ||||
| 	return !IsInBackground; | ||||
|   | ||||
| @@ -86,6 +86,10 @@ public: | ||||
| 	/** \return True if window is fullscreen. */ | ||||
| 	bool isFullscreen() const override; | ||||
| 
 | ||||
| 	//! Enables or disables fullscreen mode.
 | ||||
| 	/** \return True on success. */ | ||||
| 	bool setFullscreen(bool fullscreen) override; | ||||
| 
 | ||||
| 	//! Checks if the window could possibly be visible.
 | ||||
| 	bool isWindowVisible() const override; | ||||
| 
 | ||||
| @@ -299,6 +303,8 @@ private: | ||||
| 
 | ||||
| 	bool Resizable; | ||||
| 
 | ||||
| 	static u32 getFullscreenFlag(bool fullscreen); | ||||
| 
 | ||||
| 	core::rect<s32> lastElemPos; | ||||
| 
 | ||||
| 	struct SKeyMap | ||||
|   | ||||
		Reference in New Issue
	
	Block a user