//
//  main.c
//  ScreenPhant
//
//  Created by Luc Huygen on 12-03-12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#include <stdio.h>

#include <ApplicationServices/ApplicationServices.h>

#define MAX_DISPLAYS 32

int main (int argc, const char ** argv) {
    
    CGDirectDisplayID activeDisplays[MAX_DISPLAYS], mainID = 99, primaryID = 99;
    uint32_t mainSerial=0, serial, primaryserial=0;
    CGDisplayErr err;
    CGDisplayCount displayCount;
    CGDisplayConfigRef config;
    
    //DEBUG argc=2; argv[1]= "151d050f";
    if( argc > 1 && strcmp(argv[1],"-h")==0 ) {
        printf("Usage: %s [<primary-serial>]\n\nNo arguments will just list your displays. Give <primary-serial> to set corresponding monitor as the main display.\n", argv[0]);
        exit(0);
    } else if( argc > 1 ) {    
        sscanf(argv[1], "%x",  &primaryserial);
    } else {
        // Trick to include serial in app name so you dont need args and an extra script ;-)
        char *p=strchr(argv[0],(int)'_');
        if (p != NULL) {
            sscanf(p+1, "%x",  &primaryserial);
        }
    }
    
    err = CGGetActiveDisplayList(MAX_DISPLAYS, activeDisplays, &displayCount);
    if ( err != kCGErrorSuccess )
    {
        printf("Cannot get displays (%d)\n", err);
        exit(1);
    }
    printf("%d displays detected\n", displayCount);
    for( int i=0; i<displayCount; i++) {
        serial = CGDisplaySerialNumber(activeDisplays[i]);
        if( serial == primaryserial ) {
            primaryID = i;
        }
        printf("\tdisplay %d = unit %d serial %x", i, CGDisplayUnitNumber(activeDisplays[i]), serial);
        if( CGDisplayIsMain(activeDisplays[i]) ) {
            printf(" (main)");
            mainID = i;
            mainSerial = serial;
        }
        printf("\n");        
    }
    if( primaryserial != 0 
       && primaryID != 99 
       && mainSerial != primaryserial
       ) {
        printf("swaping %d and %d!\n", mainID, primaryID);

        CGBeginDisplayConfiguration(&config);
        CGConfigureDisplayOrigin(config,activeDisplays[primaryID], 0, 0); //Set the second display as the new main display by positionning at 0,0
        CGConfigureDisplayOrigin(config,activeDisplays[mainID], (int)CGDisplayPixelsWide(activeDisplays[mainID])*-1, 0); //Arrangement of the old main display to the left of the new main display
        CGCompleteDisplayConfiguration(config,kCGConfigureForSession);
    }
    return 0;
}