Skip to content

Use multiple windows

derpyzza edited this page Aug 19, 2021 · 7 revisions

raylib does not support multiple Windows by default, it was designed with simplicity in main and multi-window option was not considered as a core feature.

Fortunately raylib's current design allows adding multi-window support in an easy way, in case some user requires this functionality.

the steps to follow to modify the raylib source code and add multi-window support are as follows:

  • [raylib.h] A MAX_CONTEXTS constant is defined to give the size of RLGL[] and CoreData.Window[]
  • [core] Change the CoreData.Window struct into CoreData.Window[MAX_CONTEXTS] and add a currentWindow variable as global index to switch between the structures, as well as a numWindows variable to keep count of the total number of windows
  • [core] Quick and dirty find/replace all for CORE.Window to CORE.Window[CORE.currentWindow]
  • [rlgl] Change rlglData RLGL into rlglData RLGL[MAX_CONTEXTS] and add a currentContext variable as global index to switch between the structures, as well as a numContexts variable to keep count of the total number of contexts
  • [rlgl] Quick and dirt find/replace all for RLGL to RLGL[currentContext] + rlSetContext(unsigned int)
  • [core] Change the final glfwCreateWindow() parameter to share resources from the first context to the second
  • [core] Change BeginDrawing() function to accept a contextID parameter in order to CORE.currentWindow = contextID and glfwMakeContextCurrent(CORE.Window[CORE.currentWindow].handle) on the current window and to set the right RLGL[] by rlSetContext(contextID)
  • [git] Checkout https://github.com/vb-mich/raylib/tree/multiple-contexts-hack and https://github.com/vb-mich/raylib/commit/6ddc54cdde86136e07da69d3323aeb73e2ee11af to see the changes

That's it. To use it just call InitWindow() twice to get two windows. Then, just call BeginDrawing(n) to set current window for drawing (BeginDrawing(n)- EndDrawing()).

NOTE: This has only been tested on Microsoft Windows for recreational purposes.

Clone this wiki locally