Skip to content

Use multiple windows

Jeffery Myers edited this page Dec 9, 2023 · 7 revisions

NOTE

These instructions will not work for Raylib 5.0 or above, they are here for historical purposes only.

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