]> git.tdb.fi Git - libs/gui.git/blobdiff - source/gbase/display.cpp
Hide the platform-specific parts of other classes as well
[libs/gui.git] / source / gbase / display.cpp
index b39330be1c9fc3353cc387fad8f38241a8b7b765..3a755014c1996fe29083c2fda93e7958ad259c13 100644 (file)
@@ -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 <msp/strings/lexicalcast.h>
 #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; i<nmodes; ++i)
        {
                XF86VidModeModeInfo &info=*infos[i];
@@ -103,7 +105,7 @@ Display::Display(const string &disp_name)
 
        XF86VidModeModeLine modeline;
        int dotclock;
-       XF86VidModeGetModeLine(display, screen, &dotclock, &modeline);
+       XF86VidModeGetModeLine(priv->display, 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; i<nmodes; ++i)
        {
                XF86VidModeModeInfo &info=*infos[i];
@@ -158,8 +160,8 @@ void Display::set_mode(const VideoMode &mode)
                        rate=info.dotclock/(info.htotal*info.vtotal);
                if(info.hdisplay==mode.width && info.vdisplay==mode.height && (mode.rate==0 || rate==mode.rate))
                {
-                       XF86VidModeSwitchToMode(display, screen, &info);
-                       XF86VidModeSetViewPort(display, screen, 0, 0);
+                       XF86VidModeSwitchToMode(priv->display, 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; i<pending; ++i)
                {
-                       XEvent event;
-                       XNextEvent(display, &event);
+                       Window::Event event;
+                       XNextEvent(priv->display, &event.xevent);
 
                        check_error();
 
-                       map<WindowHandle, Window *>::iterator j=windows.find(event.xany.window);
-                       if(j!=windows.end())
+                       map<WindowHandle, Window *>::iterator j=priv->windows.find(event.xevent.xany.window);
+                       if(j!=priv->windows.end())
+                       {
                                j->second->event(event);
+                       }
                }
 #endif
        }