diff --git a/main.cpp b/main.cpp index 769a028..cb3e3a7 100644 --- a/main.cpp +++ b/main.cpp @@ -25,6 +25,66 @@ irr::SIrrlichtCreationParameters _irr_params; irr::f32 g_Time = 0; +void initialize_viewports () +{ + if (IsRootWindow == false || Screens.size () == 0) + return; + + Display* display = XOpenDisplay (NULL); + int xrandr_result, xrandr_error; + + if (!XRRQueryExtension (display, &xrandr_result, &xrandr_error)) + { + std::cerr << "XRandr is not present, cannot detect specified screens, running in window mode" << std::endl; + return; + } + + XRRScreenResources* screenResources = XRRGetScreenResources (display, DefaultRootWindow (display)); + + // there are some situations where xrandr returns null (like screen not using the extension) + if (screenResources == nullptr) + return; + + for (int i = 0; i < screenResources->noutput; i ++) + { + XRROutputInfo* info = XRRGetOutputInfo (display, screenResources, screenResources->outputs [i]); + + // there are some situations where xrandr returns null (like screen not using the extension) + if (info == nullptr) + continue; + + std::vector::iterator cur = Screens.begin (); + std::vector::iterator end = Screens.end (); + + for (; cur != end; cur ++) + { + if (info->connection == RR_Connected && strcmp (info->name, (*cur).c_str ()) == 0) + { + XRRCrtcInfo* crtc = XRRGetCrtcInfo (display, screenResources, info->crtc); + + std::cout << "Found requested screen: " << info->name << " -> " << crtc->x << "x" << crtc->y << ":" << crtc->width << "x" << crtc->height << std::endl; + + irr::core::rect viewport; + + viewport.UpperLeftCorner.X = crtc->x; + viewport.UpperLeftCorner.Y = crtc->y; + viewport.LowerRightCorner.X = crtc->x + crtc->width; + viewport.LowerRightCorner.Y = crtc->y + crtc->height; + + Viewports.push_back (viewport); + + XRRFreeCrtcInfo (crtc); + } + } + + XRRFreeOutputInfo (info); + } + + XRRFreeScreenResources (screenResources); + + _irr_params.WindowId = reinterpret_cast (DefaultRootWindow (display)); +} + int init_irrlicht() { // prepare basic configuration for irrlicht @@ -44,54 +104,7 @@ int init_irrlicht() _irr_params.ZBufferBits = 24; _irr_params.LoggingLevel = irr::ELL_DEBUG; - if (IsRootWindow == true) - { - Display* display = XOpenDisplay (NULL); - XRRScreenResources* screenResources = XRRGetScreenResources (display, DefaultRootWindow (display)); - - // there are some situations where xrandr returns null (like screen not using the extension) - if (screenResources != nullptr) - { - for (int i = 0; i < screenResources->noutput; i ++) - { - XRROutputInfo* info = XRRGetOutputInfo (display, screenResources, screenResources->outputs [i]); - - // there are some situations where xrandr returns null (like screen not using the extension) - if (info == nullptr) - continue; - - std::vector::iterator cur = Screens.begin (); - std::vector::iterator end = Screens.end (); - - for (; cur != end; cur ++) - { - if (info->connection == RR_Connected && strcmp (info->name, (*cur).c_str ()) == 0) - { - XRRCrtcInfo* crtc = XRRGetCrtcInfo (display, screenResources, info->crtc); - - std::cout << "Found requested screen: " << info->name << " -> " << crtc->x << "x" << crtc->y << ":" << crtc->width << "x" << crtc->height << std::endl; - - irr::core::rect viewport; - - viewport.UpperLeftCorner.X = crtc->x; - viewport.UpperLeftCorner.Y = crtc->y; - viewport.LowerRightCorner.X = crtc->x + crtc->width; - viewport.LowerRightCorner.Y = crtc->y + crtc->height; - - Viewports.push_back (viewport); - - XRRFreeCrtcInfo (crtc); - } - } - - XRRFreeOutputInfo (info); - } - - XRRFreeScreenResources (screenResources); - } - - _irr_params.WindowId = reinterpret_cast (DefaultRootWindow (display)); - } + initialize_viewports (); wp::irrlicht::device = irr::createDeviceEx (_irr_params);