3 This file is part of libmspgbase
4 Copyright © 2007 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
10 #include <X11/Xutil.h>
11 #include <msp/core/except.h>
20 WindowOptions::WindowOptions():
28 Window::Window(Display &dpy, unsigned w, unsigned h, bool fs):
33 options.fullscreen=fs;
38 Window::Window(Display &dpy, const WindowOptions &opts):
48 XDestroyWindow(display.get_display(), window);
50 display.remove_window(this);
52 if(options.fullscreen)
53 display.restore_mode();
56 void Window::set_title(const string &title)
58 vector<unsigned char> buf(title.begin(), title.end());
61 prop.encoding=XA_STRING;
63 prop.nitems=title.size();
64 XSetWMName(display.get_display(), window, &prop);
65 display.check_error();
68 void Window::reconfigure(const WindowOptions &opts)
70 bool fullscreen_changed=(opts.fullscreen!=options.fullscreen);
74 ::Display *dpy=display.get_display();
76 XMoveResizeWindow(dpy, window, 0, 0, options.width, options.height);
78 if(fullscreen_changed)
81 XSetWindowAttributes attr;
82 attr.override_redirect=options.fullscreen;
83 XChangeWindowAttributes(dpy, window, CWOverrideRedirect, &attr);
87 if(options.fullscreen)
88 display.set_mode(VideoMode(options.width, options.height));
89 else if(fullscreen_changed)
90 display.restore_mode();
95 XMapRaised(display.get_display(), window);
96 display.check_error();
101 XUnmapWindow(display.get_display(), window);
102 display.check_error();
107 ::Display *dpy=display.get_display();
109 wm_delete_window=XInternAtom(dpy, "WM_DELETE_WINDOW", true);
111 XSetWindowAttributes attr;
112 attr.override_redirect=options.fullscreen;
113 attr.event_mask=ButtonPressMask|ButtonReleaseMask|PointerMotionMask|KeyPressMask|KeyReleaseMask|StructureNotifyMask|EnterWindowMask;
115 window=XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, options.width, options.height, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect|CWEventMask, &attr);
117 XSetWMProtocols(dpy, window, &wm_delete_window, 1);
119 if(options.fullscreen)
121 display.set_mode(VideoMode(options.width, options.height));
122 XWarpPointer(dpy, None, window, 0, 0, 0, 0, options.width/2, options.height/2);
125 display.add_window(this);
126 display.check_error();
129 void Window::event(const XEvent &ev)
134 signal_button_press.emit(ev.xbutton.x, ev.xbutton.y, ev.xbutton.button, ev.xbutton.state);
137 signal_button_release.emit(ev.xbutton.x, ev.xbutton.y, ev.xbutton.button, ev.xbutton.state);
140 signal_pointer_motion.emit(ev.xmotion.x, ev.xmotion.y);
145 XLookupString(const_cast<XKeyEvent *>(&ev.xkey), buf, sizeof(buf), 0, 0);
146 // XXX Handle the result according to locale
147 signal_key_press.emit(ev.xkey.keycode, ev.xkey.state, buf[0]);
151 signal_key_release.emit(ev.xkey.keycode, ev.xkey.state);
153 case ConfigureNotify:
154 options.width=ev.xconfigure.width;
155 options.height=ev.xconfigure.height;
156 signal_resize.emit(options.width, options.height);
159 if(ev.xclient.data.l[0]==static_cast<long>(wm_delete_window))
163 XSetInputFocus(display.get_display(), window, RevertToParent, CurrentTime);
166 if(options.fullscreen)
167 XGrabPointer(display.get_display(), window, true, None, GrabModeAsync, GrabModeAsync, window, None, CurrentTime);
173 } // namespace Graphics