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.