Files
glest-source/source/shared_lib/include/platform/sdl/window.h
2018-05-06 00:01:36 +02:00

323 lines
7.8 KiB
C++

// ==============================================================
// ==============================================================
// This file is part of Glest Shared Library (www.glest.org)
//
// Copyright (C) 2005 Matthias Braun <matze@braunis.de>
//
// 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 <map>
#include <string>
#include <SDL.h>
#include <cassert>
#include "data_types.h"
#include "vec.h"
#include <vector>
#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<wchar_t, bool> 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<int> 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<int> extractKeyPressedUnicodeLength(string text);
bool isAllowedInputTextKey(wchar_t &key);
}
}//end namespace
#endif