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);
}
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;
	}