diff --git a/CMake/modules/FindEGL.cmake b/CMake/modules/FindEGL.cmake new file mode 100644 index 00000000..0929c920 --- /dev/null +++ b/CMake/modules/FindEGL.cmake @@ -0,0 +1,16 @@ +# Find EGL +# +# EGL_INCLUDE_DIR +# EGL_LIBRARY +# EGL_FOUND + +find_path(EGL_INCLUDE_DIR NAMES EGL/egl.h) + +set(EGL_NAMES ${EGL_NAMES} egl EGL) +find_library(EGL_LIBRARY NAMES ${EGL_NAMES}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(EGL DEFAULT_MSG EGL_LIBRARY EGL_INCLUDE_DIR) + +mark_as_advanced(EGL_INCLUDE_DIR EGL_LIBRARY) + diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ae85c71..ba257c95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,20 @@ option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON) option(GLFW_NATIVE_API "Build the GLFW native API" OFF) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) -find_package(OpenGL REQUIRED) +if (NOT APPLE) + option(GLFW_USE_EGL "Use EGL for context creation" OFF) +endif() + +if (GLFW_USE_EGL) + set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/modules) + find_package(EGL REQUIRED) + + set(GLFW_BUILD_EXAMPLES OFF) + set(GLFW_BUILD_TESTS OFF) + message(STATUS "NOTE: Examples and tests are disabled for EGL") +else() + find_package(OpenGL REQUIRED) +endif() #-------------------------------------------------------------------- # Enable all warnings on GCC, regardless of OS @@ -32,17 +45,40 @@ if (BUILD_SHARED_LIBS) endif() #-------------------------------------------------------------------- -# Detect and select target platform +# Detect and select target APIs #-------------------------------------------------------------------- if (WIN32) - set(_GLFW_WIN32_WGL 1) - message(STATUS "Building GLFW for WGL on a Win32 system") -elseif (UNIX AND APPLE) - set(_GLFW_COCOA_NSGL 1) - message(STATUS "Building GLFW for Cocoa and NSOpenGL on Mac OS X") -elseif (UNIX AND NOT APPLE) - set(_GLFW_X11_GLX 1) - message(STATUS "Building GLFW for X11 and GLX on a Unix-like system") + set(_GLFW_WIN32 1) + message(STATUS "Using Win32 for window creation") + + if (GLFW_USE_EGL) + set(_GLFW_EGL 1) + message(STATUS "Using EGL for context creation") + else() + set(_GLFW_WGL 1) + message(STATUS "Using WGL for context creation") + endif() +elseif (APPLE) + set(_GLFW_COCOA 1) + message(STATUS "Using Cocoa for window creation") + + if (GLFW_USE_EGL) + message(FATAL_ERROR "EGL not supported on Mac OS X") + else() + set(_GLFW_NSGL 1) + message(STATUS "Using NSGL for context creation") + endif() +elseif (UNIX) + set(_GLFW_X11 1) + message(STATUS "Using X11 for window creation") + + if (GLFW_USE_EGL) + set(_GLFW_EGL 1) + message(STATUS "Using EGL for context creation") + else() + set(_GLFW_GLX 1) + message(STATUS "Using GLX for context creation") + endif() else() message(FATAL_ERROR "No supported platform was detected") endif() @@ -50,7 +86,7 @@ endif() #-------------------------------------------------------------------- # Set up GLFW for Win32 and WGL on Windows #-------------------------------------------------------------------- -if (_GLFW_WIN32_WGL) +if (_GLFW_WIN32) # Set up library and include paths list(APPEND glfw_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR}) @@ -79,26 +115,18 @@ if (_GLFW_WIN32_WGL) endif() #-------------------------------------------------------------------- -# Set up GLFW for Xlib and GLX on Unix-like systems with X Windows +# Set up GLFW for Xlib and GLX or EGL on Unix-like systems with X Windows #-------------------------------------------------------------------- -if (_GLFW_X11_GLX) +if (_GLFW_X11) find_package(X11 REQUIRED) - set(CMAKE_THREAD_PREFER_PTHREADS YES) - find_package(Threads) - if (CMAKE_THREAD_LIBS_INIT) - list(APPEND glfw_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) - endif() + set(GLFW_PKG_LIBS "") + set(GLFW_PKG_DEPS "x11") # Set up library and include paths - list(APPEND glfw_INCLUDE_DIRS ${X11_X11_INCLUDE_PATH} ${OPENGL_INCLUDE_DIR}) - list(APPEND glfw_LIBRARIES ${X11_X11_LIB} ${OPENGL_gl_LIBRARY}) - - set(GLFW_PKG_DEPS "gl x11") - set(GLFW_PKG_LIBS "") - - include(CheckFunctionExists) + list(APPEND glfw_INCLUDE_DIRS ${X11_X11_INCLUDE_PATH}) + list(APPEND glfw_LIBRARIES ${X11_X11_LIB}) # Check for XRandR (modern resolution switching extension) if (X11_Xrandr_FOUND) @@ -144,6 +172,21 @@ if (_GLFW_X11_GLX) set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -lm") endif() +endif() + +#-------------------------------------------------------------------- +# GLX Context +#-------------------------------------------------------------------- +if (_GLFW_GLX) + + # Set up library and include paths + list(APPEND glfw_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR}) + list(APPEND glfw_LIBRARIES ${OPENGL_gl_LIBRARY}) + + set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} gl") + + include(CheckFunctionExists) + set(CMAKE_REQUIRED_LIBRARIES ${OPENGL_gl_LIBRARY}) check_function_exists(glXGetProcAddress _GLFW_HAS_GLXGETPROCADDRESS) @@ -182,12 +225,59 @@ if (_GLFW_X11_GLX) set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -ldl") endif() endif() + +endif() + +#-------------------------------------------------------------------- +# EGL Context +#-------------------------------------------------------------------- +if (_GLFW_EGL) + + # Set up library and include paths + list(APPEND glfw_INCLUDE_DIRS ${EGL_INCLUDE_DIR}) + list(APPEND glfw_LIBRARIES ${EGL_LIBRARY}) + + set(CMAKE_REQUIRED_LIBRARIES ${EGL_LIBRARY}) + + if (_GLFW_X11) + set(GLFW_PKG_DEPS "${GLFW_PKG_DEPS} egl") + + include(CheckFunctionExists) + + check_function_exists(eglGetProcAddress _GLFW_HAS_EGLGETPROCADDRESS) + + if (NOT _GLFW_HAS_EGLGETPROCADDRESS) + message(WARNING "No eglGetProcAddress found") + + # Check for dlopen support as a fallback + + find_library(DL_LIBRARY dl) + mark_as_advanced(DL_LIBRARY) + if (DL_LIBRARY) + set(CMAKE_REQUIRED_LIBRARIES ${DL_LIBRARY}) + else() + set(CMAKE_REQUIRED_LIBRARIES "") + endif() + + check_function_exists(dlopen _GLFW_HAS_DLOPEN) + + if (NOT _GLFW_HAS_DLOPEN) + message(FATAL_ERROR "No entry point retrieval mechanism found") + endif() + + if (DL_LIBRARY) + list(APPEND glfw_LIBRARIES ${DL_LIBRARY}) + set(GLFW_PKG_LIBS "${GLFW_PKG_LIBS} -ldl") + endif() + endif() + endif() + endif() #-------------------------------------------------------------------- # Set up GLFW for Cocoa and NSOpenGL on Mac OS X #-------------------------------------------------------------------- -if (_GLFW_COCOA_NSGL) +if (_GLFW_COCOA AND _GLFW_NSGL) option(GLFW_BUILD_UNIVERSAL "Build GLFW as a Universal Binary" OFF) @@ -269,7 +359,7 @@ install(FILES COPYING.txt readme.html #-------------------------------------------------------------------- # Create and install pkg-config file on supported platforms #-------------------------------------------------------------------- -if (_GLFW_X11_GLX OR _GLFW_COCOA_NSGL) +if (UNIX) configure_file(${GLFW_SOURCE_DIR}/src/glfw3.pc.in ${GLFW_BINARY_DIR}/src/glfw3.pc @ONLY) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 9458143a..d102d948 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -188,6 +188,10 @@ extern "C" { #else #if defined(GLFW_INCLUDE_GLCOREARB) #include + #elif defined(GLFW_INCLUDE_ES1) + #include + #elif defined(GLFW_INCLUDE_ES2) + #include #else #include #endif @@ -509,6 +513,10 @@ extern "C" { /*! @brief The number of samples used for default framebuffer multisampling. */ #define GLFW_FSAA_SAMPLES 0x0002100E +/*! @brief @c GL_TRUE if the framebuffer should be sRGB capable, or @c GL_FALSE + * otherwise. + */ +#define GLFW_SRGB_CAPABLE 0x0002100F /*! @brief The @link clients client API @endlink to create a context for. */ @@ -709,6 +717,16 @@ typedef void* GLFWwindow; */ typedef void (* GLFWerrorfun)(int,const char*); +/*! @brief The function signature for window position callbacks. + * @param[in] window The window that the user moved. + * @param[in] x The new x-coordinate, in pixels, of the upper-left corner of + * the client area of the window. + * @param[in] y The new y-coordinate, in pixels, of the upper-left corner of + * the client area of the window. + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow,int,int); + /*! @brief The function signature for window resize callbacks. * @param[in] window The window that the user resized. * @param[in] width The new width, in pixels, of the window. @@ -1005,7 +1023,7 @@ GLFWAPI void glfwGetVideoMode(GLFWmonitor monitor, GLFWvidmode* mode); /*! @brief Sets the system gamma ramp to one generated from the specified * exponent. - * @param[in] The desired exponent. + * @param[in] gamma The desired exponent. * @ingroup gamma */ GLFWAPI void glfwSetGamma(float gamma); @@ -1071,6 +1089,9 @@ GLFWAPI void glfwDefaultWindowHints(void); * The @ref GLFW_FSAA_SAMPLES hint specifies the desired number of samples to * use for multisampling. * + * The @ref GLFW_SRGB_CAPABLE hint specifies whether the framebuffer should be + * sRGB capable. + * * The @ref GLFW_CLIENT_API hint specifies which client API to create the * context for. Possible values are @ref GLFW_OPENGL_API and @ref * GLFW_OPENGL_ES_API. @@ -1099,7 +1120,8 @@ GLFWAPI void glfwDefaultWindowHints(void); * used by the OpenGL context. * * The @ref GLFW_RESIZABLE hint specifies whether the window will be resizable - * by the user. This hint is ignored for fullscreen windows. + * by the user. The window will still be resizable using the @ref + * glfwSetWindowSize function. This hint is ignored for fullscreen windows. * * The @ref GLFW_VISIBLE hint specifies whether the window will be initially * visible. This hint is ignored for fullscreen windows. @@ -1110,7 +1132,9 @@ GLFWAPI void glfwDefaultWindowHints(void); * Some window hints are hard constraints. These must match the available * capabilities @em exactly for window and context creation to succeed. Hints * that are not hard constraints are matched as closely as possible, but the - * resulting window and context may differ from what these hints requested. + * resulting window and context may differ from what these hints requested. To + * find out the actual properties of the created window and context, use the + * @ref glfwGetWindowParam function. * * The following window hints are hard constraints: * @arg @ref GLFW_STEREO @@ -1343,11 +1367,21 @@ GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer); */ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window); +/*! @brief Sets the position callback for the specified window. + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or @c NULL to remove the currently set + * callback. + * @ingroup window + */ +GLFWAPI void glfwSetWindowPosCallback(GLFWwindow window, GLFWwindowposfun cbfun); + /*! @brief Sets the size callback for the specified window. * @param[in] window The window whose callback to set. * @param[in] cbfun The new callback, or @c NULL to remove the currently set * callback. * @ingroup window + * + * This callback is called when the window is resized. */ GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow window, GLFWwindowsizefun cbfun); @@ -1356,6 +1390,14 @@ GLFWAPI void glfwSetWindowSizeCallback(GLFWwindow window, GLFWwindowsizefun cbfu * @param[in] cbfun The new callback, or @c NULL to remove the currently set * callback. * @ingroup window + * + * This callback is called when the user attempts to close the window, i.e. + * clicks the window's close widget or, on Mac OS X, selects @b Quit from the + * application menu. Calling @ref glfwDestroyWindow does not cause this + * callback to be called. + * + * The return value of the close callback becomes the new value of the @ref + * GLFW_CLOSE_REQUESTED window parameter. */ GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow window, GLFWwindowclosefun cbfun); @@ -1364,6 +1406,13 @@ GLFWAPI void glfwSetWindowCloseCallback(GLFWwindow window, GLFWwindowclosefun cb * @param[in] cbfun The new callback, or @c NULL to remove the currently set * callback. * @ingroup window + * + * This callback is called when the client area of the window needs to be + * redrawn, for example if the window has been exposed after having been + * covered by another window. + * + * @note On compositing window systems such as Mac OS X, where the window + * contents are saved off-screen, this callback may never be called. */ GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow window, GLFWwindowrefreshfun cbfun); @@ -1372,6 +1421,8 @@ GLFWAPI void glfwSetWindowRefreshCallback(GLFWwindow window, GLFWwindowrefreshfu * @param[in] cbfun The new callback, or @c NULL to remove the currently set * callback. * @ingroup window + * + * This callback is called when the window gains or loses focus. */ GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow window, GLFWwindowfocusfun cbfun); @@ -1380,6 +1431,8 @@ GLFWAPI void glfwSetWindowFocusCallback(GLFWwindow window, GLFWwindowfocusfun cb * @param[in] cbfun The new callback, or @c NULL to remove the currently set * callback. * @ingroup window + * + * This callback is called when the window is iconified or restored. */ GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindow window, GLFWwindowiconifyfun cbfun); @@ -1478,7 +1531,7 @@ GLFWAPI void glfwGetScrollOffset(GLFWwindow window, double* xoffset, double* yof * set callback. * @ingroup input * - * @note The key callback deals with physical keys, with @link keys tokens + * @remarks The key callback deals with physical keys, with @link keys tokens * @endlink named after their use on the standard US keyboard layout. If you * want to input text, use the Unicode character callback instead. */ @@ -1489,8 +1542,8 @@ GLFWAPI void glfwSetKeyCallback(GLFWwindow window, GLFWkeyfun cbfun); * the currently set callback. * @ingroup input * - * @note The Unicode character callback is for text input. If you want to know - * whether a specific key was pressed or released, use the key callback. + * @remarks The Unicode character callback is for text input. If you want to + * know whether a specific key was pressed or released, use the key callback. */ GLFWAPI void glfwSetCharCallback(GLFWwindow window, GLFWcharfun cbfun); @@ -1505,6 +1558,9 @@ GLFWAPI void glfwSetMouseButtonCallback(GLFWwindow window, GLFWmousebuttonfun cb * @param[in] cbfun The new cursor position callback, or @c NULL to remove the * currently set callback. * @ingroup input + * + * @remarks The position is relative to the upper-left corner of the client + * area of the window. */ GLFWAPI void glfwSetCursorPosCallback(GLFWwindow window, GLFWcursorposfun cbfun); @@ -1552,11 +1608,24 @@ GLFWAPI int glfwGetJoystickAxes(int joy, float* axes, int numaxes); */ GLFWAPI int glfwGetJoystickButtons(int joy, unsigned char* buttons, int numbuttons); +/*! @brief Returns the name of the specified joystick. + * @param[in] joy The joystick to query. + * @return The UTF-8 encoded name of the joystick, or @c NULL if the joystick + * is not present. + * @ingroup input + * + * @note The returned string is valid only until the next call to @ref + * glfwGetJoystickName. + */ +GLFWAPI const char* glfwGetJoystickName(int joy); + /*! @brief Sets the clipboard to the specified string. * @param[in] window The window that will own the clipboard contents. * @param[in] string A UTF-8 encoded string. * @ingroup clipboard * + * @note This function may only be called from the main thread. + * * @sa glfwGetClipboardString */ GLFWAPI void glfwSetClipboardString(GLFWwindow window, const char* string); @@ -1567,6 +1636,8 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow window, const char* string); * if that format was unavailable. * @ingroup clipboard * + * @note This function may only be called from the main thread. + * * @note The returned string is valid only until the next call to @ref * glfwGetClipboardString or @ref glfwSetClipboardString. * diff --git a/readme.html b/readme.html index ec16bfc1..190b05f7 100644 --- a/readme.html +++ b/readme.html @@ -279,17 +279,21 @@ version of GLFW.

  • Added glfwSetErrorCallback function and GLFWerrorfun type for receiving more specific and/or nested errors
  • Added glfwSetWindowUserPointer and glfwGetWindowUserPointer functions for per-window user pointers
  • Added glfwGetVersionString function for determining which code paths were enabled at compile time
  • -
  • Added glfwGetWindowPos function for querying the position of the specified window
  • Added glfwGetWindowMonitor for querying the monitor, if any, of the specified window
  • +
  • Added glfwSetWindowPosCallback function and GLFWwindowposfun type for reciving window position events
  • Added glfwSetWindowFocusCallback function and GLFWwindowfocusfun type for receiving window focus events
  • Added glfwSetWindowIconifyCallback function and GLFWwindowiconifyfun type for receiving window iconification events
  • Added glfwGetClipboardString and glfwSetClipboardString functions for interacting with the system clipboard
  • +
  • Added glfwGetJoystickName for retrieving the name of a joystick
  • Added glfwGetCurrentContext function for retrieving the window whose OpenGL context is current
  • +
  • Added GLFW_SRGB_CAPABLE for requesting sRGB capable framebuffers
  • Added GLFW_CLIENT_API, GLFW_OPENGL_API and GLFW_OPENGL_ES_API for selecting client API
  • Added GLFW_OPENGL_ROBUSTNESS window hint and associated strategy tokens for GL_ARB_robustness support
  • Added GLFW_OPENGL_REVISION window parameter to make up for removal of glfwGetGLVersion
  • Added GLFW_INCLUDE_GLCOREARB macro for including glcorearb.h instead of gl.h
  • +
  • Added GLFW_INCLUDE_ES2 macro for telling the GLFW header to include the OpenGL ES 2.0 header instead of gl.h
  • Added GLFW_VISIBLE window hint and parameter for controlling and polling window visibility
  • +
  • Added GLFW_POSITION_X and GLFW_POSITION_Y window hints and parameter for controlling and polling window position
  • Added windows simple multi-window test program
  • Added sharing simple OpenGL object sharing test program
  • Added modes video mode enumeration and setting test program
  • diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 01feded5..05ee10e8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,43 +8,55 @@ if (MSVC) endif() set(common_HEADERS ${GLFW_SOURCE_DIR}/include/GL/glfw3.h internal.h) -set(common_SOURCES clipboard.c gamma.c init.c input.c joystick.c monitor.c - opengl.c time.c window.c) +set(common_SOURCES clipboard.c context.c gamma.c init.c input.c joystick.c + monitor.c time.c window.c) -if (_GLFW_COCOA_NSGL) +if (_GLFW_COCOA) set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h) set(glfw_SOURCES ${common_SOURCES} cocoa_clipboard.m cocoa_gamma.c - cocoa_init.m cocoa_joystick.m cocoa_monitor.m - cocoa_opengl.m cocoa_time.c cocoa_window.m) + cocoa_init.m cocoa_joystick.m cocoa_monitor.m cocoa_time.c + cocoa_window.m) if (GLFW_NATIVE_API) list(APPEND glfw_SOURCES cocoa_native.m) endif() - - # For some reason, CMake doesn't know about .m - set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C) -elseif (_GLFW_WIN32_WGL) +elseif (_GLFW_WIN32) set(glfw_HEADERS ${common_HEADERS} win32_platform.h) set(glfw_SOURCES ${common_SOURCES} win32_clipboard.c win32_gamma.c - win32_init.c win32_joystick.c win32_monitor.c - win32_opengl.c win32_time.c win32_window.c) + win32_init.c win32_joystick.c win32_monitor.c win32_time.c + win32_window.c) if (GLFW_NATIVE_API) list(APPEND glfw_SOURCES win32_native.c) endif() -elseif (_GLFW_X11_GLX) +elseif (_GLFW_X11) set(glfw_HEADERS ${common_HEADERS} x11_platform.h) set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_gamma.c x11_init.c x11_joystick.c x11_keysym2unicode.c x11_monitor.c - x11_opengl.c x11_time.c x11_window.c) + x11_time.c x11_window.c) if (GLFW_NATIVE_API) list(APPEND glfw_SOURCES x11_native.c) endif() endif() -if (MSVC) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) +if (_GLFW_EGL) + list(APPEND glfw_HEADERS ${common_HEADERS} egl_platform.h) + list(APPEND glfw_SOURCES ${common_SOURCES} egl_context.c) +elseif (_GLFW_NSGL) + list(APPEND glfw_HEADERS ${common_HEADERS} nsgl_platform.h) + list(APPEND glfw_SOURCES ${common_SOURCES} nsgl_context.m) +elseif (_GLFW_WGL) + list(APPEND glfw_HEADERS ${common_HEADERS} wgl_platform.h) + list(APPEND glfw_SOURCES ${common_SOURCES} wgl_context.c) +elseif (_GLFW_X11) + list(APPEND glfw_HEADERS ${common_HEADERS} glx_platform.h) + list(APPEND glfw_SOURCES ${common_SOURCES} glx_context.c) +endif() + +if (APPLE) + # For some reason, CMake doesn't know about .m + set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C) endif() add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS}) @@ -57,7 +69,7 @@ if (BUILD_SHARED_LIBS) set_target_properties(glfw PROPERTIES SOVERSION ${GLFW_VERSION_MAJOR}) endif() - if (_GLFW_WIN32_WGL) + if (WIN32) # The GLFW DLL needs a special compile-time macro and import library name set_target_properties(glfw PROPERTIES PREFIX "" IMPORT_PREFIX "") @@ -66,8 +78,9 @@ if (BUILD_SHARED_LIBS) else() set_target_properties(glfw PROPERTIES IMPORT_SUFFIX "dll.lib") endif() - elseif (_GLFW_COCOA_NSGL) - # Append -fno-common to the compile flags to work around a bug in the Apple GCC + elseif (APPLE) + # Append -fno-common to the compile flags to work around a bug in + # Apple's GCC get_target_property(glfw_CFLAGS glfw COMPILE_FLAGS) if (NOT glfw_CFLAGS) set(glfw_CFLAGS "") diff --git a/src/cocoa_joystick.m b/src/cocoa_joystick.m index 04c9e972..e7d5cc81 100644 --- a/src/cocoa_joystick.m +++ b/src/cocoa_joystick.m @@ -68,7 +68,7 @@ typedef struct typedef struct { int present; - char product[256]; + char name[256]; IOHIDDeviceInterface** interface; @@ -443,9 +443,9 @@ void _glfwInitJoysticks(void) if (refCF) { CFStringGetCString(refCF, - (char*) &(joystick->product), - 256, - CFStringGetSystemEncoding()); + joystick->name, + sizeof(joystick->name), + kCFStringEncodingUTF8); } joystick->numAxes = 0; @@ -625,3 +625,13 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, return button; } + +//======================================================================== +// Get joystick name +//======================================================================== + +const char* _glfwPlatformGetJoystickName(int joy) +{ + return _glfwJoysticks[joy].name; +} + diff --git a/src/cocoa_platform.h b/src/cocoa_platform.h index b723990b..51fecbbe 100644 --- a/src/cocoa_platform.h +++ b/src/cocoa_platform.h @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: Cocoa/NSOpenGL +// Platform: Cocoa // API Version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -27,13 +27,12 @@ // //======================================================================== -#ifndef _platform_h_ -#define _platform_h_ +#ifndef _cocoa_platform_h_ +#define _cocoa_platform_h_ #include - #if defined(__OBJC__) #import #else @@ -41,12 +40,15 @@ typedef void* id; #endif +#if defined(_GLFW_NSGL) + #include "nsgl_platform.h" +#else + #error "No supported context creation API selected" +#endif -#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorNS NS -#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS NS -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL NSGL +#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS NS #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS NS -#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryNSGL NSGL +#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorNS NS //======================================================================== @@ -59,16 +61,6 @@ typedef void* id; typedef intptr_t GLFWintptr; -//------------------------------------------------------------------------ -// Platform-specific OpenGL context structure -//------------------------------------------------------------------------ -typedef struct _GLFWcontextNSGL -{ - id pixelFormat; - id context; -} _GLFWcontextNSGL; - - //------------------------------------------------------------------------ // Platform-specific window structure //------------------------------------------------------------------------ @@ -110,16 +102,6 @@ typedef struct _GLFWmonitorNS } _GLFWmonitorNS; -//------------------------------------------------------------------------ -// Platform-specific library global data for NSGL -//------------------------------------------------------------------------ -typedef struct _GLFWlibraryNSGL -{ - // dlopen handle for dynamically loading OpenGL extension entry points - void* framework; -} _GLFWlibraryNSGL; - - //======================================================================== // Prototypes for platform specific internal functions //======================================================================== @@ -139,4 +121,4 @@ void _glfwRestoreVideoMode(void); int _glfwInitOpenGL(void); void _glfwTerminateOpenGL(void); -#endif // _platform_h_ +#endif // _cocoa_platform_h_ diff --git a/src/cocoa_window.m b/src/cocoa_window.m index cae5b572..d8f5a4ed 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -835,6 +835,9 @@ static GLboolean createContext(_GLFWwindow* window, ADD_ATTR2(NSOpenGLPFASamples, fbconfig->samples); } + // NOTE: All NSOpenGLPixelFormats on the relevant cards support sRGB + // frambuffer, so there's no need (and no way) to request it + ADD_ATTR(0); #undef ADD_ATTR diff --git a/src/config.h.in b/src/config.h.in index 4a8c1e3f..d391fcdf 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -35,12 +35,21 @@ // it. Instead, you should modify the config.h.in file. //======================================================================== -// Define this to 1 if building GLFW for X11/GLX -#cmakedefine _GLFW_X11_GLX -// Define this to 1 if building GLFW for Win32/WGL -#cmakedefine _GLFW_WIN32_WGL -// Define this to 1 if building GLFW for Cocoa/NSOpenGL -#cmakedefine _GLFW_COCOA_NSGL +// Define this to 1 if building GLFW for X11 +#cmakedefine _GLFW_X11 +// Define this to 1 if building GLFW for Win32 +#cmakedefine _GLFW_WIN32 +// Define this to 1 if building GLFW for Cocoa +#cmakedefine _GLFW_COCOA + +// Define this to 1 if building GLFW for EGL +#cmakedefine _GLFW_EGL +// Define this to 1 if building GLFW for GLX +#cmakedefine _GLFW_GLX +// Define this to 1 if building GLFW for WGL +#cmakedefine _GLFW_WGL +// Define this to 1 if building GLFW for NSGL +#cmakedefine _GLFW_NSGL // Define this to 1 if building as a shared library / dynamic library / DLL #cmakedefine _GLFW_BUILD_DLL @@ -63,6 +72,9 @@ // Define this to 1 if glXGetProcAddressEXT is available #cmakedefine _GLFW_HAS_GLXGETPROCADDRESSEXT +// Define this to 1 if eglGetProcAddress is available +#cmakedefine _GLFW_HAS_EGLGETPROCADDRESS + // The GLFW version as used by glfwGetVersionString #define _GLFW_VERSION_FULL "@GLFW_VERSION_FULL@" diff --git a/src/opengl.c b/src/context.c similarity index 97% rename from src/opengl.c rename to src/context.c index 538bcdfb..eec07205 100644 --- a/src/opengl.c +++ b/src/context.c @@ -33,6 +33,7 @@ #include #include #include +#include //======================================================================== @@ -217,6 +218,12 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired, extraDiff += (desired->samples - current->samples) * (desired->samples - current->samples); } + + if (desired->sRGB) + { + if (!current->sRGB) + extraDiff++; + } } // Figure out if the current one is better than the best one found so far @@ -247,8 +254,8 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired, //======================================================================== -// Checks whether the OpenGL part of the window config is sane -// It blames glfwCreateWindow because that's the only caller +// Checks whether the client API part of the window config is sane +// It blames glfwOpenWindow because that's the only caller //======================================================================== GLboolean _glfwIsValidContextConfig(_GLFWwndconfig* wndconfig) @@ -482,7 +489,7 @@ GLboolean _glfwIsValidContext(_GLFWwndconfig* wndconfig) //======================================================================== -// Check if a string can be found in an OpenGL extension string +// Check if a string can be found in a client API extension string //======================================================================== int _glfwStringInExtensionString(const char* string, @@ -521,7 +528,7 @@ int _glfwStringInExtensionString(const char* string, ////////////////////////////////////////////////////////////////////////// //======================================================================== -// Make the OpenGL context associated with the specified window current +// Make the context associated with the specified window current //======================================================================== GLFWAPI void glfwMakeContextCurrent(GLFWwindow handle) @@ -542,7 +549,7 @@ GLFWAPI void glfwMakeContextCurrent(GLFWwindow handle) //======================================================================== -// Return the window object whose context is current +// Returns the window whose context is current //======================================================================== GLFWAPI GLFWwindow glfwGetCurrentContext(void) @@ -598,7 +605,7 @@ GLFWAPI void glfwSwapInterval(int interval) //======================================================================== -// Check if an OpenGL extension is available at runtime +// Check if a client API extension is available at runtime //======================================================================== GLFWAPI int glfwExtensionSupported(const char* extension) @@ -661,8 +668,8 @@ GLFWAPI int glfwExtensionSupported(const char* extension) //======================================================================== -// Get the function pointer to an OpenGL function. -// This function can be used to get access to extended OpenGL functions. +// Get the function pointer to a client API function +// This can be used to get access to client API extension functions //======================================================================== GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname) diff --git a/src/egl_context.c b/src/egl_context.c new file mode 100644 index 00000000..3c164520 --- /dev/null +++ b/src/egl_context.c @@ -0,0 +1,595 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: EGL +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "internal.h" + +#include +#include + + +//======================================================================== +// Thread local storage attribute macro +//======================================================================== +#if defined(_MSC_VER) + #define _GLFW_TLS __declspec(thread) +#elif defined(__GNUC__) + #define _GLFW_TLS __thread +#else + #define _GLFW_TLS +#endif + + +//======================================================================== +// The per-thread current context/window pointer +//======================================================================== +static _GLFW_TLS _GLFWwindow* _glfwCurrentWindow = NULL; + + +//======================================================================== +// Returns the specified attribute of the specified EGLConfig +//======================================================================== + +static int getConfigAttrib(EGLConfig config, int attrib) +{ + int value; + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, attrib, &value); + return value; +} + + +//======================================================================== +// Return a list of available and usable framebuffer configs +//======================================================================== + +static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, + const _GLFWwndconfig* wndconfig, + unsigned int* found) +{ + EGLConfig* configs; + _GLFWfbconfig* result; + int i, count = 0; + + *found = 0; + + eglGetConfigs(_glfwLibrary.EGL.display, NULL, 0, &count); + + configs = (EGLConfig*) malloc(sizeof(EGLConfig) * count); + if (!configs) + { + _glfwSetError(GLFW_OUT_OF_MEMORY, NULL); + return NULL; + } + + eglGetConfigs(_glfwLibrary.EGL.display, configs, count, &count); + if (!count) + { + free(configs); + + _glfwSetError(GLFW_API_UNAVAILABLE, + "EGL: No EGLConfigs returned"); + return NULL; + } + + result = (_GLFWfbconfig*) malloc(sizeof(_GLFWfbconfig) * count); + if (!result) + { + free(configs); + + _glfwSetError(GLFW_OUT_OF_MEMORY, NULL); + return NULL; + } + + for (i = 0; i < count; i++) + { + _GLFWfbconfig* f = result + *found; + + if (!getConfigAttrib(configs[i], EGL_NATIVE_VISUAL_ID)) + { + // Only consider EGLConfigs with associated visuals + continue; + } + + if (!(getConfigAttrib(configs[i], EGL_COLOR_BUFFER_TYPE) & EGL_RGB_BUFFER)) + { + // Only consider RGB(A) EGLConfigs + continue; + } + + if (!(getConfigAttrib(configs[i], EGL_SURFACE_TYPE) & EGL_WINDOW_BIT)) + { + // Only consider window EGLConfigs + continue; + } + + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + { + if (wndconfig->glMajor == 1) + { + if (!(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES_BIT)) + continue; + } + else + { + if (!(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT)) + continue; + } + } + else if (wndconfig->clientAPI == GLFW_OPENGL_API) + { + if (!(getConfigAttrib(configs[i], EGL_RENDERABLE_TYPE) & EGL_OPENGL_BIT)) + continue; + } + + f->redBits = getConfigAttrib(configs[i], EGL_RED_SIZE); + f->greenBits = getConfigAttrib(configs[i], EGL_GREEN_SIZE); + f->blueBits = getConfigAttrib(configs[i], EGL_BLUE_SIZE); + + f->alphaBits = getConfigAttrib(configs[i], EGL_ALPHA_SIZE); + f->depthBits = getConfigAttrib(configs[i], EGL_DEPTH_SIZE); + f->stencilBits = getConfigAttrib(configs[i], EGL_STENCIL_SIZE); + + f->samples = getConfigAttrib(configs[i], EGL_SAMPLES); + + // NOTE: There does not appear to be any way to request sRGB + // framebuffers for OpenGL or GLES contexts; only for OpenVG ones + f->sRGB = GL_FALSE; + + f->platformID = (GLFWintptr) getConfigAttrib(configs[i], EGL_CONFIG_ID); + + (*found)++; + } + + free(configs); + return result; +} + + +//======================================================================== +// Create the actual OpenGL(|ES) context +//======================================================================== + +#define setEGLattrib(attribs, index, attribName, attribValue) \ +{ \ + attribs[index++] = attribName; \ + attribs[index++] = attribValue; \ +} + +static int createContext(_GLFWwindow* window, + const _GLFWwndconfig* wndconfig, + EGLint fbconfigID) +{ + int attribs[40]; + EGLint count, index; + EGLConfig config; + EGLContext share = NULL; + + if (wndconfig->share) + share = wndconfig->share->EGL.context; + + // Retrieve the previously selected EGLConfig + { + index = 0; + + setEGLattrib(attribs, index, EGL_CONFIG_ID, fbconfigID); + setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); + + eglChooseConfig(_glfwLibrary.EGL.display, attribs, &config, 1, &count); + if (!count) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "EGL: Failed to retrieve the selected EGLConfig"); + return GL_FALSE; + } + } + + // Retrieve the corresponding visual + // NOTE: This is the only non-portable code in this file. + // Maybe it would not hurt too much to add #ifdefs for different platforms? +#if defined(_GLFW_X11) + { + int mask; + EGLint redBits, greenBits, blueBits, alphaBits, visualID = 0; + XVisualInfo info; + + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_NATIVE_VISUAL_ID, &visualID); + + info.screen = _glfwLibrary.X11.screen; + mask = VisualScreenMask; + + if (visualID) + { + // The X window visual must match the EGL config + info.visualid = visualID; + mask |= VisualIDMask; + } + else + { + // some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID + // attribute, so attempt to find the closest match. + + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_RED_SIZE, &redBits); + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_GREEN_SIZE, &greenBits); + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_BLUE_SIZE, &blueBits); + eglGetConfigAttrib(_glfwLibrary.EGL.display, config, + EGL_ALPHA_SIZE, &alphaBits); + + info.depth = redBits + greenBits + blueBits + alphaBits; + mask |= VisualDepthMask; + } + + window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, + mask, &info, &count); + + if (window->EGL.visual == NULL) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "EGL: Failed to retrieve visual for EGLConfig"); + return GL_FALSE; + } + } +#endif + + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + { + if (!eglBindAPI(EGL_OPENGL_ES_API)) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "EGL: OpenGL ES is not supported"); + return GL_FALSE; + } + } + else + { + if (!eglBindAPI(EGL_OPENGL_API)) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "EGL: OpenGL is not supported"); + return GL_FALSE; + } + } + + index = 0; + + if (_glfwLibrary.EGL.KHR_create_context) + { + setEGLattrib(attribs, index, EGL_CONTEXT_MAJOR_VERSION_KHR, wndconfig->glMajor); + setEGLattrib(attribs, index, EGL_CONTEXT_MINOR_VERSION_KHR, wndconfig->glMinor); + + if (wndconfig->glForward || wndconfig->glDebug || wndconfig->glRobustness) + { + int flags = 0; + + if (wndconfig->glForward) + flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; + + if (wndconfig->glDebug) + flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR; + + if (wndconfig->glRobustness) + flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR; + + setEGLattrib(attribs, index, EGL_CONTEXT_FLAGS_KHR, flags); + } + + if (wndconfig->glProfile) + { + int flags = 0; + + if (wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE) + flags = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; + else if (wndconfig->glProfile == GLFW_OPENGL_COMPAT_PROFILE) + flags = EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; + + setEGLattrib(attribs, index, EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, flags); + } + + if (wndconfig->glRobustness) + { + int strategy; + + if (wndconfig->glRobustness == GLFW_OPENGL_NO_RESET_NOTIFICATION) + strategy = EGL_NO_RESET_NOTIFICATION_KHR; + else if (wndconfig->glRobustness == GLFW_OPENGL_LOSE_CONTEXT_ON_RESET) + strategy = EGL_LOSE_CONTEXT_ON_RESET_KHR; + + setEGLattrib(attribs, index, EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR, strategy); + } + } + else + { + if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) + setEGLattrib(attribs, index, EGL_CONTEXT_CLIENT_VERSION, wndconfig->glMajor); + } + + setEGLattrib(attribs, index, EGL_NONE, EGL_NONE); + + window->EGL.context = eglCreateContext(_glfwLibrary.EGL.display, + config, share, attribs); + + if (window->EGL.context == EGL_NO_CONTEXT) + { + // TODO: Handle all the various error codes here + + _glfwSetError(GLFW_PLATFORM_ERROR, + "EGL: Failed to create context"); + return GL_FALSE; + } + + window->EGL.config = config; + + return GL_TRUE; +} + +#undef setEGLattrib + + +////////////////////////////////////////////////////////////////////////// +////// GLFW internal API ////// +////////////////////////////////////////////////////////////////////////// + +//======================================================================== +// Initialize EGL +//======================================================================== + +int _glfwInitOpenGL(void) +{ +#ifdef _GLFW_DLOPEN_LIBEGL + int i; + char* libEGL_names[ ] = + { + "libEGL.so", + "libEGL.so.1", + "/usr/lib/libEGL.so", + "/usr/lib/libEGL.so.1", + NULL + }; + + for (i = 0; libEGL_names[i] != NULL; i++) + { + _glfwLibrary.EGL.libEGL = dlopen(libEGL_names[i], RTLD_LAZY | RTLD_GLOBAL); + if (_glfwLibrary.EGL.libEGL) + break; + } + + if (!_glfwLibrary.EGL.libEGL) + { + _glfwSetError(GLFW_PLATFORM_ERROR, "EGL: Failed to find libEGL"); + return GL_FALSE; + } +#endif + + _glfwLibrary.EGL.display = eglGetDisplay(_GLFW_EGL_NATIVE_DISPLAY); + if (_glfwLibrary.EGL.display == EGL_NO_DISPLAY) + { + _glfwSetError(GLFW_API_UNAVAILABLE, + "EGL: Failed to get EGL display"); + return GL_FALSE; + } + + if (!eglInitialize(_glfwLibrary.EGL.display, + &_glfwLibrary.EGL.majorVersion, + &_glfwLibrary.EGL.minorVersion)) + { + _glfwSetError(GLFW_API_UNAVAILABLE, + "EGL: Failed to initialize EGL"); + return GL_FALSE; + } + + if (_glfwPlatformExtensionSupported("EGL_KHR_create_context")) + _glfwLibrary.EGL.KHR_create_context = GL_TRUE; + + return GL_TRUE; +} + + +//======================================================================== +// Terminate EGL +//======================================================================== + +void _glfwTerminateOpenGL(void) +{ +#ifdef _GLFW_DLOPEN_LIBEGL + if (_glfwLibrary.EGL.libEGL != NULL) + { + dlclose(_glfwLibrary.EGL.libEGL); + _glfwLibrary.EGL.libEGL = NULL; + } +#endif + + eglTerminate(_glfwLibrary.EGL.display); +} + + +//======================================================================== +// Prepare for creation of the OpenGL context +//======================================================================== + +int _glfwCreateContext(_GLFWwindow* window, + const _GLFWwndconfig* wndconfig, + const _GLFWfbconfig* fbconfig) +{ + _GLFWfbconfig closest; + + // Choose the best available fbconfig + { + unsigned int fbcount; + _GLFWfbconfig* fbconfigs; + const _GLFWfbconfig* result; + + fbconfigs = getFBConfigs(window, wndconfig, &fbcount); + if (!fbconfigs) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "EGL: No usable EGLFBConfigs found"); + return GL_FALSE; + } + + result = _glfwChooseFBConfig(fbconfig, fbconfigs, fbcount); + if (!result) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "EGL: No EGLFBConfig matched the criteria"); + + free(fbconfigs); + return GL_FALSE; + } + + closest = *result; + free(fbconfigs); + } + + return createContext(window, wndconfig, closest.platformID); +} + + +//======================================================================== +// Destroy the OpenGL context +//======================================================================== + +void _glfwDestroyContext(_GLFWwindow* window) +{ + if (window->EGL.visual) + { + XFree(window->EGL.visual); + window->EGL.visual = NULL; + } + + if (window->EGL.surface) + { + eglDestroySurface(_glfwLibrary.EGL.display, window->EGL.surface); + window->EGL.surface = EGL_NO_SURFACE; + } + + if (window->EGL.context) + { + eglDestroyContext(_glfwLibrary.EGL.display, window->EGL.context); + window->EGL.context = EGL_NO_CONTEXT; + } +} + + +//======================================================================== +// Make the OpenGL context associated with the specified window current +//======================================================================== + +void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) +{ + if (window) + { + if (window->EGL.surface == EGL_NO_SURFACE) + { + window->EGL.surface = eglCreateWindowSurface(_glfwLibrary.EGL.display, + window->EGL.config, + _GLFW_EGL_NATIVE_WINDOW, + NULL); + if (window->EGL.surface == EGL_NO_SURFACE) + { + _glfwSetError(GLFW_PLATFORM_ERROR, + "EGL: Failed to create window surface"); + } + } + + eglMakeCurrent(_glfwLibrary.EGL.display, + window->EGL.surface, + window->EGL.surface, + window->EGL.context); + } + else + { + eglMakeCurrent(_glfwLibrary.EGL.display, + EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + } + + _glfwCurrentWindow = window; +} + + +//======================================================================== +// Return the window object whose context is current +//======================================================================== + +_GLFWwindow* _glfwPlatformGetCurrentContext(void) +{ + return _glfwCurrentWindow; +} + + +//======================================================================== +// Swap OpenGL buffers +//======================================================================== + +void _glfwPlatformSwapBuffers(_GLFWwindow* window) +{ + eglSwapBuffers(_glfwLibrary.EGL.display, window->EGL.surface); +} + + +//======================================================================== +// Set double buffering swap interval +//======================================================================== + +void _glfwPlatformSwapInterval(int interval) +{ + eglSwapInterval(_glfwLibrary.EGL.display, interval); +} + + +//======================================================================== +// Check if an OpenGL extension is available at runtime +//======================================================================== + +int _glfwPlatformExtensionSupported(const char* extension) +{ + const char* extensions; + + extensions = eglQueryString(_glfwLibrary.EGL.display, EGL_EXTENSIONS); + if (extensions != NULL) + { + if (_glfwStringInExtensionString(extension, (unsigned char*) extensions)) + return GL_TRUE; + } + + return GL_FALSE; +} + + +//======================================================================== +// Get the function pointer to an OpenGL function +//======================================================================== + +GLFWglproc _glfwPlatformGetProcAddress(const char* procname) +{ + return _glfw_eglGetProcAddress(procname); +} + diff --git a/src/egl_platform.h b/src/egl_platform.h new file mode 100644 index 00000000..e416871c --- /dev/null +++ b/src/egl_platform.h @@ -0,0 +1,96 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: EGL +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef _egl_platform_h_ +#define _egl_platform_h_ + +#include + +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of eglext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/eglext.h" + +// Do we have support for dlopen/dlsym? +#if defined(_GLFW_HAS_DLOPEN) + #include +#endif + +// We support two different ways for getting addresses for EGL +// extension functions: eglGetProcAddress and dlsym +#if defined(_GLFW_HAS_EGLGETPROCADDRESS) + #define _glfw_eglGetProcAddress(x) eglGetProcAddress(x) +#elif defined(_GLFW_HAS_DLOPEN) + #define _glfw_eglGetProcAddress(x) dlsym(_glfwLibrary.EGL.libEGL, x) + #define _GLFW_DLOPEN_LIBEGL +#else + #error "No OpenGL entry point retrieval mechanism was enabled" +#endif + +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextEGL EGL +#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryEGL EGL + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Platform-specific OpenGL context structure +//------------------------------------------------------------------------ +typedef struct _GLFWcontextEGL +{ + EGLConfig config; + EGLContext context; + EGLSurface surface; + +#if defined(_GLFW_X11) + XVisualInfo* visual; +#endif +} _GLFWcontextEGL; + + +//------------------------------------------------------------------------ +// Platform-specific library global data for EGL +//------------------------------------------------------------------------ +typedef struct _GLFWlibraryEGL +{ + EGLDisplay display; + EGLint majorVersion, minorVersion; + + GLboolean KHR_create_context; + +#if defined(_GLFW_DLOPEN_LIBEGL) + void* libEGL; // dlopen handle for libEGL.so +#endif +} _GLFWlibraryEGL; + + +#endif // _egl_platform_h_ diff --git a/src/x11_opengl.c b/src/glx_context.c similarity index 98% rename from src/x11_opengl.c rename to src/glx_context.c index ad77805a..a8b4a189 100644 --- a/src/x11_opengl.c +++ b/src/glx_context.c @@ -190,6 +190,11 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) else f->samples = 0; + if (_glfwLibrary.GLX.ARB_framebuffer_sRGB) + f->sRGB = getFBConfigAttrib(window, fbconfigs[i], GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB); + else + f->sRGB = GL_FALSE; + f->platformID = (GLFWintptr) getFBConfigAttrib(window, fbconfigs[i], GLX_FBCONFIG_ID); (*found)++; @@ -527,6 +532,9 @@ int _glfwInitOpenGL(void) if (_glfwPlatformExtensionSupported("GLX_ARB_multisample")) _glfwLibrary.GLX.ARB_multisample = GL_TRUE; + if (_glfwPlatformExtensionSupported("GLX_ARB_framebuffer_sRGB")) + _glfwLibrary.GLX.ARB_framebuffer_sRGB = GL_TRUE; + if (_glfwPlatformExtensionSupported("GLX_ARB_create_context")) { _glfwLibrary.GLX.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) @@ -624,16 +632,6 @@ void _glfwDestroyContext(_GLFWwindow* window) } -//======================================================================== -// Return the X visual associated with the specified context -//======================================================================== - -XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window) -{ - return window->GLX.visual; -} - - ////////////////////////////////////////////////////////////////////////// ////// GLFW platform API ////// ////////////////////////////////////////////////////////////////////////// diff --git a/src/glx_platform.h b/src/glx_platform.h new file mode 100644 index 00000000..d1a7c963 --- /dev/null +++ b/src/glx_platform.h @@ -0,0 +1,120 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: X11/GLX +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef _x11_glx_platform_h_ +#define _x11_glx_platform_h_ + +#define GLX_GLXEXT_LEGACY +#include + +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of glxext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/glxext.h" + +// Do we have support for dlopen/dlsym? +#if defined(_GLFW_HAS_DLOPEN) + #include +#endif + +// We support four different ways for getting addresses for GL/GLX +// extension functions: glXGetProcAddress, glXGetProcAddressARB, +// glXGetProcAddressEXT, and dlsym +#if defined(_GLFW_HAS_GLXGETPROCADDRESSARB) + #define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x) +#elif defined(_GLFW_HAS_GLXGETPROCADDRESS) + #define _glfw_glXGetProcAddress(x) glXGetProcAddress(x) +#elif defined(_GLFW_HAS_GLXGETPROCADDRESSEXT) + #define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x) +#elif defined(_GLFW_HAS_DLOPEN) + #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibrary.GLX.libGL, x) + #define _GLFW_DLOPEN_LIBGL +#else + #error "No OpenGL entry point retrieval mechanism was enabled" +#endif + +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextGLX GLX +#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryGLX GLX + +#ifndef GLX_MESA_swap_control +typedef int (*PFNGLXSWAPINTERVALMESAPROC)(int); +#endif + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Platform-specific OpenGL context structure +//------------------------------------------------------------------------ +typedef struct _GLFWcontextGLX +{ + GLXContext context; // OpenGL rendering context + XVisualInfo* visual; // Visual for selected GLXFBConfig + +} _GLFWcontextGLX; + + +//------------------------------------------------------------------------ +// Platform-specific library global data for GLX +//------------------------------------------------------------------------ +typedef struct _GLFWlibraryGLX +{ + // Server-side GLX version + int majorVersion, minorVersion; + + // GLX extensions + PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI; + PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT; + PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA; + PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX; + PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX; + PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX; + PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GetVisualFromFBConfigSGIX; + PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; + GLboolean SGIX_fbconfig; + GLboolean SGI_swap_control; + GLboolean EXT_swap_control; + GLboolean MESA_swap_control; + GLboolean ARB_multisample; + GLboolean ARB_framebuffer_sRGB; + GLboolean ARB_create_context; + GLboolean ARB_create_context_profile; + GLboolean ARB_create_context_robustness; + GLboolean EXT_create_context_es2_profile; + +#if defined(_GLFW_DLOPEN_LIBGL) + void* libGL; // dlopen handle for libGL.so +#endif +} _GLFWlibraryGLX; + + +#endif // _x11_glx_platform_h_ diff --git a/src/internal.h b/src/internal.h index 828334aa..1ca3b111 100644 --- a/src/internal.h +++ b/src/internal.h @@ -66,14 +66,14 @@ typedef struct _GLFWmonitor _GLFWmonitor; // extensions and not all operating systems come with an up-to-date version #include "../support/GL/glext.h" -#if defined(_GLFW_COCOA_NSGL) +#if defined(_GLFW_COCOA) #include "cocoa_platform.h" -#elif defined(_GLFW_WIN32_WGL) +#elif defined(_GLFW_WIN32) #include "win32_platform.h" -#elif defined(_GLFW_X11_GLX) +#elif defined(_GLFW_X11) #include "x11_platform.h" #else - #error "No supported platform selected" + #error "No supported window creation API selected" #endif @@ -101,6 +101,7 @@ struct _GLFWhints GLboolean resizable; GLboolean visible; int samples; + GLboolean sRGB; int clientAPI; int glMajor; int glMinor; @@ -161,6 +162,7 @@ struct _GLFWfbconfig int auxBuffers; GLboolean stereo; int samples; + GLboolean sRGB; GLFWintptr platformID; }; @@ -201,6 +203,7 @@ struct _GLFWwindow int glRobustness; PFNGLGETSTRINGIPROC GetStringi; + GLFWwindowposfun windowPosCallback; GLFWwindowsizefun windowSizeCallback; GLFWwindowclosefun windowCloseCallback; GLFWwindowrefreshfun windowRefreshCallback; @@ -314,6 +317,7 @@ const char* _glfwPlatformGetClipboardString(_GLFWwindow* window); int _glfwPlatformGetJoystickParam(int joy, int param); int _glfwPlatformGetJoystickAxes(int joy, float* axes, int numaxes); int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, int numbuttons); +const char* _glfwPlatformGetJoystickName(int joy); // Time input double _glfwPlatformGetTime(void); diff --git a/src/joystick.c b/src/joystick.c index 84763951..9c20303d 100644 --- a/src/joystick.c +++ b/src/joystick.c @@ -126,3 +126,25 @@ GLFWAPI int glfwGetJoystickButtons(int joy, return _glfwPlatformGetJoystickButtons(joy, buttons, numbuttons); } + +//======================================================================== +// Get joystick name +//======================================================================== + +GLFWAPI const char* glfwGetJoystickName(int joy) +{ + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return NULL; + } + + if (joy < 0 || joy > GLFW_JOYSTICK_LAST) + { + _glfwSetError(GLFW_INVALID_ENUM, NULL); + return NULL; + } + + return _glfwPlatformGetJoystickName(joy); +} + diff --git a/src/cocoa_opengl.m b/src/nsgl_context.m similarity index 100% rename from src/cocoa_opengl.m rename to src/nsgl_context.m diff --git a/src/nsgl_platform.h b/src/nsgl_platform.h new file mode 100644 index 00000000..34ea0fb6 --- /dev/null +++ b/src/nsgl_platform.h @@ -0,0 +1,62 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: NSOpenGL +// API Version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef _nsgl_platform_h_ +#define _nsgl_platform_h_ + + +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL NSGL +#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryNSGL NSGL + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Platform-specific OpenGL context structure +//------------------------------------------------------------------------ +typedef struct _GLFWcontextNSGL +{ + id pixelFormat; + id context; +} _GLFWcontextNSGL; + + +//------------------------------------------------------------------------ +// Platform-specific library global data for NSGL +//------------------------------------------------------------------------ +typedef struct _GLFWlibraryNSGL +{ + // dlopen handle for dynamically loading OpenGL extension entry points + void* framework; +} _GLFWlibraryNSGL; + + +#endif // _nsgl_platform_h_ diff --git a/src/win32_opengl.c b/src/wgl_context.c similarity index 97% rename from src/win32_opengl.c rename to src/wgl_context.c index f1e911f3..80d7470e 100644 --- a/src/win32_opengl.c +++ b/src/wgl_context.c @@ -72,6 +72,7 @@ static void initWGLExtensions(_GLFWwindow* window) // This needs to include every extension used below except for // WGL_ARB_extensions_string and WGL_EXT_extensions_string window->WGL.ARB_multisample = GL_FALSE; + window->WGL.ARB_framebuffer_sRGB = GL_FALSE; window->WGL.ARB_create_context = GL_FALSE; window->WGL.ARB_create_context_profile = GL_FALSE; window->WGL.EXT_create_context_es2_profile = GL_FALSE; @@ -92,6 +93,9 @@ static void initWGLExtensions(_GLFWwindow* window) if (_glfwPlatformExtensionSupported("WGL_ARB_multisample")) window->WGL.ARB_multisample = GL_TRUE; + if (_glfwPlatformExtensionSupported("WGL_ARB_framebuffer_sRGB")) + window->WGL.ARB_framebuffer_sRGB = GL_TRUE; + if (_glfwPlatformExtensionSupported("WGL_ARB_create_context")) { window->WGL.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) @@ -246,6 +250,11 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) f->samples = getPixelFormatAttrib(window, i, WGL_SAMPLES_ARB); else f->samples = 0; + + if (window->WGL.ARB_framebuffer_sRGB) + f->sRGB = getPixelFormatAttrib(window, i, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB); + else + f->sRGB = GL_FALSE; } else { @@ -293,6 +302,9 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window, unsigned int* found) // PFD pixel formats do not support FSAA f->samples = 0; + + // PFD pixel formats do not support sRGB + f->sRGB = GL_FALSE; } f->platformID = i; diff --git a/src/wgl_platform.h b/src/wgl_platform.h new file mode 100644 index 00000000..ef815dfd --- /dev/null +++ b/src/wgl_platform.h @@ -0,0 +1,84 @@ +//======================================================================== +// GLFW - An OpenGL library +// Platform: WGL +// API version: 3.0 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef _wgl_platform_h_ +#define _wgl_platform_h_ + +// This path may need to be changed if you build GLFW using your own setup +// We ship and use our own copy of wglext.h since GLFW uses fairly new +// extensions and not all operating systems come with an up-to-date version +#include "../support/GL/wglext.h" + + +#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextWGL WGL +#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryWGL WGL + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Platform-specific OpenGL context structure +//------------------------------------------------------------------------ +typedef struct _GLFWcontextWGL +{ + // Platform specific window resources + HDC DC; // Private GDI device context + HGLRC context; // Permanent rendering context + + // Platform specific extensions (context specific) + PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT; + PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB; + PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT; + PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB; + PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; + GLboolean EXT_swap_control; + GLboolean ARB_multisample; + GLboolean ARB_framebuffer_sRGB; + GLboolean ARB_pixel_format; + GLboolean ARB_create_context; + GLboolean ARB_create_context_profile; + GLboolean EXT_create_context_es2_profile; + GLboolean ARB_create_context_robustness; +} _GLFWcontextWGL; + + +//------------------------------------------------------------------------ +// Platform-specific library global data for WGL +//------------------------------------------------------------------------ +typedef struct _GLFWlibraryWGL +{ + int dummy; + +} _GLFWlibraryWGL; + + +#endif // _wgl_platform_h_ diff --git a/src/win32_init.c b/src/win32_init.c index 21de415b..62d6c94b 100644 --- a/src/win32_init.c +++ b/src/win32_init.c @@ -232,6 +232,11 @@ int _glfwPlatformTerminate(void) const char* _glfwPlatformGetVersionString(void) { const char* version = _GLFW_VERSION_FULL +#if defined(_GLFW_WGL) + " WGL" +#elif defined(_GLFW_EGL) + " EGL" +#endif #if defined(__MINGW32__) " MinGW" #elif defined(_MSC_VER) diff --git a/src/win32_joystick.c b/src/win32_joystick.c index a51773d3..a9fe04b1 100644 --- a/src/win32_joystick.c +++ b/src/win32_joystick.c @@ -199,15 +199,43 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, if (hats > 0) { - int j; - int value = ji.dwPOV / 100 / 45; - if (value < 0 || value > 8) value = 8; + int j, value = ji.dwPOV / 100 / 45; + + if (value < 0 || value > 8) + value = 8; for (j = 0; j < 4 && button < numbuttons; j++) { - buttons[button++] = directions[value] & (1 << j) ? GLFW_PRESS : GLFW_RELEASE; + if (directions[value] & (1 << j)) + buttons[button] = GLFW_PRESS; + else + buttons[button] = GLFW_RELEASE; + + button++; } } return button; } + + +//======================================================================== +// Get joystick name +//======================================================================== + +const char* _glfwPlatformGetJoystickName(int joy) +{ + JOYCAPS jc; + const int i = joy - GLFW_JOYSTICK_1; + + if (!isJoystickPresent(joy)) + return NULL; + + _glfw_joyGetDevCaps(i, &jc, sizeof(JOYCAPS)); + + free(_glfwLibrary.Win32.joyNames[i]); + _glfwLibrary.Win32.joyNames[i] = _glfwCreateUTF8FromWideString(jc.szPname); + + return _glfwLibrary.Win32.joyNames[i]; +} + diff --git a/src/win32_platform.h b/src/win32_platform.h index dca35211..4a6495ac 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: Win32/WGL +// Platform: Win32 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -28,8 +28,8 @@ // //======================================================================== -#ifndef _platform_h_ -#define _platform_h_ +#ifndef _win32_platform_h_ +#define _win32_platform_h_ // We don't need all the fancy stuff @@ -64,11 +64,6 @@ #include #include -// This path may need to be changed if you build GLFW using your own setup -// We ship and use our own copy of wglext.h since GLFW uses fairly new -// extensions and not all operating systems come with an up-to-date version -#include "../support/GL/wglext.h" - //======================================================================== // Hack: Define things that some windows.h variants don't @@ -111,13 +106,19 @@ typedef DWORD (WINAPI * TIMEGETTIME_T) (void); #define _GLFW_WNDCLASSNAME L"GLFW30" -#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 Win32 -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextWGL WGL - -#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorWin32 Win32 +#if defined(_GLFW_WGL) + #include "wgl_platform.h" +#elif defined(_GLFW_EGL) + #define _GLFW_EGL_NATIVE_WINDOW window->Win32.handle + #define _GLFW_EGL_NATIVE_DISPLAY NULL + #include "egl_platform.h" +#else + #error "No supported context creation API selected" +#endif +#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowWin32 Win32 #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 Win32 -#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryWGL WGL +#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorWin32 Win32 //======================================================================== @@ -130,31 +131,6 @@ typedef DWORD (WINAPI * TIMEGETTIME_T) (void); typedef INT_PTR GLFWintptr; -//------------------------------------------------------------------------ -// Platform-specific OpenGL context structure -//------------------------------------------------------------------------ -typedef struct _GLFWcontextWGL -{ - // Platform specific window resources - HDC DC; // Private GDI device context - HGLRC context; // Permanent rendering context - - // Platform specific extensions (context specific) - PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT; - PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB; - PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT; - PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB; - PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; - GLboolean EXT_swap_control; - GLboolean ARB_multisample; - GLboolean ARB_pixel_format; - GLboolean ARB_create_context; - GLboolean ARB_create_context_profile; - GLboolean EXT_create_context_es2_profile; - GLboolean ARB_create_context_robustness; -} _GLFWcontextWGL; - - //------------------------------------------------------------------------ // Platform-specific window structure //------------------------------------------------------------------------ @@ -211,6 +187,8 @@ typedef struct _GLFWlibraryWin32 } winmm; #endif // _GLFW_NO_DLOAD_WINMM + char* joyNames[GLFW_JOYSTICK_LAST + 1]; + } _GLFWlibraryWin32; @@ -224,16 +202,6 @@ typedef struct _GLFWmonitorWin32 } _GLFWmonitorWin32; -//------------------------------------------------------------------------ -// Platform-specific library global data for WGL -//------------------------------------------------------------------------ -typedef struct _GLFWlibraryWGL -{ - int dummy; - -} _GLFWlibraryWGL; - - //======================================================================== // Prototypes for platform specific internal functions //======================================================================== @@ -258,4 +226,4 @@ void _glfwSetVideoMode(int* width, int* height, void _glfwRestoreVideoMode(void); -#endif // _platform_h_ +#endif // _win32_platform_h_ diff --git a/src/window.c b/src/window.c index df6c0ff4..9e430835 100644 --- a/src/window.c +++ b/src/window.c @@ -119,8 +119,14 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean focused) void _glfwInputWindowPos(_GLFWwindow* window, int x, int y) { + if (window->positionX == x && window->positionY == y) + return; + window->positionX = x; window->positionY = y; + + if (window->windowPosCallback) + window->windowPosCallback(window, x, y); } @@ -232,6 +238,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, fbconfig.auxBuffers = Max(_glfwLibrary.hints.auxBuffers, 0); fbconfig.stereo = _glfwLibrary.hints.stereo ? GL_TRUE : GL_FALSE; fbconfig.samples = Max(_glfwLibrary.hints.samples, 0); + fbconfig.sRGB = _glfwLibrary.hints.sRGB ? GL_TRUE : GL_FALSE; // Set up desired window config wndconfig.title = title; @@ -434,6 +441,9 @@ GLFWAPI void glfwWindowHint(int target, int hint) case GLFW_FSAA_SAMPLES: _glfwLibrary.hints.samples = hint; break; + case GLFW_SRGB_CAPABLE: + _glfwLibrary.hints.sRGB = hint; + break; case GLFW_CLIENT_API: _glfwLibrary.hints.clientAPI = hint; break; @@ -776,6 +786,24 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow handle) } +//======================================================================== +// Set callback function for window position changes +//======================================================================== + +GLFWAPI void glfwSetWindowPosCallback(GLFWwindow handle, GLFWwindowposfun cbfun) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return; + } + + window->windowPosCallback = cbfun; +} + + //======================================================================== // Set callback function for window size changes //======================================================================== diff --git a/src/x11_init.c b/src/x11_init.c index 2eb09517..b5631fba 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -693,6 +693,11 @@ int _glfwPlatformTerminate(void) const char* _glfwPlatformGetVersionString(void) { const char* version = _GLFW_VERSION_FULL +#if defined(_GLFW_GLX) + " GLX" +#elif defined(_GLFW_EGL) + " EGL" +#endif #if defined(_GLFW_HAS_XRANDR) " XRandR" #endif @@ -711,8 +716,12 @@ const char* _glfwPlatformGetVersionString(void) " glXGetProcAddressARB" #elif defined(_GLFW_HAS_GLXGETPROCADDRESSEXT) " glXGetProcAddressEXT" +#elif defined(_GLFW_HAS_EGLGETPROCADDRESS) + " eglGetProcAddress" #elif defined(_GLFW_DLOPEN_LIBGL) " dlsym(libGL)" +#elif defined(_GLFW_DLOPEN_LIBEGL) + " dlsym(libEGL)" #else " no-extension-support" #endif diff --git a/src/x11_joystick.c b/src/x11_joystick.c index 93ab3e7f..230edcb4 100644 --- a/src/x11_joystick.c +++ b/src/x11_joystick.c @@ -41,6 +41,7 @@ #include #include #include +#include #endif // __linux__ @@ -52,6 +53,7 @@ static int openJoystickDevice(int joy, const char* path) { #ifdef __linux__ char numAxes, numButtons; + char name[256]; int fd, version; fd = open(path, O_RDONLY | O_NONBLOCK); @@ -69,6 +71,11 @@ static int openJoystickDevice(int joy, const char* path) return GL_FALSE; } + if (ioctl(fd, JSIOCGNAME(sizeof(name)), name) < 0) + strncpy(name, "Unknown", sizeof(name)); + + _glfwLibrary.X11.joystick[joy].name = strdup(name); + ioctl(fd, JSIOCGAXES, &numAxes); _glfwLibrary.X11.joystick[joy].numAxes = (int) numAxes; @@ -237,6 +244,7 @@ void _glfwTerminateJoysticks(void) close(_glfwLibrary.X11.joystick[i].fd); free(_glfwLibrary.X11.joystick[i].axis); free(_glfwLibrary.X11.joystick[i].button); + free(_glfwLibrary.X11.joystick[i].name); _glfwLibrary.X11.joystick[i].present = GL_FALSE; } @@ -325,3 +333,16 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, return numButtons; } + +//======================================================================== +// Get joystick name +//======================================================================== + +const char* _glfwPlatformGetJoystickName(int joy) +{ + if (!_glfwLibrary.X11.joystick[joy].present) + return NULL; + + return _glfwLibrary.X11.joystick[joy].name; +} + diff --git a/src/x11_monitor.c b/src/x11_monitor.c index 96cf2b8a..e9e0a88f 100644 --- a/src/x11_monitor.c +++ b/src/x11_monitor.c @@ -434,11 +434,10 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found) return 0; } - // Build array of available RGB channel depths - rgbs = (int*) malloc(sizeof(int) * visualCount); rgbCount = 0; +#if defined(_GLFW_GLX) for (i = 0; i < visualCount; i++) { int gl, rgba, rgb, r, g, b; @@ -473,6 +472,7 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found) } XFree(visuals); +#endif // Build all permutations of channel depths and resolutions diff --git a/src/x11_platform.h b/src/x11_platform.h index 82294f90..6e94cd52 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -38,15 +38,7 @@ #include #include -#define GLX_GLXEXT_LEGACY -#include - -// This path may need to be changed if you build GLFW using your own setup -// GLFW comes with its own copy of glxext.h since it uses some fairly new -// extensions and not all operating systems come with an up-to-date version -#include "../support/GL/glxext.h" - -// The XF86VidMode extension provides mode setting and gamma control +// With XFree86, we can use the XF86VidMode extension #if defined(_GLFW_HAS_XF86VIDMODE) #include #endif @@ -56,39 +48,26 @@ #include #endif -// dlopen is used as a fallback function retrieval mechanism -#if defined(_GLFW_HAS_DLOPEN) - #include -#endif - // The Xkb extension provides improved keyboard support #if defined(_GLFW_HAS_XKB) #include #endif -// GLFW supports four different ways for getting addresses for GL/GLX -// extension functions: glXGetProcAddress, glXGetProcAddressARB, -// glXGetProcAddressEXT, and dlsym -#if defined(_GLFW_HAS_GLXGETPROCADDRESSARB) - #define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x) -#elif defined(_GLFW_HAS_GLXGETPROCADDRESS) - #define _glfw_glXGetProcAddress(x) glXGetProcAddress(x) -#elif defined(_GLFW_HAS_GLXGETPROCADDRESSEXT) - #define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x) -#elif defined(_GLFW_HAS_DLOPEN) - #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibrary.GLX.libGL, x) - #define _GLFW_DLOPEN_LIBGL +#if defined(_GLFW_GLX) + #define _GLFW_X11_CONTEXT_VISUAL window->GLX.visual + #include "glx_platform.h" +#elif defined(_GLFW_EGL) + #define _GLFW_X11_CONTEXT_VISUAL window->EGL.visual + #define _GLFW_EGL_NATIVE_WINDOW window->X11.handle + #define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display + #include "egl_platform.h" #else - #error "No OpenGL entry point retrieval mechanism was enabled" + #error "No supported context creation API selected" #endif -#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 X11 -#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextGLX GLX - -#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorX11 X11 - +#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 X11 #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 X11 -#define _GLFW_PLATFORM_LIBRARY_OPENGL_STATE _GLFWlibraryGLX GLX +#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorX11 X11 // Clipboard format atom indices #define _GLFW_CLIPBOARD_FORMAT_UTF8 0 @@ -101,10 +80,6 @@ #define _GLFW_CONVERSION_SUCCEEDED 1 #define _GLFW_CONVERSION_FAILED 2 -#ifndef GLX_MESA_swap_control -typedef int (*PFNGLXSWAPINTERVALMESAPROC)(int); -#endif - //======================================================================== // GLFW platform specific types @@ -116,17 +91,6 @@ typedef int (*PFNGLXSWAPINTERVALMESAPROC)(int); typedef intptr_t GLFWintptr; -//------------------------------------------------------------------------ -// Platform-specific OpenGL context structure -//------------------------------------------------------------------------ -typedef struct _GLFWcontextGLX -{ - GLXContext context; // OpenGL rendering context - XVisualInfo* visual; // Visual for selected GLXFBConfig - -} _GLFWcontextGLX; - - //------------------------------------------------------------------------ // Platform-specific window structure //------------------------------------------------------------------------ @@ -248,46 +212,14 @@ typedef struct _GLFWlibraryX11 int numButtons; float* axis; unsigned char* button; + char* name; } joystick[GLFW_JOYSTICK_LAST + 1]; } _GLFWlibraryX11; //------------------------------------------------------------------------ -// Platform-specific library global data for GLX -//------------------------------------------------------------------------ -typedef struct _GLFWlibraryGLX -{ - // Server-side GLX version - int majorVersion, minorVersion; - - // GLX extensions - PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI; - PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT; - PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA; - PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX; - PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX; - PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX; - PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GetVisualFromFBConfigSGIX; - PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; - GLboolean SGIX_fbconfig; - GLboolean SGI_swap_control; - GLboolean EXT_swap_control; - GLboolean MESA_swap_control; - GLboolean ARB_multisample; - GLboolean ARB_create_context; - GLboolean ARB_create_context_profile; - GLboolean ARB_create_context_robustness; - GLboolean EXT_create_context_es2_profile; - -#if defined(_GLFW_DLOPEN_LIBGL) - void* libGL; // dlopen handle for libGL.so -#endif -} _GLFWlibraryGLX; - - -//------------------------------------------------------------------------ -// Platform-specific window structure +// Platform-specific monitor structure //------------------------------------------------------------------------ typedef struct _GLFWmonitorX11 { @@ -318,7 +250,6 @@ int _glfwCreateContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWfbconfig* fbconfig); void _glfwDestroyContext(_GLFWwindow* window); -XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window); // Fullscreen support int _glfwGetClosestVideoMode(int* width, int* height, int* rate); diff --git a/src/x11_window.c b/src/x11_window.c index 3e6157c3..54436d20 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -1,6 +1,6 @@ //======================================================================== // GLFW - An OpenGL library -// Platform: X11/GLX +// Platform: X11 // API version: 3.0 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ @@ -85,7 +85,7 @@ static GLboolean createWindow(_GLFWwindow* window, { unsigned long wamask; XSetWindowAttributes wa; - XVisualInfo* visual = _glfwGetContextVisual(window); + XVisualInfo* visual = _GLFW_X11_CONTEXT_VISUAL; // Every window needs a colormap // Create one based on the visual used by the current context diff --git a/support/GL/eglext.h b/support/GL/eglext.h new file mode 100644 index 00000000..5516e7ad --- /dev/null +++ b/support/GL/eglext.h @@ -0,0 +1,444 @@ +#ifndef __eglext_h_ +#define __eglext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2007-2012 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#include + +/*************************************************************/ + +/* Header file version number */ +/* Current version at http://www.khronos.org/registry/egl/ */ +/* $Revision: 18175 $ on $Date: 2012-06-13 11:26:12 -0700 (Wed, 13 Jun 2012) $ */ +#define EGL_EGLEXT_VERSION 13 + +#ifndef EGL_KHR_config_attribs +#define EGL_KHR_config_attribs 1 +#define EGL_CONFORMANT_KHR 0x3042 /* EGLConfig attribute */ +#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 /* EGL_SURFACE_TYPE bitfield */ +#endif + +#ifndef EGL_KHR_lock_surface +#define EGL_KHR_lock_surface 1 +#define EGL_READ_SURFACE_BIT_KHR 0x0001 /* EGL_LOCK_USAGE_HINT_KHR bitfield */ +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 /* EGL_LOCK_USAGE_HINT_KHR bitfield */ +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_MATCH_FORMAT_KHR 0x3043 /* EGLConfig attribute */ +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGB_565_KHR 0x30C1 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 /* eglLockSurfaceKHR attribute */ +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 /* eglLockSurfaceKHR attribute */ +#define EGL_BITMAP_POINTER_KHR 0x30C6 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PITCH_KHR 0x30C7 /* eglQuerySurface attribute */ +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD /* eglQuerySurface attribute */ +#define EGL_LOWER_LEFT_KHR 0x30CE /* EGL_BITMAP_ORIGIN_KHR value */ +#define EGL_UPPER_LEFT_KHR 0x30CF /* EGL_BITMAP_ORIGIN_KHR value */ +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay display, EGLSurface surface); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface); +#endif + +#ifndef EGL_KHR_image +#define EGL_KHR_image 1 +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 /* eglCreateImageKHR target */ +typedef void *EGLImageKHR; +#define EGL_NO_IMAGE_KHR ((EGLImageKHR)0) +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); +#endif + +#ifndef EGL_KHR_vg_parent_image +#define EGL_KHR_vg_parent_image 1 +#define EGL_VG_PARENT_IMAGE_KHR 0x30BA /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_gl_texture_2D_image +#define EGL_KHR_gl_texture_2D_image 1 +#define EGL_GL_TEXTURE_2D_KHR 0x30B1 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_gl_texture_cubemap_image +#define EGL_KHR_gl_texture_cubemap_image 1 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_gl_texture_3D_image +#define EGL_KHR_gl_texture_3D_image 1 +#define EGL_GL_TEXTURE_3D_KHR 0x30B2 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_gl_renderbuffer_image +#define EGL_KHR_gl_renderbuffer_image 1 +#define EGL_GL_RENDERBUFFER_KHR 0x30B9 /* eglCreateImageKHR target */ +#endif + +#if KHRONOS_SUPPORT_INT64 /* EGLTimeKHR requires 64-bit uint support */ +#ifndef EGL_KHR_reusable_sync +#define EGL_KHR_reusable_sync 1 + +typedef void* EGLSyncKHR; +typedef khronos_utime_nanoseconds_t EGLTimeKHR; + +#define EGL_SYNC_STATUS_KHR 0x30F1 +#define EGL_SIGNALED_KHR 0x30F2 +#define EGL_UNSIGNALED_KHR 0x30F3 +#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 +#define EGL_CONDITION_SATISFIED_KHR 0x30F6 +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_REUSABLE_KHR 0x30FA +#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 /* eglClientWaitSyncKHR bitfield */ +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull +#define EGL_NO_SYNC_KHR ((EGLSyncKHR)0) +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif +#endif + +#ifndef EGL_KHR_image_base +#define EGL_KHR_image_base 1 +/* Most interfaces defined by EGL_KHR_image_pixmap above */ +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_image_pixmap +#define EGL_KHR_image_pixmap 1 +/* Interfaces defined by EGL_KHR_image above */ +#endif + +#ifndef EGL_IMG_context_priority +#define EGL_IMG_context_priority 1 +#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 +#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 +#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 +#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 +#endif + +#ifndef EGL_KHR_lock_surface2 +#define EGL_KHR_lock_surface2 1 +#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 +#endif + +#ifndef EGL_NV_coverage_sample +#define EGL_NV_coverage_sample 1 +#define EGL_COVERAGE_BUFFERS_NV 0x30E0 +#define EGL_COVERAGE_SAMPLES_NV 0x30E1 +#endif + +#ifndef EGL_NV_depth_nonlinear +#define EGL_NV_depth_nonlinear 1 +#define EGL_DEPTH_ENCODING_NV 0x30E2 +#define EGL_DEPTH_ENCODING_NONE_NV 0 +#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 +#endif + +#if KHRONOS_SUPPORT_INT64 /* EGLTimeNV requires 64-bit uint support */ +#ifndef EGL_NV_sync +#define EGL_NV_sync 1 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6 +#define EGL_SYNC_STATUS_NV 0x30E7 +#define EGL_SIGNALED_NV 0x30E8 +#define EGL_UNSIGNALED_NV 0x30E9 +#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 +#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFFull +#define EGL_ALREADY_SIGNALED_NV 0x30EA +#define EGL_TIMEOUT_EXPIRED_NV 0x30EB +#define EGL_CONDITION_SATISFIED_NV 0x30EC +#define EGL_SYNC_TYPE_NV 0x30ED +#define EGL_SYNC_CONDITION_NV 0x30EE +#define EGL_SYNC_FENCE_NV 0x30EF +#define EGL_NO_SYNC_NV ((EGLSyncNV)0) +typedef void* EGLSyncNV; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync); +EGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value); +#endif +#endif + +#if KHRONOS_SUPPORT_INT64 /* Dependent on EGL_KHR_reusable_sync which requires 64-bit uint support */ +#ifndef EGL_KHR_fence_sync +#define EGL_KHR_fence_sync 1 +/* Reuses most tokens and entry points from EGL_KHR_reusable_sync */ +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 +#define EGL_SYNC_CONDITION_KHR 0x30F8 +#define EGL_SYNC_FENCE_KHR 0x30F9 +#endif +#endif + +#ifndef EGL_HI_clientpixmap +#define EGL_HI_clientpixmap 1 + +/* Surface Attribute */ +#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74 +/* + * Structure representing a client pixmap + * (pixmap's data is in client-space memory). + */ +struct EGLClientPixmapHI +{ + void* pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; + +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI(EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI* pixmap); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI* pixmap); +#endif /* EGL_HI_clientpixmap */ + +#ifndef EGL_HI_colorformats +#define EGL_HI_colorformats 1 +/* Config Attribute */ +#define EGL_COLOR_FORMAT_HI 0x8F70 +/* Color Formats */ +#define EGL_COLOR_RGB_HI 0x8F71 +#define EGL_COLOR_RGBA_HI 0x8F72 +#define EGL_COLOR_ARGB_HI 0x8F73 +#endif /* EGL_HI_colorformats */ + +#ifndef EGL_MESA_drm_image +#define EGL_MESA_drm_image 1 +#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 /* CreateDRMImageMESA attribute */ +#define EGL_DRM_BUFFER_USE_MESA 0x31D1 /* CreateDRMImageMESA attribute */ +#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 /* EGL_IMAGE_FORMAT_MESA attribute value */ +#define EGL_DRM_BUFFER_MESA 0x31D3 /* eglCreateImageKHR target */ +#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 +#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 /* EGL_DRM_BUFFER_USE_MESA bits */ +#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 /* EGL_DRM_BUFFER_USE_MESA bits */ +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#endif + +#ifndef EGL_NV_post_sub_buffer +#define EGL_NV_post_sub_buffer 1 +#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#endif + +#ifndef EGL_ANGLE_query_surface_pointer +#define EGL_ANGLE_query_surface_pointer 1 +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#endif +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#endif + +#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle +#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 +#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 +#endif + +#ifndef EGL_NV_coverage_sample_resolve +#define EGL_NV_coverage_sample_resolve 1 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131 +#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133 +#endif + +#if KHRONOS_SUPPORT_INT64 /* EGLuint64NV requires 64-bit uint support */ +#ifndef EGL_NV_system_time +#define EGL_NV_system_time 1 + +typedef khronos_utime_nanoseconds_t EGLuint64NV; + +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV(void); +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV(void); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void); +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void); +#endif +#endif + +#if KHRONOS_SUPPORT_INT64 /* EGLuint64KHR requires 64-bit uint support */ +#ifndef EGL_KHR_stream +#define EGL_KHR_stream 1 +typedef void* EGLStreamKHR; +typedef khronos_uint64_t EGLuint64KHR; +#define EGL_NO_STREAM_KHR ((EGLStreamKHR)0) +#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 +#define EGL_PRODUCER_FRAME_KHR 0x3212 +#define EGL_CONSUMER_FRAME_KHR 0x3213 +#define EGL_STREAM_STATE_KHR 0x3214 +#define EGL_STREAM_STATE_CREATED_KHR 0x3215 +#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 +#define EGL_STREAM_STATE_EMPTY_KHR 0x3217 +#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218 +#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219 +#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A +#define EGL_BAD_STREAM_KHR 0x321B +#define EGL_BAD_STATE_KHR 0x321C +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC)(EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#endif +#endif + +#ifdef EGL_KHR_stream /* Requires KHR_stream extension */ +#ifndef EGL_KHR_stream_consumer_gltexture +#define EGL_KHR_stream_consumer_gltexture 1 +#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream); +#endif +#endif + +#ifdef EGL_KHR_stream /* Requires KHR_stream extension */ +#ifndef EGL_KHR_stream_producer_eglsurface +#define EGL_KHR_stream_producer_eglsurface 1 +#define EGL_STREAM_BIT_KHR 0x0800 +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR(EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)(EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#endif +#endif + +#ifdef EGL_KHR_stream /* Requires KHR_stream extension */ +#ifndef EGL_KHR_stream_producer_aldatalocator +#define EGL_KHR_stream_producer_aldatalocator 1 +#endif +#endif + +#ifdef EGL_KHR_stream /* Requires KHR_stream extension */ +#ifndef EGL_KHR_stream_fifo +#define EGL_KHR_stream_fifo 1 +/* reuse EGLTimeKHR */ +#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC +#define EGL_STREAM_TIME_NOW_KHR 0x31FD +#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE +#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#endif +#endif + +#ifndef EGL_EXT_create_context_robustness +#define EGL_EXT_create_context_robustness 1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 +#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF +#endif + +#ifndef EGL_ANGLE_d3d_share_handle_client_buffer +#define EGL_ANGLE_d3d_share_handle_client_buffer 1 +/* reuse EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE */ +#endif + +#ifndef EGL_KHR_create_context +#define EGL_KHR_create_context 1 +#define EGL_CONTEXT_MAJOR_VERSION_KHR EGL_CONTEXT_CLIENT_VERSION +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tests/events.c b/tests/events.c index 533c108f..e812ef33 100644 --- a/tests/events.c +++ b/tests/events.c @@ -218,6 +218,15 @@ static const char* get_character_string(int character) return result; } +static void window_pos_callback(GLFWwindow window, int x, int y) +{ + printf("%08x at %0.3f: Window position: %i %i\n", + counter++, + glfwGetTime(), + x, + y); +} + static void window_size_callback(GLFWwindow window, int width, int height) { printf("%08x at %0.3f: Window size: %i %i\n", @@ -382,6 +391,7 @@ int main(void) glfwSetMonitorCallback(monitor_callback); + glfwSetWindowPosCallback(window, window_pos_callback); glfwSetWindowSizeCallback(window, window_size_callback); glfwSetWindowCloseCallback(window, window_close_callback); glfwSetWindowRefreshCallback(window, window_refresh_callback); diff --git a/tests/joysticks.c b/tests/joysticks.c index 2dcb2879..560dd208 100644 --- a/tests/joysticks.c +++ b/tests/joysticks.c @@ -37,6 +37,7 @@ typedef struct Joystick { GLboolean present; + char* name; float* axes; unsigned char* buttons; int axis_count; @@ -94,11 +95,11 @@ static void draw_joystick(Joystick* j, int x, int y, int width, int height) } } -static void draw_joysticks(void) +static void draw_joysticks(GLFWwindow window) { int i, width, height; - glfwGetWindowSize(glfwGetCurrentContext(), &width, &height); + glfwGetWindowSize(window, &width, &height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -130,6 +131,9 @@ static void refresh_joysticks(void) { int axis_count, button_count; + free(j->name); + j->name = strdup(glfwGetJoystickName(GLFW_JOYSTICK_1 + i)); + axis_count = glfwGetJoystickParam(GLFW_JOYSTICK_1 + i, GLFW_AXES); if (axis_count != j->axis_count) { @@ -150,8 +154,8 @@ static void refresh_joysticks(void) if (!j->present) { - printf("Found joystick %i with %i axes, %i buttons\n", - i + 1, j->axis_count, j->button_count); + printf("Found joystick %i named \'%s\' with %i axes, %i buttons\n", + i + 1, j->name, j->axis_count, j->button_count); joystick_count++; } @@ -162,12 +166,13 @@ static void refresh_joysticks(void) { if (j->present) { + printf("Lost joystick %i named \'%s\'\n", i + 1, j->name); + + free(j->name); free(j->axes); free(j->buttons); memset(j, 0, sizeof(Joystick)); - printf("Lost joystick %i\n", i + 1); - joystick_count--; } } @@ -205,7 +210,7 @@ int main(void) glClear(GL_COLOR_BUFFER_BIT); refresh_joysticks(); - draw_joysticks(); + draw_joysticks(window); glfwSwapBuffers(window); glfwPollEvents();