static void read_mouse (void) { int i; Uint8 *keystate = NULL; int mouseScale = currprefs.input_joymouse_multiplier / 4; if(currprefs.input_tablet > TABLET_OFF) { // Mousehack active int x, y; SDL_GetMouseState(&x, &y); setmousestate(0, 0, x, 1); if(!adisplays.picasso_on) y -= OFFSET_Y_ADJUST; setmousestate(0, 1, y, 1); return; } for (i = 0; i < num_mouse; i++) { struct pidata *pid = &pi_mouse[i]; if (!pid->acquired) continue; if (pid->eventinput) continue; // input handling for this type in handle_msgpump() if(keystate == NULL) keystate = SDL_GetKeyState(NULL); // x axis if(keystate[VK_LEFT]) setmousestate(i, 0, -mouseScale, 0); if(keystate[VK_RIGHT]) setmousestate(i, 0, mouseScale, 0); // y axis if(keystate[VK_UP]) setmousestate(i, 1, -mouseScale, 0); if(keystate[VK_DOWN]) setmousestate(i, 1, mouseScale, 0); setmousebuttonstate (i, 0, keystate[VK_A]); setmousebuttonstate (i, 1, keystate[VK_B]); } }
/* Returns 0 if the queue is full, the event cannot be parsed, or the event * was not handled. */ int32_t push_event(PP_Resource event) { if (!ppb_input_event_interface || !ppb_mouse_event_interface || !ppb_keyboard_event_interface) { DEBUG_LOG("Refusing to process pre-initialization input event.\n"); return 0; } PP_InputEvent_Type type = ppb_input_event_interface->GetType(event); switch (type) { case PP_INPUTEVENT_TYPE_MOUSEDOWN: case PP_INPUTEVENT_TYPE_MOUSEUP: { int32_t buttonno = -1; switch (ppb_mouse_event_interface->GetButton(event)) { case PP_INPUTEVENT_MOUSEBUTTON_NONE: return 0; case PP_INPUTEVENT_MOUSEBUTTON_LEFT: buttonno = 0; break; case PP_INPUTEVENT_MOUSEBUTTON_MIDDLE: buttonno = 2; break; case PP_INPUTEVENT_MOUSEBUTTON_RIGHT: buttonno = 1; break; } setmousebuttonstate(0, buttonno, type == PP_INPUTEVENT_TYPE_MOUSEDOWN ? 1 : 0); break; } case PP_INPUTEVENT_TYPE_MOUSEMOVE: { struct PP_Point delta = ppb_mouse_event_interface->GetMovement(event); setmousestate (0, 0, delta.x, 0); setmousestate (0, 1, delta.y, 0); break; } case PP_INPUTEVENT_TYPE_KEYDOWN: case PP_INPUTEVENT_TYPE_KEYUP: { int32_t keycode = ppb_keyboard_event_interface->GetKeyCode(event); my_kbd_handler(0, ppapi_keycode_to_dik(keycode), type == PP_INPUTEVENT_TYPE_KEYDOWN ? 1 : 0); break; } default: return 0; } return 1; }
void handle_events (void) { for (;;) { XEvent event; #if 0 if (! XCheckMaskEvent (display, eventmask, &event)) break; #endif if (! XPending (display)) break; XNextEvent (display, &event); switch (event.type) { case KeyPress: case KeyRelease: { int state = (event.type == KeyPress); if (currprefs.map_raw_keys) { unsigned int keycode = ((XKeyEvent *)&event)->keycode; unsigned int ievent; if ((ievent = match_hotkey_sequence (keycode, state))) handle_hotkey_event (ievent, state); else inputdevice_translatekeycode (0, keycode, state); } else { KeySym keysym; int index = 0; int ievent, amiga_keycode; do { keysym = XLookupKeysym ((XKeyEvent *)&event, index); if ((ievent = match_hotkey_sequence (keysym, state))) { handle_hotkey_event (ievent, state); break; } else if ((amiga_keycode = xkeysym2amiga (keysym)) >= 0) { inputdevice_do_keyboard (amiga_keycode, state); break; } index++; } while (keysym != NoSymbol); } break; } case ButtonPress: case ButtonRelease: { int state = (event.type == ButtonPress); int buttonno = -1; switch ((int)((XButtonEvent *)&event)->button) { case 1: buttonno = 0; break; case 2: buttonno = 2; break; case 3: buttonno = 1; break; /* buttons 4 and 5 report mousewheel events */ case 4: if (state) record_key (0x7a << 1); break; case 5: if (state) record_key (0x7b << 1); break; } if (buttonno >=0) setmousebuttonstate(0, buttonno, state); break; } case MotionNotify: if (dgamode) { int tx = ((XMotionEvent *)&event)->x_root; int ty = ((XMotionEvent *)&event)->y_root; setmousestate (0, 0, tx, 0); setmousestate (0, 1, ty, 0); } else if (grabbed) { int realmove = 0; int tx, ty,ttx,tty; tx = ((XMotionEvent *)&event)->x; ty = ((XMotionEvent *)&event)->y; if (! event.xmotion.send_event) { setmousestate( 0,0,tx-oldx,0); setmousestate( 0,1,ty-oldy,0); realmove = 1; #undef ABS #define ABS(a) (((a)<0) ? -(a) : (a) ) if (ABS(current_width / 2 - tx) > 3 * current_width / 8 || ABS(current_height / 2 - ty) > 3 * current_height / 8) { #undef ABS XEvent event; ttx = current_width / 2; tty = current_height / 2; event.type = MotionNotify; event.xmotion.display = display; event.xmotion.window = mywin; event.xmotion.x = ttx; event.xmotion.y = tty; XSendEvent (display, mywin, False, PointerMotionMask, &event); XWarpPointer (display, None, mywin, 0, 0, 0, 0, ttx, tty); } } else { tx=event.xmotion.x; ty=event.xmotion.y; } oldx = tx; oldy = ty; } else if (inwindow) { int tx = ((XMotionEvent *)&event)->x; int ty = ((XMotionEvent *)&event)->y; setmousestate(0,0,tx,1); setmousestate(0,1,ty,1); if (! cursorOn && !currprefs.hide_cursor) { XDefineCursor(display, mywin, xhairCursor); cursorOn = 1; } gettimeofday(&lastMotionTime, NULL); } break; case EnterNotify: { int tx = ((XCrossingEvent *)&event)->x; int ty = ((XCrossingEvent *)&event)->y; setmousestate(0,0,tx,1); setmousestate(0,1,ty,1); } inwindow = 1; break; case LeaveNotify: inwindow = 0; break; case FocusIn: if (! autorepeatoff) XAutoRepeatOff (display); autorepeatoff = 1; break; case FocusOut: if (autorepeatoff) XAutoRepeatOn (display); autorepeatoff = 0; inputdevice_release_all_keys (); break; case Expose: refresh_necessary = 1; break; case ClientMessage: if (((Atom)event.xclient.data.l[0]) == delete_win) { uae_stop (); } break; } } #if defined PICASSO96 if (! dgamode) { if (screen_is_picasso && refresh_necessary) { DO_PUTIMAGE (pic_dinfo.ximg, 0, 0, 0, 0, picasso_vidinfo.width, picasso_vidinfo.height); XFlush (display); refresh_necessary = 0; memset (picasso_invalid_lines, 0, sizeof picasso_invalid_lines); } else if (screen_is_picasso && picasso_has_invalid_lines) { int i; int strt = -1; picasso_invalid_lines[picasso_vidinfo.height] = 0; for (i = picasso_invalid_start; i < picasso_invalid_stop + 2; i++) { if (picasso_invalid_lines[i]) { picasso_invalid_lines[i] = 0; if (strt != -1) continue; strt = i; } else { if (strt == -1) continue; DO_PUTIMAGE (pic_dinfo.ximg, 0, strt, 0, strt, picasso_vidinfo.width, i - strt); strt = -1; } } XFlush (display); if (strt != -1) abort (); } } picasso_has_invalid_lines = 0; picasso_invalid_start = picasso_vidinfo.height + 1; picasso_invalid_stop = -1; #endif if (! dgamode) { if (! screen_is_picasso && refresh_necessary) { DO_PUTIMAGE (ami_dinfo.ximg, 0, 0, 0, 0, current_width, current_height); refresh_necessary = 0; } if (cursorOn && !currprefs.hide_cursor) { struct timeval now; int diff; gettimeofday(&now, NULL); diff = (now.tv_sec - lastMotionTime.tv_sec) * 1000000 + (now.tv_usec - lastMotionTime.tv_usec); if (diff > 1000000) { XDefineCursor (display, mywin, blankCursor); cursorOn = 0; } } } }