Skip to content

Instantly share code, notes, and snippets.

@drott
Created December 3, 2013 15:31
Show Gist options
  • Save drott/7771191 to your computer and use it in GitHub Desktop.
Save drott/7771191 to your computer and use it in GitHub Desktop.
Demo App to show issues with CGDisplayRegisterReconfigurationCallback
//
// 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