// ============================================================== // ============================================================== // This file is part of Glest Shared Library (www.glest.org) // // Copyright (C) 2005 Matthias Braun // // You can redistribute this code 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 // ============================================================== #ifndef _SHARED_PLATFORM_WINDOW_H_ #define _SHARED_PLATFORM_WINDOW_H_ #include #include #include #include #include "data_types.h" #include "vec.h" #include #include "leak_dumper.h" using std::map; using std::vector; using std::string; using Shared::Graphics::Vec2i; #if SDL_VERSION_ATLEAST(2,0,0) typedef SDL_Keysym SDL_keysym; #endif namespace Shared { namespace Platform { class Timer; //class PlatformContextGl; enum MouseButton { mbUnknown, mbLeft, mbCenter, mbRight, mbButtonX1, mbButtonX2, mbCount }; enum SizeState { ssMaximized, ssMinimized, ssRestored }; class MouseState { private: bool states[mbCount]; public: MouseState() { clear(); } //MouseState(const MouseState &); //MouseState &operator=(const MouseState &); void clear() { memset(this, 0, sizeof(MouseState)); } bool get(MouseButton b) const { if (b > 0 && b < mbCount) { return states[b]; } return false; } void set(MouseButton b, bool state) { if (b > 0 && b < mbCount) { states[b] = state; } } }; enum WindowStyle { wsFullscreen, wsWindowedFixed, wsWindowedResizable }; // ===================================================== // class Window // ===================================================== class Window { private: static SDL_Window *sdlWindow; Uint32 lastMouseDown[mbCount]; int lastMouseX[mbCount]; int lastMouseY[mbCount]; static int64 lastMouseEvent; /** for use in mouse hover calculations */ static MouseState mouseState; static Vec2i mousePos; static bool isKeyPressedDown; static bool isFullScreen; static SDL_keysym keystate; static bool tryVSynch; static int64 lastToggle; static void setLastToggle(int64 lastToggle) { Window::lastToggle = lastToggle; } static int64 getLastToggle() { return Window::lastToggle; } static void setLastMouseEvent(int64 lastMouseEvent) { Window::lastMouseEvent = lastMouseEvent; } static int64 getLastMouseEvent() { return Window::lastMouseEvent; } static const MouseState &getMouseState() { return Window::mouseState; } static void setMouseState(MouseButton b, bool state) { Window::mouseState.set(b, state); } static const Vec2i &getMousePos() { return Window::mousePos; } static void setMousePos(const Vec2i &mousePos) { Window::mousePos = mousePos; } static void setKeystate(SDL_keysym state) { keystate = state; } //static bool masterserverMode; static map mapAllowedKeys; protected: //int w, h; static bool isActive; static bool allowAltEnterFullscreenToggle; static int lastShowMouseState; public: static SDL_Window *getSDLWindow(); static bool handleEvent(); static void revertMousePos(); static Vec2i getOldMousePos(); static bool isKeyDown() { return isKeyPressedDown; } static void setupGraphicsScreen(int depthBits = -1, int stencilBits = -1, bool hardware_acceleration = false, bool fullscreen_anti_aliasing = false); static const bool getIsFullScreen() { return isFullScreen; } static void setIsFullScreen(bool value) { isFullScreen = value; } //static SDL_keysym getKeystate() { return keystate; } static bool isKeyStateModPressed(int mod); static wchar_t extractLastKeyPressed(); Window(); Window(SDL_Window *sdlWindow); virtual ~Window(); static void addAllowedKeys(string keyList); static void clearAllowedKeys(); static bool isAllowedKey(wchar_t key); virtual int getScreenWidth() = 0; virtual int getScreenHeight() = 0; virtual bool ChangeVideoMode(bool preserveContext, int resWidth, int resHeight, bool fullscreenWindow, int colorBits, int depthBits, int stencilBits, bool hardware_acceleration, bool fullscreen_anti_aliasing, float gammaValue) = 0; //static void setMasterserverMode(bool value) { Window::masterserverMode = value;} //static bool getMasterserverMode() { return Window::masterserverMode;} static bool getTryVSynch() { return tryVSynch; } static void setTryVSynch(bool value) { tryVSynch = value; } WindowHandle getHandle() { return 0; } string getText(); int getX() { return 0; } int getY() { return 0; } int getW() { return getScreenWidth(); } int getH() { return getScreenHeight(); } //component state int getClientW() { return getW(); } int getClientH() { return getH(); } float getAspect(); //object state void setText(string text); void setStyle(WindowStyle windowStyle); void setSize(int w, int h); void setPos(int x, int y); void setEnabled(bool enabled); void setVisible(bool visible); //misc void create(); void destroy(); void minimize(); static void setAllowAltEnterFullscreenToggle(bool value) { allowAltEnterFullscreenToggle = value; } static bool getAllowAltEnterFullscreenToggle() { return allowAltEnterFullscreenToggle; } static char getRawKey(SDL_keysym keysym); protected: void setSDLWindow(SDL_Window *window); virtual void eventCreate() { } virtual void eventMouseDown(int x, int y, MouseButton mouseButton) { } virtual void eventMouseUp(int x, int y, MouseButton mouseButton) { } virtual void eventMouseMove(int x, int y, const MouseState* mouseState) { } virtual void eventMouseDoubleClick(int x, int y, MouseButton mouseButton) { } virtual void eventMouseWheel(int x, int y, int zDelta) { } virtual void eventKeyDown(SDL_KeyboardEvent key) { } virtual void eventKeyUp(SDL_KeyboardEvent key) { } virtual void eventKeyPress(SDL_KeyboardEvent c) { } virtual bool eventTextInput(std::string text) { return false; } virtual bool eventSdlKeyDown(SDL_KeyboardEvent key) { return false; } virtual void eventResize() { }; virtual void eventPaint() { } virtual void eventTimer(int timerId) { } virtual void eventActivate(bool activated) { }; virtual void eventResize(SizeState sizeState) { }; virtual void eventMenu(int menuId) { } virtual void eventClose() { }; virtual void eventDestroy() { }; virtual void eventToggleFullScreen(bool isFullscreen) { }; virtual void eventWindowEvent(SDL_WindowEvent event) { } private: /// needed to detect double clicks void handleMouseDown(SDL_Event event); void handleMouseWheel(SDL_Event event); static MouseButton getMouseButton(int sdlButton); //static char getKey(SDL_keysym keysym, bool skipSpecialKeys=false); //static char getNormalKey(SDL_keysym keysym,bool skipSpecialKeys=false); static void toggleFullscreen(); static wchar_t convertStringtoSDLKey(const string &value); }; bool isKeyPressed(SDL_Keycode compareKey, SDL_KeyboardEvent input, vector modifiersToCheck); bool isKeyPressed(SDL_Keycode compareKey, SDL_KeyboardEvent input, bool modifiersAllowed = true); SDL_Keycode extractKeyPressed(SDL_KeyboardEvent input); //bool isAllowedInputTextKey(SDL_Keycode key); //wchar_t extractKeyPressedUnicode(SDL_KeyboardEvent input); vector extractKeyPressedUnicodeLength(string text); bool isAllowedInputTextKey(wchar_t &key); } }//end namespace #endif