summaryrefslogtreecommitdiff
path: root/src/gui/windowmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/windowmanager.cpp')
-rw-r--r--src/gui/windowmanager.cpp405
1 files changed, 405 insertions, 0 deletions
diff --git a/src/gui/windowmanager.cpp b/src/gui/windowmanager.cpp
new file mode 100644
index 000000000..eb3d244ea
--- /dev/null
+++ b/src/gui/windowmanager.cpp
@@ -0,0 +1,405 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2014 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * 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
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "gui/windowmanager.h"
+
+#include "auctionmanager.h"
+#include "chatlogger.h"
+#include "client.h"
+#include "configmanager.h"
+#include "configuration.h"
+#include "dirs.h"
+#include "dropshortcut.h"
+#include "emoteshortcut.h"
+#include "eventsmanager.h"
+#include "game.h"
+#include "guild.h"
+#include "guildmanager.h"
+#include "graphicsmanager.h"
+#include "itemshortcut.h"
+#include "party.h"
+#include "settings.h"
+#include "soundconsts.h"
+#include "soundmanager.h"
+#include "statuseffect.h"
+#include "units.h"
+#include "touchmanager.h"
+
+#include "being/beingspeech.h"
+#include "being/playerinfo.h"
+#include "being/playerrelations.h"
+
+#include "input/inputmanager.h"
+#include "input/joystick.h"
+#include "input/keyboardconfig.h"
+
+#include "gui/dialogsmanager.h"
+#include "gui/gui.h"
+#include "gui/skin.h"
+#include "gui/theme.h"
+
+#include "gui/windows/buyselldialog.h"
+#include "gui/windows/buydialog.h"
+#include "gui/windows/changeemaildialog.h"
+#include "gui/windows/changepassworddialog.h"
+#include "gui/windows/charselectdialog.h"
+#include "gui/windows/confirmdialog.h"
+#include "gui/windows/connectiondialog.h"
+#include "gui/windows/didyouknowwindow.h"
+#include "gui/windows/helpwindow.h"
+#include "gui/windows/logindialog.h"
+#include "gui/windows/npcdialog.h"
+#include "gui/windows/okdialog.h"
+#include "gui/windows/registerdialog.h"
+#include "gui/windows/selldialog.h"
+#include "gui/windows/serverdialog.h"
+#include "gui/windows/setupwindow.h"
+#include "gui/windows/unregisterdialog.h"
+#include "gui/windows/updaterwindow.h"
+#include "gui/windows/quitdialog.h"
+#include "gui/windows/worldselectdialog.h"
+
+#include "gui/widgets/button.h"
+#include "gui/widgets/desktop.h"
+
+#include "net/chathandler.h"
+#include "net/download.h"
+#include "net/gamehandler.h"
+#include "net/generalhandler.h"
+#include "net/guildhandler.h"
+#include "net/inventoryhandler.h"
+#include "net/loginhandler.h"
+#include "net/net.h"
+#include "net/netconsts.h"
+#include "net/packetlimiter.h"
+#include "net/partyhandler.h"
+
+#include "particle/particle.h"
+
+#include "resources/imagehelper.h"
+#include "resources/openglimagehelper.h"
+#include "resources/resourcemanager.h"
+#include "resources/surfaceimagehelper.h"
+#include "resources/spritereference.h"
+
+#include "resources/db/avatardb.h"
+#include "resources/db/chardb.h"
+#include "resources/db/colordb.h"
+#include "resources/db/deaddb.h"
+#include "resources/db/emotedb.h"
+#include "resources/db/sounddb.h"
+#include "resources/db/itemdb.h"
+#include "resources/db/mapdb.h"
+#include "resources/db/moddb.h"
+#include "resources/db/monsterdb.h"
+#include "resources/db/npcdb.h"
+#include "resources/db/palettedb.h"
+#include "resources/db/petdb.h"
+#include "resources/db/weaponsdb.h"
+
+#include "utils/base64.h"
+#include "utils/cpu.h"
+#include "utils/delete2.h"
+#include "utils/files.h"
+#include "utils/fuzzer.h"
+#include "utils/gettext.h"
+#include "utils/gettexthelper.h"
+#include "utils/mkdir.h"
+#include "utils/paths.h"
+#include "utils/physfstools.h"
+#include "utils/sdlcheckutils.h"
+#include "utils/sdlhelper.h"
+#include "utils/timer.h"
+
+#include "utils/translation/translationmanager.h"
+
+#include "test/testlauncher.h"
+#include "test/testmain.h"
+
+#ifdef __APPLE__
+#include <CoreFoundation/CFBundle.h>
+#endif
+
+#include <SDL_image.h>
+
+#ifdef WIN32
+#include <SDL_syswm.h>
+#include "utils/specialfolder.h"
+#endif
+
+#ifdef ANDROID
+#ifndef USE_SDL2
+#include <SDL_screenkeyboard.h>
+#endif
+#endif
+
+#include <sys/stat.h>
+
+#include <climits>
+#include <fstream>
+
+#include "mumblemanager.h"
+
+#include "debug.h"
+
+FPSmanager fpsManager;
+
+namespace
+{
+ SDL_Surface *mIcon(nullptr);
+ int mKeyboardHeight(0);
+ bool mIsMinimized(false);
+ bool mNewMessageFlag(false);
+} // namespace
+
+void WindowManager::init()
+{
+ // Initialize frame limiting
+ fpsManager.framecount = 0;
+ fpsManager.rateticks = 0;
+ fpsManager.lastticks = 0;
+ fpsManager.rate = 0;
+}
+
+void WindowManager::createWindows()
+{
+ userPalette = new UserPalette;
+ setupWindow = new SetupWindow;
+ setupWindow->postInit();
+ helpWindow = new HelpWindow;
+ didYouKnowWindow = new DidYouKnowWindow;
+ didYouKnowWindow->postInit();
+}
+
+void WindowManager::initTitle()
+{
+ if (settings.options.test.empty())
+ {
+ settings.windowCaption = strprintf("%s %s",
+ branding.getStringValue("appName").c_str(),
+ SMALL_VERSION);
+ }
+ else
+ {
+ settings.windowCaption = strprintf(
+ "Please wait - VIDEO MODE TEST - %s %s - Please wait",
+ branding.getStringValue("appName").c_str(),
+ SMALL_VERSION);
+ }
+
+ SDL::SetWindowTitle(mainGraphics->getWindow(), settings.windowCaption.c_str());
+#ifndef WIN32
+ setIcon();
+#endif
+}
+
+void WindowManager::setFramerate(const int fpsLimit)
+{
+ if (!fpsLimit)
+ return;
+
+ if (!settings.limitFps)
+ return;
+
+ SDL_setFramerate(&fpsManager, fpsLimit);
+}
+
+int WindowManager::getFramerate()
+{
+ if (!settings.limitFps)
+ return 0;
+
+ return SDL_getFramerate(&fpsManager);
+}
+
+void WindowManager::resizeVideo(int actualWidth,
+ int actualHeight,
+ const bool always)
+{
+ // Keep a minimum size. This isn't adhered to by the actual window, but
+ // it keeps some window positions from getting messed up.
+ actualWidth = std::max(470, actualWidth);
+ actualHeight = std::max(320, actualHeight);
+
+ if (!mainGraphics)
+ return;
+ if (!always
+ && mainGraphics->mActualWidth == actualWidth
+ && mainGraphics->mActualHeight == actualHeight)
+ {
+ return;
+ }
+
+ if (mainGraphics->resizeScreen(actualWidth, actualHeight))
+ {
+ const int width = mainGraphics->mWidth;
+ const int height = mainGraphics->mHeight;
+ touchManager.resize(width, height);
+
+ if (gui)
+ gui->videoResized();
+
+ if (desktop)
+ desktop->setSize(width, height);
+
+ client->moveButtons(width);
+
+ Game *const game = Game::instance();
+ if (game)
+ game->videoResized(width, height);
+
+ if (gui)
+ gui->draw();
+
+ config.setValue("screenwidth", actualWidth);
+ config.setValue("screenheight", actualHeight);
+ }
+}
+
+void WindowManager::applyGrabMode()
+{
+ SDL::grabInput(mainGraphics->getWindow(),
+ config.getBoolValue("grabinput"));
+}
+
+void WindowManager::applyGamma()
+{
+ if (config.getFloatValue("enableGamma"))
+ {
+ SDL::setGamma(mainGraphics->getWindow(),
+ config.getFloatValue("gamma"));
+ }
+}
+
+void WindowManager::applyVSync()
+{
+ const int val = config.getIntValue("vsync");
+ if (val > 0 && val < 2)
+ SDL::setVsync(val);
+}
+
+void WindowManager::applyKeyRepeat()
+{
+#ifndef USE_SDL2
+ SDL_EnableKeyRepeat(config.getIntValue("repeateDelay"),
+ config.getIntValue("repeateInterval"));
+#endif
+}
+
+void WindowManager::applyScale()
+{
+ const int scale = config.getIntValue("scale");
+ if (mainGraphics->getScale() == scale)
+ return;
+ mainGraphics->setScale(scale);
+ resizeVideo(mainGraphics->mActualWidth,
+ mainGraphics->mActualHeight,
+ true);
+}
+
+void WindowManager::setIsMinimized(const bool n)
+{
+ mIsMinimized = n;
+ if (!n && mNewMessageFlag)
+ {
+ mNewMessageFlag = false;
+ SDL::SetWindowTitle(mainGraphics->getWindow(),
+ settings.windowCaption.c_str());
+ }
+}
+
+void WindowManager::newChatMessage()
+{
+ if (!mNewMessageFlag && mIsMinimized)
+ {
+ // show * on window caption
+ SDL::SetWindowTitle(mainGraphics->getWindow(),
+ ("*" + settings.windowCaption).c_str());
+ mNewMessageFlag = true;
+ }
+}
+
+void WindowManager::setIcon()
+{
+ std::string iconFile = branding.getValue("appIcon", "icons/manaplus");
+#ifdef WIN32
+ iconFile.append(".ico");
+#else
+ iconFile.append(".png");
+#endif
+ iconFile = Files::getPath(iconFile);
+ logger->log("Loading icon from file: %s", iconFile.c_str());
+
+#ifdef WIN32
+ static SDL_SysWMinfo pInfo;
+ if (mainGraphics)
+ SDL::getWindowWMInfo(mainGraphics->getWindow(), &pInfo);
+ else
+ SDL::getWindowWMInfo(nullptr, &pInfo);
+ // Attempt to load icon from .ico file
+ HICON icon = (HICON) LoadImage(nullptr, iconFile.c_str(),
+ IMAGE_ICON, 64, 64, LR_LOADFROMFILE);
+ // If it's failing, we load the default resource file.
+ if (!icon)
+ {
+ logger->log("icon load error");
+ icon = LoadIcon(GetModuleHandle(nullptr), "A");
+ }
+ if (icon)
+ SetClassLong(pInfo.window, GCL_HICON, reinterpret_cast<LONG>(icon));
+#else
+ mIcon = MIMG_Load(iconFile.c_str());
+ if (mIcon)
+ {
+#ifdef USE_SDL2
+ SDL_SetSurfaceAlphaMod(mIcon, SDL_ALPHA_OPAQUE);
+#else
+ SDL_SetAlpha(mIcon, SDL_SRCALPHA, SDL_ALPHA_OPAQUE);
+#endif
+ SDL::SetWindowIcon(mainGraphics->getWindow(), mIcon);
+ }
+#endif
+}
+
+bool WindowManager::isKeyboardVisible()
+{
+#ifdef USE_SDL2
+ return SDL_IsTextInputActive();
+#else
+ return mKeyboardHeight > 1;
+#endif
+}
+
+bool WindowManager::getIsMinimized()
+{
+ return mIsMinimized;
+}
+
+void WindowManager::updateScreenKeyboard(const int height)
+{
+ mKeyboardHeight = height;
+}
+
+void WindowManager::deleteIcon()
+{
+ MSDL_FreeSurface(mIcon);
+}