GLFW 3.4 / External platform

I was looking at the 3.4 release and the concept of platform that was introduced. Having worked on the GLFW3 emscripten implementation, I am not too sure how I would implement the glfwGetPlatform() API since none of the defines make sense: the code runs in the browser so the platform is “web” or “emscripten”?

I understand that this platform is not part of the official distribution, but GLFW in the browser is a reality… Would it make sense to add a new define for this purpose?

// one of these?
#define GLFW_PLATFORM_WEB        0x00060006
#define GLFW_PLATFORM_EMSCRIPTEN 0x00060006

I think that would make sense, and personally I would choose GLFW_PLATFORM_EMSCRIPTEN.

Is the right approach to submit a pull request on GitHub?

The official GLFW repository cannot add this platform define because it doesn’t have the emscripten platform, and I don’t think we can take on an emscripten platform at the moment.

So you should just add this define to your own project: GitHub - pongasoft/emscripten-glfw: This project is an emscripten port of glfw written in C++ for the web/webassembly platform #wasm

What we can do is reserve that platform ID for Emscripten, even if it isn’t currently part of the official repository.

@dougbinks I know I can add this define to my project (and the emscripten built-in project) and I would be fine doing that, but what if in GLFW 3.5, this value is used for some other platform officially supported by GLFW?

As @elmindreda suggested, it would be great if there was a platform ID reserved for Emscripten.

I suppose an alternative would be to have an official platform ID for “other” (GLFW_PLATFORM_OTHER) which could be returned by other platforms not part of the official distribution.

A reserved platform Id for Emscripten is a good idea, though we have to be careful to ensure people don’t think this means they can use GLFW with Emscripten out of the box.

If we go that route I can see some other unofficial platforms wanting to add their defines. If we didn’t want to open up that capability then GLFW_PLATFORM_OTHER is a decent alternative. It might be best to offer a range of defines for ports which support multiple platforms (GLFW_PLATFORM_OTHER_START to GLFW_PLATFORM_OTHER_MAX or similar).

I am up for whatever solution makes the most sense for GLFW. Just let me know which way you want to go.

Our current plan is to reserve a define and add a comment in the header that this is reserved.

For example:

/*! @addtogroup init
 *  @{ */
/*! @brief Hint value that enables automatic platform selection.
 *
 *  Hint value for @ref GLFW_PLATFORM that enables automatic platform selection.
 */
#define GLFW_ANY_PLATFORM           0x00060000
#define GLFW_PLATFORM_WIN32         0x00060001
#define GLFW_PLATFORM_COCOA         0x00060002
#define GLFW_PLATFORM_WAYLAND       0x00060003
#define GLFW_PLATFORM_X11           0x00060004
#define GLFW_PLATFORM_NULL          0x00060005
/*! @} */

/* Reserved platform define for external Emscripten port: 0x00060006
 * See https://github.com/pongasoft/emscripten-glfw 
 */

So you should be able to go ahead and use 0x00060006.

Does that work for you?

Absolutely. This is awesome and would work perfectly!

I am also planning to add support for this new (platform) API to the built-in (javascript) implementations that comes packaged with emscripten since I did some work on it recently. Although they are different implementation (one is C++, the other javascript), they represent the same platform. So maybe the comments could be:

/* Reserved platform define for external Emscripten ports: 0x00060006
 * See https://github.com/pongasoft/emscripten-glfw
 * See https://emscripten.org/docs/tools_reference/settings_reference.html?#use-glfw
 */

But either way, knowing that this value is reserved is enough for me to move forward with implementation! Thank you so much.