/*
  Keyboard logout
 
 This sketch demonstrates the Keyboard library.
 
 When you connect pin 2 to ground, it performs a logout.  
 It uses keyboard combinations to do this, as follows:
 
 On Windows, CTRL-ALT-DEL followed by ALT-l
 On Ubuntu, CTRL-ALT-DEL, and ENTER
 On OSX, CMD-SHIFT-q
 
 To wake: Spacebar. 
 
 Circuit:
 * Arduino Leonardo
 * wire to connect D2 to ground.
 
 created 6 Mar 2012
 modified 27 Mar 2012
 by Tom Igoe
 
 This example is in the public domain
 
 http://www.arduino.cc/en/Tutorial/KeyboardLogout
 */
 
#define OSX 0
#define WINDOWS 1
#define UBUNTU 2

// change this to match your platform:
int platform = OSX;

void setup() {
  // make pin 2 an input and turn on the 
  // pullup resistor so it goes high unless
  // connected to ground:
  pinMode(2, INPUT_PULLUP);
  Keyboard.begin();
}
 
void loop() {
  while (digitalRead(2) == HIGH) {
    // do nothing until pin 2 goes low
    delay(500);
  }
  delay(1000);

  switch (platform) {
  case OSX:
   Keyboard.press(KEY_LEFT_GUI);
   // Shift-Q logs out:
   Keyboard.press(KEY_LEFT_SHIFT); 
   Keyboard.press('Q');
    delay(100);
    Keyboard.releaseAll();
     // enter:
    Keyboard.write(KEY_RETURN);  
    break;
  case WINDOWS:
    // CTRL-ALT-DEL:
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(KEY_DELETE);
    delay(100);
    Keyboard.releaseAll();
    //ALT-s:
    delay(2000);
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('l');
    Keyboard.releaseAll();
    break;
  case UBUNTU:
    // CTRL-ALT-DEL:
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(KEY_DELETE);
    delay(1000);
    Keyboard.releaseAll();
    // Enter to confirm logout:
    Keyboard.write(KEY_RETURN);
    break;
  }
// do nothing:
  while(true);
}








