/* $Id$
This file is part of libmspgbase
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
+Copyright © 2007-2008 Mikko Rasa, Mikkosoft Productions
Distributed under the LGPL
*/
#include <msp/strings/lexicalcast.h>
#include "display.h"
#include "window.h"
+#include "display_priv.h"
using namespace std;
namespace Msp {
namespace Graphics {
-Display::Display(const string &disp_name)
+Display::Display(const string &disp_name):
+ priv(new Private)
{
#ifdef WIN32
(void)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];
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);
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)
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];
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;
}
}
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
}