mirror of
https://github.com/glfw/glfw.git
synced 2024-11-23 13:24:34 +00:00
Add GLFW theming functions
Cocoa implementations are broken. Other platforms have no stubs, and therefore can't be compiled for.
This commit is contained in:
parent
57cbded076
commit
e7922d7b4f
@ -5845,6 +5845,37 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string);
|
|||||||
*/
|
*/
|
||||||
GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window);
|
GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window);
|
||||||
|
|
||||||
|
typedef struct GLFWtheme
|
||||||
|
{
|
||||||
|
int baseTheme; // light/dark
|
||||||
|
int flags;
|
||||||
|
unsigned char color[4];
|
||||||
|
} GLFWtheme;
|
||||||
|
|
||||||
|
#define GLFW_BASE_THEME_DEFAULT 0
|
||||||
|
#define GLFW_BASE_THEME_LIGHT 1
|
||||||
|
#define GLFW_BASE_THEME_DARK 2
|
||||||
|
|
||||||
|
#define GLFW_THEME_FLAG_HAS_COLOR 1
|
||||||
|
#define GLFW_THEME_FLAG_HIGH_CONTRAST 2
|
||||||
|
#define GLFW_THEME_FLAG_VIBRANT 4
|
||||||
|
|
||||||
|
typedef void (* GLFWthemefun)(GLFWtheme* theme);
|
||||||
|
|
||||||
|
/*! @brief Notifies the application when the system default theme changes.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
GLFWAPI GLFWthemefun glfwSetSystemThemeCallback(GLFWthemefun callback);
|
||||||
|
|
||||||
|
/*! @brief Sets the theme for a window.
|
||||||
|
*
|
||||||
|
* @param[in] window The window to set the theme for.
|
||||||
|
* @param[in] theme The theme to set. Pass `NULL` to set it to the system default.
|
||||||
|
*/
|
||||||
|
GLFWAPI void glfwSetTheme(GLFWwindow* handle, GLFWtheme* theme);
|
||||||
|
GLFWAPI GLFWtheme* glfwGetTheme(GLFWwindow* handle);
|
||||||
|
GLFWAPI GLFWtheme* glfwGetSystemDefaultTheme();
|
||||||
|
|
||||||
/*! @brief Returns the GLFW time.
|
/*! @brief Returns the GLFW time.
|
||||||
*
|
*
|
||||||
* This function returns the current GLFW time, in seconds. Unless the time
|
* This function returns the current GLFW time, in seconds. Unless the time
|
||||||
|
@ -496,8 +496,11 @@ GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform)
|
|||||||
const _GLFWplatform cocoa =
|
const _GLFWplatform cocoa =
|
||||||
{
|
{
|
||||||
GLFW_PLATFORM_COCOA,
|
GLFW_PLATFORM_COCOA,
|
||||||
|
// Init
|
||||||
_glfwInitCocoa,
|
_glfwInitCocoa,
|
||||||
_glfwTerminateCocoa,
|
_glfwTerminateCocoa,
|
||||||
|
_glfwGetSystemDefaultThemeCocoa,
|
||||||
|
// Input
|
||||||
_glfwGetCursorPosCocoa,
|
_glfwGetCursorPosCocoa,
|
||||||
_glfwSetCursorPosCocoa,
|
_glfwSetCursorPosCocoa,
|
||||||
_glfwSetCursorModeCocoa,
|
_glfwSetCursorModeCocoa,
|
||||||
@ -516,6 +519,7 @@ GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform)
|
|||||||
_glfwPollJoystickCocoa,
|
_glfwPollJoystickCocoa,
|
||||||
_glfwGetMappingNameCocoa,
|
_glfwGetMappingNameCocoa,
|
||||||
_glfwUpdateGamepadGUIDCocoa,
|
_glfwUpdateGamepadGUIDCocoa,
|
||||||
|
// Monitor
|
||||||
_glfwFreeMonitorCocoa,
|
_glfwFreeMonitorCocoa,
|
||||||
_glfwGetMonitorPosCocoa,
|
_glfwGetMonitorPosCocoa,
|
||||||
_glfwGetMonitorContentScaleCocoa,
|
_glfwGetMonitorContentScaleCocoa,
|
||||||
@ -524,6 +528,7 @@ GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform)
|
|||||||
_glfwGetVideoModeCocoa,
|
_glfwGetVideoModeCocoa,
|
||||||
_glfwGetGammaRampCocoa,
|
_glfwGetGammaRampCocoa,
|
||||||
_glfwSetGammaRampCocoa,
|
_glfwSetGammaRampCocoa,
|
||||||
|
// Window
|
||||||
_glfwCreateWindowCocoa,
|
_glfwCreateWindowCocoa,
|
||||||
_glfwDestroyWindowCocoa,
|
_glfwDestroyWindowCocoa,
|
||||||
_glfwSetWindowTitleCocoa,
|
_glfwSetWindowTitleCocoa,
|
||||||
@ -557,13 +562,17 @@ GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform)
|
|||||||
_glfwSetWindowFloatingCocoa,
|
_glfwSetWindowFloatingCocoa,
|
||||||
_glfwSetWindowOpacityCocoa,
|
_glfwSetWindowOpacityCocoa,
|
||||||
_glfwSetWindowMousePassthroughCocoa,
|
_glfwSetWindowMousePassthroughCocoa,
|
||||||
|
_glfwGetThemeCocoa,
|
||||||
|
_glfwSetThemeCocoa,
|
||||||
_glfwPollEventsCocoa,
|
_glfwPollEventsCocoa,
|
||||||
_glfwWaitEventsCocoa,
|
_glfwWaitEventsCocoa,
|
||||||
_glfwWaitEventsTimeoutCocoa,
|
_glfwWaitEventsTimeoutCocoa,
|
||||||
_glfwPostEmptyEventCocoa,
|
_glfwPostEmptyEventCocoa,
|
||||||
|
// EGL
|
||||||
_glfwGetEGLPlatformCocoa,
|
_glfwGetEGLPlatformCocoa,
|
||||||
_glfwGetEGLNativeDisplayCocoa,
|
_glfwGetEGLNativeDisplayCocoa,
|
||||||
_glfwGetEGLNativeWindowCocoa,
|
_glfwGetEGLNativeWindowCocoa,
|
||||||
|
// Vulkan
|
||||||
_glfwGetRequiredInstanceExtensionsCocoa,
|
_glfwGetRequiredInstanceExtensionsCocoa,
|
||||||
_glfwGetPhysicalDevicePresentationSupportCocoa,
|
_glfwGetPhysicalDevicePresentationSupportCocoa,
|
||||||
_glfwCreateWindowSurfaceCocoa,
|
_glfwCreateWindowSurfaceCocoa,
|
||||||
@ -693,5 +702,10 @@ void _glfwTerminateCocoa(void)
|
|||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWtheme* _glfwGetSystemDefaultThemeCocoa(void)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // _GLFW_COCOA
|
#endif // _GLFW_COCOA
|
||||||
|
|
||||||
|
@ -300,3 +300,7 @@ GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|||||||
const _GLFWfbconfig* fbconfig);
|
const _GLFWfbconfig* fbconfig);
|
||||||
void _glfwDestroyContextNSGL(_GLFWwindow* window);
|
void _glfwDestroyContextNSGL(_GLFWwindow* window);
|
||||||
|
|
||||||
|
|
||||||
|
GLFWtheme* _glfwGetSystemDefaultThemeCocoa(void);
|
||||||
|
void _glfwSetThemeCocoa(_GLFWwindow* window, GLFWtheme* theme);
|
||||||
|
GLFWtheme* _glfwGetThemeCocoa(_GLFWwindow* window);
|
||||||
|
@ -1876,6 +1876,106 @@ const char* _glfwGetClipboardStringCocoa(void)
|
|||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwSetThemeCocoa(_GLFWwindow* window, GLFWtheme* theme)
|
||||||
|
{
|
||||||
|
if (!theme || theme->baseTheme == GLFW_BASE_THEME_DEFAULT)
|
||||||
|
{
|
||||||
|
[window->ns.object setAppearance:nil];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSAppearanceName name;
|
||||||
|
|
||||||
|
if (theme->baseTheme == GLFW_BASE_THEME_LIGHT)
|
||||||
|
{
|
||||||
|
if ((theme->flags & GLFW_THEME_FLAG_VIBRANT) && (theme->flags & GLFW_THEME_FLAG_HIGH_CONTRAST))
|
||||||
|
{
|
||||||
|
name = NSAppearanceNameAccessibilityHighContrastVibrantLight;
|
||||||
|
}
|
||||||
|
else if (theme->flags & GLFW_THEME_FLAG_VIBRANT) {
|
||||||
|
name = NSAppearanceNameVibrantLight;
|
||||||
|
}
|
||||||
|
else if (theme->flags & GLFW_THEME_FLAG_HIGH_CONTRAST)
|
||||||
|
{
|
||||||
|
name = NSAppearanceNameAccessibilityHighContrastAqua;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
name = NSAppearanceNameAqua;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((theme->flags & GLFW_THEME_FLAG_VIBRANT) && (theme->flags & GLFW_THEME_FLAG_HIGH_CONTRAST))
|
||||||
|
{
|
||||||
|
name = NSAppearanceNameAccessibilityHighContrastVibrantDark;
|
||||||
|
}
|
||||||
|
else if (theme->flags & GLFW_THEME_FLAG_VIBRANT) {
|
||||||
|
name = NSAppearanceNameVibrantDark;
|
||||||
|
}
|
||||||
|
else if (theme->flags & GLFW_THEME_FLAG_HIGH_CONTRAST)
|
||||||
|
{
|
||||||
|
name = NSAppearanceNameAccessibilityHighContrastDarkAqua;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
name = NSAppearanceNameDarkAqua;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NSAppearance* appearance = [NSAppearance appearanceNamed:name];
|
||||||
|
[window->ns.object setAppearance:appearance];
|
||||||
|
}
|
||||||
|
|
||||||
|
GLFWtheme* _glfwGetThemeCocoa(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
GLFWtheme theme;
|
||||||
|
NSAppearanceName name = [window->ns.object appearance].name;
|
||||||
|
|
||||||
|
if (name == NSAppearanceNameAqua)
|
||||||
|
{
|
||||||
|
theme.baseTheme = GLFW_BASE_THEME_LIGHT;
|
||||||
|
}
|
||||||
|
else if (name == NSAppearanceNameDarkAqua)
|
||||||
|
{
|
||||||
|
theme.baseTheme = GLFW_BASE_THEME_DARK;
|
||||||
|
}
|
||||||
|
else if (name == NSAppearanceNameVibrantLight)
|
||||||
|
{
|
||||||
|
theme.baseTheme = GLFW_BASE_THEME_LIGHT;
|
||||||
|
theme.flags |= GLFW_THEME_FLAG_VIBRANT;
|
||||||
|
}
|
||||||
|
else if (name == NSAppearanceNameVibrantDark)
|
||||||
|
{
|
||||||
|
theme.baseTheme = GLFW_BASE_THEME_DARK;
|
||||||
|
theme.flags |= GLFW_THEME_FLAG_VIBRANT;
|
||||||
|
}
|
||||||
|
if (name == NSAppearanceNameAccessibilityHighContrastAqua)
|
||||||
|
{
|
||||||
|
theme.baseTheme = GLFW_BASE_THEME_LIGHT;
|
||||||
|
theme.flags |= GLFW_THEME_FLAG_HIGH_CONTRAST;
|
||||||
|
}
|
||||||
|
else if (name == NSAppearanceNameAccessibilityHighContrastDarkAqua)
|
||||||
|
{
|
||||||
|
theme.baseTheme = GLFW_BASE_THEME_DARK;
|
||||||
|
theme.flags |= GLFW_THEME_FLAG_HIGH_CONTRAST;
|
||||||
|
}
|
||||||
|
else if (name == NSAppearanceNameAccessibilityHighContrastVibrantLight)
|
||||||
|
{
|
||||||
|
theme.baseTheme = GLFW_BASE_THEME_LIGHT;
|
||||||
|
theme.flags |= GLFW_THEME_FLAG_VIBRANT | GLFW_THEME_FLAG_HIGH_CONTRAST;
|
||||||
|
}
|
||||||
|
else if (name == NSAppearanceNameAccessibilityHighContrastVibrantDark)
|
||||||
|
{
|
||||||
|
theme.baseTheme = GLFW_BASE_THEME_DARK;
|
||||||
|
theme.flags |= GLFW_THEME_FLAG_VIBRANT | GLFW_THEME_FLAG_HIGH_CONTRAST;
|
||||||
|
}
|
||||||
|
|
||||||
|
//return theme;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
EGLenum _glfwGetEGLPlatformCocoa(EGLint** attribs)
|
EGLenum _glfwGetEGLPlatformCocoa(EGLint** attribs)
|
||||||
{
|
{
|
||||||
if (_glfw.egl.ANGLE_platform_angle)
|
if (_glfw.egl.ANGLE_platform_angle)
|
||||||
|
14
src/init.c
14
src/init.c
@ -543,3 +543,17 @@ GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun)
|
|||||||
return cbfun;
|
return cbfun;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWAPI GLFWtheme* glfwGetSystemDefaultTheme()
|
||||||
|
{
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
return _glfw.platform.getSystemDefaultTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
GLFWAPI GLFWthemefun glfwSetSystemThemeCallback(GLFWthemefun callback)
|
||||||
|
{
|
||||||
|
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
|
||||||
|
//return _glfw.platform.setSystemThemeCallback(callback);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@ -673,6 +673,7 @@ struct _GLFWplatform
|
|||||||
// init
|
// init
|
||||||
GLFWbool (*init)(void);
|
GLFWbool (*init)(void);
|
||||||
void (*terminate)(void);
|
void (*terminate)(void);
|
||||||
|
GLFWtheme* (*getSystemDefaultTheme)(void);
|
||||||
// input
|
// input
|
||||||
void (*getCursorPos)(_GLFWwindow*,double*,double*);
|
void (*getCursorPos)(_GLFWwindow*,double*,double*);
|
||||||
void (*setCursorPos)(_GLFWwindow*,double,double);
|
void (*setCursorPos)(_GLFWwindow*,double,double);
|
||||||
@ -735,6 +736,8 @@ struct _GLFWplatform
|
|||||||
void (*setWindowFloating)(_GLFWwindow*,GLFWbool);
|
void (*setWindowFloating)(_GLFWwindow*,GLFWbool);
|
||||||
void (*setWindowOpacity)(_GLFWwindow*,float);
|
void (*setWindowOpacity)(_GLFWwindow*,float);
|
||||||
void (*setWindowMousePassthrough)(_GLFWwindow*,GLFWbool);
|
void (*setWindowMousePassthrough)(_GLFWwindow*,GLFWbool);
|
||||||
|
GLFWtheme* (*getTheme)(_GLFWwindow*);
|
||||||
|
void (*setTheme)(_GLFWwindow*,GLFWtheme*);
|
||||||
void (*pollEvents)(void);
|
void (*pollEvents)(void);
|
||||||
void (*waitEvents)(void);
|
void (*waitEvents)(void);
|
||||||
void (*waitEventsTimeout)(double);
|
void (*waitEventsTimeout)(double);
|
||||||
|
18
src/window.c
18
src/window.c
@ -1153,3 +1153,21 @@ GLFWAPI void glfwPostEmptyEvent(void)
|
|||||||
_glfw.platform.postEmptyEvent();
|
_glfw.platform.postEmptyEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWAPI void glfwSetTheme(GLFWwindow* handle, GLFWtheme* theme)
|
||||||
|
{
|
||||||
|
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
|
_GLFW_REQUIRE_INIT();
|
||||||
|
_glfw.platform.setTheme(window, theme);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLFWAPI GLFWtheme* glfwGetTheme(GLFWwindow* handle)
|
||||||
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
assert(window != NULL);
|
||||||
|
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
return _glfw.platform.getTheme(window);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user