2025
Released emscripten-glfw 3.4.0.20250927 with the following changes:
- Fixed #23: Calling
glfwInit()breaks various input elements
Released emscripten-glfw 3.4.0.20250824 with the following changes:
- The code has been optimized for size
- Fixed #21: Flicker when resizing
- to fix this issue, resizing (when the handle is moved or the window resized) is now delayed until
glfwPollEvents()is called. Make sure to callglfwPollEvents()at the beginning of the loop to ensure a flicker-free experience. See Events & Main loop for more details.
- to fix this issue, resizing (when the handle is moved or the window resized) is now delayed until
Released emscripten-glfw 3.4.0.20250607 with the following changes:
- The main port file has been simplified and is now using the new (as of 4.0.10) “external port file” Emscripten feature
Released emscripten-glfw 3.4.0.20250305 with the following changes:
Released emscripten-glfw 3.4.0.20250209 with the following changes:
Released emscripten-glfw 3.4.0.20250117 with the following changes:
- Added port option
disableWebGL2to disable support for WebGL2 when not needed (reduces JavaScript code size)
Released emscripten-glfw 3.4.0.20250112 with the following changes:
2024
Released emscripten-glfw 3.4.0.20241230 with the following changes:
- Added support for offscreen canvas (check example_offscreen_canvas for a comprehensive example)
Released emscripten-glfw 3.4.0.20241221 with the following changes:
- Added support for pthread (check example_pthread for a comprehensive example)
Released emscripten-glfw 3.4.0.20241004 with the following changes:
- Implemented custom cursors (
glfwCreateCursor)- uses a canvas to draw the cursor image into it and convert it into a URL (
canvas.toDataURL()) - uses the CSS property syntax:
cursor: url(xxx) xhot yhot, autowhen callingglfwSetCursorwith a custom cursor
- uses a canvas to draw the cursor image into it and convert it into a URL (
Published a blog post
properly introducing emscripten-glfw.
You can read about the history of the project and some of the primary features.

Released emscripten-glfw 3.4.0.20240907 with the following changes:
- Fixed Meta/Super key workaround to also handle the rare (but possible) use-case of having other keys down before pressing the Meta/Super key
Released emscripten-glfw 3.4.0.20240817 with the following changes:
- Major clipboard changes: the clipboard now uses the browser events to handle cut, copy and paste
- Added a way to tweak the timeouts for the Super + Key workaround (Super is also known as Meta or Cmd)
- Added a way to set which keys are allowed to be handled by the browser
- Added a convenient API to open a URL (
emscripten::glfw3::OpenURL) - Added a convenient API to detect if the runtime platform is Apple (
emscripten::glfw3::IsRuntimePlatformApple), mostly used for keyboard shortcuts (Ctrl vs. Cmd). - Added
GLFW/emscripten_glfw3_version.hwithEMSCRIPTEN_GLFW_VERSIONdefine for compilation time version detection EMSCRIPTEN_USE_PORT_CONTRIB_GLFW3port define now also contains the version
Breaking changes:
- The clipboard async API has been removed.
- Check the Clipboard support section for details on how to deal with the clipboard in your application.
Released emscripten-glfw 3.4.0.20240804 with the following changes:
- Fixed
nullptrissue when clipboard is empty - Fixed the internal clipboard being wiped on asynchronous callback error
Released emscripten-glfw 3.4.0.20240731 with the following changes:
- Added
emscripten_glfw_get_clipboard_stringthe C version ofemscripten::glfw3::GetClipboardStringto retrieve the clipboard asynchronously - Added a helper class
emscripten::glfw3::FutureClipboardStringto greatly simplify the more frequent use-cases GetClipboardString::value()now returns the internal clipboard in case of error, instead of throwing exception- Added
optimizationLeveloption to the emscripten port
Released emscripten-glfw 3.4.0.20240727 with the following release notes:
- Introduced C++ API (namespace
emscripten::glfw3) included withGLFW3/emscripten_glfw3.h:- provides a more correct API with sensible defaults (ex:
std::string_view/std::optional<std::string_view>vschar const *which may or may not benullptr) - allow for C++ only API (ex:
std::future) - the C API is still available if you would rather stick to it
- provides a more correct API with sensible defaults (ex:
- Implemented
emscripten::glfw3::GetClipboardString(C++ only) which provides a way of fetching the global clipboard in a browser environment (glfwGetClipboardStringis not the right API due to the asynchronous nature of the underlying platform API). - The cursor position is no longer clamped to the window size, and as a result, can have negative values or values greater than the window size. Note that GLFW implements a similar behavior on the macOS desktop platform.
- Implemented
glfwSetWindowPosCallback - Added support for GLFW Window Attribute
GLFW_HOVERED - Fixed #6:
emscripten_glfw_make_canvas_resizabledoes not clean up properly. - Fixed an issue with opacity: when using opacity, the handle is not working unless its z-index is higher than the canvas z-index
Released emscripten-glfw 3.4.0.20240625 with the following release notes:
- Implemented workaround for #4: Using Super + “Key” on macOS results in “Key” not being released.
Due to the broken state of javascript handling the
Super/Metakey, there is no good solution. The workaround implemented, releases all keys whenSuperis released. Although not a perfect solution, it guarantees that the state is eventually consistent:- if “Key” was released while “Super” was held, then when “Super” gets released, “Key” is released (later than when actually released, final state is consistent: “Key” in
Releasestate) - if “Key” is still held when “Super” is released, “Key” is released when “Super” gets released, but immediately gets a down event (Up/Down event, final state is consistent”: “Key” in
Pressedstate)
- if “Key” was released while “Super” was held, then when “Super” gets released, “Key” is released (later than when actually released, final state is consistent: “Key” in
Released emscripten-glfw 3.4.0.20240617 with the following release notes:
- Fixed #3:
glfwGetKeymust return one ofGLFW_PRESSorGLFW_RELEASE
Released emscripten-glfw 3.4.0.20240616 with the following release notes:
- Implemented
glfwGetClipboardString. Note that due to the async (and restrictive) nature of thenavigator.clipboard.readTextcall, this synchronous API returns whatever was set via a previous call toglfwSetClipboardStringand ignores the external clipboard entirely.
Released emscripten-glfw 3.4.0.20240601 with the following release notes:
- Fixed #2: Dynamically changing HiDPI awareness does not trigger content callback
Released emscripten-glfw 3.4.0.20240514 with the following release notes:
- Implemented
glfwSetClipboardString
Released emscripten-glfw 3.4.0.20240501 with the following release notes:
- Fixed issue when calling
glfwGetWindowContentScalewithnullptr - Renamed javascript api/impl since these names are not unique to avoid potential conflicts
- Added
glfw3native.htoGLFW. Although not used (at this moment) by this implementation, this allows calling code to include it if necessary since it is part of a normal GLFW installation.
Released emscripten-glfw 3.4.0.20240318 with the following release notes:
- Fixed joystick/gamepad code that was improperly mapping
GLFW_GAMEPAD_AXIS_LEFT_TRIGGERGLFW_GAMEPAD_AXIS_RIGHT_TRIGGER,GLFW_GAMEPAD_BUTTON_LEFT_THUMBandGLFW_GAMEPAD_BUTTON_RIGHT_THUMB GLFW_GAMEPAD_AXIS_LEFT_TRIGGERandGLFW_GAMEPAD_AXIS_RIGHT_TRIGGERare now properly represented as an analog value in the range[-1.0, +1.0]- Please note the change in version numbering which from now on will be tied to the GLFW version implemented + date of release of this port to avoid confusion
I released emscripten-glfw 1.1.0 which implements GLFW 3.4 APIs:
- Upgraded to GLFW 3.4
- GLFW 3.4 features implemented
glfwGetPlatformandglfwPlatformSupporteduses theGLFW_PLATFORM_EMSCRIPTENconstant defined inemscripten-glfw3.h(officially reserved value is0x00060006)glfwInitHintsupports the new hintGLFW_PLATFORM- Supports all 10 cursors
- Implemented
glfwGetWindowTitle - Use
GLFW_SCALE_FRAMEBUFFERto enable (resp. disable) Hi DPI support - Changed the functions that can report
GLFW_FEATURE_UNAVAILABLEfailure to report this error instead of a warning
- GLFW 3.4 features not implemented
GLFW_MOUSE_PASSTHROUGHis not supportedGLFW_CURSOR_CAPTUREDcursor input mode is not supported (not possible in a browser context)glfwInitAllocatoris implemented as noop (could be supported for the C++ part only if there is demand, not javascript)GLFW_POSITION_XandGLFW_POSITION_Yare not supported (same asglfwSetWindowPos)GLFW_ANGLE_PLATFORM_TYPEis not supported (no direct access in browser, but implementation is most likely using it anyway)
- Since GLFW 3.4 introduces a proper constant to handle Hi DPI Awareness (
GLFW_SCALE_FRAMEBUFFER), the prior constant used by this port (GLFW_SCALE_TO_MONITOR) is still accepted, but it is now deprecated. In addition, due to the fact thatGLFW_SCALE_FRAMEBUFFERdefaults toGLFW_TRUE, this port is now Hi DPI aware by default and needs to be explicitly turned off (glfwWindowHint(GLFW_SCALE_FRAMEBUFFER, GLFW_FALSE)) if this is the desired behavior.
Note: These changes are available in emscripten 3.1.56 (released on 2024/03/14) via the contrib port contrib.glfw3
I released emscripten-glfw 1.0.5 with a critical bug fix:
- Fixed memory corruption with joystick
Note: These changes are available in emscripten 3.1.55 (released on 2024/03/01) via the contrib port contrib.glfw3
I am very happy to announce the 1.0 release of my new free and open source project emscripten-glfw which is a port of glfw written in C++ for the web/webassembly platform.
Check out the live demo.
