ggi_event_mask GII_aa_poll(gii_input_t inp, void *arg) { ggi_aa_priv *priv = inp->priv; ggi_event_mask evmask = 0; unsigned int aatype; DPRINT_EVENTS("GII_aa_poll\n"); if (!priv->context) return 0; while ((aatype = aa_getevent(priv->context, 0)) != AA_NONE) { DPRINT_EVENTS("AA: got event %x\n", aatype); if (aatype == AA_MOUSE) { evmask |= do_mouse(inp, priv); } else if (aatype >= 1 && aatype <= AA_RELEASE) { if (priv->lastkey == 0) { /* First hit */ evmask |= emKeyPress; add_key_event(inp, aatype, evKeyPress); } else if (priv->lastkey == aatype) { /* Repeated keypress */ evmask |= emKeyRepeat; add_key_event(inp, aatype, evKeyRepeat); } else { if (!priv->haverelease) { /* Whoops, different key! We send a release for the lastkey first. */ evmask |= emKeyRelease; add_key_event(inp, priv->lastkey, evKeyRelease); } evmask |= emKeyPress; add_key_event(inp, aatype, evKeyPress); } priv->lastkey = aatype; } else if (aatype > AA_RELEASE) { /* Release given key. It should match lastkey, but if it doesn't, tough luck, we clear it anyway. */ evmask |= emKeyRelease; add_key_event(inp, aatype, evKeyRelease); priv->lastkey = 0; priv->haverelease = 1; } else if (aatype == AA_RESIZE || aatype == AA_UNKNOWN) { } } if (!priv->haverelease && priv->lastkey) { /* No more events. If priv->lastkey != 0, we release that key. */ evmask |= emKeyRelease; add_key_event(inp, priv->lastkey, evKeyRelease); priv->lastkey = 0; } return evmask; }
//--------- Begin of MouseSDL::poll_event ----------// // // Poll mouse events from the direct mouse VXD. // void MouseSDL::poll_event() { SDL_Event event; int moveFlag; moveFlag = 0; while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_KEYDOWN, SDL_JOYBUTTONUP)) { MouseEvent ev; switch (event.type) { case SDL_MOUSEMOTION: // SDL already accelerates relative mouse motions. // Disable to let the user control speed outside of game. #ifdef MOUSE_RELATIVE cur_x += micky_to_displacement(event.motion.xrel); cur_y += micky_to_displacement(event.motion.yrel); #else cur_x = event.motion.x; cur_y = event.motion.y; #endif if(cur_x < bound_x1) cur_x = bound_x1; if(cur_x > bound_x2) cur_x = bound_x2; if(cur_y < bound_y1) cur_y = bound_y1; if(cur_y > bound_y2) cur_y = bound_y2; moveFlag = 1; break; case SDL_MOUSEBUTTONDOWN: ev.x = cur_x; ev.y = cur_y; ev.time = misc.get_time(); //mouseMsg->dwTimeStamp; ev.scan_code = 0; ev.skey_state = skey_state; if (event.button.button == SDL_BUTTON_LEFT) { // left_press = (event.button.state == SDL_PRESSED); left_press = LEFT_BUTTON_MASK; ev.event_type = LEFT_BUTTON; add_event(&ev); } else if (event.button.button == SDL_BUTTON_RIGHT) { //right_press = (event.button.state == SDL_PRESSED); right_press = RIGHT_BUTTON_MASK; ev.event_type = RIGHT_BUTTON; add_event(&ev); } break; case SDL_MOUSEBUTTONUP: ev.x = cur_x; ev.y = cur_y; ev.time = misc.get_time(); //mouseMsg->dwTimeStamp; ev.scan_code = 0; ev.skey_state = skey_state; if (event.button.button == SDL_BUTTON_LEFT) { // left_press = !(event.button.state == SDL_RELEASED); left_press = 0; ev.event_type = LEFT_BUTTON_RELEASE; add_event(&ev); reset_boundary(); } else if (event.button.button == SDL_BUTTON_RIGHT) { //right_press = !(event.button.state == SDL_RELEASED); right_press = 0; ev.event_type = RIGHT_BUTTON_RELEASE; add_event(&ev); } break; case SDL_KEYDOWN: { int bypass = 0; int mod = event.key.keysym.mod & (KMOD_CTRL|KMOD_SHIFT|KMOD_ALT); if (mod == KMOD_LALT || mod == KMOD_RALT) { if (event.key.keysym.sym == SDLK_RETURN) { bypass = 1; sys.toggle_full_screen_flag = 1; sys.need_redraw_flag = 1; } else if (event.key.keysym.sym == SDLK_F4) { bypass = 1; sys.signal_exit_flag = 1; } else if (event.key.keysym.sym == SDLK_TAB) { bypass = 1; SDL_Window *window = SDL_GetWindowFromID(event.key.windowID); SDL_MinimizeWindow(window); } } else if (mod == KMOD_LCTRL || mod == KMOD_RCTRL) { if (event.key.keysym.sym == SDLK_g && !vga.is_full_screen()) { static int grabbed = 0; bypass = 1; SDL_Window *window = SDL_GetWindowFromID(event.key.windowID); if (!grabbed) { SDL_SetWindowGrab(window, SDL_TRUE); grabbed = 1; } else { SDL_SetWindowGrab(window, SDL_FALSE); grabbed = 0; } } } if (!bypass) { update_skey_state(); add_key_event(event.key.keysym.sym, misc.get_time()); } break; } case SDL_KEYUP: update_skey_state(); break; case SDL_TEXTINPUT: case SDL_JOYAXISMOTION: case SDL_JOYBALLMOTION: case SDL_JOYHATMOTION: case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: default: ERR("unhandled event %d\n", event.type); break; } } if(moveFlag) { mouse_cursor.process(cur_x, cur_y); // repaint mouse cursor power.mouse_handler(); } }
//--------- Begin of MouseSDL::poll_event ----------// // // Poll mouse events from the direct mouse VXD. // void MouseSDL::poll_event() { SDL_Event event; int moveFlag; while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_KEYEVENTMASK | SDL_MOUSEEVENTMASK | SDL_JOYEVENTMASK) > 0) { MouseEvent ev; switch (event.type) { case SDL_MOUSEMOTION: cur_x += micky_to_displacement(event.motion.xrel); cur_y += micky_to_displacement(event.motion.yrel); if(cur_x < bound_x1) cur_x = bound_x1; if(cur_x > bound_x2) cur_x = bound_x2; if(cur_y < bound_y1) cur_y = bound_y1; if(cur_y > bound_y2) cur_y = bound_y2; moveFlag = 1; break; case SDL_MOUSEBUTTONDOWN: ev.x = cur_x; ev.y = cur_y; ev.time = m.get_time(); //mouseMsg->dwTimeStamp; ev.scan_code = 0; ev.skey_state = skey_state; if (event.button.button == SDL_BUTTON_LEFT) { // left_press = (event.button.state == SDL_PRESSED); left_press = LEFT_BUTTON_MASK; ev.event_type = LEFT_BUTTON; add_event(&ev); } else if (event.button.button == SDL_BUTTON_RIGHT) { //right_press = (event.button.state == SDL_PRESSED); right_press = RIGHT_BUTTON_MASK; ev.event_type = RIGHT_BUTTON; add_event(&ev); } break; case SDL_MOUSEBUTTONUP: ev.x = cur_x; ev.y = cur_y; ev.time = m.get_time(); //mouseMsg->dwTimeStamp; ev.scan_code = 0; ev.skey_state = skey_state; if (event.button.button == SDL_BUTTON_LEFT) { // left_press = !(event.button.state == SDL_RELEASED); left_press = 0; ev.event_type = LEFT_BUTTON_RELEASE; add_event(&ev); reset_boundary(); } else if (event.button.button == SDL_BUTTON_RIGHT) { //right_press = !(event.button.state == SDL_RELEASED); right_press = 0; ev.event_type = RIGHT_BUTTON_RELEASE; add_event(&ev); } break; case SDL_KEYDOWN: update_skey_state(); add_key_event(event.key.keysym.sym, m.get_time()); break; case SDL_KEYUP: update_skey_state(); break; case SDL_JOYAXISMOTION: case SDL_JOYBALLMOTION: case SDL_JOYHATMOTION: case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: default: ERR("unhandled event %d\n", event.type); break; } } if(moveFlag) { mouse_cursor.process(cur_x, cur_y); // repaint mouse cursor power.mouse_handler(); } }
void Java_org_puder_trs80_XTRS_addKeyEvent(JNIEnv* env, jclass cls, jint event, jint sym, jint key) { add_key_event(event, sym, key); }
// ------- begin of Mouse::process_key_message -------// // // called by poll_event to handle language specific keyboard // int Mouse::process_key_message(DWORD keyOfs, DWORD keyData, DWORD keyTimeStamp) { int rc = 0; // trap keys, such as shift, ctrl, alt, numlock, caplock and scrolllock // add to event if the key is none of the above switch( keyOfs ) { case DIK_LSHIFT: if( keyData & 0x80 ) skey_state |= LEFT_SHIFT_KEY_MASK; else skey_state &= ~LEFT_SHIFT_KEY_MASK; break; case DIK_RSHIFT: if( keyData & 0x80 ) skey_state |= RIGHT_SHIFT_KEY_MASK; else skey_state &= ~RIGHT_SHIFT_KEY_MASK; break; case DIK_LCONTROL: if( keyData & 0x80 ) skey_state |= LEFT_CONTROL_KEY_MASK; else skey_state &= ~LEFT_CONTROL_KEY_MASK; break; case DIK_RCONTROL: if( keyData & 0x80 ) skey_state |= RIGHT_CONTROL_KEY_MASK; else skey_state &= ~RIGHT_CONTROL_KEY_MASK; break; case DIK_LMENU: if( keyData & 0x80 ) skey_state |= LEFT_ALT_KEY_MASK; else skey_state &= ~LEFT_ALT_KEY_MASK; break; case DIK_RMENU: if( keyData & 0x80 ) skey_state |= RIGHT_ALT_KEY_MASK; else skey_state &= ~RIGHT_ALT_KEY_MASK; break; case DIK_CAPITAL: if(keyData & 0x80) skey_state ^= CAP_LOCK_STATE_MASK; break; case DIK_NUMLOCK: if(keyData & 0x80) skey_state ^= NUM_LOCK_STATE_MASK; break; case DIK_SCROLL: if(keyData & 0x80) skey_state ^= SCROLL_LOCK_STATE_MASK; break; case DIK_INSERT: if(keyData & 0x80) { // insert is a special case, it toggle skey_state and // append event queue skey_state ^= INSERT_STATE_MASK; add_key_event(keyOfs, keyTimeStamp); rc = 1; } break; default: if( keyData & 0x80 ) { add_key_event(keyOfs, keyTimeStamp); rc = 1; // capture screen if(keyOfs == DIK_F11 && (skey_state & CONTROL_KEY_MASK)) { sys.capture_screen(); } } else { add_key_release_event(keyOfs, keyTimeStamp); rc = 1; } } // -------- update arrow_key_state ---------// switch( keyOfs ) { case DIK_LEFT: if( keyData & 0x80 ) arrow_key_state |= ARROW_LEFT_KEY_MASK; else arrow_key_state &= ~ARROW_LEFT_KEY_MASK; break; case DIK_RIGHT: if( keyData & 0x80 ) arrow_key_state |= ARROW_RIGHT_KEY_MASK; else arrow_key_state &= ~ARROW_RIGHT_KEY_MASK; break; case DIK_UP: if( keyData & 0x80 ) arrow_key_state |= ARROW_UP_KEY_MASK; else arrow_key_state &= ~ARROW_UP_KEY_MASK; break; case DIK_DOWN: if( keyData & 0x80 ) arrow_key_state |= ARROW_DOWN_KEY_MASK; else arrow_key_state &= ~ARROW_DOWN_KEY_MASK; break; } return rc; }