Beispiel #1
0
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;
}
Beispiel #2
0
/*
 * 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;
	}