Mercurial > dwindows
comparison mac/dw.m @ 1958:45abd53a3fc6
Mac: Moved even/odd color code into DWContainer class since
it is only used there and apparently each window can have a
different dark/light theme so we store that information on
the control itself and detect mode changes there.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Thu, 25 Jul 2019 06:55:01 +0000 |
parents | c15af2f757e2 |
children | 9ac432c8620c |
comparison
equal
deleted
inserted
replaced
1957:c15af2f757e2 | 1958:45abd53a3fc6 |
---|---|
393 return image_exts[i]; | 393 return image_exts[i]; |
394 } | 394 } |
395 return NULL; | 395 return NULL; |
396 } | 396 } |
397 | 397 |
398 unsigned long _DW_COLOR_ROW_ODD = DW_RGB(230, 230, 230); | 398 /* Return the RGB color regardless if a predefined color was passed */ |
399 unsigned long _DW_COLOR_ROW_EVEN = DW_RGB_TRANSPARENT; | |
400 | |
401 unsigned long _get_color(unsigned long thiscolor) | 399 unsigned long _get_color(unsigned long thiscolor) |
402 { | 400 { |
403 if(thiscolor & DW_RGB_COLOR) | 401 if(thiscolor & DW_RGB_COLOR) |
404 { | 402 { |
405 return thiscolor & ~DW_RGB_COLOR; | 403 return thiscolor & ~DW_RGB_COLOR; |
407 else if(thiscolor < 17) | 405 else if(thiscolor < 17) |
408 { | 406 { |
409 return _colors[thiscolor]; | 407 return _colors[thiscolor]; |
410 } | 408 } |
411 return 0; | 409 return 0; |
410 } | |
411 | |
412 /* Returns TRUE of Mojave or later is in Dark Mode */ | |
413 BOOL _is_dark(NSAppearance * appearance) | |
414 { | |
415 #ifdef BUILDING_FOR_MOJAVE | |
416 if(@available(macOS 10.14, *)) | |
417 { | |
418 NSAppearanceName basicAppearance = [appearance bestMatchFromAppearancesWithNames:@[ | |
419 NSAppearanceNameAqua, | |
420 NSAppearanceNameDarkAqua]]; | |
421 return [basicAppearance isEqualToString:NSAppearanceNameDarkAqua]; | |
422 } | |
423 #endif | |
424 return NO; | |
412 } | 425 } |
413 | 426 |
414 /* Thread specific storage */ | 427 /* Thread specific storage */ |
415 #if !defined(GARBAGE_COLLECT) | 428 #if !defined(GARBAGE_COLLECT) |
416 pthread_key_t _dw_pool_key; | 429 pthread_key_t _dw_pool_key; |
422 | 435 |
423 /* Create a default colors for a thread */ | 436 /* Create a default colors for a thread */ |
424 void _init_colors(void) | 437 void _init_colors(void) |
425 { | 438 { |
426 NSColor *fgcolor = [[NSColor grayColor] retain]; | 439 NSColor *fgcolor = [[NSColor grayColor] retain]; |
427 #ifdef BUILDING_FOR_MOJAVE | |
428 if (@available(macOS 10.14, *)) | |
429 { | |
430 NSArray<NSColor *> *bgColors = [NSColor alternatingContentBackgroundColors]; | |
431 if(bgColors) | |
432 { | |
433 NSColor *color = bgColors[0]; | |
434 NSColor* device_color = [color colorUsingColorSpace:[NSColorSpace deviceRGBColorSpace]]; | |
435 CGFloat red, green, blue; | |
436 [device_color getRed:&red green:&green blue:&blue alpha:NULL]; | |
437 _DW_COLOR_ROW_ODD = DW_RGB((int)(red * 255), (int)(green *255), (int)(blue *255)); | |
438 color = bgColors[1]; | |
439 device_color = [color colorUsingColorSpace:[NSColorSpace deviceRGBColorSpace]]; | |
440 [device_color getRed:&red green:&green blue:&blue alpha:NULL]; | |
441 _DW_COLOR_ROW_EVEN = DW_RGB((int)(red * 255), (int)(green *255), (int)(blue *255)); | |
442 } | |
443 } | |
444 #endif | |
445 pthread_setspecific(_dw_fg_color_key, fgcolor); | 440 pthread_setspecific(_dw_fg_color_key, fgcolor); |
446 pthread_setspecific(_dw_bg_color_key, NULL); | 441 pthread_setspecific(_dw_bg_color_key, NULL); |
447 } | 442 } |
448 | 443 |
449 typedef struct _sighandler | 444 typedef struct _sighandler |
2183 NSMutableArray *data; | 2178 NSMutableArray *data; |
2184 NSMutableArray *types; | 2179 NSMutableArray *types; |
2185 NSPointerArray *titles; | 2180 NSPointerArray *titles; |
2186 NSPointerArray *rowdatas; | 2181 NSPointerArray *rowdatas; |
2187 NSColor *fgcolor, *oddcolor, *evencolor; | 2182 NSColor *fgcolor, *oddcolor, *evencolor; |
2183 unsigned long dw_oddcolor, dw_evencolor; | |
2184 unsigned long _DW_COLOR_ROW_ODD, _DW_COLOR_ROW_EVEN; | |
2188 int lastAddPoint, lastQueryPoint; | 2185 int lastAddPoint, lastQueryPoint; |
2189 id scrollview; | 2186 id scrollview; |
2190 int filesystem; | 2187 int filesystem; |
2191 } | 2188 } |
2192 -(NSInteger)numberOfRowsInTableView:(NSTableView *)aTable; | 2189 -(NSInteger)numberOfRowsInTableView:(NSTableView *)aTable; |
2286 -(int)filesystem { return filesystem; } | 2283 -(int)filesystem { return filesystem; } |
2287 -(id)scrollview { return scrollview; } | 2284 -(id)scrollview { return scrollview; } |
2288 -(void)setScrollview:(id)input { scrollview = input; } | 2285 -(void)setScrollview:(id)input { scrollview = input; } |
2289 -(void)addColumn:(NSTableColumn *)input andType:(int)type { if(tvcols) { [tvcols addObject:input]; [types addObject:[NSNumber numberWithInt:type]]; } } | 2286 -(void)addColumn:(NSTableColumn *)input andType:(int)type { if(tvcols) { [tvcols addObject:input]; [types addObject:[NSNumber numberWithInt:type]]; } } |
2290 -(NSTableColumn *)getColumn:(int)col { if(tvcols) { return [tvcols objectAtIndex:col]; } return nil; } | 2287 -(NSTableColumn *)getColumn:(int)col { if(tvcols) { return [tvcols objectAtIndex:col]; } return nil; } |
2291 -(void)setRowBgOdd:(unsigned long)oddcol andEven:(unsigned long)evencol | 2288 -(void)refreshColors |
2292 { | 2289 { |
2293 NSColor *oldodd = oddcolor; | 2290 NSColor *oldodd = oddcolor; |
2294 NSColor *oldeven = evencolor; | 2291 NSColor *oldeven = evencolor; |
2295 unsigned long _odd = _get_color(oddcol); | 2292 unsigned long thisodd = dw_oddcolor == DW_CLR_DEFAULT ? _DW_COLOR_ROW_ODD : dw_oddcolor; |
2296 unsigned long _even = _get_color(evencol); | 2293 unsigned long _odd = _get_color(thisodd); |
2294 unsigned long thiseven = dw_evencolor == DW_CLR_DEFAULT ? _DW_COLOR_ROW_EVEN : dw_evencolor; | |
2295 unsigned long _even = _get_color(thiseven); | |
2297 | 2296 |
2298 /* Get the NSColor for non-default colors */ | 2297 /* Get the NSColor for non-default colors */ |
2299 if(oddcol != DW_RGB_TRANSPARENT) | 2298 if(thisodd != DW_RGB_TRANSPARENT) |
2300 oddcolor = [[NSColor colorWithDeviceRed: DW_RED_VALUE(_odd)/255.0 green: DW_GREEN_VALUE(_odd)/255.0 blue: DW_BLUE_VALUE(_odd)/255.0 alpha: 1] retain]; | 2299 oddcolor = [[NSColor colorWithDeviceRed: DW_RED_VALUE(_odd)/255.0 green: DW_GREEN_VALUE(_odd)/255.0 blue: DW_BLUE_VALUE(_odd)/255.0 alpha: 1] retain]; |
2301 else | 2300 else |
2302 oddcolor = NULL; | 2301 oddcolor = NULL; |
2303 if(evencol != DW_RGB_TRANSPARENT) | 2302 if(thiseven != DW_RGB_TRANSPARENT) |
2304 evencolor = [[NSColor colorWithDeviceRed: DW_RED_VALUE(_even)/255.0 green: DW_GREEN_VALUE(_even)/255.0 blue: DW_BLUE_VALUE(_even)/255.0 alpha: 1] retain]; | 2303 evencolor = [[NSColor colorWithDeviceRed: DW_RED_VALUE(_even)/255.0 green: DW_GREEN_VALUE(_even)/255.0 blue: DW_BLUE_VALUE(_even)/255.0 alpha: 1] retain]; |
2305 else | 2304 else |
2306 evencolor = NULL; | 2305 evencolor = NULL; |
2307 [oldodd release]; | 2306 [oldodd release]; |
2308 [oldeven release]; | 2307 [oldeven release]; |
2309 } | 2308 } |
2309 -(void)setRowBgOdd:(unsigned long)oddcol andEven:(unsigned long)evencol | |
2310 { | |
2311 /* Save the set colors in case we get a theme change */ | |
2312 dw_oddcolor = oddcol; | |
2313 dw_evencolor = evencol; | |
2314 [self refreshColors]; | |
2315 } | |
2316 -(void)checkDark | |
2317 { | |
2318 /* Update any system colors based on the Dark Mode */ | |
2319 _DW_COLOR_ROW_EVEN = DW_RGB_TRANSPARENT; | |
2320 if(_is_dark([self effectiveAppearance])) | |
2321 _DW_COLOR_ROW_ODD = DW_RGB(100, 100, 100); | |
2322 else | |
2323 _DW_COLOR_ROW_ODD = DW_RGB(230, 230, 230); | |
2324 /* Only refresh if we've been setup already */ | |
2325 if(titles) | |
2326 [self refreshColors]; | |
2327 } | |
2328 -(void)viewDidChangeEffectiveAppearance { [self checkDark]; } | |
2310 -(int)insertRow:(NSArray *)input at:(int)index | 2329 -(int)insertRow:(NSArray *)input at:(int)index |
2311 { | 2330 { |
2312 if(data) | 2331 if(data) |
2313 { | 2332 { |
2314 unsigned long start = [tvcols count] * index; | 2333 unsigned long start = [tvcols count] * index; |
2486 rowdatas = iwopa([NSPointerArray class], swopa); | 2505 rowdatas = iwopa([NSPointerArray class], swopa); |
2487 [rowdatas retain]; | 2506 [rowdatas retain]; |
2488 tvcols = [[[NSMutableArray alloc] init] retain]; | 2507 tvcols = [[[NSMutableArray alloc] init] retain]; |
2489 data = [[[NSMutableArray alloc] init] retain]; | 2508 data = [[[NSMutableArray alloc] init] retain]; |
2490 types = [[[NSMutableArray alloc] init] retain]; | 2509 types = [[[NSMutableArray alloc] init] retain]; |
2491 | 2510 if(!dw_oddcolor && !dw_evencolor) |
2511 dw_oddcolor = dw_evencolor = DW_CLR_DEFAULT; | |
2512 [self checkDark]; | |
2492 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(selectionChanged:) name:NSTableViewSelectionDidChangeNotification object:self]; | 2513 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(selectionChanged:) name:NSTableViewSelectionDidChangeNotification object:self]; |
2493 } | 2514 } |
2494 -(NSSize)getsize | 2515 -(NSSize)getsize |
2495 { | 2516 { |
2496 int cwidth = 0, cheight = 0; | 2517 int cwidth = 0, cheight = 0; |
7430 DW_FUNCTION_NO_RETURN(dw_container_set_stripe) | 7451 DW_FUNCTION_NO_RETURN(dw_container_set_stripe) |
7431 DW_FUNCTION_RESTORE_PARAM3(handle, HWND, oddcolor, unsigned long, evencolor, unsigned long) | 7452 DW_FUNCTION_RESTORE_PARAM3(handle, HWND, oddcolor, unsigned long, evencolor, unsigned long) |
7432 { | 7453 { |
7433 DW_FUNCTION_INIT; | 7454 DW_FUNCTION_INIT; |
7434 DWContainer *cont = handle; | 7455 DWContainer *cont = handle; |
7435 [cont setRowBgOdd:(oddcolor == DW_CLR_DEFAULT ? _DW_COLOR_ROW_ODD : oddcolor) | 7456 [cont setRowBgOdd:oddcolor |
7436 andEven:(evencolor == DW_CLR_DEFAULT ? _DW_COLOR_ROW_EVEN : evencolor)]; | 7457 andEven:evencolor]; |
7437 DW_FUNCTION_RETURN_NOTHING; | 7458 DW_FUNCTION_RETURN_NOTHING; |
7438 } | 7459 } |
7439 | 7460 |
7440 /* | 7461 /* |
7441 * Sets the width of a column in the container. | 7462 * Sets the width of a column in the container. |