Cpp11 initializers: last src root changeset (#6022)
[oweals/minetest.git] / src / porting.cpp
index ddf8139eace570abf7a2bef915ab742385ca1d1e..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,7 +611,58 @@ void setXorgClassHint(const video::SExposedVideoData &video_data,
 #endif
 }
 
-bool setXorgWindowIcon(IrrlichtDevice *device,
+bool setWindowIcon(IrrlichtDevice *device)
+{
+#if defined(XORG_USED)
+#      if RUN_IN_PLACE
+       return setXorgWindowIconFromPath(device,
+                       path_share + "/misc/" PROJECT_NAME "-xorg-icon-128.png");
+#      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.
+       return
+               setXorgWindowIconFromPath(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
+}
+
+bool setXorgWindowIconFromPath(IrrlichtDevice *device,
        const std::string &icon_file)
 {
 #ifdef XORG_USED
@@ -619,7 +670,8 @@ bool setXorgWindowIcon(IrrlichtDevice *device,
        video::IVideoDriver *v_driver = device->getVideoDriver();
 
        video::IImageLoader *image_loader = NULL;
-       for (u32 i = v_driver->getImageLoaderCount() - 1; i >= 0; i--) {
+       u32 cnt = v_driver->getImageLoaderCount();
+       for (u32 i = 0; i < cnt; i++) {
                if (v_driver->getImageLoader(i)->isALoadableFileExtension(icon_file.c_str())) {
                        image_loader = v_driver->getImageLoader(i);
                        break;
@@ -695,8 +747,8 @@ bool setXorgWindowIcon(IrrlichtDevice *device,
 
        delete [] icon_buffer;
 
-       return true;
 #endif
+       return true;
 }
 
 ////
@@ -877,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