Mercurial > dwindows
comparison mac/dw.m @ 1993:e643d280edae
Mac: Fix compilation with the Catalina 10.15 SDK.
IMP type has changed to be opaque and cannot call the methods.
Created a DWIMP that functions like IMP did in earlier SDKs.
WK_API_ENABLED has been removed, so define it ourselves with 10.15.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Sat, 21 Sep 2019 15:34:24 +0000 |
parents | 218fce0e3b06 |
children | 4c53c8367a12 |
comparison
equal
deleted
inserted
replaced
1992:4bfcad4986ff | 1993:e643d280edae |
---|---|
138 #if defined(MAC_OS_X_VERSION_10_14) && ((defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) || !defined(MAC_OS_X_VERSION_MAX_ALLOWED)) | 138 #if defined(MAC_OS_X_VERSION_10_14) && ((defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) || !defined(MAC_OS_X_VERSION_MAX_ALLOWED)) |
139 #define DWProgressIndicatorStyleBar NSProgressIndicatorStyleBar | 139 #define DWProgressIndicatorStyleBar NSProgressIndicatorStyleBar |
140 #define BUILDING_FOR_MOJAVE | 140 #define BUILDING_FOR_MOJAVE |
141 #else | 141 #else |
142 #define DWProgressIndicatorStyleBar NSProgressIndicatorBarStyle | 142 #define DWProgressIndicatorStyleBar NSProgressIndicatorBarStyle |
143 #endif | |
144 | |
145 /* Handle deprecation of several constants in 10.15... | |
146 * the replacements are not available in earlier versions. | |
147 */ | |
148 #if defined(MAC_OS_X_VERSION_10_15) && ((defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_15) || !defined(MAC_OS_X_VERSION_MAX_ALLOWED)) | |
149 #define DWProgressIndicatorStyleBar NSProgressIndicatorStyleBar | |
150 #define BUILDING_FOR_CATALINA | |
151 #define WK_API_ENABLED 1 | |
143 #endif | 152 #endif |
144 | 153 |
145 /* Macros to encapsulate running functions on the main thread | 154 /* Macros to encapsulate running functions on the main thread |
146 * on Mojave or later... and locking mutexes on earlier versions. | 155 * on Mojave or later... and locking mutexes on earlier versions. |
147 */ | 156 */ |
460 static void _do_resize(Box *thisbox, int x, int y); | 469 static void _do_resize(Box *thisbox, int x, int y); |
461 void _handle_resize_events(Box *thisbox); | 470 void _handle_resize_events(Box *thisbox); |
462 int _remove_userdata(UserData **root, char *varname, int all); | 471 int _remove_userdata(UserData **root, char *varname, int all); |
463 int _dw_main_iteration(NSDate *date); | 472 int _dw_main_iteration(NSDate *date); |
464 NSGraphicsContext *_dw_draw_context(NSBitmapImageRep *image); | 473 NSGraphicsContext *_dw_draw_context(NSBitmapImageRep *image); |
474 typedef id (*DWIMP)(id, SEL, ...); | |
465 | 475 |
466 /* Internal function to queue a window redraw */ | 476 /* Internal function to queue a window redraw */ |
467 void _dw_redraw(id window, int skip) | 477 void _dw_redraw(id window, int skip) |
468 { | 478 { |
469 static id lastwindow = nil; | 479 static id lastwindow = nil; |
623 { | 633 { |
624 int (* API motionfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction; | 634 int (* API motionfunc)(HWND, int, int, int, void *) = (int (* API)(HWND, int, int, int, void *))handler->signalfunction; |
625 id view = [[[event window] contentView] superview]; | 635 id view = [[[event window] contentView] superview]; |
626 NSPoint p = [view convertPoint:[event locationInWindow] toView:object]; | 636 NSPoint p = [view convertPoint:[event locationInWindow] toView:object]; |
627 SEL spmb = NSSelectorFromString(@"pressedMouseButtons"); | 637 SEL spmb = NSSelectorFromString(@"pressedMouseButtons"); |
628 IMP ipmb = [[NSEvent class] respondsToSelector:spmb] ? [[NSEvent class] methodForSelector:spmb] : 0; | 638 DWIMP ipmb = [[NSEvent class] respondsToSelector:spmb] ? (DWIMP)[[NSEvent class] methodForSelector:spmb] : 0; |
629 int buttonmask = ipmb ? (int)ipmb([NSEvent class], spmb) : (1 << [event buttonNumber]); | 639 int buttonmask = ipmb ? (int)ipmb([NSEvent class], spmb) : (1 << [event buttonNumber]); |
630 | 640 |
631 return motionfunc(object, (int)p.x, (int)p.y, buttonmask, handler->data); | 641 return motionfunc(object, (int)p.x, (int)p.y, buttonmask, handler->data); |
632 } | 642 } |
633 /* Window close event */ | 643 /* Window close event */ |
1175 { | 1185 { |
1176 DWTID curr = pthread_self(); | 1186 DWTID curr = pthread_self(); |
1177 | 1187 |
1178 if(DWThread == (DWTID)-1 || DWThread == curr) | 1188 if(DWThread == (DWTID)-1 || DWThread == curr) |
1179 { | 1189 { |
1180 IMP imp = [self methodForSelector:sel]; | 1190 DWIMP imp = (DWIMP)[self methodForSelector:sel]; |
1181 | 1191 |
1182 if(imp) | 1192 if(imp) |
1183 imp(self, sel, param); | 1193 imp(self, sel, param); |
1184 } | 1194 } |
1185 else | 1195 else |
1225 SEL siwc = NSSelectorFromString(@"initWithCGImage"); | 1235 SEL siwc = NSSelectorFromString(@"initWithCGImage"); |
1226 NSCompositingOperation op = DWCompositingOperationSourceOver; | 1236 NSCompositingOperation op = DWCompositingOperationSourceOver; |
1227 | 1237 |
1228 if([image respondsToSelector:siwc]) | 1238 if([image respondsToSelector:siwc]) |
1229 { | 1239 { |
1230 IMP iiwc = [image methodForSelector:siwc]; | 1240 DWIMP iiwc = (DWIMP)[image methodForSelector:siwc]; |
1231 image = iiwc(image, siwc, [rep CGImage], NSZeroSize); | 1241 image = iiwc(image, siwc, [rep CGImage], NSZeroSize); |
1232 } | 1242 } |
1233 else | 1243 else |
1234 { | 1244 { |
1235 image = [image initWithSize:[rep size]]; | 1245 image = [image initWithSize:[rep size]]; |
2150 imageFrame.size = imageSize; | 2160 imageFrame.size = imageSize; |
2151 | 2161 |
2152 /* New method for 10.6 and later */ | 2162 /* New method for 10.6 and later */ |
2153 if([image respondsToSelector:sdir]) | 2163 if([image respondsToSelector:sdir]) |
2154 { | 2164 { |
2155 IMP idir = [image methodForSelector:sdir]; | 2165 DWIMP idir = (DWIMP)[image methodForSelector:sdir]; |
2156 | 2166 |
2157 imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); | 2167 imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); |
2158 | 2168 |
2159 idir(image, sdir, imageFrame, NSZeroRect, op, 1.0, YES, nil); | 2169 idir(image, sdir, imageFrame, NSZeroRect, op, 1.0, YES, nil); |
2160 } | 2170 } |
2168 else | 2178 else |
2169 imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); | 2179 imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); |
2170 | 2180 |
2171 if([image respondsToSelector:sctp]) | 2181 if([image respondsToSelector:sctp]) |
2172 { | 2182 { |
2173 IMP ictp = [image methodForSelector:sctp]; | 2183 DWIMP ictp = (DWIMP)[image methodForSelector:sctp]; |
2174 | 2184 |
2175 ictp(image, sctp, imageFrame.origin, op); | 2185 ictp(image, sctp, imageFrame.origin, op); |
2176 } | 2186 } |
2177 } | 2187 } |
2178 } | 2188 } |
2515 if(![[NSPointerArray class] respondsToSelector:swopa]) | 2525 if(![[NSPointerArray class] respondsToSelector:swopa]) |
2516 swopa = NSSelectorFromString(@"weakObjectsPointerArray"); | 2526 swopa = NSSelectorFromString(@"weakObjectsPointerArray"); |
2517 if(![[NSPointerArray class] respondsToSelector:swopa]) | 2527 if(![[NSPointerArray class] respondsToSelector:swopa]) |
2518 return; | 2528 return; |
2519 | 2529 |
2520 IMP iwopa = [[NSPointerArray class] methodForSelector:swopa]; | 2530 DWIMP iwopa = (DWIMP)[[NSPointerArray class] methodForSelector:swopa]; |
2521 | 2531 |
2522 titles = iwopa([NSPointerArray class], swopa); | 2532 titles = iwopa([NSPointerArray class], swopa); |
2523 [titles retain]; | 2533 [titles retain]; |
2524 rowdatas = iwopa([NSPointerArray class], swopa); | 2534 rowdatas = iwopa([NSPointerArray class], swopa); |
2525 [rowdatas retain]; | 2535 [rowdatas retain]; |
3986 { | 3996 { |
3987 SEL ssdu = NSSelectorFromString(@"setDirectoryURL"); | 3997 SEL ssdu = NSSelectorFromString(@"setDirectoryURL"); |
3988 | 3998 |
3989 if([openDlg respondsToSelector:ssdu]) | 3999 if([openDlg respondsToSelector:ssdu]) |
3990 { | 4000 { |
3991 IMP isdu = [openDlg methodForSelector:ssdu]; | 4001 DWIMP isdu = (DWIMP)[openDlg methodForSelector:ssdu]; |
3992 isdu(openDlg, ssdu, [NSURL fileURLWithPath:[NSString stringWithUTF8String:path]]); | 4002 isdu(openDlg, ssdu, [NSURL fileURLWithPath:[NSString stringWithUTF8String:path]]); |
3993 } | 4003 } |
3994 } | 4004 } |
3995 | 4005 |
3996 /* Enable the selection of files in the dialog. */ | 4006 /* Enable the selection of files in the dialog. */ |
4042 { | 4052 { |
4043 SEL ssdu = NSSelectorFromString(@"setDirectoryURL"); | 4053 SEL ssdu = NSSelectorFromString(@"setDirectoryURL"); |
4044 | 4054 |
4045 if([saveDlg respondsToSelector:ssdu]) | 4055 if([saveDlg respondsToSelector:ssdu]) |
4046 { | 4056 { |
4047 IMP isdu = [saveDlg methodForSelector:ssdu]; | 4057 DWIMP isdu = (DWIMP)[saveDlg methodForSelector:ssdu]; |
4048 isdu(saveDlg, ssdu, [NSURL fileURLWithPath:[NSString stringWithUTF8String:path]]); | 4058 isdu(saveDlg, ssdu, [NSURL fileURLWithPath:[NSString stringWithUTF8String:path]]); |
4049 } | 4059 } |
4050 } | 4060 } |
4051 if(file) | 4061 if(file) |
4052 { | 4062 { |
4053 SEL ssnfsv = NSSelectorFromString(@"setNameFieldStringValue"); | 4063 SEL ssnfsv = NSSelectorFromString(@"setNameFieldStringValue"); |
4054 | 4064 |
4055 if([saveDlg respondsToSelector:ssnfsv]) | 4065 if([saveDlg respondsToSelector:ssnfsv]) |
4056 { | 4066 { |
4057 IMP isnfsv = [saveDlg methodForSelector:ssnfsv]; | 4067 DWIMP isnfsv = (DWIMP)[saveDlg methodForSelector:ssnfsv]; |
4058 isnfsv(saveDlg, ssnfsv, [NSString stringWithUTF8String:file]); | 4068 isnfsv(saveDlg, ssnfsv, [NSString stringWithUTF8String:file]); |
4059 } | 4069 } |
4060 } | 4070 } |
4061 | 4071 |
4062 /* Enable the creation of directories in the dialog. */ | 4072 /* Enable the creation of directories in the dialog. */ |
4123 NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; | 4133 NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; |
4124 SEL scc = NSSelectorFromString(@"clearContents"); | 4134 SEL scc = NSSelectorFromString(@"clearContents"); |
4125 | 4135 |
4126 if([pasteboard respondsToSelector:scc]) | 4136 if([pasteboard respondsToSelector:scc]) |
4127 { | 4137 { |
4128 IMP icc = [pasteboard methodForSelector:scc]; | 4138 DWIMP icc = (DWIMP)[pasteboard methodForSelector:scc]; |
4129 icc(pasteboard, scc); | 4139 icc(pasteboard, scc); |
4130 } | 4140 } |
4131 | 4141 |
4132 [pasteboard setString:[ NSString stringWithUTF8String:str ] forType:NSPasteboardTypeString]; | 4142 [pasteboard setString:[ NSString stringWithUTF8String:str ] forType:NSPasteboardTypeString]; |
4133 } | 4143 } |
9471 DWWindow *window = object; | 9481 DWWindow *window = object; |
9472 SEL sssm = NSSelectorFromString(@"setStyleMask"); | 9482 SEL sssm = NSSelectorFromString(@"setStyleMask"); |
9473 | 9483 |
9474 if([window respondsToSelector:sssm]) | 9484 if([window respondsToSelector:sssm]) |
9475 { | 9485 { |
9476 IMP issm = [window methodForSelector:sssm]; | 9486 DWIMP issm = (DWIMP)[window methodForSelector:sssm]; |
9477 int currentstyle = (int)[window styleMask]; | 9487 int currentstyle = (int)[window styleMask]; |
9478 int tmp; | 9488 int tmp; |
9479 | 9489 |
9480 tmp = currentstyle | (int)mask; | 9490 tmp = currentstyle | (int)mask; |
9481 tmp ^= mask; | 9491 tmp ^= mask; |