Created
December 3, 2013 15:31
-
-
Save drott/7771191 to your computer and use it in GitHub Desktop.
Demo App to show issues with CGDisplayRegisterReconfigurationCallback
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| // screendumperCocoa | |
| // | |
| // Copyright (c) 2013 Intel Corporation | |
| // | |
| #import "AppDelegate.h" | |
| #include <stdio.h> | |
| #import <AppKit/AppKit.h> | |
| #import <AppKit/NSScreen.h> | |
| @implementation AppDelegate | |
| void DumpCb(CGDirectDisplayID id, CGDisplayChangeSummaryFlags change_flags) { | |
| NSLog(@"CB for displayId: 0x%x - Flags: %@", id, ChangeFlagsToString(change_flags)); | |
| } | |
| NSString* ChangeFlagsToString(CGDisplayChangeSummaryFlags change_flags) { | |
| NSString* changeFlagsString = @"ChangeFlags: "; | |
| if (change_flags & kCGDisplayBeginConfigurationFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplayBeginConfigurationFlag "]; | |
| } | |
| if (change_flags & kCGDisplayMovedFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplayMovedFlag "]; | |
| } | |
| if (change_flags & kCGDisplaySetMainFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplaySetMainFlag "]; | |
| } | |
| if (change_flags & kCGDisplaySetModeFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplaySetModeFlag "]; | |
| } | |
| if (change_flags & kCGDisplayAddFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplayAddFlag "]; | |
| } | |
| if (change_flags & kCGDisplayRemoveFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplayRemoveFlag "]; | |
| } | |
| if (change_flags & kCGDisplayEnabledFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplayEnabledFlag "]; | |
| } | |
| if (change_flags & kCGDisplayDisabledFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplayDisabledFlag "]; | |
| } | |
| if (change_flags & kCGDisplayMirrorFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplayMirrorFlag "]; | |
| } | |
| if (change_flags & kCGDisplayUnMirrorFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplayUnMirrorFlag "]; | |
| } | |
| if (change_flags & kCGDisplayDesktopShapeChangedFlag) { | |
| changeFlagsString = [changeFlagsString stringByAppendingString:@"kCGDisplayDesktopShapeChangedFlag "]; | |
| } | |
| return changeFlagsString; | |
| } | |
| void DisplayReconfigurationCallback(CGDirectDisplayID cg_id, | |
| CGDisplayChangeSummaryFlags change_flags, | |
| void *cg_to_persistent_id_map_mac) | |
| { | |
| DumpCb(cg_id, change_flags); | |
| fflush(stderr); | |
| } | |
| - (void)applicationDidFinishLaunching:(NSNotification *)aNotification | |
| { | |
| CGDisplayRegisterReconfigurationCallback(DisplayReconfigurationCallback, 0); | |
| } | |
| -(IBAction)dumpScreens:(id)sender | |
| { | |
| for (NSScreen* screen in [NSScreen screens]) { | |
| NSDictionary* screen_device_description = [screen deviceDescription]; | |
| unsigned screen_id = [[screen_device_description | |
| objectForKey:@"NSScreenNumber"] unsignedIntValue]; | |
| NSLog(@"Screen available: 0x%x", screen_id); | |
| } | |
| CGDirectDisplayID online_displays[128]; | |
| CGDisplayCount online_display_count = 0; | |
| if (CGGetOnlineDisplayList(128, | |
| online_displays, | |
| &online_display_count) == kCGErrorSuccess) { | |
| for(int i=0; i < online_display_count; ++i) { | |
| NSLog(@"Online display: 0x%x", online_displays[i] ); | |
| } | |
| } | |
| } | |
| @end | |
| /* | |
| Secondary Display Connected, Automatic Graphics Switching Off, dumping screens and online displays: | |
| 2013-12-03 17:26:50.313 screendumperCocoa[2699:303] Screen available: 0x4272900 | |
| 2013-12-03 17:26:50.313 screendumperCocoa[2699:303] Screen available: 0x3c0a19c1 | |
| 2013-12-03 17:26:50.314 screendumperCocoa[2699:303] Online display: 0x4272900 | |
| 2013-12-03 17:26:50.314 screendumperCocoa[2699:303] Online display: 0x3c0a19c1 | |
| Unplugging External Display (note the Add/Remove and Disable/Enable Flags set at the same time) | |
| 2013-12-03 17:26:54.331 screendumperCocoa[2699:303] CB for displayId: 0x4272900 - Flags: ChangeFlags: kCGDisplayBeginConfigurationFlag | |
| 2013-12-03 17:26:54.331 screendumperCocoa[2699:303] CB for displayId: 0x3c0a19c1 - Flags: ChangeFlags: kCGDisplayBeginConfigurationFlag | |
| 2013-12-03 17:26:54.366 screendumperCocoa[2699:303] CB for displayId: 0x3c0a19c1 - Flags: ChangeFlags: kCGDisplayMovedFlag kCGDisplaySetMainFlag kCGDisplaySetModeFlag kCGDisplayAddFlag kCGDisplayRemoveFlag kCGDisplayEnabledFlag kCGDisplayDisabledFlag kCGDisplayDesktopShapeChangedFlag | |
| 2013-12-03 17:26:54.366 screendumperCocoa[2699:303] CB for displayId: 0x4272900 - Flags: ChangeFlags: kCGDisplayDesktopShapeChangedFlag | |
| Dumping screens and online displays again: | |
| 2013-12-03 17:26:58.656 screendumperCocoa[2699:303] Screen available: 0x4272900 | |
| 2013-12-03 17:26:58.656 screendumperCocoa[2699:303] Online display: 0x4272900 | |
| Reconecting monitor: | |
| 2013-12-03 17:27:04.679 screendumperCocoa[2699:303] CB for displayId: 0x3c0a19c1 - Flags: ChangeFlags: kCGDisplayBeginConfigurationFlag | |
| 2013-12-03 17:27:04.679 screendumperCocoa[2699:303] CB for displayId: 0x4272900 - Flags: ChangeFlags: kCGDisplayBeginConfigurationFlag | |
| 2013-12-03 17:27:04.735 screendumperCocoa[2699:303] CB for displayId: 0x3c0a19c1 - Flags: ChangeFlags: kCGDisplayMovedFlag kCGDisplaySetModeFlag kCGDisplayDesktopShapeChangedFlag | |
| 2013-12-03 17:27:04.735 screendumperCocoa[2699:303] CB for displayId: 0x4272900 - Flags: ChangeFlags: kCGDisplayDesktopShapeChangedFlag | |
| Dumping again, here: One screen was added without having received an kCGDisplayAddFlag callback | |
| 2013-12-03 17:28:58.664 screendumperCocoa[2699:303] Screen available: 0x4272900 | |
| 2013-12-03 17:28:58.665 screendumperCocoa[2699:303] Screen available: 0x3c0a19c1 | |
| 2013-12-03 17:28:58.665 screendumperCocoa[2699:303] Online display: 0x4272900 | |
| 2013-12-03 17:28:58.665 screendumperCocoa[2699:303] Online display: 0x3c0a19c1 | |
| */ | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment