Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at

activekitten.com.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401155
This commit is contained in:
Ryan C. Gordon 2005-09-29 09:43:00 +00:00
parent 91121c3104
commit ba06fd388b
13 changed files with 211 additions and 41 deletions

Binary file not shown.

View File

@ -25,6 +25,10 @@ static char rcsid =
"@(#) $Id$"; "@(#) $Id$";
#endif #endif
#ifdef _WIN32_WCE
#define NO_SIGNAL_H
#endif
/* General fatal signal handling code for SDL */ /* General fatal signal handling code for SDL */
#ifdef NO_SIGNAL_H #ifdef NO_SIGNAL_H

View File

@ -31,7 +31,7 @@ static char rcsid =
#include <stdio.h> #include <stdio.h>
#if defined(USE_DLOPEN) #if defined(USE_DLOPEN)
# include <dlfcn.h> # include <dlfcn.h>
#elif defined(WIN32) #elif defined(WIN32) || defined(_WIN32_WCE)
# include <windows.h> # include <windows.h>
#elif defined(__BEOS__) #elif defined(__BEOS__)
# include <be/kernel/image.h> # include <be/kernel/image.h>
@ -60,6 +60,30 @@ void *SDL_LoadObject(const char *sofile)
/* * */ /* * */
handle = dlopen(sofile, RTLD_NOW); handle = dlopen(sofile, RTLD_NOW);
loaderror = (char *)dlerror(); loaderror = (char *)dlerror();
#elif defined(_WIN32_WCE)
/* * */
char errbuf[512];
wchar_t *errbuf_t = malloc(512 * sizeof(wchar_t));
wchar_t *sofile_t = malloc((MAX_PATH+1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sofile, -1, sofile_t, MAX_PATH);
handle = (void *)LoadLibrary(sofile_t);
/* Generate an error message if all loads failed */
if ( handle == NULL ) {
FormatMessage((FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM),
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
errbuf_t, SDL_TABLESIZE(errbuf), NULL);
WideCharToMultiByte(CP_ACP, 0, errbuf_t, -1, errbuf, 511, NULL, NULL);
loaderror = errbuf;
}
free(sofile_t);
free(errbuf_t);
#elif defined(WIN32) #elif defined(WIN32)
/* * */ /* * */
char errbuf[512]; char errbuf[512];
@ -139,6 +163,30 @@ void *SDL_LoadFunction(void *handle, const char *name)
if ( symbol == NULL ) { if ( symbol == NULL ) {
loaderror = (char *)dlerror(); loaderror = (char *)dlerror();
} }
#elif defined(_WIN32_WCE)
/* * */
char errbuf[512];
int length = strlen(name);
wchar_t *name_t = malloc((length + 1) * sizeof(wchar_t));
wchar_t *errbuf_t = malloc(512 * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, name_t, length);
symbol = (void *)GetProcAddress((HMODULE)handle, name_t);
if ( symbol == NULL ) {
FormatMessage((FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM),
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
errbuf_t, SDL_TABLESIZE(errbuf), NULL);
WideCharToMultiByte(CP_ACP, 0, errbuf_t, -1, errbuf, 511, NULL, NULL);
loaderror = errbuf;
}
free(name_t);
free(errbuf_t);
#elif defined(WIN32) #elif defined(WIN32)
/* * */ /* * */
char errbuf[512]; char errbuf[512];

View File

@ -40,3 +40,7 @@ void SDL_SYS_CDQuit(void)
return; return;
} }
int SDL_CDROMInit(void)
{
return 0;
}

View File

