/*! * This is called once a frame so that the system can tell * whether a key was pressed this turn or held down from the last frame. */ void inputNewFrame(void) { unsigned int i; /* Do the keyboard */ for (i = 0; i < KEY_MAXSCAN; i++) { if (aKeyState[i].state == KEY_PRESSED) { aKeyState[i].state = KEY_DOWN; } else if (aKeyState[i].state == KEY_RELEASED || aKeyState[i].state == KEY_PRESSRELEASE) { aKeyState[i].state = KEY_UP; } } /* Do the mouse */ for (i = 0; i < MOUSE_BAD; i++) { if (aMouseState[i].state == KEY_PRESSED) { aMouseState[i].state = KEY_DOWN; } else if (aMouseState[i].state == KEY_RELEASED || aMouseState[i].state == KEY_DOUBLECLICK || aMouseState[i].state == KEY_PRESSRELEASE) { aMouseState[i].state = KEY_UP; } } mousePresses.clear(); }
void WzMainWindow::mouseReleaseEvent(QMouseEvent *event) { mouseXPos = event->x(); mouseYPos = event->y(); MOUSE_KEY_CODE idx = buttonToIdx(event->button()); if (idx == MOUSE_BAD) { return; // not recognized mouse button } MousePress mousePress; mousePress.action = MousePress::Release; mousePress.key = idx; mousePress.pos = Vector2i(mouseXPos, mouseYPos); mousePresses.push_back(mousePress); aMouseState[idx].releasePos.x = mouseXPos; aMouseState[idx].releasePos.y = mouseYPos; if (aMouseState[idx].state == KEY_PRESSED) { aMouseState[idx].state = KEY_PRESSRELEASE; } else if (aMouseState[idx].state == KEY_DOWN || aMouseState[idx].state == KEY_DRAG || aMouseState[idx].state == KEY_DOUBLECLICK) { aMouseState[idx].state = KEY_RELEASED; } }
/*! * This is called once a frame so that the system can tell * whether a key was pressed this turn or held down from the last frame. */ void inputNewFrame(void) { // handle the keyboard for (unsigned int i = 0; i < KEY_MAXSCAN; i++) { if (aKeyState[i].state == KEY_PRESSED) { aKeyState[i].state = KEY_DOWN; debug(LOG_NEVER, "This key is DOWN! %x, %d [%s]", i, i, SDL_GetKeyName(keyCodeToSDLKey((KEY_CODE)i))); } else if (aKeyState[i].state == KEY_RELEASED || aKeyState[i].state == KEY_PRESSRELEASE) { aKeyState[i].state = KEY_UP; debug(LOG_NEVER, "This key is UP! %x, %d [%s]", i, i, SDL_GetKeyName(keyCodeToSDLKey((KEY_CODE)i))); } } // handle the mouse for (unsigned int i = 0; i < MOUSE_END; i++) { if (aMouseState[i].state == KEY_PRESSED) { aMouseState[i].state = KEY_DOWN; } else if (aMouseState[i].state == KEY_RELEASED || aMouseState[i].state == KEY_DOUBLECLICK || aMouseState[i].state == KEY_PRESSRELEASE) { aMouseState[i].state = KEY_UP; } } mousePresses.clear(); }
// TODO consider using QWidget::mouseDoubleClickEvent() for double-click void WzMainWindow::mousePressEvent(QMouseEvent *event) { mouseXPos = event->x(); mouseYPos = event->y(); Qt::MouseButtons presses = event->buttons(); // full state info for all buttons MOUSE_KEY_CODE idx = buttonToIdx(event->button()); // index of button that caused event if (idx == MOUSE_BAD) { debug(LOG_ERROR, "bad mouse idx"); // FIXME remove return; // not recognized mouse button } MousePress mousePress; mousePress.action = MousePress::Press; mousePress.key = idx; mousePress.pos = Vector2i(mouseXPos, mouseYPos); mousePresses.push_back(mousePress); aMouseState[idx].pressPos.x = mouseXPos; aMouseState[idx].pressPos.y = mouseYPos; if (aMouseState[idx].state == KEY_UP || aMouseState[idx].state == KEY_RELEASED || aMouseState[idx].state == KEY_PRESSRELEASE) { if (!presses.testFlag(Qt::MidButton)) //skip doubleclick check for wheel { // whether double click or not if (realTime - aMouseState[idx].lastdown < DOUBLE_CLICK_INTERVAL) { aMouseState[idx].state = KEY_DOUBLECLICK; aMouseState[idx].lastdown = 0; } else { aMouseState[idx].state = KEY_PRESSED; aMouseState[idx].lastdown = realTime; } } else //mouse wheel up/down was used, so notify. FIXME. { aMouseState[idx].state = KEY_PRESSED; aMouseState[idx].lastdown = 0; } if (idx == MOUSE_LMB || idx == MOUSE_RMB || idx == MOUSE_MMB) { dragKey = idx; dragX = mouseX(); dragY = mouseY(); } } }
/*! * Handle mouse button events (We can handle up to 5) */ static void inputHandleMouseButtonEvent(SDL_MouseButtonEvent *buttonEvent) { mouseXPos = buttonEvent->x; mouseYPos = buttonEvent->y; MOUSE_KEY_CODE mouseKeyCode; switch (buttonEvent->button) { case SDL_BUTTON_LEFT: mouseKeyCode = MOUSE_LMB; break; case SDL_BUTTON_MIDDLE: mouseKeyCode = MOUSE_MMB; break; case SDL_BUTTON_RIGHT: mouseKeyCode = MOUSE_RMB; break; case SDL_BUTTON_X1: mouseKeyCode = MOUSE_X1; break; case SDL_BUTTON_X2: mouseKeyCode = MOUSE_X2; break; default: return; // Unknown button. } MousePress mousePress; mousePress.key = mouseKeyCode; mousePress.pos = Vector2i(mouseXPos, mouseYPos); switch (buttonEvent->type) { case SDL_MOUSEBUTTONDOWN: mousePress.action = MousePress::Press; mousePresses.push_back(mousePress); aMouseState[mouseKeyCode].pressPos.x = mouseXPos; aMouseState[mouseKeyCode].pressPos.y = mouseYPos; if (aMouseState[mouseKeyCode].state == KEY_UP || aMouseState[mouseKeyCode].state == KEY_RELEASED || aMouseState[mouseKeyCode].state == KEY_PRESSRELEASE) { // whether double click or not if (realTime - aMouseState[mouseKeyCode].lastdown < DOUBLE_CLICK_INTERVAL) { aMouseState[mouseKeyCode].state = KEY_DOUBLECLICK; aMouseState[mouseKeyCode].lastdown = 0; } else { aMouseState[mouseKeyCode].state = KEY_PRESSED; aMouseState[mouseKeyCode].lastdown = realTime; } if (mouseKeyCode < MOUSE_X1) // Assume they are draggin' with either LMB|RMB|MMB { dragKey = mouseKeyCode; dragX = mouseXPos; dragY = mouseYPos; } } break; case SDL_MOUSEBUTTONUP: mousePress.action = MousePress::Release; mousePresses.push_back(mousePress); aMouseState[mouseKeyCode].releasePos.x = mouseXPos; aMouseState[mouseKeyCode].releasePos.y = mouseYPos; if (aMouseState[mouseKeyCode].state == KEY_PRESSED) { aMouseState[mouseKeyCode].state = KEY_PRESSRELEASE; } else if (aMouseState[mouseKeyCode].state == KEY_DOWN || aMouseState[mouseKeyCode].state == KEY_DRAG || aMouseState[mouseKeyCode].state == KEY_DOUBLECLICK) { aMouseState[mouseKeyCode].state = KEY_RELEASED; } break; default: break; } }