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, &region, 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, &region, 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