PRBool nsWidget::DispatchKeyEvent( PhKeyEvent_t *aPhKeyEvent, int force ) { NS_ASSERTION(aPhKeyEvent, "nsWidget::DispatchKeyEvent a NULL PhKeyEvent was passed in"); if( !(aPhKeyEvent->key_flags & (Pk_KF_Cap_Valid|Pk_KF_Sym_Valid) ) ) { //printf("nsWidget::DispatchKeyEvent throwing away invalid key: Modifiers Valid=<%d,%d,%d> this=<%p>\n", //(aPhKeyEvent->key_flags & Pk_KF_Scan_Valid), (aPhKeyEvent->key_flags & Pk_KF_Sym_Valid), (aPhKeyEvent->key_flags & Pk_KF_Cap_Valid), this ); return PR_FALSE; } if ( !force && PtIsFocused(mWidget) != 2) { //printf("nsWidget::DispatchKeyEvent Not on focus leaf! PtIsFocused(mWidget)=<%d>\n", PtIsFocused(mWidget)); return PR_FALSE; } if ( ( aPhKeyEvent->key_cap == Pk_Shift_L ) || ( aPhKeyEvent->key_cap == Pk_Shift_R ) || ( aPhKeyEvent->key_cap == Pk_Control_L ) || ( aPhKeyEvent->key_cap == Pk_Control_R ) || ( aPhKeyEvent->key_cap == Pk_Num_Lock ) || ( aPhKeyEvent->key_cap == Pk_Scroll_Lock ) ) return PR_TRUE; nsWindow *w = (nsWindow *) this; w->AddRef(); if (aPhKeyEvent->key_flags & Pk_KF_Key_Down) { nsKeyEvent keyDownEvent(PR_TRUE, NS_KEY_DOWN, w); InitKeyEvent(aPhKeyEvent, keyDownEvent); PRBool noDefault = w->OnKey(keyDownEvent); nsKeyEvent keyPressEvent(PR_TRUE, NS_KEY_PRESS, w); InitKeyPressEvent(aPhKeyEvent, keyPressEvent); if (noDefault) { // If prevent default set for keydown, do same for keypress keyPressEvent.flags = NS_EVENT_FLAG_NO_DEFAULT; } w->OnKey(keyPressEvent); } else if (aPhKeyEvent->key_flags & Pk_KF_Key_Repeat) { nsKeyEvent keyPressEvent(PR_TRUE, NS_KEY_PRESS, w); InitKeyPressEvent(aPhKeyEvent, keyPressEvent); w->OnKey(keyPressEvent); } else if (PkIsKeyDown(aPhKeyEvent->key_flags) == 0) { nsKeyEvent kevent(PR_TRUE, NS_KEY_UP, w); InitKeyEvent(aPhKeyEvent, kevent); w->OnKey(kevent); } w->Release(); return PR_TRUE; }
/* * 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; }