mirror of
https://github.com/gwm17/glfw.git
synced 2025-08-06 12:38:49 -04:00
This adds compile-time support for multiple platforms and runtime detection of them. Window system related platform functions are now called from shared code via the function pointer struct _GLFWplatform. The timer, thread and module loading platform functions are still called directly by name and the implementation chosen at link-time. These functions are the same for any backend on a given OS, including the Null backend. The platforms are now enabled via CMake dependent options following the GLFW_BUILD_<platform> pattern instead of a mix of automagic and ad-hoc option names. There is no longer any option for the Null backend as it is now always enabled. Much of the struct stitching work in platform.h was based on an earlier experimental branch for runtime platform selection by @ronchaine. Every platform function related to windows, contexts, monitors, input, event processing and Vulkan have been renamed so that multiple sets of them can exist without colliding. Calls to these are now routed through the _glfw.platform struct member. These changes makes up most of this commit. For Wayland and X11 the client library loading and display creation is used to detect a running compositor/server. The XDG_SESSION_TYPE environment variable is ignored for now, as X11 is still by far the more complete implementation. Closes #1655 Closes #1958
295 lines
12 KiB
Objective-C
295 lines
12 KiB
Objective-C
//========================================================================
|
|
// GLFW 3.4 macOS - www.glfw.org
|
|
//------------------------------------------------------------------------
|
|
// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>
|
|
//
|
|
// 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 <stdint.h>
|
|
|
|
#include <Carbon/Carbon.h>
|
|
#include <IOKit/hid/IOHIDLib.h>
|
|
|
|
// NOTE: All of NSGL was deprecated in the 10.14 SDK
|
|
// This disables the pointless warnings for every symbol we use
|
|
#ifndef GL_SILENCE_DEPRECATION
|
|
#define GL_SILENCE_DEPRECATION
|
|
#endif
|
|
|
|
#if defined(__OBJC__)
|
|
#import <Cocoa/Cocoa.h>
|
|
#else
|
|
typedef void* id;
|
|
#endif
|
|
|
|
// NOTE: Many Cocoa enum values have been renamed and we need to build across
|
|
// SDK versions where one is unavailable or the other deprecated
|
|
// We use the newer names in code and these macros to handle compatibility
|
|
#if MAC_OS_X_VERSION_MAX_ALLOWED < 101400
|
|
#define NSOpenGLContextParameterSwapInterval NSOpenGLCPSwapInterval
|
|
#define NSOpenGLContextParameterSurfaceOpacity NSOpenGLCPSurfaceOpacity
|
|
#endif
|
|
|
|
// NOTE: Many Cocoa enum values have been renamed and we need to build across
|
|
// SDK versions where one is unavailable or the other deprecated
|
|
// We use the newer names in code and these macros to handle compatibility
|
|
#if MAC_OS_X_VERSION_MAX_ALLOWED < 101200
|
|
#define NSBitmapFormatAlphaNonpremultiplied NSAlphaNonpremultipliedBitmapFormat
|
|
#define NSEventMaskAny NSAnyEventMask
|
|
#define NSEventMaskKeyUp NSKeyUpMask
|
|
#define NSEventModifierFlagCapsLock NSAlphaShiftKeyMask
|
|
#define NSEventModifierFlagCommand NSCommandKeyMask
|
|
#define NSEventModifierFlagControl NSControlKeyMask
|
|
#define NSEventModifierFlagDeviceIndependentFlagsMask NSDeviceIndependentModifierFlagsMask
|
|
#define NSEventModifierFlagOption NSAlternateKeyMask
|
|
#define NSEventModifierFlagShift NSShiftKeyMask
|
|
#define NSEventTypeApplicationDefined NSApplicationDefined
|
|
#define NSWindowStyleMaskBorderless NSBorderlessWindowMask
|
|
#define NSWindowStyleMaskClosable NSClosableWindowMask
|
|
#define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask
|
|
#define NSWindowStyleMaskResizable NSResizableWindowMask
|
|
#define NSWindowStyleMaskTitled NSTitledWindowMask
|
|
#endif
|
|
|
|
typedef VkFlags VkMacOSSurfaceCreateFlagsMVK;
|
|
typedef VkFlags VkMetalSurfaceCreateFlagsEXT;
|
|
|
|
typedef struct VkMacOSSurfaceCreateInfoMVK
|
|
{
|
|
VkStructureType sType;
|
|
const void* pNext;
|
|
VkMacOSSurfaceCreateFlagsMVK flags;
|
|
const void* pView;
|
|
} VkMacOSSurfaceCreateInfoMVK;
|
|
|
|
typedef struct VkMetalSurfaceCreateInfoEXT
|
|
{
|
|
VkStructureType sType;
|
|
const void* pNext;
|
|
VkMetalSurfaceCreateFlagsEXT flags;
|
|
const void* pLayer;
|
|
} VkMetalSurfaceCreateInfoEXT;
|
|
|
|
typedef VkResult (APIENTRY *PFN_vkCreateMacOSSurfaceMVK)(VkInstance,const VkMacOSSurfaceCreateInfoMVK*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
|
typedef VkResult (APIENTRY *PFN_vkCreateMetalSurfaceEXT)(VkInstance,const VkMetalSurfaceCreateInfoEXT*,const VkAllocationCallbacks*,VkSurfaceKHR*);
|
|
|
|
#define GLFW_COCOA_WINDOW_STATE _GLFWwindowNS ns;
|
|
#define GLFW_COCOA_LIBRARY_WINDOW_STATE _GLFWlibraryNS ns;
|
|
#define GLFW_COCOA_MONITOR_STATE _GLFWmonitorNS ns;
|
|
#define GLFW_COCOA_CURSOR_STATE _GLFWcursorNS ns;
|
|
|
|
#define GLFW_NSGL_CONTEXT_STATE _GLFWcontextNSGL nsgl;
|
|
#define GLFW_NSGL_LIBRARY_CONTEXT_STATE _GLFWlibraryNSGL nsgl;
|
|
|
|
// HIToolbox.framework pointer typedefs
|
|
#define kTISPropertyUnicodeKeyLayoutData _glfw.ns.tis.kPropertyUnicodeKeyLayoutData
|
|
typedef TISInputSourceRef (*PFN_TISCopyCurrentKeyboardLayoutInputSource)(void);
|
|
#define TISCopyCurrentKeyboardLayoutInputSource _glfw.ns.tis.CopyCurrentKeyboardLayoutInputSource
|
|
typedef void* (*PFN_TISGetInputSourceProperty)(TISInputSourceRef,CFStringRef);
|
|
#define TISGetInputSourceProperty _glfw.ns.tis.GetInputSourceProperty
|
|
typedef UInt8 (*PFN_LMGetKbdType)(void);
|
|
#define LMGetKbdType _glfw.ns.tis.GetKbdType
|
|
|
|
|
|
// NSGL-specific per-context data
|
|
//
|
|
typedef struct _GLFWcontextNSGL
|
|
{
|
|
id pixelFormat;
|
|
id object;
|
|
} _GLFWcontextNSGL;
|
|
|
|
// NSGL-specific global data
|
|
//
|
|
typedef struct _GLFWlibraryNSGL
|
|
{
|
|
// dlopen handle for OpenGL.framework (for glfwGetProcAddress)
|
|
CFBundleRef framework;
|
|
} _GLFWlibraryNSGL;
|
|
|
|
// Cocoa-specific per-window data
|
|
//
|
|
typedef struct _GLFWwindowNS
|
|
{
|
|
id object;
|
|
id delegate;
|
|
id view;
|
|
id layer;
|
|
|
|
GLFWbool maximized;
|
|
GLFWbool occluded;
|
|
GLFWbool retina;
|
|
|
|
// Cached window properties to filter out duplicate events
|
|
int width, height;
|
|
int fbWidth, fbHeight;
|
|
float xscale, yscale;
|
|
|
|
// The total sum of the distances the cursor has been warped
|
|
// since the last cursor motion event was processed
|
|
// This is kept to counteract Cocoa doing the same internally
|
|
double cursorWarpDeltaX, cursorWarpDeltaY;
|
|
} _GLFWwindowNS;
|
|
|
|
// Cocoa-specific global data
|
|
//
|
|
typedef struct _GLFWlibraryNS
|
|
{
|
|
CGEventSourceRef eventSource;
|
|
id delegate;
|
|
GLFWbool cursorHidden;
|
|
TISInputSourceRef inputSource;
|
|
IOHIDManagerRef hidManager;
|
|
id unicodeData;
|
|
id helper;
|
|
id keyUpMonitor;
|
|
id nibObjects;
|
|
|
|
char keynames[GLFW_KEY_LAST + 1][17];
|
|
short int keycodes[256];
|
|
short int scancodes[GLFW_KEY_LAST + 1];
|
|
char* clipboardString;
|
|
CGPoint cascadePoint;
|
|
// Where to place the cursor when re-enabled
|
|
double restoreCursorPosX, restoreCursorPosY;
|
|
// The window whose disabled cursor mode is active
|
|
_GLFWwindow* disabledCursorWindow;
|
|
|
|
struct {
|
|
CFBundleRef bundle;
|
|
PFN_TISCopyCurrentKeyboardLayoutInputSource CopyCurrentKeyboardLayoutInputSource;
|
|
PFN_TISGetInputSourceProperty GetInputSourceProperty;
|
|
PFN_LMGetKbdType GetKbdType;
|
|
CFStringRef kPropertyUnicodeKeyLayoutData;
|
|
} tis;
|
|
} _GLFWlibraryNS;
|
|
|
|
// Cocoa-specific per-monitor data
|
|
//
|
|
typedef struct _GLFWmonitorNS
|
|
{
|
|
CGDirectDisplayID displayID;
|
|
CGDisplayModeRef previousMode;
|
|
uint32_t unitNumber;
|
|
id screen;
|
|
double fallbackRefreshRate;
|
|
} _GLFWmonitorNS;
|
|
|
|
// Cocoa-specific per-cursor data
|
|
//
|
|
typedef struct _GLFWcursorNS
|
|
{
|
|
id object;
|
|
} _GLFWcursorNS;
|
|
|
|
|
|
GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform);
|
|
int _glfwInitCocoa(void);
|
|
void _glfwTerminateCocoa(void);
|
|
|
|
int _glfwCreateWindowCocoa(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig);
|
|
void _glfwDestroyWindowCocoa(_GLFWwindow* window);
|
|
void _glfwSetWindowTitleCocoa(_GLFWwindow* window, const char* title);
|
|
void _glfwSetWindowIconCocoa(_GLFWwindow* window, int count, const GLFWimage* images);
|
|
void _glfwGetWindowPosCocoa(_GLFWwindow* window, int* xpos, int* ypos);
|
|
void _glfwSetWindowPosCocoa(_GLFWwindow* window, int xpos, int ypos);
|
|
void _glfwGetWindowSizeCocoa(_GLFWwindow* window, int* width, int* height);
|
|
void _glfwSetWindowSizeCocoa(_GLFWwindow* window, int width, int height);
|
|
void _glfwSetWindowSizeLimitsCocoa(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);
|
|
void _glfwSetWindowAspectRatioCocoa(_GLFWwindow* window, int numer, int denom);
|
|
void _glfwGetFramebufferSizeCocoa(_GLFWwindow* window, int* width, int* height);
|
|
void _glfwGetWindowFrameSizeCocoa(_GLFWwindow* window, int* left, int* top, int* right, int* bottom);
|
|
void _glfwGetWindowContentScaleCocoa(_GLFWwindow* window, float* xscale, float* yscale);
|
|
void _glfwIconifyWindowCocoa(_GLFWwindow* window);
|
|
void _glfwRestoreWindowCocoa(_GLFWwindow* window);
|
|
void _glfwMaximizeWindowCocoa(_GLFWwindow* window);
|
|
void _glfwShowWindowCocoa(_GLFWwindow* window);
|
|
void _glfwHideWindowCocoa(_GLFWwindow* window);
|
|
void _glfwRequestWindowAttentionCocoa(_GLFWwindow* window);
|
|
void _glfwFocusWindowCocoa(_GLFWwindow* window);
|
|
void _glfwSetWindowMonitorCocoa(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);
|
|
int _glfwWindowFocusedCocoa(_GLFWwindow* window);
|
|
int _glfwWindowIconifiedCocoa(_GLFWwindow* window);
|
|
int _glfwWindowVisibleCocoa(_GLFWwindow* window);
|
|
int _glfwWindowMaximizedCocoa(_GLFWwindow* window);
|
|
int _glfwWindowHoveredCocoa(_GLFWwindow* window);
|
|
int _glfwFramebufferTransparentCocoa(_GLFWwindow* window);
|
|
void _glfwSetWindowResizableCocoa(_GLFWwindow* window, GLFWbool enabled);
|
|
void _glfwSetWindowDecoratedCocoa(_GLFWwindow* window, GLFWbool enabled);
|
|
void _glfwSetWindowFloatingCocoa(_GLFWwindow* window, GLFWbool enabled);
|
|
float _glfwGetWindowOpacityCocoa(_GLFWwindow* window);
|
|
void _glfwSetWindowOpacityCocoa(_GLFWwindow* window, float opacity);
|
|
void _glfwSetWindowMousePassthroughCocoa(_GLFWwindow* window, GLFWbool enabled);
|
|
|
|
void _glfwSetRawMouseMotionCocoa(_GLFWwindow *window, GLFWbool enabled);
|
|
GLFWbool _glfwRawMouseMotionSupportedCocoa(void);
|
|
|
|
void _glfwPollEventsCocoa(void);
|
|
void _glfwWaitEventsCocoa(void);
|
|
void _glfwWaitEventsTimeoutCocoa(double timeout);
|
|
void _glfwPostEmptyEventCocoa(void);
|
|
|
|
void _glfwGetCursorPosCocoa(_GLFWwindow* window, double* xpos, double* ypos);
|
|
void _glfwSetCursorPosCocoa(_GLFWwindow* window, double xpos, double ypos);
|
|
void _glfwSetCursorModeCocoa(_GLFWwindow* window, int mode);
|
|
const char* _glfwGetScancodeNameCocoa(int scancode);
|
|
int _glfwGetKeyScancodeCocoa(int key);
|
|
int _glfwCreateCursorCocoa(_GLFWcursor* cursor, const GLFWimage* image, int xhot, int yhot);
|
|
int _glfwCreateStandardCursorCocoa(_GLFWcursor* cursor, int shape);
|
|
void _glfwDestroyCursorCocoa(_GLFWcursor* cursor);
|
|
void _glfwSetCursorCocoa(_GLFWwindow* window, _GLFWcursor* cursor);
|
|
void _glfwSetClipboardStringCocoa(const char* string);
|
|
const char* _glfwGetClipboardStringCocoa(void);
|
|
|
|
EGLenum _glfwGetEGLPlatformCocoa(EGLint** attribs);
|
|
EGLNativeDisplayType _glfwGetEGLNativeDisplayCocoa(void);
|
|
EGLNativeWindowType _glfwGetEGLNativeWindowCocoa(_GLFWwindow* window);
|
|
|
|
void _glfwGetRequiredInstanceExtensionsCocoa(char** extensions);
|
|
int _glfwGetPhysicalDevicePresentationSupportCocoa(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);
|
|
VkResult _glfwCreateWindowSurfaceCocoa(VkInstance instance, _GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);
|
|
|
|
void _glfwFreeMonitorCocoa(_GLFWmonitor* monitor);
|
|
void _glfwGetMonitorPosCocoa(_GLFWmonitor* monitor, int* xpos, int* ypos);
|
|
void _glfwGetMonitorContentScaleCocoa(_GLFWmonitor* monitor, float* xscale, float* yscale);
|
|
void _glfwGetMonitorWorkareaCocoa(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height);
|
|
GLFWvidmode* _glfwGetVideoModesCocoa(_GLFWmonitor* monitor, int* count);
|
|
void _glfwGetVideoModeCocoa(_GLFWmonitor* monitor, GLFWvidmode* mode);
|
|
GLFWbool _glfwGetGammaRampCocoa(_GLFWmonitor* monitor, GLFWgammaramp* ramp);
|
|
void _glfwSetGammaRampCocoa(_GLFWmonitor* monitor, const GLFWgammaramp* ramp);
|
|
|
|
void _glfwPollMonitorsCocoa(void);
|
|
void _glfwSetVideoModeCocoa(_GLFWmonitor* monitor, const GLFWvidmode* desired);
|
|
void _glfwRestoreVideoModeCocoa(_GLFWmonitor* monitor);
|
|
|
|
float _glfwTransformYCocoa(float y);
|
|
|
|
void* _glfwLoadLocalVulkanLoaderCocoa(void);
|
|
|
|
GLFWbool _glfwInitNSGL(void);
|
|
void _glfwTerminateNSGL(void);
|
|
GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|
const _GLFWctxconfig* ctxconfig,
|
|
const _GLFWfbconfig* fbconfig);
|
|
void _glfwDestroyContextNSGL(_GLFWwindow* window);
|
|
|