146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997-2006 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Lesser General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2.1 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lesser General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Lesser General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free Software 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Handle the event stream, converting photon events into SDL events */ 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <stdio.h> 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <setjmp.h> 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <sys/time.h> 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <Ph.h> 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <photon/PkKeyDef.h> 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL.h" 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_syswm.h" 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_sysvideo.h" 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_sysevents.h" 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_events_c.h" 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_ph_video.h" 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_ph_modes_c.h" 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_ph_image_c.h" 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_ph_events_c.h" 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_phyuv_c.h" 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* The translation tables from a photon keysym to a SDL keysym */ 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDLKey ODD_keymap[256]; 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDLKey MISC_keymap[0xFF + 1]; 4746be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_keysym *ph_TranslateKey(PhKeyEvent_t *key, SDL_keysym *keysym); 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Check to see if this is a repeated key. 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (idea shamelessly lifted from GII -- thanks guys! :) */ 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int ph_WarpedMotion(_THIS, PhEvent_t *winEvent) 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhRect_t *rect = PhGetRects( winEvent ); 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int centre_x, centre_y; 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dx, dy; 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner short abs_x, abs_y; 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int posted; 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner centre_x = SDL_VideoSurface->w / 2; 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner centre_y = SDL_VideoSurface->h / 2; 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dx = rect->ul.x - centre_x; 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dy = rect->ul.y - centre_y; 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateMouseMotion( 0, 1, dx, dy ); 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Move mouse cursor to middle of the window */ 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PtGetAbsPosition( window, &abs_x, &abs_y ); 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhMoveCursorAbs(PhInputGroup(NULL), abs_x + centre_x, abs_y + centre_y); 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (posted); 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Control which motion flags the window has set, a flags value of -1 sets 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * MOTION_BUTTON and MOTION_NOBUTTON */ 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void set_motion_sensitivity(_THIS, unsigned int flags) 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int rid; 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int fields = Ph_EV_PTR_MOTION_BUTTON | Ph_EV_PTR_MOTION_NOBUTTON; 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhRegion_t region; 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if( window ) 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rid = PtWidgetRid(window); 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if( rid != 0 && PhRegionQuery(rid, ®ion, NULL, NULL, 0) == 0 ) 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner region.events_sense=(region.events_sense & ~fields)|(flags & fields); 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhRegionChange(Ph_REGION_EV_SENSE, 0, ®ion, NULL, NULL); 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Convert the photon button state value to an SDL value */ 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic Uint8 ph2sdl_mousebutton(unsigned short button_state) 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 mouse_button = 0; 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (button_state & Ph_BUTTON_SELECT) 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mouse_button |= SDL_BUTTON_LEFT; 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (button_state & Ph_BUTTON_MENU) 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mouse_button |= SDL_BUTTON_RIGHT; 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (button_state & Ph_BUTTON_ADJUST) 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mouse_button |= SDL_BUTTON_MIDDLE; 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (mouse_button); 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int ph_DispatchEvent(_THIS) 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int posted; 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhRect_t* rect; 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhPointerEvent_t* pointerEvent; 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhKeyEvent_t* keyEvent; 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PhWindowEvent_t* winEvent; 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i, buttons; 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Rect sdlrects[PH_SDL_MAX_RECTS]; 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = 0; 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (phevent->type) 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EV_BOUNDARY: 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (phevent->subtype == Ph_EV_PTR_ENTER) 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (phevent->subtype ==Ph_EV_PTR_LEAVE) 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EV_PTR_MOTION_BUTTON: 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EV_PTR_MOTION_NOBUTTON: 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SDL_VideoSurface) 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pointerEvent = PhGetData(phevent); 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rect = PhGetRects(phevent); 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (mouse_relative) 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = ph_WarpedMotion(this, phevent); 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateMouseMotion(0, 0, rect->ul.x, rect->ul.y); 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EV_BUT_PRESS: 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pointerEvent = PhGetData(phevent); 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner buttons = ph2sdl_mousebutton(pointerEvent->buttons); 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (buttons != 0) 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateMouseButton(SDL_PRESSED, buttons, 0, 0); 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EV_BUT_RELEASE: 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pointerEvent = PhGetData(phevent); 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner buttons = ph2sdl_mousebutton(pointerEvent->buttons); 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (phevent->subtype == Ph_EV_RELEASE_REAL && buttons != 0) 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateMouseButton(SDL_RELEASED, buttons, 0, 0); 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if(phevent->subtype == Ph_EV_RELEASE_PHANTOM) 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* If the mouse is outside the window, 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * only a phantom release event is sent, so 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * check if the window doesn't have mouse focus. 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * Not perfect, maybe checking the mouse button 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * state for Ph_EV_BOUNDARY events would be 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * better. */ 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS) == 0) 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateMouseButton(SDL_RELEASED, buttons, 0, 0); 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EV_WM: 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner winEvent = PhGetData(phevent); 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* losing focus */ 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((winEvent->event_f==Ph_WM_FOCUS) && (winEvent->event_state==Ph_WM_EVSTATE_FOCUSLOST)) 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner set_motion_sensitivity(this, Ph_EV_PTR_MOTION_BUTTON); 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS); 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* gaining focus */ 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if ((winEvent->event_f==Ph_WM_FOCUS) && (winEvent->event_state==Ph_WM_EVSTATE_FOCUS)) 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner set_motion_sensitivity(this, -1); 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS); 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* request quit */ 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (winEvent->event_f==Ph_WM_CLOSE) 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateQuit(); 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* request hide/unhide */ 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (winEvent->event_f==Ph_WM_HIDE) 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (currently_hided) 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* got unhide window event */ 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* TODO: restore application's palette if in palette mode */ 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currently_hided=0; 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* got hide window event */ 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* TODO: restore original palette if in palette mode */ 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currently_hided=1; 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* request to resize */ 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (winEvent->event_f==Ph_WM_RESIZE) 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currently_maximized=0; 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner #if (_NTO_VERSION < 630) 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateResize(winEvent->size.w+1, winEvent->size.h+1); 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner #else 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* QNX 6.3.0 have this bug fixed */ 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateResize(winEvent->size.w, winEvent->size.h); 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner #endif /* _NTO_VERSION */ 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* request to move */ 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (winEvent->event_f==Ph_WM_MOVE) 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (current_overlay!=NULL) 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int lockedstate=current_overlay->hwdata->locked; 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int chromastate=current_overlay->hwdata->ischromakey; 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int error; 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Rect src, dst; 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner current_overlay->hwdata->locked=1; 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src.x = 0; 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src.y = 0; 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src.w = current_overlay->w; 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src.y = current_overlay->h; 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst.x=current_overlay->hwdata->CurrentViewPort.pos.x; 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst.y=current_overlay->hwdata->CurrentViewPort.pos.y; 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst.w=current_overlay->hwdata->CurrentViewPort.size.w; 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst.h=current_overlay->hwdata->CurrentViewPort.size.h; 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner current_overlay->hwdata->ischromakey=0; 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner error=ph_DisplayYUVOverlay(this, current_overlay, &src, &dst); 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!error) 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner current_overlay->hwdata->ischromakey=chromastate; 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner current_overlay->hwdata->locked=lockedstate; 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* maximize request */ 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (winEvent->event_f==Ph_WM_MAX) 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* window already moved and resized here */ 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currently_maximized=1; 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* restore request */ 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (winEvent->event_f==Ph_WM_RESTORE) 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* window already moved and resized here */ 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner currently_maximized=0; 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* window has been resized, moved or removed */ 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EV_EXPOSE: 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (phevent->num_rects!=0) 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int numrects; 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SDL_VideoSurface) 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rect = PhGetRects(phevent); 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (phevent->num_rects>PH_SDL_MAX_RECTS) 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* sorry, buffers underrun, we'll update only first PH_SDL_MAX_RECTS rects */ 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner numrects=PH_SDL_MAX_RECTS; 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for(i=0; i<phevent->num_rects; i++) 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sdlrects[i].x = rect[i].ul.x; 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sdlrects[i].y = rect[i].ul.y; 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sdlrects[i].w = rect[i].lr.x - rect[i].ul.x + 1; 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sdlrects[i].h = rect[i].lr.y - rect[i].ul.y + 1; 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner this->UpdateRects(this, phevent->num_rects, sdlrects); 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (current_overlay!=NULL) 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int lockedstate=current_overlay->hwdata->locked; 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int error; 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Rect src, dst; 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner current_overlay->hwdata->locked=1; 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src.x = 0; 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src.y = 0; 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src.w = current_overlay->w; 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src.y = current_overlay->h; 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst.x=current_overlay->hwdata->CurrentViewPort.pos.x; 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst.y=current_overlay->hwdata->CurrentViewPort.pos.y; 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst.w=current_overlay->hwdata->CurrentViewPort.size.w; 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst.h=current_overlay->hwdata->CurrentViewPort.size.h; 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner current_overlay->hwdata->forcedredraw=1; 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner error=ph_DisplayYUVOverlay(this, current_overlay, &src, &dst); 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!error) 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner current_overlay->hwdata->forcedredraw=0; 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner current_overlay->hwdata->locked=lockedstate; 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EV_KEY: 33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_keysym keysym; 34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = 0; 34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keyEvent = PhGetData(phevent); 34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (Pk_KF_Key_Down & keyEvent->key_flags) 34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* split the wheel events from real key events */ 34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((keyEvent->key_cap==Pk_Up) && (keyEvent->key_scan==0) && ((keyEvent->key_flags & Pk_KF_Scan_Valid)==Pk_KF_Scan_Valid)) 34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELUP, 0, 0); 35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((keyEvent->key_cap==Pk_Down) && (keyEvent->key_scan==0) && ((keyEvent->key_flags & Pk_KF_Scan_Valid)==Pk_KF_Scan_Valid)) 35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELDOWN, 0, 0); 35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateKeyboard(SDL_PRESSED, ph_TranslateKey(keyEvent, &keysym)); 35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else /* must be key release */ 36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* split the wheel events from real key events */ 36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((keyEvent->key_cap==Pk_Up) && (keyEvent->key_scan==0) && ((keyEvent->key_flags & Pk_KF_Scan_Valid)==Pk_KF_Scan_Valid)) 36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELUP, 0, 0); 36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((keyEvent->key_cap==Pk_Down) && (keyEvent->key_scan==0) && ((keyEvent->key_flags & Pk_KF_Scan_Valid)==Pk_KF_Scan_Valid)) 36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELDOWN, 0, 0); 37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = SDL_PrivateKeyboard(SDL_RELEASED, ph_TranslateKey( keyEvent, &keysym)); 37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EV_INFO: 37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (phevent->subtype==Ph_OFFSCREEN_INVALID) 38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner unsigned long* EvInfoData; 38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EvInfoData=(unsigned long*)PhGetData(phevent); 38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (*EvInfoData) 38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Pg_VIDEO_MODE_SWITCHED: 38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Pg_ENTERED_DIRECT: 39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Pg_EXITED_DIRECT: 39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Pg_DRIVER_STARTED: 40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(posted); 41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* perform a blocking read if no events available */ 41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint ph_Pending(_THIS) 41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Flush the display connection and look to see if events are queued */ 41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PgFlush(); 41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (1) 42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch(PhEventPeek(phevent, EVENT_SIZE)) 42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case Ph_EVENT_MSG: 42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 1; 42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case -1: 42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("ph_Pending(): PhEventNext failed.\n"); 42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Oh well, nothing is ready .. */ 43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid ph_PumpEvents(_THIS) 43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Flush the display connection and look to see if events are queued */ 44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PgFlush(); 44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (ph_Pending(this)) 44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PtEventHandler(phevent); 44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ph_DispatchEvent(this); 44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid ph_InitKeymap(void) 45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i; 45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Odd keys used in international keyboards */ 45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i=0; i<SDL_arraysize(ODD_keymap); ++i) 45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ODD_keymap[i] = SDLK_UNKNOWN; 45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Map the miscellaneous keys */ 46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i=0; i<SDL_arraysize(MISC_keymap); ++i) 46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[i] = SDLK_UNKNOWN; 46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_BackSpace&0xFF] = SDLK_BACKSPACE; 46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Tab&0xFF] = SDLK_TAB; 46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Clear&0xFF] = SDLK_CLEAR; 46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Return&0xFF] = SDLK_RETURN; 46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Pause&0xFF] = SDLK_PAUSE; 47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Escape&0xFF] = SDLK_ESCAPE; 47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Delete&0xFF] = SDLK_DELETE; 47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_0&0xFF] = SDLK_KP0; 47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_1&0xFF] = SDLK_KP1; 47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_2&0xFF] = SDLK_KP2; 47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_3&0xFF] = SDLK_KP3; 47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_4&0xFF] = SDLK_KP4; 47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_5&0xFF] = SDLK_KP5; 47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_6&0xFF] = SDLK_KP6; 48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_7&0xFF] = SDLK_KP7; 48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_8&0xFF] = SDLK_KP8; 48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_9&0xFF] = SDLK_KP9; 48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_Decimal&0xFF] = SDLK_KP_PERIOD; 48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_Divide&0xFF] = SDLK_KP_DIVIDE; 48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_Multiply&0xFF] = SDLK_KP_MULTIPLY; 48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_Subtract&0xFF] = SDLK_KP_MINUS; 48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_Add&0xFF] = SDLK_KP_PLUS; 48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_Enter&0xFF] = SDLK_KP_ENTER; 49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_KP_Equal&0xFF] = SDLK_KP_EQUALS; 49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Up&0xFF] = SDLK_UP; 49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Down&0xFF] = SDLK_DOWN; 49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Right&0xFF] = SDLK_RIGHT; 49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Left&0xFF] = SDLK_LEFT; 49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Insert&0xFF] = SDLK_INSERT; 49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Home&0xFF] = SDLK_HOME; 49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_End&0xFF] = SDLK_END; 49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Pg_Up&0xFF] = SDLK_PAGEUP; 50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Pg_Down&0xFF] = SDLK_PAGEDOWN; 50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F1&0xFF] = SDLK_F1; 50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F2&0xFF] = SDLK_F2; 50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F3&0xFF] = SDLK_F3; 50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F4&0xFF] = SDLK_F4; 50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F5&0xFF] = SDLK_F5; 50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F6&0xFF] = SDLK_F6; 50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F7&0xFF] = SDLK_F7; 50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F8&0xFF] = SDLK_F8; 51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F9&0xFF] = SDLK_F9; 51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F10&0xFF] = SDLK_F10; 51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F11&0xFF] = SDLK_F11; 51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F12&0xFF] = SDLK_F12; 51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F13&0xFF] = SDLK_F13; 51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F14&0xFF] = SDLK_F14; 51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_F15&0xFF] = SDLK_F15; 51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Num_Lock&0xFF] = SDLK_NUMLOCK; 51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Caps_Lock&0xFF] = SDLK_CAPSLOCK; 52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Scroll_Lock&0xFF] = SDLK_SCROLLOCK; 52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Shift_R&0xFF] = SDLK_RSHIFT; 52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Shift_L&0xFF] = SDLK_LSHIFT; 52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Control_R&0xFF] = SDLK_RCTRL; 52446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Control_L&0xFF] = SDLK_LCTRL; 52546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Alt_R&0xFF] = SDLK_RALT; 52646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Alt_L&0xFF] = SDLK_LALT; 52746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Meta_R&0xFF] = SDLK_RMETA; 52846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Meta_L&0xFF] = SDLK_LMETA; 52946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Super_L&0xFF] = SDLK_LSUPER; 53046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Super_R&0xFF] = SDLK_RSUPER; 53146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Mode_switch&0xFF] = SDLK_MODE; /* "Alt Gr" key */ 53246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 53346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Help&0xFF] = SDLK_HELP; 53446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Print&0xFF] = SDLK_PRINT; 53546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Break&0xFF] = SDLK_BREAK; 53646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Menu&0xFF] = SDLK_MENU; /* Windows "Menu" key */ 53746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 53846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Hyper_R&0xFF] = SDLK_RSUPER; /* Right "Windows" */ 53946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 54046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Left "Windows" key, but it can't be catched by application */ 54146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MISC_keymap[Pk_Hyper_L&0xFF] = SDLK_LSUPER; 54246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 54346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 54446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic unsigned long cap; 54546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 54646be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_keysym *ph_TranslateKey(PhKeyEvent_t *key, SDL_keysym *keysym) 54746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 54846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 'sym' is set to the value of the key with modifiers applied to it. 54946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This member is valid only if Pk_KF_Sym_Valid is set in the key_flags. 55046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner We will assume it is valid. */ 55146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 55246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* FIXME: This needs to check whether the cap & scancode is valid */ 55346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 55446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cap = key->key_cap; 55546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 55646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (cap>>8) 55746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 55846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x00: /* Latin 1 */ 55946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x01: /* Latin 2 */ 56046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x02: /* Latin 3 */ 56146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x03: /* Latin 4 */ 56246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x04: /* Katakana */ 56346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x05: /* Arabic */ 56446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x06: /* Cyrillic */ 56546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x07: /* Greek */ 56646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x08: /* Technical */ 56746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x0A: /* Publishing */ 56846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x0C: /* Hebrew */ 56946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x0D: /* Thai */ 57046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = (SDLKey)(cap&0xFF); 57146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Map capital letter syms to lowercase */ 57246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((keysym->sym >= 'A')&&(keysym->sym <= 'Z')) 57346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym += ('a'-'A'); 57446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 57546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0xF0: 57646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = MISC_keymap[cap&0xFF]; 57746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 57846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 57946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_UNKNOWN; 58046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 58146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 58246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 58346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->scancode = key->key_scan; 58446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->unicode = 0; 58546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 58646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SDL_TranslateUNICODE) 58746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 58846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char utf8[MB_CUR_MAX]; 58946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int utf8len; 59046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner wchar_t unicode; 59146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 59246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (keysym->scancode) 59346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 59446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Esc key */ 59546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x01: keysym->unicode = 27; 59646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 59746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* BackSpace key */ 59846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x0E: keysym->unicode = 127; 59946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 60046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Enter key */ 60146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0x1C: keysym->unicode = 10; 60246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 60346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 60446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner utf8len = PhKeyToMb(utf8, key); 60546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (utf8len > 0) 60646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 60746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner utf8len = mbtowc(&unicode, utf8, utf8len); 60846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (utf8len > 0) 60946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 61046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->unicode = unicode; 61146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 61246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 61346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 61446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 61546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 61646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 61746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 61846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (keysym); 61946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 62046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 62146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid ph_InitOSKeymap(_THIS) 62246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 62346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ph_InitKeymap(); 62446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 625