diff --git a/src/framework/engine.cpp b/src/framework/engine.cpp index c5a77f28..aeec5c62 100644 --- a/src/framework/engine.cpp +++ b/src/framework/engine.cpp @@ -23,6 +23,7 @@ #include "engine.h" +#include "fonts.h" #include "platform.h" #include "graphics.h" #include "input.h" @@ -47,6 +48,9 @@ void Engine::init() // initialize graphics stuff g_graphics.init(); + // load fonts + g_fonts.load(); + // finally show the window onResize(Platform::getWindowWidth(), Platform::getWindowHeight()); } diff --git a/src/framework/fonts.cpp b/src/framework/fonts.cpp new file mode 100644 index 00000000..19f66633 --- /dev/null +++ b/src/framework/fonts.cpp @@ -0,0 +1,22 @@ +#include "fonts.h" +#include "resourcemanager.h" + +Fonts g_fonts; + +Fonts::Fonts() +{ +} + +Fonts::~Fonts() +{ +} + +bool Fonts::load() +{ + std::list files = g_resources.getDirectoryFiles("fonts"); + for(std::list::iterator it = files.begin(), end = files.end(); it != end; ++it) { + notice("File: %s", (*it).c_str()); + } + + return true; +} diff --git a/src/framework/fonts.h b/src/framework/fonts.h new file mode 100644 index 00000000..f68cd1c4 --- /dev/null +++ b/src/framework/fonts.h @@ -0,0 +1,27 @@ +#ifndef FONTS_H +#define FONTS_H + +#include "prerequisites.h" +#include "rect.h" + +struct Font +{ + + Rect textureArea[256]; +}; + +class Fonts +{ +public: + Fonts(); + ~Fonts(); + + bool load(); + +private: + std::map mFonts; +}; + +extern Fonts g_fonts; + +#endif // FONTS_H diff --git a/src/framework/resourcemanager.cpp b/src/framework/resourcemanager.cpp index 574c9b1a..011abd6e 100644 --- a/src/framework/resourcemanager.cpp +++ b/src/framework/resourcemanager.cpp @@ -117,3 +117,15 @@ bool ResourceManager::saveTextFile(const std::string &fileName, std::string text { return saveFile(fileName, (const unsigned char*)text.c_str(), text.size()); } + +std::list ResourceManager::getDirectoryFiles(const std::string& directory) +{ + std::list files; + char **rc = PHYSFS_enumerateFiles(directory.c_str()); + + for(char **i = rc; *i != NULL; i++) + files.push_back(*i); + + PHYSFS_freeList(rc); + return files; +} diff --git a/src/framework/resourcemanager.h b/src/framework/resourcemanager.h index 9333653c..66f43a17 100644 --- a/src/framework/resourcemanager.h +++ b/src/framework/resourcemanager.h @@ -63,6 +63,9 @@ public: /// Save a text file into write directory bool saveTextFile(const std::string &fileName, std::string text); + + /// Get a list with all files in a directory + std::list getDirectoryFiles(const std::string& directory); }; extern ResourceManager g_resources; diff --git a/src/framework/win32platform.cpp b/src/framework/win32platform.cpp index 1d834951..6aec3117 100644 --- a/src/framework/win32platform.cpp +++ b/src/framework/win32platform.cpp @@ -40,7 +40,7 @@ struct Win32PlatformPrivate { int x, y; int width, height; int minWidth, minHeight; - bool maximized; + bool focused, visible, maximized; } win32; void Platform::init(const char *appName) @@ -302,6 +302,16 @@ void Platform::swapBuffers() SwapBuffers(win32.hdc); } +bool Platform::isWindowFocused() +{ + return win32.focused; +} + +bool Platform::isWindowVisible() +{ + return win32.visible; +} + int Platform::getWindowX() { return win32.x; @@ -348,8 +358,15 @@ const char *Platform::getAppUserDir() LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + static int lastX, lastY; + switch(uMsg) { + case WM_ACTIVATE: + { + win32.focused = !(wParam == WA_INACTIVE); + break; + } case WM_CLOSE: { g_engine.onClose(); @@ -364,6 +381,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } case WM_MOVE: { + lastX = win32.x; + lastY = win32.y; win32.x = LOWORD(lParam); win32.y = HIWORD(lParam); break; @@ -373,6 +392,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(wParam) { case SIZE_MAXIMIZED: + win32.x = lastX; + win32.y = lastY; win32.maximized = true; break; case SIZE_RESTORED: @@ -380,14 +401,19 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) break; } - win32.width = LOWORD(lParam); - win32.height = HIWORD(lParam); + win32.visible = !(wParam == SIZE_MINIMIZED); + + if(!win32.maximized) { + win32.width = LOWORD(lParam); + win32.height = HIWORD(lParam); + } + g_engine.onResize(LOWORD(lParam), HIWORD(lParam)); break; } default: { - return DefWindowProc(hWnd,uMsg,wParam,lParam); + return DefWindowProc(hWnd, uMsg, wParam, lParam); } } return 0; diff --git a/src/framework/x11platform.cpp b/src/framework/x11platform.cpp index 5b90b569..f0ad5dde 100644 --- a/src/framework/x11platform.cpp +++ b/src/framework/x11platform.cpp @@ -297,20 +297,27 @@ void Platform::poll() switch(event.type) { case ConfigureNotify: // window resize - if(x11.width != event.xconfigure.width || x11.height != event.xconfigure.height) { + static int oldWidth = -1; + static int oldHeight = -1; + if(oldWidth != event.xconfigure.width || oldHeight != event.xconfigure.height) { + g_engine.onResize(event.xconfigure.width, event.xconfigure.height); + oldWidth = event.xconfigure.width; + oldHeight = event.xconfigure.height; + } + + if(!isWindowMaximized()) { x11.width = event.xconfigure.width; x11.height = event.xconfigure.height; - g_engine.onResize(x11.width, x11.height); - } - // hack to fix x11 windows move gaps - static int gap_x = -1, gap_y = -1; - if(gap_x == -1 && gap_y == -1) { - gap_x = event.xconfigure.x; - gap_y = event.xconfigure.y; + // hack to fix x11 windows move gaps + static int gap_x = -1, gap_y = -1; + if(gap_x == -1 && gap_y == -1) { + gap_x = event.xconfigure.x; + gap_y = event.xconfigure.y; + } + x11.x = event.xconfigure.x - gap_x; + x11.y = event.xconfigure.y - gap_y; } - x11.x = event.xconfigure.x - gap_x; - x11.y = event.xconfigure.y - gap_y; break; case KeyPress: