Example #1
0
void Pointer::sendButton(uint32_t button, uint32_t state)
{
    if (m_focusResource) {
        uint32_t serial = m_compositor->nextSerial();
        send_button(m_focusResource->handle, serial, m_compositor->time(),
                    button, state);
    }
}
Example #2
0
void handle_button(struct ir_command command) {
  static unsigned short previousButton;
  static unsigned char holdButtonSent;
  static long buttonStart;

  unsigned short eventId;
  if(command.flags == 0x26) {
    eventId = previousButton;
  } else {
    eventId = is_multi_candidate(command) ? command.address<<8 | command.eventId : command.eventId;
  }

  if(debug) printf("Event id: %04x\n", eventId);

  if(previousButton != eventId && previousButton != 0 && !holdButtonSent) {
    switch(previousButton) {
      case 0x03: case 0x02: send_button(EVENT_MENU); break;
      case 0x05: case 0x04: send_button(EVENT_PLAY); break;
      case 0x9602: send_multi(EVENT_HARMONY_MENU); break;
      case 0x9604: send_multi(EVENT_HARMONY_OK); break;
    }
  }
  
  if(previousButton != eventId) {
    buttonStart = millis();
  }

  switch(eventId) {
    case 0x0a:
    case 0x0b:
      if(eventId != previousButton) send_button(EVENT_UP); break;
    case 0x0c:
    case 0x0d:
      if(eventId != previousButton) send_button(EVENT_DOWN); break;
    case 0x09:
    case 0x08:
      if(eventId != previousButton) send_button(EVENT_LEFT); break;
    case 0x06:
    case 0x07:
      if(eventId != previousButton) send_button(EVENT_RIGHT); break;
      
    // extra buttons mapped by Harmony remotes
    case 0x16: if(eventId != previousButton) send_button( EVENT_EXTRA_PLAY         ); break;
    case 0x32: if(eventId != previousButton) send_button( EVENT_EXTRA_PAUSE        ); break;
    case 0x31: if(eventId != previousButton) send_button( EVENT_EXTRA_STOP         ); break;
    case 0x25: if(eventId != previousButton) send_button( EVENT_EXTRA_REPLAY       ); break;
    case 0x23: if(eventId != previousButton) send_button( EVENT_EXTRA_SKIP         ); break;
    case 0x1c: if(eventId != previousButton) send_button( EVENT_EXTRA_REWIND       ); break;
    case 0x1a: if(eventId != previousButton) send_button( EVENT_EXTRA_FORWARD      ); break;
    case 0x2f: if(eventId != previousButton) send_button( EVENT_EXTRA_PAGEUP       ); break;
    case 0x26: if(eventId != previousButton) send_button( EVENT_EXTRA_PAGEDOWN     ); break;
      
    // multi-remote buttons
    // extra buttons mapped by Harmony remotes - duplicates of ATV, just in case
    case 0x960b: if(eventId != previousButton) send_multi( EVENT_HARMONY_UP           ); break;
    case 0x960d: if(eventId != previousButton) send_multi( EVENT_HARMONY_DOWN         ); break;
    case 0x9608: if(eventId != previousButton) send_multi( EVENT_HARMONY_LEFT         ); break;
    case 0x9607: if(eventId != previousButton) send_multi( EVENT_HARMONY_RIGHT        ); break;
    case 0x9703: if(eventId != previousButton) send_multi( EVENT_HARMONY_PLAY         ); break;
    case 0x9705: if(eventId != previousButton) send_multi( EVENT_HARMONY_STOP         ); break;
    case 0x9803: if(eventId != previousButton) send_multi( EVENT_HARMONY_PAUSE        ); break;
    case 0xa00b: if(eventId != previousButton) send_multi( EVENT_HARMONY_REPLAY       ); break;
    case 0xa00d: if(eventId != previousButton) send_multi( EVENT_HARMONY_SKIP         ); break;
    case 0x9a0b: if(eventId != previousButton) send_multi( EVENT_HARMONY_REWIND       ); break;
    case 0x9a0d: if(eventId != previousButton) send_multi( EVENT_HARMONY_FORWARD      ); break;
    case 0x9b0c: if(eventId != previousButton) send_multi( EVENT_HARMONY_RECORD       ); break;
    case 0x990d: if(eventId != previousButton) send_multi( EVENT_HARMONY_PREV         ); break;
    case 0x9d05: if(eventId != previousButton) send_multi( EVENT_HARMONY_GUIDE        ); break;
    case 0x990b: if(eventId != previousButton) send_multi( EVENT_HARMONY_INFO         ); break;
    case 0x9b0a: if(eventId != previousButton) send_multi( EVENT_HARMONY_EXIT         ); break;
    case 0x980a: if(eventId != previousButton) send_multi( EVENT_HARMONY_VOLUP        ); break;
    case 0x980c: if(eventId != previousButton) send_multi( EVENT_HARMONY_VOLDOWN      ); break;
    case 0x970a: if(eventId != previousButton) send_multi( EVENT_HARMONY_1            ); break;
    case 0x970c: if(eventId != previousButton) send_multi( EVENT_HARMONY_2            ); break;
    case 0x9709: if(eventId != previousButton) send_multi( EVENT_HARMONY_3            ); break;
    case 0x9706: if(eventId != previousButton) send_multi( EVENT_HARMONY_4            ); break;
    case 0x9809: if(eventId != previousButton) send_multi( EVENT_HARMONY_5            ); break;
    case 0x9806: if(eventId != previousButton) send_multi( EVENT_HARMONY_6            ); break;
    case 0x9908: if(eventId != previousButton) send_multi( EVENT_HARMONY_7            ); break;
    case 0x9907: if(eventId != previousButton) send_multi( EVENT_HARMONY_8            ); break;
    case 0x9a08: if(eventId != previousButton) send_multi( EVENT_HARMONY_9            ); break;
    case 0x9a07: if(eventId != previousButton) send_multi( EVENT_HARMONY_0            ); break;
    case 0x9a04: if(eventId != previousButton) send_multi( EVENT_HARMONY_CLEAR        ); break;
    case 0x9902: if(eventId != previousButton) send_multi( EVENT_HARMONY_ENTER        ); break;
    case 0x9805: if(eventId != previousButton) send_multi( EVENT_HARMONY_MUTE         ); break;
    case 0x9d0a: if(eventId != previousButton) send_multi( EVENT_HARMONY_ASPECT       ); break;
    case 0x9b09: if(eventId != previousButton) send_multi( EVENT_HARMONY_F1           ); break;
    case 0x9b06: if(eventId != previousButton) send_multi( EVENT_HARMONY_F2           ); break;
    case 0x9b05: if(eventId != previousButton) send_multi( EVENT_HARMONY_F3           ); break;
    case 0x9b03: if(eventId != previousButton) send_multi( EVENT_HARMONY_F4           ); break;
    case 0xa008: if(eventId != previousButton) send_multi( EVENT_HARMONY_F5           ); break;
    case 0xa007: if(eventId != previousButton) send_multi( EVENT_HARMONY_F6           ); break;
    case 0xa004: if(eventId != previousButton) send_multi( EVENT_HARMONY_F7           ); break;
    case 0xa002: if(eventId != previousButton) send_multi( EVENT_HARMONY_F8           ); break;
    case 0x9e09: if(eventId != previousButton) send_multi( EVENT_HARMONY_F9           ); break;
    case 0x9e06: if(eventId != previousButton) send_multi( EVENT_HARMONY_F10          ); break;
    case 0x9e05: if(eventId != previousButton) send_multi( EVENT_HARMONY_F11          ); break;
    case 0x9e03: if(eventId != previousButton) send_multi( EVENT_HARMONY_F12          ); break;
    case 0x9d09: if(eventId != previousButton) send_multi( EVENT_HARMONY_F13          ); break;
    case 0x9d06: if(eventId != previousButton) send_multi( EVENT_HARMONY_F14          ); break;
    case 0x9e0c: if(eventId != previousButton) send_multi( EVENT_HARMONY_CHANDOWN     ); break;
    case 0x9e0a: if(eventId != previousButton) send_multi( EVENT_HARMONY_CHANUP       ); break;
    case 0x9f0d: if(eventId != previousButton) send_multi( EVENT_HARMONY_LRGDOWN      ); break;
    case 0x9f0b: if(eventId != previousButton) send_multi( EVENT_HARMONY_LRGUP        ); break;
    case 0x9d03: if(eventId != previousButton) send_multi( EVENT_HARMONY_PWRTOGGLE    ); break;
    case 0x9d0c: if(eventId != previousButton) send_multi( EVENT_HARMONY_QUEUE        ); break;
    case 0x9a02: if(eventId != previousButton) send_multi( EVENT_HARMONY_SLEEP        ); break;
    case 0x9f08: if(eventId != previousButton) send_multi( EVENT_HARMONY_RED          ); break;
    case 0x9f07: if(eventId != previousButton) send_multi( EVENT_HARMONY_GREEN        ); break;
    case 0x9f04: if(eventId != previousButton) send_multi( EVENT_HARMONY_YELLOW       ); break;
    case 0x9f02: if(eventId != previousButton) send_multi( EVENT_HARMONY_BLUE         ); break;

    case 0x03: case 0x02: case 0x05: case 0x04: case 0x9603: case 0x9602: case 0x9605: case 0x9604:
      // menu and pause need special treatment
      if(previousButton != eventId) {
        holdButtonSent = 0;
      } else {
        if(millis() - buttonStart > HOLD_TIMEOUT && !holdButtonSent) {
          set_led(hold_mode);
          switch(eventId) {
            case 0x03: case 0x02: send_button(EVENT_HOLD_MENU); break;
            case 0x05: case 0x04: send_button(EVENT_HOLD_PLAY); break;
            case 0x9602: send_multi(EVENT_HARMONY_HOLD_MENU); break;
            case 0x9604: send_multi(EVENT_HARMONY_HOLD_OK); break;
          }
          holdButtonSent = 1;
        }
      }
      break;
    case 0x00:
      // button timeout
      switch(previousButton) {
        case 0x0a:
        case 0x0b:
          send_button(EVENT_UP | EVENT_RELEASE); break;
        case 0x0c:
        case 0x0d:
          send_button(EVENT_DOWN | EVENT_RELEASE); break;
        case 0x09:
        case 0x08:
          send_button(EVENT_LEFT | EVENT_RELEASE); break;
        case 0x06:
        case 0x07:
          send_button(EVENT_RIGHT | EVENT_RELEASE); break;
        case 0x960b: send_multi(EVENT_HARMONY_UP        | EVENT_RELEASE); break;
        case 0x960d: send_multi(EVENT_HARMONY_DOWN      | EVENT_RELEASE); break;
        case 0x9608: send_multi(EVENT_HARMONY_LEFT      | EVENT_RELEASE); break;
        case 0x9607: send_multi(EVENT_HARMONY_RIGHT     | EVENT_RELEASE); break;
        case 0x980a: send_multi(EVENT_HARMONY_VOLUP     | EVENT_RELEASE); break;
        case 0x980c: send_multi(EVENT_HARMONY_VOLDOWN   | EVENT_RELEASE); break;
        case 0x9a0b: send_multi(EVENT_HARMONY_REWIND    | EVENT_RELEASE); break;
        case 0x9a0d: send_multi(EVENT_HARMONY_FORWARD   | EVENT_RELEASE); break;
      }
      break;
    default:
      if(debug) printf("unknown\n");
  }
  previousButton = eventId;
}