4ian / GDevelop

:video_game: Open-source, cross-platform game engine designed to be used by everyone.
https://gdevelop.io
Other
6.57k stars 722 forks source link

Fullscreen Detection broken #6477

Open netAction opened 2 months ago

netAction commented 2 months ago

Is there an existing issue for this?

Describe the bug

Affects: HTML5 export.

Both fullscreen detection and fullscreen switch methods are broken when the user leaves fullscreen on Chrome/Windows via Esc key or on Chrome/Android via < button or on Safari/IOs via swipe down.

After executing the Activate fullscreen action, GDevelop thinks it is in fullscreen. Even if it is not, because fullscreen has been left manually. Then running Activate fullscreen again might crash. And worse, the condition The game is in fullscreen says true but it is not.

The Javascript code if (document.fullscreenElement != null) returns the correct value on all three browsers, no matter if the fullscreen has been closed via Activate fullscreen action or via the intended browser way.

Minimal project for reproduction:

Screenshot 2024-03-21 223432

Steps to reproduce

  1. Create a button and bind Activate fullscreen on click.
  2. Leave Fullscreen in the way your browser suggests.
  3. Check The game is in fullscreen or use the Activate fullscreen action again. Both don't work correctly.
  4. Check if (document.fullscreenElement != null). It does work.

GDevelop platform

Desktop

GDevelop version

5.3.195

Platform info

IDE: GDevelop via Microsoft Store on Windows 11

Browser: Chrome/Windows, Chrome/Android, Safari/IOs

Additional context

No response

ClementPasteau commented 2 months ago

Hi @netAction does this happen when you publish on gd.games too? If so, can you share a link so we can see the problem in action? Thanks

netAction commented 2 months ago

Yes the bug is reproducable in gd.games. https://gd.games/netaction/fullscreen-bug

Screenshot 2024-03-28 100308

Screenshot 2024-03-28 100334

ClementPasteau commented 2 months ago

Thanks, that's very helpful and detailed, we're probably missing an event not being listened properly or using a wrong logic

ClementPasteau commented 2 months ago

This is the function being used in the runtime to set the full screen (it's quite old), saving the variable in the state. https://github.com/4ian/GDevelop/blob/5c66623631083caf5aaf2f2d5629329a6c314ba2/GDJS/Runtime/pixi-renderers/runtimegame-pixi-renderer.ts#L390-L446

There are indeed no listeners on wether the full screen has been left. We could try adding a listener on https://developer.mozilla.org/en-US/docs/Web/API/Element/fullscreenchange_event in this method to see if it catches it or not