@ -101,7 +101,7 @@ CPUid by definition. But it's nice to be able to prove it. :) */
: :
: "%rax", "%rcx" : "%rax", "%rcx"
); );
#elif defined(_MSC_VER) #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_X86_))
__asm { __asm {
pushfd ; Get original EFLAGS pushfd ; Get original EFLAGS
pop eax pop eax
@ -140,7 +140,7 @@ static __inline__ int CPU_getCPUIDFeatures()
: :
: "%eax", "%ecx", "%edx", "%edi" : "%eax", "%ecx", "%edx", "%edi"
); );
#elif defined(_MSC_VER) #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_X86_))
__asm { __asm {
xor eax, eax ; Set up for CPUID instruction xor eax, eax ; Set up for CPUID instruction
cpuid ; Get and save vendor ID cpuid ; Get and save vendor ID
@ -175,7 +175,7 @@ static __inline__ int CPU_getCPUIDFeaturesExt()
: :
: "%eax", "%ecx", "%edx", "%edi" : "%eax", "%ecx", "%edx", "%edi"
); );
#elif defined(_MSC_VER) #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_X86_))
__asm { __asm {
mov eax,80000000h ; Query for extended functions mov eax,80000000h ; Query for extended functions
cpuid ; Get extended function limit cpuid ; Get extended function limit

View File

@ -27,6 +27,10 @@ static char rcsid =
/* General quit handling code for SDL */ /* General quit handling code for SDL */
#if defined (_WIN32_WCE)
#define NO_SIGNAL_H
#endif
#include <stdio.h> #include <stdio.h>
#ifndef NO_SIGNAL_H #ifndef NO_SIGNAL_H
#include <signal.h> #include <signal.h>

View File

@ -34,6 +34,8 @@ static char rcsid =
#include "SDL_sysjoystick.h" #include "SDL_sysjoystick.h"
#include "SDL_joystick_c.h" #include "SDL_joystick_c.h"
Uint8 SDL_numjoysticks = 0;
/* Function to scan the system for joysticks. /* Function to scan the system for joysticks.
* This function should set SDL_numjoysticks to the number of available * This function should set SDL_numjoysticks to the number of available
* joysticks. Joystick 0 should be the system default joystick. * joysticks. Joystick 0 should be the system default joystick.

View File

@ -40,6 +40,7 @@ static char rcsid =
#include "SDL_lowvideo.h" #include "SDL_lowvideo.h"
#include "SDL_syswm_c.h" #include "SDL_syswm_c.h"
#include "SDL_main.h" #include "SDL_main.h"
#include "SDL_loadso.h"
#ifdef WMMSG_DEBUG #ifdef WMMSG_DEBUG
#include "wmmsg.h" #include "wmmsg.h"
@ -71,13 +72,37 @@ WORD *gamma_saved = NULL;
/* Functions called by the message processing function */ /* Functions called by the message processing function */
LONG LONG (*HandleMessage)(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)=NULL;
(*HandleMessage)(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)=NULL;
void (*WIN_RealizePalette)(_THIS); void (*WIN_RealizePalette)(_THIS);
void (*WIN_PaletteChanged)(_THIS, HWND window); void (*WIN_PaletteChanged)(_THIS, HWND window);
void (*WIN_WinPAINT)(_THIS, HDC hdc); void (*WIN_WinPAINT)(_THIS, HDC hdc);
extern void DIB_SwapGamma(_THIS); extern void DIB_SwapGamma(_THIS);
#if defined(_WIN32_WCE)
// dynamically load aygshell dll because we want SDL to work on HPC and be300
HINSTANCE aygshell = NULL;
BOOL (WINAPI *SHFullScreen)(HWND hwndRequester, DWORD dwState) = 0;
#define SHFS_SHOWTASKBAR 0x0001
#define SHFS_HIDETASKBAR 0x0002
#define SHFS_SHOWSIPBUTTON 0x0004
#define SHFS_HIDESIPBUTTON 0x0008
#define SHFS_SHOWSTARTICON 0x0010
#define SHFS_HIDESTARTICON 0x0020
static void LoadAygshell(void)
{
if( !aygshell )
aygshell = SDL_LoadObject("aygshell.dll");
if( aygshell )
{
SHFullScreen = (int (WINAPI *)(struct HWND__ *,unsigned long)) SDL_LoadFunction(aygshell, "SHFullScreen");
}
}
#endif
static void SDL_RestoreGameMode(void) static void SDL_RestoreGameMode(void)
{ {
#ifndef NO_CHANGEDISPLAYSETTINGS #ifndef NO_CHANGEDISPLAYSETTINGS
@ -213,6 +238,18 @@ LONG CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
SDL_RestoreGameMode(); SDL_RestoreGameMode();
} }
} }
#if defined(_WIN32_WCE)
if ( WINDIB_FULLSCREEN() )
{
LoadAygshell();
if( aygshell )
SHFullScreen(SDL_Window, SHFS_HIDESTARTICON|SHFS_HIDETASKBAR|SHFS_HIDESIPBUTTON);
else
ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_HIDE);
}
#endif
posted = SDL_PrivateAppActive(1, appstate); posted = SDL_PrivateAppActive(1, appstate);
WIN_GetKeyboardState(); WIN_GetKeyboardState();
} else { } else {
@ -230,6 +267,14 @@ LONG CALLBACK WinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
} }
if ( WINDIB_FULLSCREEN() ) { if ( WINDIB_FULLSCREEN() ) {
SDL_RestoreDesktopMode(); SDL_RestoreDesktopMode();
#if defined(_WIN32_WCE)
LoadAygshell();
if( aygshell )
SHFullScreen(SDL_Window, SHFS_SHOWSTARTICON|SHFS_SHOWTASKBAR|SHFS_SHOWSIPBUTTON);
else
ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOW);
#endif
} }
} }
posted = SDL_PrivateAppActive(0, appstate); posted = SDL_PrivateAppActive(0, appstate);

