From 0266964e830c47c5a6e12654b8e84378dfe97ca5 Mon Sep 17 00:00:00 2001 From: culler Date: Sat, 1 Aug 2020 16:12:43 +0000 Subject: The colormaps do not fix winfo rgb. Handle that directly. And deal with Big Sur deprecations. --- generic/tkCmds.c | 16 ++++++++++++++++ macosx/tkMacOSXColor.c | 38 ++++++++++++++++++++------------------ macosx/tkMacOSXConstants.h | 4 +++- macosx/tkMacOSXPort.h | 3 +++ macosx/tkMacOSXWindowEvent.c | 7 ------- 5 files changed, 42 insertions(+), 26 deletions(-) diff --git a/generic/tkCmds.c b/generic/tkCmds.c index 7f4c49b..1bc4f8c 100644 --- a/generic/tkCmds.c +++ b/generic/tkCmds.c @@ -1748,7 +1748,23 @@ Tk_WinfoObjCmd( if (TkGetWindowFromObj(interp, tkwin, objv[2], &tkwin) != TCL_OK) { return TCL_ERROR; } +#ifdef TK_HAS_DYNAMIC_COLORS + + /* + * Make sure that the TkColor used for the winfo rgb command is + * destroyed when we are through with it, so we do not get stale RGB + * values next time. + */ + + { + Colormap temp = Tk_Colormap(tkwin); + Tk_Colormap(tkwin) = TK_DYNAMIC_COLORMAP; + colorPtr = Tk_GetColor(interp, tkwin, Tcl_GetString(objv[3])); + Tk_Colormap(tkwin) = temp; + } +#else colorPtr = Tk_GetColor(interp, tkwin, Tcl_GetString(objv[3])); +#endif if (colorPtr == NULL) { return TCL_ERROR; } diff --git a/macosx/tkMacOSXColor.c b/macosx/tkMacOSXColor.c index b77adf3..2a78c97 100644 --- a/macosx/tkMacOSXColor.c +++ b/macosx/tkMacOSXColor.c @@ -24,9 +24,9 @@ static int rgbColorIndex; static int controlAccentIndex; static Bool useFakeAccentColor = NO; static SystemColorDatum **systemColorIndex; -static NSAppearance *lightAqua; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 -static NSAppearance *darkAqua; +static NSAppearance *lightAqua = nil; +static NSAppearance *darkAqua = nil; #endif static NSColorSpace* sRGB = NULL; static CGFloat windowBackground[4] = @@ -41,8 +41,8 @@ void initColorTable() int newPtr, index = 0; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 darkAqua = [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]; -#endif lightAqua = [NSAppearance appearanceNamed:NSAppearanceNameAqua]; +#endif /* * Build a hash table for looking up a color by its name. @@ -230,7 +230,7 @@ GetRGBA( unsigned long pixel, CGFloat *rgba) { - NSColor *bgColor, *color; + NSColor *bgColor, *color = nil; if (!sRGB) { sRGB = [NSColorSpace sRGBColorSpace]; @@ -268,7 +268,9 @@ GetRGBA( break; case semantic: if (entry->index == controlAccentIndex && useFakeAccentColor) { +#if MAC_OS_X_VERSION_MAX_ALLOWED < 101500 color = [NSColor colorForControlTint: [NSColor currentControlTint]]; +#endif } else { color = [[NSColor valueForKey:entry->selector] colorUsingColorSpace:sRGB]; } @@ -672,9 +674,9 @@ TkpGetColor( * suitable for passing to XParseColor). */ { Display *display = NULL; - Colormap colormap = noColormap; TkColor *tkColPtr; XColor color; + Colormap colormap = tkwin ? Tk_Colormap(tkwin) : noColormap; static Bool initialized = NO; static NSColorSpace* sRGB = NULL; @@ -683,10 +685,8 @@ TkpGetColor( sRGB = [NSColorSpace sRGBColorSpace]; initColorTable(); } - if (tkwin) { display = Tk_Display(tkwin); - colormap = TkMacOSXInDarkMode(tkwin) ? darkColormap : lightColormap; } /* @@ -706,21 +706,22 @@ TkpGetColor( color.pixel = p.ulong; if (entry->type == semantic) { CGFloat rgba[4]; - NSAppearance *savedAppearance = [NSAppearance currentAppearance]; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 - switch(colormap) { - case lightColormap: - [NSAppearance setCurrentAppearance:lightAqua]; - break; - case darkColormap: - [NSAppearance setCurrentAppearance:darkAqua]; - break; - default: - break; + NSAppearance *savedAppearance = [NSAppearance currentAppearance]; + NSAppearance *windowAppearance; + if (TkMacOSXInDarkMode(tkwin)) { + windowAppearance = darkAqua; + colormap = darkColormap; + } else { + windowAppearance = lightAqua; + colormap = lightColormap; } -#endif + [NSAppearance setCurrentAppearance:windowAppearance]; GetRGBA(entry, p.ulong, rgba); [NSAppearance setCurrentAppearance:savedAppearance]; +#else + GetRGBA(entry, p.ulong, rgba); +#endif color.red = rgba[0] * 65535.0; color.green = rgba[1] * 65535.0; color.blue = rgba[2] * 65535.0; @@ -752,6 +753,7 @@ TkpGetColor( validXColor: tkColPtr = ckalloc(sizeof(TkColor)); + tkColPtr->colormap = colormap; tkColPtr->color = color; return tkColPtr; } diff --git a/macosx/tkMacOSXConstants.h b/macosx/tkMacOSXConstants.h index e019ea1..19ffd2c 100644 --- a/macosx/tkMacOSXConstants.h +++ b/macosx/tkMacOSXConstants.h @@ -106,6 +106,8 @@ typedef NSInteger NSModalResponse; #define graphicsContextWithGraphicsPort graphicsContextWithCGContext #endif - +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 110000 +#define NSWindowStyleMaskTexturedBackground 0 #endif +#endif diff --git a/macosx/tkMacOSXPort.h b/macosx/tkMacOSXPort.h index 8d92601..f5c3689 100644 --- a/macosx/tkMacOSXPort.h +++ b/macosx/tkMacOSXPort.h @@ -159,10 +159,13 @@ */ #define TK_NO_DOUBLE_BUFFERING 1 +#define TK_HAS_DYNAMIC_COLORS 1 +#define TK_DYNAMIC_COLORMAP 0x0fffffff /* * Used by xcolor.c */ + MODULE_SCOPE unsigned long TkMacOSXRGBPixel(unsigned long red, unsigned long green, unsigned long blue); #define TkpGetPixel(p) (TkMacOSXRGBPixel(p->red, p->green, p->blue)) diff --git a/macosx/tkMacOSXWindowEvent.c b/macosx/tkMacOSXWindowEvent.c index 5f52ea7..a23a6d7 100644 --- a/macosx/tkMacOSXWindowEvent.c +++ b/macosx/tkMacOSXWindowEvent.c @@ -1137,13 +1137,6 @@ ConfigureRestrictProc( Tk_QueueWindowEvent((XEvent *) &event, TCL_QUEUE_TAIL); } -- (BOOL) isOpaque -{ - NSWindow *w = [self window]; - return (w && (([w styleMask] & NSTexturedBackgroundWindowMask) || - ![w isOpaque]) ? NO : YES); -} - /* * On Catalina this is never called and drawRect clips to the rect that * is passed to it by AppKit. -- cgit v0.12