X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgbase%2Fdisplay.cpp;h=3a755014c1996fe29083c2fda93e7958ad259c13;hb=39ec5cd588bf8b49717033d841be689df68537a3;hp=3baf7c11a72e92eb1a1827666f247198d85e21aa;hpb=999ca92aa9ee10585c0b2094d84364159253982f;p=libs%2Fgui.git diff --git a/source/gbase/display.cpp b/source/gbase/display.cpp index 3baf7c1..3a75501 100644 --- a/source/gbase/display.cpp +++ b/source/gbase/display.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of libmspgbase -Copyright © 2007 Mikko Rasa, Mikkosoft Productions +Copyright © 2007-2008 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ @@ -15,6 +15,7 @@ Distributed under the LGPL #include #include "display.h" #include "window.h" +#include "display_priv.h" using namespace std; @@ -52,29 +53,51 @@ int x_error_handler(Display *display, XErrorEvent *event) namespace Msp { namespace Graphics { -Display::Display(const string &disp_name) +Display::Display(const string &disp_name): + priv(new Private) { -#ifndef WIN32 +#ifdef WIN32 + (void)disp_name; + + for(unsigned i=0;; ++i) + { + DEVMODE info; + if(!EnumDisplaySettings(0, i, &info)) + break; + + VideoMode mode(info.dmPelsWidth, info.dmPelsHeight); + mode.rate=info.dmDisplayFrequency; + modes.push_back(mode); + } + + DEVMODE info; + if(EnumDisplaySettings(0, ENUM_CURRENT_SETTINGS, &info)) + { + orig_mode=VideoMode(info.dmPelsWidth, info.dmPelsHeight); + orig_mode.rate=info.dmDisplayFrequency; + } +#else if(disp_name.empty()) - display=XOpenDisplay(0); + priv->display=XOpenDisplay(0); else - display=XOpenDisplay(disp_name.c_str()); - if(!display) + priv->display=XOpenDisplay(disp_name.c_str()); + if(!priv->display) throw Exception("Couldn't open X display"); XSetErrorHandler(x_error_handler); - int screen=DefaultScreen(display); + int screen=DefaultScreen(priv->display); int nmodes; XF86VidModeModeInfo **infos; - XF86VidModeGetAllModeLines(display, screen, &nmodes, &infos); + XF86VidModeGetAllModeLines(priv->display, screen, &nmodes, &infos); for(int i=0; idisplay, screen, &dotclock, &modeline); orig_mode=VideoMode(modeline.hdisplay, modeline.vdisplay); - orig_mode.rate=dotclock/(modeline.htotal*modeline.vtotal); -#else - (void)disp_name; + if(modeline.htotal && modeline.vtotal) + orig_mode.rate=dotclock/(modeline.htotal*modeline.vtotal); #endif } Display::~Display() { #ifndef WIN32 - XCloseDisplay(display); - display=0; + XCloseDisplay(priv->display); + delete priv; #endif } -void Display::add_window(Window *wnd) +void Display::add_window(Window &wnd) { - windows[wnd->get_handle()]=wnd; + priv->windows[wnd.get_private().window]=&wnd; } -void Display::remove_window(Window *wnd) +void Display::remove_window(Window &wnd) { - windows.erase(wnd->get_handle()); + priv->windows.erase(wnd.get_private().window); } void Display::set_mode(const VideoMode &mode) { -#ifndef WIN32 - int screen=DefaultScreen(display); +#ifdef WIN32 + DEVMODE info; + info.dmSize=sizeof(DEVMODE); + info.dmFields=DM_PELSWIDTH|DM_PELSHEIGHT; + info.dmPelsWidth=mode.width; + info.dmPelsHeight=mode.height; + if(mode.rate) + { + info.dmFields|=DM_DISPLAYFREQUENCY; + info.dmDisplayFrequency=mode.rate; + } + + ChangeDisplaySettings(&info, CDS_FULLSCREEN); +#else + int screen=DefaultScreen(priv->display); int nmodes; XF86VidModeModeInfo **infos; - XF86VidModeGetAllModeLines(display, screen, &nmodes, &infos); + XF86VidModeGetAllModeLines(priv->display, screen, &nmodes, &infos); for(int i=0; idisplay, screen, &info); + XF86VidModeSetViewPort(priv->display, screen, 0, 0); return; } } throw InvalidParameterValue("Requested mode not supported"); -#else - (void)mode; #endif } @@ -148,20 +183,22 @@ void Display::tick() else break; #else - int pending=XPending(display); + int pending=XPending(priv->display); if(pending==0) break; for(int i=0; idisplay, &event.xevent); check_error(); - map::iterator j=windows.find(event.xany.window); - if(j!=windows.end()) + map::iterator j=priv->windows.find(event.xevent.xany.window); + if(j!=priv->windows.end()) + { j->second->event(event); + } } #endif }