X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fporting.cpp;h=04a7952c6ac73f8e7b4a61f179c25c8b60be26d0;hb=40dd03e328ff0ae36338615114cb38879752756e;hp=f0337b6102f2cbb3d90fb22a1627f1f8ce497ac4;hpb=33a606c034a6dfea4a011b6d69077455bbb56746;p=minetest.git diff --git a/src/porting.cpp b/src/porting.cpp index f0337b610..04a7952c6 100644 --- a/src/porting.cpp +++ b/src/porting.cpp @@ -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 #include #elif defined(_WIN32) @@ -41,14 +41,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #define _PSTAT64 #include #endif -#if !defined(_WIN32) && !defined(__APPLE__) && \ - !defined(__ANDROID__) && !defined(SERVER) - #define XORG_USED -#endif -#ifdef XORG_USED - #include - #include -#endif #include "config.h" #include "debug.h" @@ -67,7 +59,7 @@ namespace porting bool g_killed = false; -bool * signal_handler_killstatus(void) +bool *signal_handler_killstatus() { return &g_killed; } @@ -175,7 +167,7 @@ bool detectMSVCBuildDir(const std::string &path) "bin\\Build", NULL }; - return (removeStringEnd(path, ends) != ""); + return (!removeStringEnd(path, ends).empty()); } std::string get_sysinfo() @@ -396,7 +388,7 @@ bool setSystemPaths() // It is identified by containing the subdirectory "builtin". std::list trylist; std::string static_sharedir = STATIC_SHAREDIR; - if (static_sharedir != "" && static_sharedir != ".") + if (!static_sharedir.empty() && static_sharedir != ".") trylist.push_back(static_sharedir); trylist.push_back(bindir + DIR_DELIM ".." DIR_DELIM "share" @@ -408,7 +400,7 @@ bool setSystemPaths() #endif for (std::list::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")) { @@ -564,7 +556,7 @@ void initializePaths() infostream << "Detected user path: " << path_user << std::endl; infostream << "Detected cache path: " << path_cache << std::endl; -#ifdef USE_GETTEXT +#if USE_GETTEXT bool found_localedir = false; # ifdef STATIC_LOCALEDIR if (STATIC_LOCALEDIR[0] && fs::PathExists(STATIC_LOCALEDIR)) { @@ -592,273 +584,6 @@ void initializePaths() #endif // USE_GETTEXT } - - -void setXorgClassHint(const video::SExposedVideoData &video_data, - const std::string &name) -{ -#ifdef XORG_USED - if (video_data.OpenGLLinux.X11Display == NULL) - return; - - XClassHint *classhint = XAllocClassHint(); - classhint->res_name = (char *)name.c_str(); - classhint->res_class = (char *)name.c_str(); - - XSetClassHint((Display *)video_data.OpenGLLinux.X11Display, - video_data.OpenGLLinux.X11Window, classhint); - XFree(classhint); -#endif -} - -bool setXorgWindowIcon(IrrlichtDevice *device) -{ -#ifdef 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 - return false; -#endif -} - -bool setXorgWindowIconFromPath(IrrlichtDevice *device, - const std::string &icon_file) -{ -#ifdef XORG_USED - - video::IVideoDriver *v_driver = device->getVideoDriver(); - - video::IImageLoader *image_loader = NULL; - 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; - } - } - - if (!image_loader) { - warningstream << "Could not find image loader for file '" - << icon_file << "'" << std::endl; - return false; - } - - io::IReadFile *icon_f = device->getFileSystem()->createAndOpenFile(icon_file.c_str()); - - if (!icon_f) { - warningstream << "Could not load icon file '" - << icon_file << "'" << std::endl; - return false; - } - - video::IImage *img = image_loader->loadImage(icon_f); - - if (!img) { - warningstream << "Could not load icon file '" - << icon_file << "'" << std::endl; - icon_f->drop(); - return false; - } - - u32 height = img->getDimension().Height; - u32 width = img->getDimension().Width; - - size_t icon_buffer_len = 2 + height * width; - long *icon_buffer = new long[icon_buffer_len]; - - icon_buffer[0] = width; - icon_buffer[1] = height; - - for (u32 x = 0; x < width; x++) { - for (u32 y = 0; y < height; y++) { - video::SColor col = img->getPixel(x, y); - long pixel_val = 0; - pixel_val |= (u8)col.getAlpha() << 24; - pixel_val |= (u8)col.getRed() << 16; - pixel_val |= (u8)col.getGreen() << 8; - pixel_val |= (u8)col.getBlue(); - icon_buffer[2 + x + y * width] = pixel_val; - } - } - - img->drop(); - icon_f->drop(); - - const video::SExposedVideoData &video_data = v_driver->getExposedVideoData(); - - Display *x11_dpl = (Display *)video_data.OpenGLLinux.X11Display; - - if (x11_dpl == NULL) { - warningstream << "Could not find x11 display for setting its icon." - << std::endl; - delete [] icon_buffer; - return false; - } - - Window x11_win = (Window)video_data.OpenGLLinux.X11Window; - - Atom net_wm_icon = XInternAtom(x11_dpl, "_NET_WM_ICON", False); - Atom cardinal = XInternAtom(x11_dpl, "CARDINAL", False); - XChangeProperty(x11_dpl, x11_win, - net_wm_icon, cardinal, 32, - PropModeReplace, (const unsigned char *)icon_buffer, - icon_buffer_len); - - delete [] icon_buffer; - -#endif - return true; -} - -//// -//// Video/Display Information (Client-only) -//// - -#ifndef SERVER - -static irr::IrrlichtDevice *device; - -void initIrrlicht(irr::IrrlichtDevice *device_) -{ - device = device_; -} - -v2u32 getWindowSize() -{ - return device->getVideoDriver()->getScreenSize(); -} - - -std::vector > getSupportedVideoModes() -{ - IrrlichtDevice *nulldevice = createDevice(video::EDT_NULL); - sanity_check(nulldevice != NULL); - - std::vector > mlist; - video::IVideoModeList *modelist = nulldevice->getVideoModeList(); - - u32 num_modes = modelist->getVideoModeCount(); - for (u32 i = 0; i != num_modes; i++) { - core::dimension2d mode_res = modelist->getVideoModeResolution(i); - s32 mode_depth = modelist->getVideoModeDepth(i); - mlist.push_back(core::vector3d(mode_res.Width, mode_res.Height, mode_depth)); - } - - nulldevice->drop(); - - return mlist; -} - -std::vector getSupportedVideoDrivers() -{ - std::vector drivers; - - for (int i = 0; i != irr::video::EDT_COUNT; i++) { - if (irr::IrrlichtDevice::isDriverSupported((irr::video::E_DRIVER_TYPE)i)) - drivers.push_back((irr::video::E_DRIVER_TYPE)i); - } - - return drivers; -} - -const char *getVideoDriverName(irr::video::E_DRIVER_TYPE type) -{ - static const char *driver_ids[] = { - "null", - "software", - "burningsvideo", - "direct3d8", - "direct3d9", - "opengl", - "ogles1", - "ogles2", - }; - - return driver_ids[type]; -} - - -const char *getVideoDriverFriendlyName(irr::video::E_DRIVER_TYPE type) -{ - static const char *driver_names[] = { - "NULL Driver", - "Software Renderer", - "Burning's Video", - "Direct3D 8", - "Direct3D 9", - "OpenGL", - "OpenGL ES1", - "OpenGL ES2", - }; - - return driver_names[type]; -} - -# ifndef __ANDROID__ -# ifdef XORG_USED - -static float calcDisplayDensity() -{ - const char *current_display = getenv("DISPLAY"); - - if (current_display != NULL) { - Display *x11display = XOpenDisplay(current_display); - - if (x11display != NULL) { - /* try x direct */ - float dpi_height = floor(DisplayHeight(x11display, 0) / - (DisplayHeightMM(x11display, 0) * 0.039370) + 0.5); - float dpi_width = floor(DisplayWidth(x11display, 0) / - (DisplayWidthMM(x11display, 0) * 0.039370) + 0.5); - - XCloseDisplay(x11display); - - return std::max(dpi_height,dpi_width) / 96.0; - } - } - - /* return manually specified dpi */ - return g_settings->getFloat("screen_dpi")/96.0; -} - - -float getDisplayDensity() -{ - static float cached_display_density = calcDisplayDensity(); - return cached_display_density; -} - - -# else // XORG_USED -float getDisplayDensity() -{ - return g_settings->getFloat("screen_dpi")/96.0; -} -# endif // XORG_USED - -v2u32 getDisplaySize() -{ - IrrlichtDevice *nulldevice = createDevice(video::EDT_NULL); - - core::dimension2d deskres = nulldevice->getVideoModeList()->getDesktopResolution(); - nulldevice -> drop(); - - return deskres; -} -# endif // __ANDROID__ -#endif // SERVER - - //// //// OS-specific Secure Random //// @@ -898,4 +623,31 @@ bool secure_rand_fill_buf(void *buf, size_t len) #endif +void attachOrCreateConsole() +{ +#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