⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_epocevents.cpp

📁 linux下面的一个开源的多媒体中间件
💻 CPP
字号:
/*    SDL - Simple DirectMedia Layer    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Library General Public    License as published by the Free Software Foundation; either    version 2 of the License, or (at your option) any later version.    This library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Library General Public License for more details.    You should have received a copy of the GNU Library General Public    License along with this library; if not, write to the Free    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    Sam Lantinga    slouken@libsdl.org*/#include "SDL_config.h"/*    SDL_epocevents.cpp    Handle the event stream, converting Epoc events into SDL events    Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi)*/#include <stdio.h>#undef NULLextern "C" {#include "SDL_error.h"#include "SDL_video.h"#include "SDL_keysym.h"#include "SDL_keyboard.h"#include "SDL_timer.h"#include "../../events/SDL_events_c.h"}; /* extern "C" */#include "SDL_epocvideo.h"#include "SDL_epocevents_c.h"#include <hal.h>extern "C" {/* The translation tables from a console scancode to a SDL keysym */static SDLKey keymap[MAX_SCANCODE];static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym);}; /* extern "C" */TBool isCursorVisible = ETrue;int EPOC_HandleWsEvent(_THIS, const TWsEvent& aWsEvent){    int posted = 0;    SDL_keysym keysym;    switch (aWsEvent.Type()) {        case EEventPointer: /* Mouse pointer events */    {        const TPointerEvent* pointerEvent = aWsEvent.Pointer();        TPoint mousePos = pointerEvent->iPosition;        //SDL_TRACE1("SDL: EPOC_HandleWsEvent, pointerEvent->iType=%d", pointerEvent->iType); //!!        if (Private->EPOC_ShrinkedHeight) {            mousePos.iY <<= 1; /* Scale y coordinate to shrinked screen height */        }		posted += SDL_PrivateMouseMotion(0, 0, mousePos.iX, mousePos.iY); /* Absolute position on screen */        if (pointerEvent->iType==TPointerEvent::EButton1Down) {            posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_LEFT, 0, 0);        }        else if (pointerEvent->iType==TPointerEvent::EButton1Up) {			posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_LEFT, 0, 0);        }        else if (pointerEvent->iType==TPointerEvent::EButton2Down) {            posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_RIGHT, 0, 0);        }        else if (pointerEvent->iType==TPointerEvent::EButton2Up) {			posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_RIGHT, 0, 0);        }	    //!!posted += SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(aWsEvent.Key()->iScanCode, &keysym));        break;    }        case EEventKeyDown: /* Key events */    {       (void*)TranslateKey(aWsEvent.Key()->iScanCode, &keysym);                /* Special handling */        switch((int)keysym.sym) {        case SDLK_CAPSLOCK:            if (!isCursorVisible) {                /* Enable virtual cursor */	            HAL::Set(HAL::EMouseState, HAL::EMouseState_Visible);            }            else {                /* Disable virtual cursor */                HAL::Set(HAL::EMouseState, HAL::EMouseState_Invisible);            }            isCursorVisible = !isCursorVisible;            break;        }        	    posted += SDL_PrivateKeyboard(SDL_PRESSED, &keysym);        break;	}     case EEventKeyUp: /* Key events */    {	    posted += SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(aWsEvent.Key()->iScanCode, &keysym));        break;	}         case EEventFocusGained: /* SDL window got focus */    {        //Private->EPOC_IsWindowFocused = ETrue;        /* Draw window background and screen buffer */        RedrawWindowL(_this);          break;    }    case EEventFocusLost: /* SDL window lost focus */    {        //Private->EPOC_IsWindowFocused = EFalse;        // Wait and eat events until focus is gained again        /*	    while (ETrue) {            Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus);            User::WaitForRequest(Private->EPOC_WsEventStatus);		    Private->EPOC_WsSession.GetEvent(Private->EPOC_WsEvent);            TInt eventType = Private->EPOC_WsEvent.Type();		    Private->EPOC_WsEventStatus = KRequestPending;		    //Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus);            if (eventType == EEventFocusGained) {                RedrawWindowL(_this);                break;            }	    }        */        break;    }    case EEventModifiersChanged:     {	    TModifiersChangedEvent* modEvent = aWsEvent.ModifiersChanged();        TUint modstate = KMOD_NONE;        if (modEvent->iModifiers == EModifierLeftShift)            modstate |= KMOD_LSHIFT;        if (modEvent->iModifiers == EModifierRightShift)            modstate |= KMOD_RSHIFT;        if (modEvent->iModifiers == EModifierLeftCtrl)            modstate |= KMOD_LCTRL;        if (modEvent->iModifiers == EModifierRightCtrl)            modstate |= KMOD_RCTRL;        if (modEvent->iModifiers == EModifierLeftAlt)            modstate |= KMOD_LALT;        if (modEvent->iModifiers == EModifierRightAlt)            modstate |= KMOD_RALT;        if (modEvent->iModifiers == EModifierLeftFunc)            modstate |= KMOD_LMETA;        if (modEvent->iModifiers == EModifierRightFunc)            modstate |= KMOD_RMETA;        if (modEvent->iModifiers == EModifierCapsLock)            modstate |= KMOD_CAPS;        SDL_SetModState(STATIC_CAST(SDLMod,(modstate | KMOD_LSHIFT)));        break;    }    default:                    break;	} 	    return posted;}extern "C" {void EPOC_PumpEvents(_THIS){    int posted = 0; // !! Do we need this?    //Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus);	while (Private->EPOC_WsEventStatus != KRequestPending) {		Private->EPOC_WsSession.GetEvent(Private->EPOC_WsEvent);		posted = EPOC_HandleWsEvent(_this, Private->EPOC_WsEvent);		Private->EPOC_WsEventStatus = KRequestPending;		Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus);	}}void EPOC_InitOSKeymap(_THIS){	int i;	/* Initialize the key translation table */	for ( i=0; i<SDL_TABLESIZE(keymap); ++i )		keymap[i] = SDLK_UNKNOWN;	/* Numbers */	for ( i = 0; i<32; ++i ){		keymap[' ' + i] = (SDLKey)(SDLK_SPACE+i);	}	/* e.g. Alphabet keys */	for ( i = 0; i<32; ++i ){		keymap['A' + i] = (SDLKey)(SDLK_a+i);	}	keymap[EStdKeyBackspace]    = SDLK_BACKSPACE;	keymap[EStdKeyTab]          = SDLK_TAB;	keymap[EStdKeyEnter]        = SDLK_RETURN;	keymap[EStdKeyEscape]       = SDLK_ESCAPE;   	keymap[EStdKeySpace]        = SDLK_SPACE;   	keymap[EStdKeyPause]        = SDLK_PAUSE;   	keymap[EStdKeyHome]         = SDLK_HOME;   	keymap[EStdKeyEnd]          = SDLK_END;   	keymap[EStdKeyPageUp]       = SDLK_PAGEUP;   	keymap[EStdKeyPageDown]     = SDLK_PAGEDOWN;	keymap[EStdKeyDelete]       = SDLK_DELETE;	keymap[EStdKeyUpArrow]      = SDLK_UP;	keymap[EStdKeyDownArrow]    = SDLK_DOWN;	keymap[EStdKeyLeftArrow]    = SDLK_LEFT;	keymap[EStdKeyRightArrow]   = SDLK_RIGHT;	keymap[EStdKeyCapsLock]     = SDLK_CAPSLOCK;	keymap[EStdKeyLeftShift]    = SDLK_LSHIFT;	keymap[EStdKeyRightShift]   = SDLK_RSHIFT;	keymap[EStdKeyLeftAlt]      = SDLK_LALT;	keymap[EStdKeyRightAlt]     = SDLK_RALT;	keymap[EStdKeyLeftCtrl]     = SDLK_LCTRL;	keymap[EStdKeyRightCtrl]    = SDLK_RCTRL;	keymap[EStdKeyLeftFunc]     = SDLK_LMETA;	keymap[EStdKeyRightFunc]    = SDLK_RMETA;	keymap[EStdKeyInsert]       = SDLK_INSERT;	keymap[EStdKeyComma]        = SDLK_COMMA;	keymap[EStdKeyFullStop]     = SDLK_PERIOD;	keymap[EStdKeyForwardSlash] = SDLK_SLASH;	keymap[EStdKeyBackSlash]    = SDLK_BACKSLASH;	keymap[EStdKeySemiColon]    = SDLK_SEMICOLON;	keymap[EStdKeySingleQuote]  = SDLK_QUOTE;	keymap[EStdKeyHash]         = SDLK_HASH;	keymap[EStdKeySquareBracketLeft]    = SDLK_LEFTBRACKET;	keymap[EStdKeySquareBracketRight]   = SDLK_RIGHTBRACKET;	keymap[EStdKeyMinus]        = SDLK_MINUS;	keymap[EStdKeyEquals]       = SDLK_EQUALS;   	keymap[EStdKeyF1]          = SDLK_F1;  /* chr + q */   	keymap[EStdKeyF2]          = SDLK_F2;  /* chr + w */   	keymap[EStdKeyF3]          = SDLK_F3;  /* chr + e */   	keymap[EStdKeyF4]          = SDLK_F4;  /* chr + r */   	keymap[EStdKeyF5]          = SDLK_F5;  /* chr + t */   	keymap[EStdKeyF6]          = SDLK_F6;  /* chr + y */   	keymap[EStdKeyF7]          = SDLK_F7;  /* chr + i */   	keymap[EStdKeyF8]          = SDLK_F8;  /* chr + o */   	keymap[EStdKeyF9]          = SDLK_F9;  /* chr + a */   	keymap[EStdKeyF10]         = SDLK_F10; /* chr + s */   	keymap[EStdKeyF11]         = SDLK_F11; /* chr + d */   	keymap[EStdKeyF12]         = SDLK_F12; /* chr + f */    /* !!TODO	EStdKeyNumLock=0x1b,	EStdKeyScrollLock=0x1c,	EStdKeyNkpForwardSlash=0x84,	EStdKeyNkpAsterisk=0x85,	EStdKeyNkpMinus=0x86,	EStdKeyNkpPlus=0x87,	EStdKeyNkpEnter=0x88,	EStdKeyNkp1=0x89,	EStdKeyNkp2=0x8a,	EStdKeyNkp3=0x8b,	EStdKeyNkp4=0x8c,	EStdKeyNkp5=0x8d,	EStdKeyNkp6=0x8e,	EStdKeyNkp7=0x8f,	EStdKeyNkp8=0x90,	EStdKeyNkp9=0x91,	EStdKeyNkp0=0x92,	EStdKeyNkpFullStop=0x93,    EStdKeyMenu=0x94,    EStdKeyBacklightOn=0x95,    EStdKeyBacklightOff=0x96,    EStdKeyBacklightToggle=0x97,    EStdKeyIncContrast=0x98,    EStdKeyDecContrast=0x99,    EStdKeySliderDown=0x9a,    EStdKeySliderUp=0x9b,    EStdKeyDictaphonePlay=0x9c,    EStdKeyDictaphoneStop=0x9d,    EStdKeyDictaphoneRecord=0x9e,    EStdKeyHelp=0x9f,    EStdKeyOff=0xa0,    EStdKeyDial=0xa1,    EStdKeyIncVolume=0xa2,    EStdKeyDecVolume=0xa3,    EStdKeyDevice0=0xa4,    EStdKeyDevice1=0xa5,    EStdKeyDevice2=0xa6,    EStdKeyDevice3=0xa7,    EStdKeyDevice4=0xa8,    EStdKeyDevice5=0xa9,    EStdKeyDevice6=0xaa,    EStdKeyDevice7=0xab,    EStdKeyDevice8=0xac,    EStdKeyDevice9=0xad,    EStdKeyDeviceA=0xae,    EStdKeyDeviceB=0xaf,    EStdKeyDeviceC=0xb0,    EStdKeyDeviceD=0xb1,    EStdKeyDeviceE=0xb2,    EStdKeyDeviceF=0xb3,    EStdKeyApplication0=0xb4,    EStdKeyApplication1=0xb5,    EStdKeyApplication2=0xb6,    EStdKeyApplication3=0xb7,    EStdKeyApplication4=0xb8,    EStdKeyApplication5=0xb9,    EStdKeyApplication6=0xba,    EStdKeyApplication7=0xbb,    EStdKeyApplication8=0xbc,    EStdKeyApplication9=0xbd,    EStdKeyApplicationA=0xbe,    EStdKeyApplicationB=0xbf,    EStdKeyApplicationC=0xc0,    EStdKeyApplicationD=0xc1,    EStdKeyApplicationE=0xc2,    EStdKeyApplicationF=0xc3,    EStdKeyYes=0xc4,    EStdKeyNo=0xc5,    EStdKeyIncBrightness=0xc6,    EStdKeyDecBrightness=0xc7,     EStdKeyCaseOpen=0xc8,    EStdKeyCaseClose=0xc9    */}static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym){    char debug[256];    //SDL_TRACE1("SDL: TranslateKey, scancode=%d", scancode); //!!	/* Set the keysym information */ 	keysym->scancode = scancode;    if ((scancode >= MAX_SCANCODE) &&         ((scancode - ENonCharacterKeyBase + 0x0081) >= MAX_SCANCODE)) {        SDL_SetError("Too big scancode");        keysym->scancode = SDLK_UNKNOWN;	    keysym->mod = KMOD_NONE;         return keysym;    }	keysym->mod = SDL_GetModState(); //!!Is this right??    /* Handle function keys: F1, F2, F3 ... */    if (keysym->mod & KMOD_META) {        if (scancode >= 'A' && scancode < ('A' + 24)) { /* first 32 alphapet keys */            switch(scancode) {                case 'Q': scancode = EStdKeyF1; break;                case 'W': scancode = EStdKeyF2; break;                case 'E': scancode = EStdKeyF3; break;                case 'R': scancode = EStdKeyF4; break;                case 'T': scancode = EStdKeyF5; break;                case 'Y': scancode = EStdKeyF6; break;                case 'U': scancode = EStdKeyF7; break;                case 'I': scancode = EStdKeyF8; break;                case 'A': scancode = EStdKeyF9; break;                case 'S': scancode = EStdKeyF10; break;                case 'D': scancode = EStdKeyF11; break;                case 'F': scancode = EStdKeyF12; break;            }            keysym->sym = keymap[scancode];        }    }    if (scancode >= ENonCharacterKeyBase) {        // Non character keys	    keysym->sym = keymap[scancode -             ENonCharacterKeyBase + 0x0081]; // !!hard coded    } else {	    keysym->sym = keymap[scancode];    }	/* If UNICODE is on, get the UNICODE value for the key */	keysym->unicode = 0;#if 0 // !!TODO:unicode	if ( SDL_TranslateUNICODE )     {		/* Populate the unicode field with the ASCII value */		keysym->unicode = scancode;	}#endif    //!!    //sprintf(debug, "SDL: TranslateKey: keysym->scancode=%d, keysym->sym=%d, keysym->mod=%d",    //    keysym->scancode, keysym->sym, keysym->mod);    //SDL_TRACE(debug); //!!	return(keysym);}}; /* extern "C" */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -