Cpp11 initializers: last src root changeset (#6022)
[oweals/minetest.git] / src / porting.cpp
index ae9114ac8c9f5b404ec1fcfbe41aa84235835b81..0cc323934ba18b2f56afdb8ad4e4e47a66f33c1c 100644 (file)
@@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "porting.h"
 
-#if defined(__FreeBSD__)
+#if defined(__FreeBSD__)  || defined(__NetBSD__) || defined(__DragonFly__)
        #include <sys/types.h>
        #include <sys/sysctl.h>
 #elif defined(_WIN32)
@@ -408,7 +408,7 @@ bool setSystemPaths()
 #endif
 
        for (std::list<std::string>::const_iterator
-                       i = trylist.begin(); i != trylist.end(); i++) {
+                       i = trylist.begin(); i != trylist.end(); ++i) {
                const std::string &trypath = *i;
                if (!fs::PathExists(trypath) ||
                        !fs::PathExists(trypath + DIR_DELIM + "builtin")) {
@@ -611,12 +611,13 @@ void setXorgClassHint(const video::SExposedVideoData &video_data,
 #endif
 }
 
-bool setXorgWindowIcon(IrrlichtDevice *device)
+bool setWindowIcon(IrrlichtDevice *device)
 {
-#if RUN_IN_PLACE
+#if defined(XORG_USED)
+#      if RUN_IN_PLACE
        return setXorgWindowIconFromPath(device,
                        path_share + "/misc/" PROJECT_NAME "-xorg-icon-128.png");
-#else
+#      else
        // We have semi-support for reading in-place data if we are
        // compiled with RUN_IN_PLACE. Don't break with this and
        // also try the path_share location.
@@ -625,6 +626,39 @@ bool setXorgWindowIcon(IrrlichtDevice *device)
                        ICON_DIR "/hicolor/128x128/apps/" PROJECT_NAME ".png") ||
                setXorgWindowIconFromPath(device,
                        path_share + "/misc/" PROJECT_NAME "-xorg-icon-128.png");
+#      endif
+#elif defined(_WIN32)
+       const video::SExposedVideoData exposedData = device->getVideoDriver()->getExposedVideoData();
+       HWND hWnd; // Window handle
+
+       switch (device->getVideoDriver()->getDriverType()) {
+       case video::EDT_DIRECT3D8:
+               hWnd = reinterpret_cast<HWND>(exposedData.D3D8.HWnd);
+               break;
+       case video::EDT_DIRECT3D9:
+               hWnd = reinterpret_cast<HWND>(exposedData.D3D9.HWnd);
+               break;
+       case video::EDT_OPENGL:
+               hWnd = reinterpret_cast<HWND>(exposedData.OpenGLWin32.HWnd);
+               break;
+       default:
+               return false;
+       }
+
+       // Load the ICON from resource file
+       const HICON hicon = LoadIcon(
+               GetModuleHandle(NULL),
+               MAKEINTRESOURCE(130) // The ID of the ICON defined in winresource.rc
+       );
+
+       if (hicon) {
+               SendMessage(hWnd, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(hicon));
+               SendMessage(hWnd, WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(hicon));
+               return true;
+       }
+       return false;
+#else
+       return false;
 #endif
 }
 
@@ -895,4 +929,31 @@ bool secure_rand_fill_buf(void *buf, size_t len)
 
 #endif
 
+void attachOrCreateConsole(void)
+{
+#ifdef _WIN32
+       static bool consoleAllocated = false;
+       const bool redirected = (_fileno(stdout) == -2 || _fileno(stdout) == -1); // If output is redirected to e.g a file
+       if (!consoleAllocated && redirected && (AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole())) {
+               freopen("CONOUT$", "w", stdout);
+               freopen("CONOUT$", "w", stderr);
+               consoleAllocated = true;
+       }
+#endif
+}
+
+// Load performance counter frequency only once at startup
+#ifdef _WIN32
+
+inline double get_perf_freq()
+{
+       LARGE_INTEGER freq;
+       QueryPerformanceFrequency(&freq);
+       return freq.QuadPart;
+}
+
+double perf_freq = get_perf_freq();
+
+#endif
+
 } //namespace porting