X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgbase%2Fdisplay.cpp;h=3a755014c1996fe29083c2fda93e7958ad259c13;hb=fcd5f24311fcfe772825a75678e038749401a9be;hp=b39330be1c9fc3353cc387fad8f38241a8b7b765;hpb=fbefc4904d290205658209bbe2392b4b7f9e2711;p=libs%2Fgui.git diff --git a/source/gbase/display.cpp b/source/gbase/display.cpp index b39330b..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,7 +53,8 @@ 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) { #ifdef WIN32 (void)disp_name; @@ -76,19 +78,19 @@ Display::Display(const string &disp_name) } #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); if(modeline.htotal && modeline.vtotal) orig_mode.rate=dotclock/(modeline.htotal*modeline.vtotal); @@ -113,19 +115,19 @@ Display::Display(const string &disp_name) 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) @@ -144,11 +146,11 @@ void Display::set_mode(const VideoMode &mode) ChangeDisplaySettings(&info, CDS_FULLSCREEN); #else - 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, &info); + XF86VidModeSetViewPort(priv->display, screen, 0, 0); return; } } @@ -181,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 }