Skip to content

Commit f364f30

Browse files
committed
Add support for html style colors in OSC 4 and friends
1 parent e7a5cdd commit f364f30

File tree

5 files changed

+39
-22
lines changed

5 files changed

+39
-22
lines changed

sources/NSColor+iTerm.m

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -458,28 +458,11 @@ - (NSString *)hexString {
458458
}
459459

460460
+ (instancetype)colorFromHexString:(NSString *)hexString {
461-
if (![hexString hasPrefix:@"#"]) {
461+
int red, green, blue;
462+
if (![hexString getHashColorRed:&red green:&green blue:&blue]) {
462463
return nil;
463464
}
464-
if (hexString.length == 4) {
465-
NSString *first = [hexString substringWithRange:NSMakeRange(1, 1)];
466-
NSString *second = [hexString substringWithRange:NSMakeRange(2, 1)];
467-
NSString *third = [hexString substringWithRange:NSMakeRange(3, 1)];
468-
hexString = [NSString stringWithFormat:@"#%@%@%@%@%@%@", first, first, second, second, third, third];
469-
}
470-
if (hexString.length != 7) {
471-
return nil;
472-
}
473-
474-
NSScanner *scanner = [NSScanner scannerWithString:[hexString substringFromIndex:1]];
475-
unsigned long long ll;
476-
if (![scanner scanHexLongLong:&ll]) {
477-
return nil;
478-
}
479-
CGFloat red = (ll >> 16) & 0xff;
480-
CGFloat green = (ll >> 8) & 0xff;
481-
CGFloat blue = (ll >> 0) & 0xff;
482-
return [NSColor colorWithSRGBRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1];
465+
return [NSColor colorWithSRGBRed:red / 255.0 green:green / 255.0 blue:blue / 255.0 alpha:1];
483466
}
484467

485468
- (NSColor *)it_colorByDimmingByAmount:(double)dimmingAmount {

sources/NSStringITerm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ int decode_utf8_char(const unsigned char * restrict datap,
341341
- (NSString *)removingHTMLFromTabTitleIfNeeded;
342342
// nil if this is not scannable as an integer.
343343
- (NSNumber *)integerNumber;
344+
- (BOOL)getHashColorRed:(int *)red green:(int *)green blue:(int *)blue;
344345

345346
@end
346347

sources/NSStringITerm.m

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2230,6 +2230,32 @@ - (NSNumber *)integerNumber {
22302230
return @(value);
22312231
}
22322232

2233+
- (BOOL)getHashColorRed:(int *)red green:(int *)green blue:(int *)blue {
2234+
if (![self hasPrefix:@"#"]) {
2235+
return NO;
2236+
}
2237+
if (self.length == 4) {
2238+
NSString *first = [self substringWithRange:NSMakeRange(1, 1)];
2239+
NSString *second = [self substringWithRange:NSMakeRange(2, 1)];
2240+
NSString *third = [self substringWithRange:NSMakeRange(3, 1)];
2241+
NSString *extended = [NSString stringWithFormat:@"#%@%@%@%@%@%@", first, first, second, second, third, third];
2242+
return [extended getHashColorRed:red green:green blue:blue];
2243+
}
2244+
if (self.length != 7) {
2245+
return NO;
2246+
}
2247+
2248+
NSScanner *scanner = [NSScanner scannerWithString:[self substringFromIndex:1]];
2249+
unsigned long long ll;
2250+
if (![scanner scanHexLongLong:&ll]) {
2251+
return NO;
2252+
}
2253+
*red = (ll >> 16) & 0xff;
2254+
*green = (ll >> 8) & 0xff;
2255+
*blue = (ll >> 0) & 0xff;
2256+
return YES;
2257+
}
2258+
22332259
@end
22342260

22352261
@implementation NSMutableString (iTerm)

sources/VT100Terminal.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2733,6 +2733,13 @@ - (NSString *)decrqssPayload:(NSString *)pt {
27332733
}
27342734
}
27352735
}
2736+
if ([part hasPrefix:@"#"]) {
2737+
int red, green, blue;
2738+
if (![part getHashColorRed:&red green:&green blue:&blue]) {
2739+
return nil;
2740+
}
2741+
return @[ @(red / 255.0), @(green / 255.0), @(blue / 255.0) ];
2742+
}
27362743
return nil;
27372744
}
27382745

tests/osc4-and-friends.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ def hex2(n):
1212
return "{:02x}".format(n)
1313

1414
def rgb(r,g,b):
15-
#return "#" + hex2(r) + hex2(g) + hex2(b)
16-
return "rgb:" + "/".join([hex2(r), hex2(g), hex2(b)])
15+
return "#" + hex2(r) + hex2(g) + hex2(b)
16+
#return "rgb:" + "/".join([hex2(r), hex2(g), hex2(b)])
1717

1818
class DynamicColor(enum.Enum):
1919
# Values are (reset OSC, set OSC)

0 commit comments

Comments
 (0)