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); } }
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; }