View File

@ -36,6 +36,8 @@ static char rcsid =
#include "SDL_syswm_c.h" #include "SDL_syswm_c.h"
#include "SDL_wingl_c.h" #include "SDL_wingl_c.h"
#include "SDL_pixels_c.h" #include "SDL_pixels_c.h"
#include "SDL_loadso.h"
#ifdef _WIN32_WCE #ifdef _WIN32_WCE
#define DISABLE_ICON_SUPPORT #define DISABLE_ICON_SUPPORT
@ -48,6 +50,25 @@ static char rcsid =
/* The screen icon -- needs to be freed on SDL_VideoQuit() */ /* The screen icon -- needs to be freed on SDL_VideoQuit() */
HICON screen_icn = NULL; HICON screen_icn = NULL;
#ifdef _WIN32_WCE
BOOL (WINAPI *CoreCatchInput)(int flag) = NULL;
int input_catched = 0;
HINSTANCE coredll = NULL;
// the same API call that gx.dll does to catch the input
void LoadInputCatchFunc()
{
coredll = SDL_LoadObject("coredll.dll");
if( coredll )
{
CoreCatchInput = (int (WINAPI *)(int)) GetProcAddress(coredll, (const unsigned short *) 1453);
}
}
#endif
/* Win32 icon mask semantics are different from those of SDL: /* Win32 icon mask semantics are different from those of SDL:
SDL applies the mask to the icon and copies result to desktop. SDL applies the mask to the icon and copies result to desktop.
Win32 applies the mask to the desktop and XORs the icon on. Win32 applies the mask to the desktop and XORs the icon on.
@ -245,6 +266,15 @@ SDL_GrabMode WIN_GrabInput(_THIS, SDL_GrabMode mode)
ClientToScreen(SDL_Window, &pt); ClientToScreen(SDL_Window, &pt);
SetCursorPos(pt.x,pt.y); SetCursorPos(pt.x,pt.y);
} }
#ifdef _WIN32_WCE
if( input_catched )
{
if( !CoreCatchInput ) LoadInputCatchFunc();
if( CoreCatchInput )
CoreCatchInput(0);
}
#endif
} else { } else {
ClipCursor(&SDL_bounds); ClipCursor(&SDL_bounds);
if ( !(SDL_cursorstate & CURSOR_VISIBLE) ) { if ( !(SDL_cursorstate & CURSOR_VISIBLE) ) {
@ -257,6 +287,15 @@ SDL_GrabMode WIN_GrabInput(_THIS, SDL_GrabMode mode)
ClientToScreen(SDL_Window, &pt); ClientToScreen(SDL_Window, &pt);
SetCursorPos(pt.x, pt.y); SetCursorPos(pt.x, pt.y);
} }
#ifdef _WIN32_WCE
if( !input_catched )
{
if( !CoreCatchInput ) LoadInputCatchFunc();
if( CoreCatchInput )
CoreCatchInput(1);
}
#endif
} }
return(mode); return(mode);
} }

View File

@ -360,12 +360,25 @@ static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, in
int DIB_CreateWindow(_THIS) int DIB_CreateWindow(_THIS)
{ {
#if defined(_WIN32_WCE) && (_WIN32_WCE < 300)
wchar_t *SDL_windowid_t;
#endif
#ifndef CS_BYTEALIGNCLIENT #ifndef CS_BYTEALIGNCLIENT
#define CS_BYTEALIGNCLIENT 0 #define CS_BYTEALIGNCLIENT 0
#endif #endif
SDL_RegisterApp("SDL_app", CS_BYTEALIGNCLIENT, 0); SDL_RegisterApp("SDL_app", CS_BYTEALIGNCLIENT, 0);
if ( SDL_windowid ) { if ( SDL_windowid ) {
// wince 2.1 does not have strtol
#if defined(_WIN32_WCE) && (_WIN32_WCE < 300)
SDL_windowid_t = malloc((strlen(SDL_windowid) + 1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, SDL_windowid, -1, SDL_windowid_t, strlen(SDL_windowid) + 1);
SDL_Window = (HWND)wcstol(SDL_windowid_t, NULL, 0);
free(SDL_windowid_t);
#else
SDL_Window = (HWND)strtol(SDL_windowid, NULL, 0); SDL_Window = (HWND)strtol(SDL_windowid, NULL, 0);
#endif
if ( SDL_Window == NULL ) { if ( SDL_Window == NULL ) {
SDL_SetError("Couldn't get user specified window"); SDL_SetError("Couldn't get user specified window");
return(-1); return(-1);

View File

@ -29,9 +29,13 @@ static char rcsid =
#include <stdlib.h> #include <stdlib.h>
#include <malloc.h> #include <malloc.h>
#include <windows.h> #include <windows.h>
#if defined(WIN32_PLATFORM_PSPC)
#include <aygshell.h> // Add Pocket PC includes
#pragma comment( lib, "aygshell" ) // Link Pocket PC library #if defined(_WIN32_WCE)
// defined and used in SDL_sysevents.c
extern HINSTANCE aygshell;
#endif #endif
/* Not yet in the mingw32 cross-compile headers */ /* Not yet in the mingw32 cross-compile headers */
@ -191,7 +195,7 @@ static SDL_VideoDevice *DIB_CreateDevice(int devindex)
} }
VideoBootStrap WINDIB_bootstrap = { VideoBootStrap WINDIB_bootstrap = {
"windib", "Win95/98/NT/2000 GDI", "windib", "Win95/98/NT/2000/CE GDI",
DIB_Available, DIB_CreateDevice DIB_Available, DIB_CreateDevice
}; };
@ -389,12 +393,6 @@ static int DIB_SussScreenDepth()
hdc = GetDC(SDL_Window); hdc = GetDC(SDL_Window);
depth = GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL); depth = GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL);
ReleaseDC(SDL_Window, hdc); ReleaseDC(SDL_Window, hdc);
#ifndef _WIN32_WCE
// AFAIK 16 bit CE devices have indeed RGB 565
if ( depth == 16 ) {
depth = 15; /* GDI defined as RGB 555 */
}
#endif
return(depth); return(depth);
#else #else
int dib_size; int dib_size;
@ -518,23 +516,18 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current,
video->h = height; video->h = height;
video->pitch = SDL_CalculatePitch(video); video->pitch = SDL_CalculatePitch(video);
#ifdef WIN32_PLATFORM_PSPC /* Small fix for WinCE/Win32 - when activating window
/* Stuff to hide that $#!^%#$ WinCE taskbar in fullscreen... */ SDL_VideoSurface is equal to zero, so activating code
if ( flags & SDL_FULLSCREEN ) { is not called properly for fullscreen windows because
if ( !(prev_flags & SDL_FULLSCREEN) ) { macros WINDIB_FULLSCREEN uses SDL_VideoSurface
SHFullScreen(SDL_Window, SHFS_HIDETASKBAR); */
SHFullScreen(SDL_Window, SHFS_HIDESIPBUTTON); SDL_VideoSurface = video;
ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_HIDE);
} #if defined(_WIN32_WCE)
if ( flags & SDL_FULLSCREEN )
video->flags |= SDL_FULLSCREEN; video->flags |= SDL_FULLSCREEN;
} else {
if ( prev_flags & SDL_FULLSCREEN ) {
SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR);
SHFullScreen(SDL_Window, SHFS_SHOWSIPBUTTON);
ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL);
}
}
#endif #endif
#ifndef NO_CHANGEDISPLAYSETTINGS #ifndef NO_CHANGEDISPLAYSETTINGS
/* Set fullscreen mode if appropriate */ /* Set fullscreen mode if appropriate */
if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) { if ( (flags & SDL_FULLSCREEN) == SDL_FULLSCREEN ) {
@ -942,14 +935,6 @@ void DIB_VideoQuit(_THIS)
if ( SDL_Window ) { if ( SDL_Window ) {
/* Delete the screen bitmap (also frees screen->pixels) */ /* Delete the screen bitmap (also frees screen->pixels) */
if ( this->screen ) { if ( this->screen ) {
#ifdef WIN32_PLATFORM_PSPC
if ( this->screen->flags & SDL_FULLSCREEN ) {
/* Unhide taskbar, etc. */
SHFullScreen(SDL_Window, SHFS_SHOWTASKBAR);
SHFullScreen(SDL_Window, SHFS_SHOWSIPBUTTON);
ShowWindow(FindWindow(TEXT("HHTaskBar"),NULL),SW_SHOWNORMAL);
}
#endif
#ifndef NO_CHANGEDISPLAYSETTINGS #ifndef NO_CHANGEDISPLAYSETTINGS
if ( this->screen->flags & SDL_FULLSCREEN ) { if ( this->screen->flags & SDL_FULLSCREEN ) {
ChangeDisplaySettings(NULL, 0); ChangeDisplaySettings(NULL, 0);
@ -975,6 +960,17 @@ void DIB_VideoQuit(_THIS)
FlushMessageQueue(); FlushMessageQueue();
SDL_Window = NULL; SDL_Window = NULL;
#if defined(_WIN32_WCE)
// Unload wince aygshell library to prevent leak
if( aygshell )
{
FreeLibrary(aygshell);
aygshell = NULL;
}
#endif
} }
} }

View File

@ -339,12 +339,20 @@ int main(int argc, char *argv[])
} }
/* Set 640x480 video mode */ /* Set 640x480 video mode */
#ifndef _WIN32_WCE
if ( (screen=SDL_SetVideoMode(640,480,video_bpp,videoflags)) == NULL ) { if ( (screen=SDL_SetVideoMode(640,480,video_bpp,videoflags)) == NULL ) {
fprintf(stderr, "Couldn't set 640x480x%d video mode: %s\n", fprintf(stderr, "Couldn't set 640x480x%d video mode: %s\n",
video_bpp, SDL_GetError()); video_bpp, SDL_GetError());
quit(2); quit(2);
} }
#else
/* Pocket PC */
if ( (screen=SDL_SetVideoMode(240,320,video_bpp,SDL_FULLSCREEN)) == NULL ) {
fprintf(stderr, "Couldn't set 240x320x%d video mode: %s\n",
video_bpp, SDL_GetError());
quit(2);
}
#endif
/* Set the surface pixels and refresh! */ /* Set the surface pixels and refresh! */
if ( SDL_LockSurface(screen) < 0 ) { if ( SDL_LockSurface(screen) < 0 ) {
fprintf(stderr, "Couldn't lock the display surface: %s\n", fprintf(stderr, "Couldn't lock the display surface: %s\n",

View File

@ -248,11 +248,18 @@ int main(int argc, char *argv[])
flip = 0; flip = 0;
nofade = 0; nofade = 0;
delay = 1; delay = 1;
#ifdef _WIN32_WCE
w = 640;
h = 320;
desired_bpp = 0;
video_flags = SDL_FULLSCREEN;
#else
w = 640; w = 640;
h = 480; h = 480;
desired_bpp = 0; desired_bpp = 0;
video_flags = 0; video_flags = 0;
#endif
if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
fprintf(stderr, fprintf(stderr,
"Couldn't initialize SDL: %s\n", SDL_GetError()); "Couldn't initialize SDL: %s\n", SDL_GetError());