Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix [a91b242d43]: Correct macOSVersion on future macOS for older SDK builds |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | core-8-6-branch |
Files: | files | file ages | folders |
SHA3-256: |
f2d0ceecc7a789d3418eb16ec6b7b29b |
User & Date: | jan.nijtmans 2025-08-15 21:35:46.581 |
References
2025-08-15
| ||
22:30 | • Closed ticket [a91b242d]: Correct macOSVersion on future macOS for older SDK builds plus 7 other changes artifact: e04f5bab user: jan.nijtmans | |
Context
2025-08-15
| ||
22:12 | Fix [d93d96]: Pointer arithmetic with NULL in ImgGetPhoto() check-in: 61aaaad2 user: jan.nijtmans tags: core-8-6-branch | |
22:03 | Merge 8.6 check-in: 452179cb user: jan.nijtmans tags: core-9-0-branch | |
21:35 | Fix [a91b242d43]: Correct macOSVersion on future macOS for older SDK builds check-in: f2d0ceec user: jan.nijtmans tags: core-8-6-branch | |
19:16 | Merge release check-in: 74b1a05f user: dgp tags: core-8-6-branch | |
Changes
Changes to changes.
︙ | ︙ | |||
8292 8293 8294 8295 8296 8297 8298 | 2025-07-25 (bug) [e94c8b] interop with clipboard managers (ilyagr,culler) 2025-08-11 (bug) [dc38c9] Aqua: NSHighResolutionCapable should be a Boolean value (chavez) 2025-08-11 (bug) [4e1e10] Aqua: CGRect/NSRect type mismatch on 32-bit (root) - Released 8.6.17, Aug 15, 2025 - https://core.tcl-lang.org/tk/ for details | > > > > | 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 | 2025-07-25 (bug) [e94c8b] interop with clipboard managers (ilyagr,culler) 2025-08-11 (bug) [dc38c9] Aqua: NSHighResolutionCapable should be a Boolean value (chavez) 2025-08-11 (bug) [4e1e10] Aqua: CGRect/NSRect type mismatch on 32-bit (root) - Released 8.6.17, Aug 15, 2025 - https://core.tcl-lang.org/tk/ for details 2025-08-15 (bug) [a91b24] Correct macOSVersion on future macOS for older SDK builds (chavez) - (to be) Released 8.6.18, Apr ??, 2026 - https://core.tcl-lang.org/tk/ for details |
Changes to macosx/tkMacOSXInit.c.
︙ | ︙ | |||
35 36 37 38 39 40 41 | static char scriptPath[PATH_MAX + 1] = ""; /* * Forward declarations... */ | | < > | 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | static char scriptPath[PATH_MAX + 1] = ""; /* * Forward declarations... */ static Tcl_ObjCmdProc TkMacOSXGetAppPathObjCmd; #pragma mark TKApplication(TKInit) @implementation TKApplication @synthesize poolLock = _poolLock; @synthesize macOSVersion = _macOSVersion; @synthesize isDrawing = _isDrawing; @synthesize needsToDraw = _needsToDraw; @synthesize tkLiveResizeEnded = _tkLiveResizeEnded; @synthesize tkPointerWindow = _tkPointerWindow; - (void) setTkPointerWindow: (TkWindow *)winPtr { if (winPtr) { Tcl_Preserve(winPtr); } if (_tkPointerWindow) { Tcl_Release(_tkPointerWindow); |
︙ | ︙ | |||
139 140 141 142 143 144 145 146 147 148 149 150 151 152 | /* * Fix for 10b38a7a7c. */ - (BOOL)applicationSupportsSecureRestorableState:(NSApplication *)app { return YES; } -(void)applicationWillFinishLaunching:(NSNotification *)aNotification { (void)aNotification; | > | 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | /* * Fix for 10b38a7a7c. */ - (BOOL)applicationSupportsSecureRestorableState:(NSApplication *)app { (void) app; return YES; } -(void)applicationWillFinishLaunching:(NSNotification *)aNotification { (void)aNotification; |
︙ | ︙ | |||
183 184 185 186 187 188 189 | /* * Initialize Apple Event processing on macOS versions * older than Big Sur (11). */ TkMacOSXInitAppleEvents(_eventInterp); | < | 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | /* * Initialize Apple Event processing on macOS versions * older than Big Sur (11). */ TkMacOSXInitAppleEvents(_eventInterp); } /* * Initialize the graphics context. */ |
︙ | ︙ | |||
279 280 281 282 283 284 285 | * Apple never released macOS 10.16. To work around this we guess the * OS version from the kernel release number, as reported by uname. */ struct utsname name; char *endptr; if (uname(&name) == 0) { | | > > > | 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 | * Apple never released macOS 10.16. To work around this we guess the * OS version from the kernel release number, as reported by uname. */ struct utsname name; char *endptr; if (uname(&name) == 0) { majorVersion = (int)strtol(name.release, &endptr, 10) + 1; if (majorVersion < 26) { majorVersion -= 10; } minorVersion = 0; } } [NSApp setMacOSVersion: 10000*majorVersion + 100*minorVersion]; /* * We are not drawing right now. |
︙ | ︙ | |||
390 391 392 393 394 395 396 | static void closePanels( void) { if ([NSFontPanel sharedFontPanelExists]) { [[NSFontPanel sharedFontPanel] orderOut:nil]; } if ([NSColorPanel sharedColorPanelExists]) { | | | 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 | static void closePanels( void) { if ([NSFontPanel sharedFontPanelExists]) { [[NSFontPanel sharedFontPanel] orderOut:nil]; } if ([NSColorPanel sharedColorPanelExists]) { [[NSColorPanel sharedColorPanel] orderOut:nil]; } } /* * This custom exit procedure is called by Tcl_Exit in place of the exit * function from the C runtime. It calls the terminate method of the * NSApplication class (superTerminate for a TKApplication). The purpose of |
︙ | ︙ | |||
467 468 469 470 471 472 473 | * TkpInit can be called multiple times with different interpreters. But * The application initialization should only be done once. */ if (!initialized) { struct stat st; Bool shouldOpenConsole = NO; | | | 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 | * TkpInit can be called multiple times with different interpreters. But * The application initialization should only be done once. */ if (!initialized) { struct stat st; Bool shouldOpenConsole = NO; Bool stdinIsNullish = (!isatty(0) && (fstat(0, &st) || (S_ISCHR(st.st_mode) && st.st_blocks == 0))); /* * Initialize/check OS version variable for runtime checks. */ #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 |
︙ | ︙ | |||
491 492 493 494 495 496 497 | * framework scripts directory. * FIXME: Should we come up with a more generic way of doing this? */ if (Tcl_MacOSXOpenVersionedBundleResources(interp, "com.tcltk.tklibrary", TK_FRAMEWORK_VERSION, 0, PATH_MAX, tkLibPath) != TCL_OK) { | | | 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 | * framework scripts directory. * FIXME: Should we come up with a more generic way of doing this? */ if (Tcl_MacOSXOpenVersionedBundleResources(interp, "com.tcltk.tklibrary", TK_FRAMEWORK_VERSION, 0, PATH_MAX, tkLibPath) != TCL_OK) { # if 0 /* This is not really an error. Wish still runs fine. */ TkMacOSXDbgMsg("Tcl_MacOSXOpenVersionedBundleResources failed"); # endif } #endif /* * Instantiate our NSApplication object. This needs to be done before |
︙ | ︙ | |||
513 514 515 516 517 518 519 | @"_NSCanWrapButtonTitles", [NSNumber numberWithInt:-1], @"NSStringDrawingTypesetterBehavior", nil]]; [TKApplication sharedApplication]; [pool drain]; | | | | | | | | | | | | | | | | | | | | | | | | | | | 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 | @"_NSCanWrapButtonTitles", [NSNumber numberWithInt:-1], @"NSStringDrawingTypesetterBehavior", nil]]; [TKApplication sharedApplication]; [pool drain]; /* * WARNING: The finishLaunching method runs asynchronously. This * creates a race between the initialization of the NSApplication and * the initialization of Tk. If Tk wins the race bad things happen * with the root window (see below). If the NSApplication wins then an * AppleEvent created during launch, e.g. by dropping a file icon on * the application icon, will be delivered before the procedure meant * to to handle the AppleEvent has been defined. This is handled in * tkMacOSXHLEvents.c by scheduling a timer event to handle the * AppleEvent later, after the required procedure has been defined. */ [NSApp _setup:interp]; [NSApp finishLaunching]; /* * Create a Tk event source based on the Appkit event queue. */ Tk_MacOSXSetupTkNotifier(); /* * If Tk initialization wins the race, the root window is mapped before * the NSApplication is initialized. This can cause bad things to * happen. The root window can open off screen with no way to make it * appear on screen until the app icon is clicked. This will happen if * a Tk application opens a modal window in its startup script (see * ticket 56a1823c73). In other cases, an empty root window can open * on screen and remain visible for a noticeable amount of time while * the Tk initialization finishes (see ticket d1989fb7cf). The call * below forces Tk to block until the Appkit event queue has been * created. This seems to be sufficient to ensure that the * NSApplication initialization wins the race, avoiding these bad * window behaviors. */ Tcl_DoOneEvent(TCL_WINDOW_EVENTS | TCL_DONT_WAIT); /* * Decide whether to open a console window. If the TK_CONSOLE * environment variable is not defined we only show the console if |
︙ | ︙ | |||
627 628 629 630 631 632 633 634 635 636 637 638 639 640 | * The root window has been created and mapped, but XMapWindow deferred its * call to makeKeyAndOrderFront because the first call to XMapWindow * occurs too early in the initialization process for that. Process idle * tasks now, so the root window is configured, then order it front. */ while(Tcl_DoOneEvent(TCL_IDLE_EVENTS)) {}; for (NSWindow *window in [NSApp windows]) { TkWindow *winPtr = TkMacOSXGetTkWindow(window); if (winPtr && Tk_IsMapped(winPtr)) { [window makeKeyAndOrderFront:NSApp]; break; } } | > | 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 | * The root window has been created and mapped, but XMapWindow deferred its * call to makeKeyAndOrderFront because the first call to XMapWindow * occurs too early in the initialization process for that. Process idle * tasks now, so the root window is configured, then order it front. */ while(Tcl_DoOneEvent(TCL_IDLE_EVENTS)) {}; for (NSWindow *window in [NSApp windows]) { TkWindow *winPtr = TkMacOSXGetTkWindow(window); if (winPtr && Tk_IsMapped(winPtr)) { [window makeKeyAndOrderFront:NSApp]; break; } } |
︙ | ︙ | |||
653 654 655 656 657 658 659 | * application is killed with one of these signals. */ signal(SIGINT, TkMacOSXSignalHandler); signal(SIGHUP, TkMacOSXSignalHandler); signal(SIGTERM, TkMacOSXSignalHandler); } | < > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > | 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 | * application is killed with one of these signals. */ signal(SIGINT, TkMacOSXSignalHandler); signal(SIGHUP, TkMacOSXSignalHandler); signal(SIGTERM, TkMacOSXSignalHandler); } /* * Initialization steps that are needed for all interpreters. */ if (tkLibPath[0] != '\0') { Tcl_SetVar2(interp, "tk_library", NULL, tkLibPath, TCL_GLOBAL_ONLY); } if (scriptPath[0] != '\0') { Tcl_SetVar2(interp, "auto_path", NULL, scriptPath, TCL_GLOBAL_ONLY|TCL_LIST_ELEMENT|TCL_APPEND_VALUE); } Tcl_CreateObjCommand(interp, "::tk::mac::standardAboutPanel", TkMacOSXStandardAboutPanelObjCmd, NULL, NULL); Tcl_CreateObjCommand(interp, "::tk::mac::iconBitmap", TkMacOSXIconBitmapObjCmd, NULL, NULL); Tcl_CreateObjCommand(interp, "::tk::mac::GetAppPath", TkMacOSXGetAppPathObjCmd, NULL, NULL); return TCL_OK; } /* *---------------------------------------------------------------------- * * TkMacOSXGetAppPathObjCmd -- * * Returns the path of the Wish application bundle. * * Results: * Returns the application path. * * Side effects: * None. * *---------------------------------------------------------------------- */ static int TkMacOSXGetAppPathObjCmd( TCL_UNUSED(void *), /* clientData */ Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { if (objc != 1) { Tcl_WrongNumArgs(interp, 1, objv, NULL); return TCL_ERROR; } /* * Get the application path URL and convert it to a string path reference. */ CFURLRef mainBundleURL = CFBundleCopyBundleURL(CFBundleGetMainBundle()); CFStringRef appPath = CFURLCopyFileSystemPath(mainBundleURL, kCFURLPOSIXPathStyle); /* * Convert (and copy) the string reference into a Tcl result. */ Tcl_SetObjResult(interp, Tcl_NewStringObj( CFStringGetCStringPtr(appPath, CFStringGetSystemEncoding()), -1)); CFRelease(mainBundleURL); CFRelease(appPath); return TCL_OK; } /* *---------------------------------------------------------------------- * |
︙ | ︙ | |||
711 712 713 714 715 716 717 | p = strrchr(name, '/'); if (p != NULL) { name = p+1; } } Tcl_DStringAppend(namePtr, name, -1); } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 763 764 765 766 767 768 769 770 771 772 773 774 775 776 | p = strrchr(name, '/'); if (p != NULL) { name = p+1; } } Tcl_DStringAppend(namePtr, name, -1); } /* *---------------------------------------------------------------------- * * TkpDisplayWarning -- * * This routines is called from Tk_Main to display warning messages that |
︙ | ︙ | |||
828 829 830 831 832 833 834 | if (appMainURL != NULL) { CFURLRef scriptFldrURL; char startupScript[PATH_MAX + 1]; if (CFURLGetFileSystemRepresentation(appMainURL, true, (unsigned char *) startupScript, PATH_MAX)) { | | | 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 | if (appMainURL != NULL) { CFURLRef scriptFldrURL; char startupScript[PATH_MAX + 1]; if (CFURLGetFileSystemRepresentation(appMainURL, true, (unsigned char *) startupScript, PATH_MAX)) { Tcl_SetStartupScript(Tcl_NewStringObj(startupScript, -1), NULL); scriptFldrURL = CFURLCreateCopyDeletingLastPathComponent(NULL, appMainURL); if (scriptFldrURL != NULL) { CFURLGetFileSystemRepresentation(scriptFldrURL, true, (unsigned char *) scriptPath, PATH_MAX); CFRelease(scriptFldrURL); } |
︙ | ︙ |