SDL_keysym *ph_TranslateKey(PhKeyEvent_t *key, SDL_keysym *keysym) { /* 'sym' is set to the value of the key with modifiers applied to it. This member is valid only if Pk_KF_Sym_Valid is set in the key_flags. We will assume it is valid. */ /* FIXME: This needs to check whether the cap & scancode is valid */ cap = key->key_cap; switch (cap>>8) { case 0x00: /* Latin 1 */ case 0x01: /* Latin 2 */ case 0x02: /* Latin 3 */ case 0x03: /* Latin 4 */ case 0x04: /* Katakana */ case 0x05: /* Arabic */ case 0x06: /* Cyrillic */ case 0x07: /* Greek */ case 0x08: /* Technical */ case 0x0A: /* Publishing */ case 0x0C: /* Hebrew */ case 0x0D: /* Thai */ keysym->sym = (SDLKey)(cap&0xFF); /* Map capital letter syms to lowercase */ if ((keysym->sym >= 'A')&&(keysym->sym <= 'Z')) keysym->sym += ('a'-'A'); break; case 0xF0: keysym->sym = MISC_keymap[cap&0xFF]; break; default: keysym->sym = SDLK_UNKNOWN; break; } keysym->scancode = key->key_scan; keysym->unicode = 0; if (SDL_TranslateUNICODE) { char utf8[MB_CUR_MAX]; int utf8len; wchar_t unicode; switch (keysym->scancode) { case 0x01: keysym->unicode = 27; break; default: utf8len = PhKeyToMb(utf8, key); if (utf8len > 0) { utf8len = mbtowc(&unicode, utf8, utf8len); if (utf8len > 0) { keysym->unicode = unicode; } } break; } } return (keysym); }
/* * Create a display screen, or window, large enough to accomodate a bitmap * of the given dimensions. */ int I_GetEvent(PtWidget_t *widget, void *data, PtCallbackInfo_t *cbinfo, int bitmap_depth ) { int mask=FALSE; int kdosomething=FALSE; PhKeyEvent_t *kevent; PhPointerEvent_t *pevent; int keycode,code; int *pt; struct xmame_keyboard_event mame_key_event; char keyname[16+1]; mame_key_event.press = FALSE; switch (cbinfo->event->type) { case Ph_EV_KEY: { kevent = PhGetData (cbinfo->event); if (PkIsFirstDown (kevent->key_flags)) { mask=TRUE; mame_key_event.press=TRUE; kdosomething = TRUE; } else if (!PkIsKeyDown(kevent->key_flags)) kdosomething = TRUE; if (kdosomething) { if (kevent->key_flags & Pk_KF_Cap_Valid) keycode = kevent->key_cap; else goto getevent_done; if ((keycode & 0xF000) == 0xF000) { pt=extended_code_table; keycode &= 0x00FF; } else { pt=code_table; } mame_key_event.scancode = *(pt+keycode); if (PhKeyToMb (keyname, kevent) == -1) { keyname[0]=0; } mame_key_event.unicode = keyname[0]; //phkey [ *(pt+keycode) ] = mask; xmame_keyboard_register_event(&mame_key_event); } break; } case Ph_EV_BUT_PRESS: pevent = PhGetData( cbinfo->event ); if (pevent->buttons & Ph_BUTTON_SELECT) { mouse_data[0].buttons[0] = TRUE; } if (pevent->buttons & Ph_BUTTON_MENU) { mouse_data[0].buttons[1] = TRUE; } if (pevent->buttons & Ph_BUTTON_ADJUST) { mouse_data[0].buttons[2] = TRUE; } break; case Ph_EV_BUT_RELEASE: if( cbinfo->event->subtype != Ph_EV_RELEASE_REAL ) break; pevent = PhGetData( cbinfo->event ); if (pevent->buttons & Ph_BUTTON_SELECT) { mouse_data[0].buttons[0] = FALSE; } if (pevent->buttons & Ph_BUTTON_MENU) { mouse_data[0].buttons[1] = FALSE; } if (pevent->buttons & Ph_BUTTON_ADJUST) { mouse_data[0].buttons[2] = FALSE; } break; case Ph_EV_PTR_MOTION_NOBUTTON: case Ph_EV_PTR_MOTION_BUTTON: if (ph_grab_mouse == FALSE) { pevent = PhGetData( cbinfo->event ); update_mouse=TRUE; mouse_data[0].deltas[0] = pevent->pos.x-current_mouse[0]; mouse_data[0].deltas[1] = pevent->pos.y-current_mouse[1]; current_mouse[0] = pevent->pos.x; current_mouse[1] = pevent->pos.y; } break; case Ph_EV_EXPOSE: if (ph_video_mode==0) { ph_window_refresh_screen(); PgFlush(); } break; case Ph_EV_INFO: { switch (cbinfo->event->subtype) { case Ph_OFFSCREEN_INVALID : fprintf (stderr,"info: got offscreen invalid\n"); if (image != NULL) { fprintf(stderr,"info: creating new image\n"); PhDCRelease(image); image = PdCreateOffscreenContext(0, view_size.w, view_size.h, Pg_OSC_MEM_PAGE_ALIGN); if (image == NULL) { fprintf(stderr_file, "error: failed to create offscreen context\n"); exit(1); } scaled_buffer_ptr = PdGetOffscreenContextPtr (image); if (!scaled_buffer_ptr) { fprintf (stderr_file, "error: failed get a pointer to offscreen context.\n"); PhDCRelease (image); exit(1); } depth = 0; switch (image->format) { case Pg_IMAGE_PALETTE_BYTE : // TODO : break; case Pg_IMAGE_DIRECT_565 : depth = 16; pixels_per_line = image->pitch >> 1; break; case Pg_IMAGE_DIRECT_555 : // TODO: break; case Pg_IMAGE_DIRECT_888 : depth = 24; pixels_per_line = image->pitch / 3; break; case Pg_IMAGE_DIRECT_8888 : depth = 32; pixels_per_line = image->pitch >> 2; break; } ph_init_palette_info(); ph_window_update_display_func=NULL; if (bitmap_depth == 16) { switch(depth) { case 16: ph_window_update_display_func = ph_window_update_16_to_16bpp; break; case 24: ph_window_update_display_func = ph_window_update_16_to_24bpp; break; case 32: ph_window_update_display_func = ph_window_update_16_to_32bpp; break; } } if (ph_window_update_display_func == NULL) { fprintf(stderr_file, "error: Unsupported\n"); exit(1); } } break; } } break; }