static void glw_ps3_dispatch_event(uii_t *uii, event_t *e) { /* Pass it on to GLW */ glw_dispatch_event(uii, e); event_release(e); }
static void handle_btn(glw_ps3_t *gp, int pad, int code, int pressed) { int16_t *store = &button_counter[pad][code]; if(code == 0) return; if(pressed) { if(*store == 0 || (*store > KEY_REPEAT_DELAY && (*store % KEY_REPEAT_RATE == 0))) { int uc = 0; event_t *e = NULL; if(code >= BTN_KEY_1 && code <= BTN_KEY_9) { uc = code - BTN_KEY_1 + '1'; } else if(code == BTN_KEY_0) { uc = '0'; } if(uc != 0) e = event_create_int(EVENT_UNICODE, uc); if(e == NULL) { const action_type_t *avec = btn_to_action[code]; if(avec) { int i = 0; while(avec[i] != 0) i++; e = event_create_action_multi(avec, i); } } if(e != NULL) { glw_dispatch_event(&gp->gr.gr_uii, e); event_release(e); } } (*store)++; } else { *store = 0; } }
static void btn(glw_ps3_t *gp, krepeat_t *kr, int pressed, action_type_t ac) { event_t *e; if(ac == ACTION_NONE) return; if(pressed) { if(kr->held_frames == 0 || (kr->held_frames > 30 && (kr->held_frames % 3 == 0))) { e = event_create_action(ac); glw_dispatch_event(&gp->gr.gr_uii, e); event_release(e); } kr->held_frames++; } else { kr->held_frames = 0; } }
static void handle_kb(glw_ps3_t *gp) { KbInfo kbinfo; KbData kbdata; int i, j; int uc; event_t *e; action_type_t av[3]; int mods; if(ioKbGetInfo(&kbinfo)) return; for(i=0; i<MAX_KEYBOARDS; i++) { if(kbinfo.status[i] == 0) { if(gp->kb_present[i]) TRACE(TRACE_INFO, "PS3", "Keyboard %d disconnected", i); } else { if(!gp->kb_present[i]) { ioKbGetConfiguration(i, &gp->kb_config[i]); TRACE(TRACE_INFO, "PS3", "Keyboard %d connected, mapping=%d, rmode=%d, codetype=%d", i, gp->kb_config[i].mapping, gp->kb_config[i].rmode, gp->kb_config[i].codetype); ioKbSetCodeType(i, KB_CODETYPE_RAW); } if(!ioKbRead(i, &kbdata)) { for(j = 0; j < kbdata.nb_keycode; j++) { if(0) TRACE(TRACE_DEBUG, "PS3", "Keystrike %x %x %x %x", gp->kb_config[i].mapping, kbdata.mkey.mkeys, kbdata.led.leds, kbdata.keycode[j]); uc = ioKbCnvRawCode(gp->kb_config[i].mapping, kbdata.mkey, kbdata.led, kbdata.keycode[j]); mods = 0; if(kbdata.mkey.l_shift || kbdata.mkey.r_shift) mods |= KB_SHIFTMASK; if(kbdata.mkey.l_alt || kbdata.mkey.r_alt) mods |= KB_ALTMASK; if(kbdata.mkey.l_ctrl || kbdata.mkey.r_ctrl) mods |= KB_CTRLMASK; for(i = 0; i < sizeof(kb2action) / sizeof(*kb2action); i++) { if(kb2action[i].code == uc && (kb2action[i].modifier == -1 || kb2action[i].modifier == mods)) { av[0] = kb2action[i].action1; av[1] = kb2action[i].action2; av[2] = kb2action[i].action3; if(kb2action[i].action3 != ACTION_NONE) e = event_create_action_multi(av, 3); else if(kb2action[i].action2 != ACTION_NONE) e = event_create_action_multi(av, 2); else if(kb2action[i].action1 != ACTION_NONE) e = event_create_action_multi(av, 1); else if(kb2action[i].sym != NULL) { char buf[128]; snprintf(buf, sizeof(buf), "%s%s%s%s", mods & KB_SHIFTMASK ? "Shift+" : "", mods & KB_ALTMASK ? "Alt+" : "", mods & KB_CTRLMASK ? "Ctrl+" : "", kb2action[i].sym); e = event_create_str(EVENT_KEYDESC, buf); } else { e = NULL; } if(e != NULL) { glw_dispatch_event(&gp->gr.gr_uii, e); event_release(e); break; } } } if(i == sizeof(kb2action) / sizeof(*kb2action) && uc < 0x8000 && uc) { e = event_create_int(EVENT_UNICODE, uc); glw_dispatch_event(&gp->gr.gr_uii, e); event_release(e); } } } } gp->kb_present[i] = kbinfo.status[i]; } }