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;