Fix memory leak in ANSCI parsing code
We do not have ARC enabled.
This commit is contained in:
parent
4ded79801f
commit
c9acccaddc
5 changed files with 49 additions and 38 deletions
|
@ -4,8 +4,8 @@
|
||||||
// Use of this source code is governed by the MIT license that can be
|
// Use of this source code is governed by the MIT license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef ATOM_BROWSER_UI_COCOA_NSCOLOR+HEX_H_
|
#ifndef ATOM_BROWSER_UI_COCOA_NSCOLOR_HEX_H_
|
||||||
#define ATOM_BROWSER_UI_COCOA_NSCOLOR+HEX_H_
|
#define ATOM_BROWSER_UI_COCOA_NSCOLOR_HEX_H_
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
@implementation NSColor (Hex)
|
@implementation NSColor (Hex)
|
||||||
|
|
||||||
+ (NSColor*)colorWithHexColorString:(NSString*)inColorString {
|
+ (NSColor*)colorWithHexColorString:(NSString*)inColorString {
|
||||||
NSColor* result = nil;
|
|
||||||
unsigned colorCode = 0;
|
unsigned colorCode = 0;
|
||||||
unsigned char redByte, greenByte, blueByte;
|
unsigned char redByte, greenByte, blueByte;
|
||||||
|
|
||||||
|
|
|
@ -10,10 +10,8 @@
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
@interface NSString(ANSI)
|
@interface NSString(ANSI)
|
||||||
|
|
||||||
- (BOOL)containsANSICodes;
|
- (BOOL)containsANSICodes;
|
||||||
- (NSMutableAttributedString*)attributedStringParsingANSICodes;
|
- (NSMutableAttributedString*)attributedStringParsingANSICodes;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
#endif // ATOM_BROWSER_UI_COCOA_NSSTRING_ANSI_H_
|
#endif // ATOM_BROWSER_UI_COCOA_NSSTRING_ANSI_H_
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
// Use of this source code is governed by the MIT license that can be
|
// Use of this source code is governed by the MIT license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#import "Cocoa/Cocoa.h"
|
#include "atom/browser/ui/cocoa/NSString+ANSI.h"
|
||||||
#import "NSString+ANSI.h"
|
#include "atom/browser/ui/cocoa/NSColor+Hex.h"
|
||||||
#import "NSColor+Hex.h"
|
#include "base/mac/scoped_nsobject.h"
|
||||||
|
|
||||||
@implementation NSMutableDictionary (ANSI)
|
@implementation NSMutableDictionary (ANSI)
|
||||||
|
|
||||||
|
@ -112,9 +112,12 @@
|
||||||
- (NSMutableAttributedString*)attributedStringParsingANSICodes {
|
- (NSMutableAttributedString*)attributedStringParsingANSICodes {
|
||||||
NSMutableAttributedString* result = [[NSMutableAttributedString alloc] init];
|
NSMutableAttributedString* result = [[NSMutableAttributedString alloc] init];
|
||||||
|
|
||||||
NSMutableDictionary* attributes = [NSMutableDictionary.alloc init];
|
base::scoped_nsobject<NSMutableDictionary> attributes(
|
||||||
|
[[NSMutableDictionary alloc] init]);
|
||||||
NSArray* parts = [self componentsSeparatedByString:@"\\033["];
|
NSArray* parts = [self componentsSeparatedByString:@"\\033["];
|
||||||
[result appendAttributedString:[NSAttributedString.alloc initWithString:parts.firstObject attributes:nil]];
|
[result appendAttributedString:[[[NSAttributedString alloc]
|
||||||
|
initWithString:parts.firstObject
|
||||||
|
attributes:nil] autorelease]];
|
||||||
|
|
||||||
for (NSString* part in [parts subarrayWithRange:NSMakeRange(1, parts.count - 1)]) {
|
for (NSString* part in [parts subarrayWithRange:NSMakeRange(1, parts.count - 1)]) {
|
||||||
if (part.length == 0)
|
if (part.length == 0)
|
||||||
|
@ -124,17 +127,20 @@
|
||||||
NSString* text = sequence.lastObject;
|
NSString* text = sequence.lastObject;
|
||||||
|
|
||||||
if (sequence.count < 2) {
|
if (sequence.count < 2) {
|
||||||
[result appendAttributedString:[NSAttributedString.alloc initWithString:text attributes:attributes]];
|
[result appendAttributedString:[[[NSAttributedString alloc]
|
||||||
|
initWithString:text
|
||||||
|
attributes:attributes] autorelease]];
|
||||||
} else if (sequence.count >= 2) {
|
} else if (sequence.count >= 2) {
|
||||||
text = [[sequence subarrayWithRange:NSMakeRange(1, sequence.count - 1)] componentsJoinedByString:@"m"];
|
text = [[sequence subarrayWithRange:NSMakeRange(1, sequence.count - 1)]
|
||||||
|
componentsJoinedByString:@"m"];
|
||||||
[attributes modifyAttributesForANSICodes:sequence[0]];
|
[attributes modifyAttributesForANSICodes:sequence[0]];
|
||||||
[result appendAttributedString:[NSAttributedString.alloc initWithString:text attributes:attributes]];
|
[result appendAttributedString:[[[NSAttributedString alloc]
|
||||||
|
initWithString:text
|
||||||
|
attributes:attributes] autorelease]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -5,12 +5,12 @@
|
||||||
#include "atom/browser/ui/tray_icon_cocoa.h"
|
#include "atom/browser/ui/tray_icon_cocoa.h"
|
||||||
|
|
||||||
#include "atom/browser/ui/cocoa/atom_menu_controller.h"
|
#include "atom/browser/ui/cocoa/atom_menu_controller.h"
|
||||||
|
#include "atom/browser/ui/cocoa/NSString+ANSI.h"
|
||||||
#include "base/strings/sys_string_conversions.h"
|
#include "base/strings/sys_string_conversions.h"
|
||||||
#include "ui/events/cocoa/cocoa_event_utils.h"
|
#include "ui/events/cocoa/cocoa_event_utils.h"
|
||||||
#include "ui/gfx/image/image.h"
|
#include "ui/gfx/image/image.h"
|
||||||
#include "ui/gfx/mac/coordinate_conversion.h"
|
#include "ui/gfx/mac/coordinate_conversion.h"
|
||||||
#include "ui/display/screen.h"
|
#include "ui/display/screen.h"
|
||||||
#include "atom/browser/ui/cocoa/NSString+ANSI.h"
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -122,8 +122,8 @@ const CGFloat kVerticalTitleMargin = 2;
|
||||||
NSRect titleDrawRect = NSMakeRect(
|
NSRect titleDrawRect = NSMakeRect(
|
||||||
[self iconWidth], -kVerticalTitleMargin, [self titleWidth], thickness);
|
[self iconWidth], -kVerticalTitleMargin, [self titleWidth], thickness);
|
||||||
|
|
||||||
NSAttributedString* titleParsed = [self attributedTitleWithParams:title_];
|
base::scoped_nsobject<NSAttributedString> titleParsed(
|
||||||
|
[self attributedTitleWithParams:title_]);
|
||||||
[titleParsed drawInRect:titleDrawRect];
|
[titleParsed drawInRect:titleDrawRect];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,10 +174,13 @@ const CGFloat kVerticalTitleMargin = 2;
|
||||||
// The width of the title.
|
// The width of the title.
|
||||||
- (CGFloat)titleWidth {
|
- (CGFloat)titleWidth {
|
||||||
if (!title_)
|
if (!title_)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (ANSI_)
|
if (ANSI_) {
|
||||||
return [[title_ attributedStringParsingANSICodes] size].width + 10;
|
base::scoped_nsobject<NSMutableAttributedString> attributedTitle(
|
||||||
|
[title_ attributedStringParsingANSICodes]);
|
||||||
|
return [attributedTitle size].width + 10;
|
||||||
|
}
|
||||||
|
|
||||||
base::scoped_nsobject<NSAttributedString> attributes(
|
base::scoped_nsobject<NSAttributedString> attributes(
|
||||||
[[NSAttributedString alloc] initWithString:title_
|
[[NSAttributedString alloc] initWithString:title_
|
||||||
|
@ -226,25 +229,30 @@ const CGFloat kVerticalTitleMargin = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (NSAttributedString*) attributedTitleWithParams:(NSString *)fullTitle {
|
- (NSAttributedString*)attributedTitleWithParams:(NSString*)fullTitle {
|
||||||
fullTitle = [fullTitle stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceCharacterSet];
|
NSString* title = [fullTitle
|
||||||
NSString * title = fullTitle;
|
stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
||||||
|
NSDictionary* attributes =
|
||||||
|
[self titleAttributesWithHighlight:[self isHighlighted]];
|
||||||
|
|
||||||
NSDictionary* attributes = [self titleAttributesWithHighlight:[self isHighlighted]];
|
base::scoped_nsobject<NSMutableAttributedString> attributedTitle(
|
||||||
NSMutableAttributedString * attributedTitle = [NSMutableAttributedString.alloc initWithString:title attributes:attributes];
|
[[NSMutableAttributedString alloc] initWithString:title
|
||||||
if (ANSI_) {
|
attributes:attributes]);
|
||||||
attributedTitle = [title attributedStringParsingANSICodes];
|
if (ANSI_) {
|
||||||
[attributedTitle addAttributes:attributes range:NSMakeRange(0, attributedTitle.length)];
|
attributedTitle.reset([title attributedStringParsingANSICodes]);
|
||||||
return attributedTitle;
|
[attributedTitle addAttributes:attributes
|
||||||
}
|
range:NSMakeRange(0, [attributedTitle length])];
|
||||||
|
return attributedTitle.release();
|
||||||
|
}
|
||||||
|
|
||||||
//NSFontAttributeName:[NSFont menuBarFontOfSize:0],
|
//NSFontAttributeName:[NSFont menuBarFontOfSize:0],
|
||||||
//NSForegroundColorAttributeName:[self colorWithHighlight: highlight]
|
//NSForegroundColorAttributeName:[self colorWithHighlight: highlight]
|
||||||
|
[attributedTitle addAttributes:attributes
|
||||||
[attributedTitle addAttributes:attributes range:NSMakeRange(0, attributedTitle.length)];
|
range:NSMakeRange(0, [attributedTitle length])];
|
||||||
[attributedTitle addAttribute:NSForegroundColorAttributeName value:[self colorWithHighlight: [self isDarkMode]] range:NSMakeRange(0, attributedTitle.length)];
|
[attributedTitle addAttribute:NSForegroundColorAttributeName
|
||||||
|
value:[self colorWithHighlight: [self isDarkMode]]
|
||||||
return attributedTitle;
|
range:NSMakeRange(0, [attributedTitle length])];
|
||||||
|
return attributedTitle.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setMenuController:(AtomMenuController*)menu {
|
- (void)setMenuController:(AtomMenuController*)menu {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue