├── .gitignore ├── LICENSE ├── NSStatusBar+MISSINGOrder.podspec ├── Pod └── Classes │ ├── NSStatusBar+MISSINGOrder.h │ └── NSStatusBar+MISSINGOrder.m └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | 20 | # CocoaPods 21 | # 22 | # We recommend against adding the Pods directory to your .gitignore. However 23 | # you should judge for yourself, the pros and cons are mentioned at: 24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 25 | # 26 | #Pods/ 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Valentin Shergin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /NSStatusBar+MISSINGOrder.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "NSStatusBar+MISSINGOrder" 3 | s.version = "1.3.0" 4 | s.summary = "A very tiny library that allows define position for `NSStatusBarItem` inside `NSStatusBar`." 5 | s.homepage = "https://github.com/shergin/NSImage-MISSINGTint" 6 | s.license = 'MIT' 7 | s.author = { "Valentin Shergin" => "valentin@shergin.com" } 8 | s.source = { :git => "https://github.com/shergin/NSStatusBar-MISSINGOrder.git", :tag => s.version.to_s } 9 | 10 | s.platform = :osx, '10.7' 11 | s.requires_arc = true 12 | 13 | s.source_files = 'Pod/Classes/**/*' 14 | 15 | s.public_header_files = 'Pod/Classes/**/*.h' 16 | s.frameworks = 'AppKit' 17 | end 18 | -------------------------------------------------------------------------------- /Pod/Classes/NSStatusBar+MISSINGOrder.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSStatusBar+MISSINGOrder.h 3 | // NSStatusBar+MISSINGOrder 4 | // 5 | // Created by Valentin Shergin on 30/04/15. 6 | // Copyright (c) 2015 Shergin Research. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef NS_ENUM(NSInteger, NSStatusBarItemPriority) { 12 | NSStatusBarItemPriorityDefault = 1000, 13 | NSStatusBarItemPrioritySystem = 2147483645, 14 | NSStatusBarItemPrioritySpotlight = 2147483646, 15 | NSStatusBarItemPriorityNotificationCenter = 2147483647, 16 | }; 17 | 18 | typedef NS_ENUM(NSInteger, NSStatusBarItemOrderingMode) { 19 | NSStatusBarItemOrderingModeBefore = -1, 20 | NSStatusBarItemOrderingModeAfter = 0, 21 | }; 22 | 23 | 24 | @interface NSStatusBar (MISSINGOrder) 25 | 26 | - (NSStatusItem *)statusItemWithLength:(CGFloat)length positioned:(NSStatusBarItemOrderingMode)orderingMode relativeTo:(NSStatusBarItemPriority)priority; 27 | - (NSStatusItem *)statusItemWithLength:(CGFloat)length priority:(NSStatusBarItemPriority)priority; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Pod/Classes/NSStatusBar+MISSINGOrder.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSStatusBar+MISSINGOrder.m 3 | // NSStatusBar+MISSINGOrder 4 | // 5 | // Created by Valentin Shergin on 30/04/15. 6 | // Copyright (c) 2015 Shergin Research. All rights reserved. 7 | // 8 | 9 | #import "NSStatusBar+MISSINGOrder.h" 10 | 11 | @implementation NSStatusBar (MISSINGOrder) 12 | 13 | - (NSStatusItem *)statusItemWithLength:(CGFloat)length positioned:(NSStatusBarItemOrderingMode)orderingMode relativeTo:(NSStatusBarItemPriority)priority 14 | { 15 | return [self statusItemWithLength:length priority:priority + orderingMode]; 16 | } 17 | 18 | - (NSStatusItem *)statusItemWithLength:(CGFloat)length priority:(NSStatusBarItemPriority)priority 19 | { 20 | // @selector(_statusItemWithLength:withPriority:) 21 | SEL statusItemWithLengthWithPrioritySelector = NSSelectorFromString([@[@"_status", @"Item", @"With", @"Length", @":", @"with", @"Priority", @":"] componentsJoinedByString:@""]); 22 | 23 | // @selector(_insertStatusItem:withPriority:) 24 | SEL insertStatusItemWithPrioritySelector = NSSelectorFromString([@[@"_insert", @"Status", @"Item", @":", @"with", @"Priority", @":"] componentsJoinedByString:@""]); 25 | 26 | NSStatusItem *statusItem; 27 | if ( 28 | [self respondsToSelector:statusItemWithLengthWithPrioritySelector] && 29 | [self respondsToSelector:insertStatusItemWithPrioritySelector] 30 | ) { 31 | // Perform `[self _statusItemWithLength:length withPriority:priority]`. 32 | void *tempResultValuePtr; 33 | NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:statusItemWithLengthWithPrioritySelector]; 34 | NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 35 | [invocation setTarget:self]; 36 | [invocation setSelector:statusItemWithLengthWithPrioritySelector]; 37 | [invocation setArgument:&length atIndex:2]; 38 | [invocation setArgument:&priority atIndex:3]; 39 | [invocation invoke]; 40 | [invocation getReturnValue:&tempResultValuePtr]; 41 | statusItem = (__bridge NSStatusItem *)tempResultValuePtr; 42 | 43 | if (statusItem) { 44 | [self removeStatusItem:statusItem]; 45 | 46 | // Perform `[self _insertStatusItem:statusItem withPriority:priority]`. 47 | NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:insertStatusItemWithPrioritySelector]; 48 | NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 49 | [invocation setTarget:self]; 50 | [invocation setSelector:insertStatusItemWithPrioritySelector]; 51 | [invocation setArgument:(void *)&statusItem atIndex:2]; 52 | [invocation setArgument:&priority atIndex:3]; 53 | [invocation invoke]; 54 | } 55 | } 56 | 57 | if (!statusItem) { 58 | statusItem = [self statusItemWithLength:length]; 59 | } 60 | 61 | return statusItem; 62 | } 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NSStatusBar+MISSINGOrder 2 | 3 | [![Version](https://img.shields.io/cocoapods/v/NSStatusBar+MISSINGOrder.svg?style=flat)](http://cocoadocs.org/docsets/NSStatusBar+MISSINGOrder) 4 | [![License](https://img.shields.io/cocoapods/l/NSStatusBar+MISSINGOrder.svg?style=flat)](http://cocoadocs.org/docsets/NSStatusBar+MISSINGOrder) 5 | [![Platform](https://img.shields.io/cocoapods/p/NSStatusBar+MISSINGOrder.svg?style=flat)](http://cocoadocs.org/docsets/NSStatusBar+MISSINGOrder) 6 | 7 | A very tiny library that allows define position for `NSStatusBarItem` inside `NSStatusBar`. 8 | 9 | ## Usage 10 | 11 | #import "NSStatusBar+MISSINGOrder.h" 12 | 13 | // Let's create new status item at the end of menu bar! 14 | NSStatusItem *statusItem = 15 | [systemStatusBar statusItemWithLength:NSVariableStatusItemLength 16 | positioned:NSStatusBarItemOrderingModeBefore 17 | relativeTo:NSStatusBarItemPriorityNotificationCenter]; 18 | 19 | // Voilà! 20 | 21 | ## Installation 22 | 23 | NSStatusBar+MISSINGOrder is available through [CocoaPods](http://cocoapods.org). To install 24 | it, simply add the following line to your Podfile: 25 | 26 | pod "NSStatusBar+MISSINGOrder" 27 | 28 | ## Author 29 | 30 | Valentin Shergin, valentin@shergin.com 31 | 32 | ## License 33 | 34 | NSStatusBar+MISSINGOrder is available under the MIT license. See the LICENSE file for more info. 35 | --------------------------------------------------------------------------------