From bf913525968a65c816b64e25bdf4135b7c0b8be6 Mon Sep 17 00:00:00 2001 From: Nicolas Bacca Date: Sun, 26 Jan 2003 21:36:45 +0000 Subject: Smartphone support imports svn-id: r6551 --- backends/wince/logo.bmp | Bin 0 -> 6398 bytes backends/wince/pocketpc.h | 22 ++ backends/wince/smartphone.cpp | 689 ++++++++++++++++++++++++++++++++++++++++++ backends/wince/smartphone.h | 23 ++ backends/wince/wince.h | 249 +++++++++++++++ 5 files changed, 983 insertions(+) create mode 100644 backends/wince/logo.bmp create mode 100644 backends/wince/pocketpc.h create mode 100644 backends/wince/smartphone.cpp create mode 100644 backends/wince/smartphone.h create mode 100644 backends/wince/wince.h (limited to 'backends/wince') diff --git a/backends/wince/logo.bmp b/backends/wince/logo.bmp new file mode 100644 index 0000000000..df67559cf8 Binary files /dev/null and b/backends/wince/logo.bmp differ diff --git a/backends/wince/pocketpc.h b/backends/wince/pocketpc.h new file mode 100644 index 0000000000..43f3197b79 --- /dev/null +++ b/backends/wince/pocketpc.h @@ -0,0 +1,22 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001/2002 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program 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 General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +BOOL PPCWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, OSystem_WINCE3 *wm); diff --git a/backends/wince/smartphone.cpp b/backends/wince/smartphone.cpp new file mode 100644 index 0000000000..9ec67af4db --- /dev/null +++ b/backends/wince/smartphone.cpp @@ -0,0 +1,689 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001/2002 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program 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 General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "wince.h" +#include + +#define IDM_SMARTFON_LIST_BASE 99100 + +#define IDM_SMARTFON_MAP_BASE 99200 + +#define SMARTFON_VERSION "Smartphone build 03.01.27/1" + +#define SCAN_LOCATION "\\Storage Card" + +#define KEYS_VERSION 2 +#define TOTAL_KEYS 10 +#define TOTAL_ZONES 3 + +typedef struct zoneDesc { + int x; + int y; + int width; + int height; +} zoneDesc; + +typedef BOOL (*tSHCreateMenuBar)(void*); +typedef void (*tSmartfonAction)(OSystem_WINCE3 *wm, BOOL repeat); + +extern tSHCreateMenuBar dynamicSHCreateMenuBar; +extern bool need_GAPI; +extern void startFindGame(BOOL display, TCHAR *path); +extern bool loadGameSettings(BOOL display); +extern void sortFoundGames(void); +extern int getTotalGames(void); +extern void getSelectedGame(int result, char *id, TCHAR *directory); +extern TCHAR* getGameName(int); +extern Engine *engine; +extern bool is_simon; +extern bool sound_activated; +extern void Cls(); + +int game_chosen; + +HMENU gamesMenu; +HMENU optionsMenu; +HMENU gamesListMenu; +HMENU keysMappingMenu; +HWND _hWnd; +HWND _hWndMenu; + +extern Config *g_config; + +int mouseX; +int mouseY; +int lastKeyPressed = 0; +int mapping = -1; +int mappingDone = -1; + +int mouseXZone[TOTAL_ZONES]; +int mouseYZone[TOTAL_ZONES]; +int currentZone = 0; + +zoneDesc ZONES[TOTAL_ZONES] = { + { 0, 0, 320, 145 }, + { 0, 145, 150, 55 }, + { 150, 145, 170, 55 } +}; + +const char* SMARTFON_KEYS_MAPPING[TOTAL_KEYS] = { + "Up", + "Down", + "Left", + "Right", + "Left click", + "Right click", + "Options", + "Skip", + "Zone", + "Boss" +}; + + +void SmartfonUp(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonDown(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonLeft(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonRight(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonLeftClick(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonLeftUp(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonRightClick(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonRightUp(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonSave(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonSkip(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonBoss(OSystem_WINCE3 *wm, BOOL repeat); +void SmartfonZone(OSystem_WINCE3 *wm, BOOL repeat); + + +const tSmartfonAction SMARTFON_ACTIONS[TOTAL_KEYS] = { + SmartfonUp, + SmartfonDown, + SmartfonLeft, + SmartfonRight, + SmartfonLeftClick, + SmartfonRightClick, + SmartfonSave, + SmartfonSkip, + SmartfonZone, + SmartfonBoss, +}; + +const tSmartfonAction SMARTFON_DEACTIONS[TOTAL_KEYS] = { + NULL, + NULL, + NULL, + NULL, + SmartfonLeftUp, + SmartfonRightUp, + NULL, + NULL, + NULL, + NULL +}; + + +const char* KEYS_NAME[] = { + "1", "2", "3","4", "5", "6", "7", "8", "9", "*", "0", "#", + "Home", "Back", "Up", "Down", "Left", "Right", "Action", "Hang up", "Call", + "Soft 1", "Soft 2", "Power", "Volume Up" ,"Volume Down", "Record", "None", 0 +}; + +const int KEYS_MAPPING[] = { + '1', '2', '3', '4', '5', '6', '7', '8', '9', VK_F8, '0', VK_F9, + VK_LWIN, VK_ESCAPE, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_RETURN, VK_F4, VK_F3, + VK_F1, VK_F2, VK_F18, VK_F6, VK_F7, VK_F10, 0xff, 0 +}; + +const int DEFAULT_MAPPING[TOTAL_KEYS] = { + '4', + '6', + '8', + '2', + VK_F1, + VK_F2, + VK_LWIN, + VK_ESCAPE, + 0xff, + 0xff +}; + +int current_mapping[TOTAL_KEYS]; + +// Actions + +void SmartfonUp(OSystem_WINCE3 *wm, BOOL repeat) { + if (repeat) + mouseY -= 10; + else + mouseY -= 2; + + if (mouseY < 0) + mouseY = 0; + + wm->_event.event_code = OSystem::EVENT_MOUSEMOVE; + wm->_event.mouse.x = mouseX; + wm->_event.mouse.y = mouseY; +} + +void SmartfonDown(OSystem_WINCE3 *wm, BOOL repeat) { + if (repeat) + mouseY += 10; + else + mouseY += 2; + + if (mouseY > 200) + mouseY = 200; + + wm->_event.event_code = OSystem::EVENT_MOUSEMOVE; + wm->_event.mouse.x = mouseX; + wm->_event.mouse.y = mouseY; +} + +void SmartfonLeft(OSystem_WINCE3 *wm, BOOL repeat) { + if (repeat) + mouseX -= 10; + else + mouseX -= 2; + + if (mouseX < 0) + mouseX = 0; + + wm->_event.event_code = OSystem::EVENT_MOUSEMOVE; + wm->_event.mouse.x = mouseX; + wm->_event.mouse.y = mouseY; +} + +void SmartfonRight(OSystem_WINCE3 *wm, BOOL repeat) { + if (repeat) + mouseX += 10; + else + mouseX += 2; + + if (mouseX > 320) + mouseX = 320; + + wm->_event.event_code = OSystem::EVENT_MOUSEMOVE; + wm->_event.mouse.x = mouseX; + wm->_event.mouse.y = mouseY; +} + +void SmartfonLeftClick(OSystem_WINCE3 *wm, BOOL repeat) { + + wm->_event.event_code = OSystem::EVENT_LBUTTONDOWN; + wm->_event.mouse.x = mouseX; + wm->_event.mouse.y = mouseY; +} + +void SmartfonLeftUp(OSystem_WINCE3 *wm, BOOL repeat) { + + wm->_event.event_code = OSystem::EVENT_LBUTTONUP; + wm->_event.mouse.x = mouseX; + wm->_event.mouse.y = mouseY; +} + + +void SmartfonRightClick(OSystem_WINCE3 *wm, BOOL repeat) { + + wm->_event.event_code = OSystem::EVENT_RBUTTONDOWN; + wm->_event.mouse.x = mouseX; + wm->_event.mouse.y = mouseY; +} + +void SmartfonRightUp(OSystem_WINCE3 *wm, BOOL repeat) { + + wm->_event.event_code = OSystem::EVENT_RBUTTONUP; + wm->_event.mouse.x = mouseX; + wm->_event.mouse.y = mouseY; +} + + +void SmartfonSave(OSystem_WINCE3 *wm, BOOL repeat) { + + wm->_event.event_code = OSystem::EVENT_KEYDOWN; + if (g_scumm->_features & GF_OLD256) + wm->_event.kbd.ascii = 319; + else + wm->_event.kbd.ascii = g_scumm->_vars[g_scumm->VAR_SAVELOADDIALOG_KEY]; +} + +void SmartfonSkip(OSystem_WINCE3 *wm, BOOL repeat) { + + if (is_simon) { + ((SimonState*)engine)->_exit_cutscene = true; + return; + } + wm->_event.event_code = OSystem::EVENT_KEYDOWN; + if (g_scumm->vm.cutScenePtr[g_scumm->vm.cutSceneStackPointer] || g_scumm->_insaneState) + wm->_event.kbd.ascii = g_scumm->_vars[g_scumm->VAR_CUTSCENEEXIT_KEY]; + else + wm->_event.kbd.ascii = g_scumm->_vars[g_scumm->VAR_TALKSTOP_KEY]; +} + +void SmartfonBoss(OSystem_WINCE3 *wm, BOOL repeat) { + SHELLEXECUTEINFO se; + + sound_activated = false; + Cls(); + g_scumm->_saveLoadSlot = 0; + g_scumm->_saveLoadCompatible = false; + g_scumm->_saveLoadFlag = 1; + strcpy(g_scumm->_saveLoadName, "BOSS"); + g_scumm->saveState(g_scumm->_saveLoadSlot, g_scumm->_saveLoadCompatible); + dynamicGXCloseInput(); + dynamicGXCloseDisplay(); + SDL_AudioQuit(); + memset(&se, 0, sizeof(se)); + se.cbSize = sizeof(se); + se.hwnd = NULL; + se.lpFile = TEXT("tasks.exe"); + se.lpVerb = TEXT("open"); + se.lpDirectory = TEXT("\\windows"); + ShellExecuteEx(&se); + exit(1); +} + +void updateZone(int x, int y) { + int i; + + for (i=0; i= ZONES[i].x && y >= ZONES[i].y && + x <= ZONES[i].x + ZONES[i].width && y <= ZONES[i].y + ZONES[i].height + ) { + mouseXZone[i] = x; + mouseYZone[i] = y; + break; + } +} + +void initZone() { + int i; + + for (i=0; i= TOTAL_ZONES) + currentZone = 0; + mouseX = mouseXZone[currentZone]; + mouseY = mouseYZone[currentZone]; + wm->_event.event_code = OSystem::EVENT_MOUSEMOVE; + wm->_event.mouse.x = mouseX; + wm->_event.mouse.y = mouseY; +} + +// + +char *getKeyName(int key) { + int i; + + for (i=0; KEYS_MAPPING[i]; i++) + if (KEYS_MAPPING[i] == key) + return (char*)KEYS_NAME[i]; + + return NULL; +} + +void updateMapping(int mapping, int key) { + int i; + + for (i=0; isetInt("KeysVersion", KEYS_VERSION, "smartfon"); + for (i=0; iset("ActionKeys", tempo, "smartfon"); + g_config->flush(); + + return TRUE; +} + +BOOL loadKeyMapping() { + int version; + const char *current; + + version = g_config->getInt("KeysVersion", 0, "smartfon"); + current = g_config->get("ActionKeys", "smartfon"); + if (current && version == KEYS_VERSION) { + int i; + for (i=0; i= IDM_SMARTFON_MAP_BASE) { + mapping = wParam - IDM_SMARTFON_MAP_BASE; + disableHotKeys(); + return TRUE; + } + + if (wParam >= IDM_SMARTFON_LIST_BASE) { + game_chosen = wParam - IDM_SMARTFON_LIST_BASE; + saveKeyMapping(); + return TRUE; + } + + switch(wParam) { + case IDM_SMARTFON_QUIT: + exit(0); + break; + case IDM_SMARTFON_SCAN: + doSmartphoneScan(); + break; + default: + return FALSE; + } + break; + + + case WM_KEYDOWN: + + int i; + + if (!need_GAPI && mapping == -1) + break; + + if (mapping != -1) { + mappingDone = wParam; + InvalidateRect(_hWnd, NULL, FALSE); + enableHotKeys(); + return TRUE; + } + + for (i=0; i_event.event_code = OSystem::EVENT_KEYDOWN; + wm->_event.kbd.ascii = wParam; + wm->_event.kbd.keycode = wParam; + + break; + + case WM_KEYUP: + if (!need_GAPI) + break; + + for (i=0; i + +//#include "commctrl.h" + +#if _WIN32_WCE < 300 + +#include +#include +#include + +#endif + +#include +#include +#include +#include +#include "resource.h" + +#include "scumm.h" +#include "debug.h" +#include "screen.h" +#include "gui/newgui.h" +#include "sound/mididrv.h" +#include "gameDetector.h" +#include "simon/simon.h" +#include "gapi_keys.h" +#include "config-file.h" + + +#include "SDL.h" +#include "SDL_audio.h" +#include "SDL_timer.h" +#include "SDL_thread.h" + +#include "dynamic_imports.h" + +#include "backends/fs/fs.h" + +#if (defined(MIPS) || defined(SH3)) && (_WIN32_WCE < 300) +// Comment this out if you don't want to support GameX +#define GAMEX +#endif + +#ifdef GAMEX +#include "GameX.h" +#endif + +class OSystem_WINCE3; + +#include "pocketpc.h" +#include "smartphone.h" + +#define MAX_NUMBER_OF_DIRTY_SQUARES 32 + +class OSystem_WINCE3 : public OSystem { +public: + // Set colors of the palette + void set_palette(const byte *colors, uint start, uint num); + + // Set the size of the video bitmap. + // Typically, 320x200 + void init_size(uint w, uint h); + + // Draw a bitmap to screen. + // The screen will not be updated to reflect the new bitmap + void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h); + + // Update the dirty areas of the screen + void update_screen(); + + // Either show or hide the mouse cursor + bool show_mouse(bool visible); + + // Set the position of the mouse cursor + void set_mouse_pos(int x, int y); + + // Set the bitmap that's used when drawing the cursor. + void set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y); + + // Shaking is used in SCUMM. Set current shake position. + void set_shake_pos(int shake_pos); + + // Get the number of milliseconds since the program was started. + uint32 get_msecs(); + + // Delay for a specified amount of milliseconds + void delay_msecs(uint msecs); + + // Create a thread + void *create_thread(ThreadProc *proc, void *param); + + // Get the next event. + // Returns true if an event was retrieved. + bool poll_event(Event *event); + + // Set function that generates samples + bool set_sound_proc(void *param, SoundProc *proc, byte sound); + + // Poll cdrom status + // Returns true if cd audio is playing + bool poll_cdrom(); + + // Play cdrom audio track + void play_cdrom(int track, int num_loops, int start_frame, int end_frame); + + // Stop cdrom audio track + void stop_cdrom(); + + // Update cdrom audio status + void update_cdrom(); + + // Add a new callback timer + void set_timer(int timer, int (*callback)(int)); + + // Quit + void quit(); + + // Set a parameter + uint32 property(int param, Property *value); + + // Overlay + void show_overlay(); + void hide_overlay(); + void clear_overlay(); + void grab_overlay(int16 *buf, int pitch); + void copy_rect_overlay(const int16 *buf, int pitch, int x, int y, int w, int h); + + void move_screen(int dx, int dy, int height); + + static OSystem *create(int gfx_mode, bool full_screen); + + // Added for hardware keys mapping + + void addEventKeyPressed(int ascii_code); + + void addEventRightButtonClicked(); + + // Mutex functions + + void* create_mutex(); + void lock_mutex(void*); + void unlock_mutex(void*); + void delete_mutex(void*); + + // Windows callbacks & stuff + static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + +//private: + // Windows callbacks & stuff + //bool handleMessage(); + + + byte *_gfx_buf; + byte *_overlay_buf; + uint _screenHeight; + uint _screenWidth; + bool _overlay_visible; + uint32 _start_time; + Event _event; + Event _last_mouse_event; + HMODULE hInst; + HWND hWnd; + bool _display_cursor; + + enum { + DF_FORCE_FULL_ON_PALETTE = 1, + DF_WANT_RECT_OPTIM = 2, + DF_2xSAI = 4, + DF_SEPARATE_HWSCREEN = 8, + DF_UPDATE_EXPAND_1_PIXEL = 16, + }; + + int _mode; + bool _full_screen; + bool _mouse_visible; + bool _mouse_drawn; + uint32 _mode_flags; + + byte _internal_scaling; + + bool force_full; //Force full redraw on next update_screen + bool cksum_valid; + + enum { + NUM_DIRTY_RECT = 100, + SCREEN_WIDTH = 320, + SCREEN_HEIGHT = 200, + CKSUM_NUM = (SCREEN_WIDTH*SCREEN_HEIGHT/(8*8)), + + MAX_MOUSE_W = 40, + MAX_MOUSE_H = 40, + MAX_SCALING = 3, + + TMP_SCREEN_OFFS = 320*2 + 8, + }; + + /* CD Audio */ + int cd_track, cd_num_loops, cd_start_frame, cd_end_frame; + Uint32 cd_end_time, cd_stop_time, cd_next_second; + + struct MousePos { + int16 x,y,w,h; + }; + + byte *_ms_buf; + byte *_ms_backup; + MousePos _ms_cur; + MousePos _ms_old; + int16 _ms_hotspot_x; + int16 _ms_hotspot_y; + int _current_shake_pos; + + + static void fill_sound(void *userdata, Uint8 * stream, int len); + + + void draw_mouse(); + void undraw_mouse(); + void warp_mouse(int x, int y); + + void load_gfx_mode(); + void unload_gfx_mode(); + + void hotswap_gfx_mode(); + + void get_320x200_image(byte *buf); +}; \ No newline at end of file -- cgit v1.2.3