diff --git a/Messenger/AppDelegate.mm b/Messenger/AppDelegate.mm index c872f12..f6989a4 100644 --- a/Messenger/AppDelegate.mm +++ b/Messenger/AppDelegate.mm @@ -249,6 +249,11 @@ - (void)applicationDidFinishLaunching:(NSNotification*)notification { toItem:_curtainView attribute:NSLayoutAttributeCenterY multiplier:1.f constant:0.f]]; + + // Touch bar + if ([NSTouchBar class]) { + [[NSApplication sharedApplication] setAutomaticCustomizeTouchBarMenuItemEnabled:YES]; + } // Present main window [_window makeKeyAndOrderFront:self]; diff --git a/Messenger/FBMWindow.h b/Messenger/FBMWindow.h index b511528..c4dc374 100644 --- a/Messenger/FBMWindow.h +++ b/Messenger/FBMWindow.h @@ -1,4 +1,4 @@ -@interface FBMWindow : NSWindow +@interface FBMWindow : NSWindow @property (nonatomic) CGFloat titlebarHeight; diff --git a/Messenger/FBMWindow.mm b/Messenger/FBMWindow.mm index d47b879..f11243c 100644 --- a/Messenger/FBMWindow.mm +++ b/Messenger/FBMWindow.mm @@ -160,6 +160,48 @@ - (void)hideTitlebarAnimate:(BOOL)animate { +#pragma mark - Touch Bar + +static NSString * const touchBarIdentifier = @"me.rsms.fbmessenger.touchbar"; +static NSString * const touchBarComposeButtonIdentifier = @"me.rsms.fbmessenger.touchbar.compose"; +static NSString * const touchBarConversationNavigationIdentifier = @"me.rsms.fbmessenger.touchbar.conversationNavigation"; + +- (NSTouchBar *)makeTouchBar { + auto bar = [NSTouchBar new]; + bar.delegate = self; + bar.customizationIdentifier = touchBarIdentifier; + bar.defaultItemIdentifiers = @[touchBarComposeButtonIdentifier, NSTouchBarItemIdentifierOtherItemsProxy, NSTouchBarItemIdentifierFlexibleSpace, touchBarConversationNavigationIdentifier]; + bar.customizationAllowedItemIdentifiers = @[touchBarComposeButtonIdentifier, touchBarConversationNavigationIdentifier]; + + return bar; +} + +- (NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier { + if ([identifier isEqual:touchBarComposeButtonIdentifier]) { + auto item = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier]; + item.customizationLabel = @"New Message"; + item.view = [NSButton buttonWithImage:[NSImage imageNamed:NSImageNameTouchBarComposeTemplate] target:[NSApp delegate] action:@selector(composeNewMessage:)]; + return item; + } + if ([identifier isEqual:touchBarConversationNavigationIdentifier]) { + auto item = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier]; + item.customizationLabel = @"Conversation Navigation"; + auto segmentedControl = [NSSegmentedControl segmentedControlWithImages:@[[NSImage imageNamed:NSImageNameTouchBarGoUpTemplate], [NSImage imageNamed:NSImageNameTouchBarGoDownTemplate]] trackingMode:NSSegmentSwitchTrackingMomentary target:self action:@selector(conversationNavigationSegmentedControlDidSelect:)]; + segmentedControl.segmentStyle = NSSegmentStyleSeparated; + item.view = segmentedControl; + return item; + } + return nil; +} + +- (void)conversationNavigationSegmentedControlDidSelect:(NSSegmentedControl *)sender { + auto delegate = (AppDelegate *)[NSApp delegate]; + if (sender.selectedSegment == 0) [delegate selectNewerConversation:sender]; + else if (sender.selectedSegment == 1) [delegate selectOlderConversation:sender]; +} + + + #pragma mark - NSWindowDelegate diff --git a/website/app/main.js b/website/app/main.js index 14365d3..45432c4 100644 --- a/website/app/main.js +++ b/website/app/main.js @@ -302,7 +302,11 @@ }, currentConversationItem: function() { - return document.querySelector('li[aria-relevant="additions text"]'); + // when a conversation is unread, it has both aria-relevant _and_ aria-live. + // so we are looking for the element with aria-relevant but _not_ aria-live, _unless_ there's only one aria-relevant (then it's selected and unread). + var item = document.querySelector('div[aria-label="Conversations"] li[aria-relevant]:not([aria-live])'); + if (!item) item = document.querySelector('div[aria-label="Conversations"] li[aria-relevant]'); + return item; }, canSelectNewerConversation: function () {