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);
53 void Window::set_title(const string &title)
55 vector<unsigned char> buf(title.begin(), title.end());
58 prop.encoding=XA_STRING;
60 prop.nitems=title.size();
61 XSetWMName(display.get_display(), window, &prop);
62 display.check_error();
67 XMapRaised(display.get_display(), window);
68 display.check_error();
73 XUnmapWindow(display.get_display(), window);
74 display.check_error();
79 ::Display *dpy=display.get_display();
81 wm_delete_window=XInternAtom(dpy, "WM_DELETE_WINDOW", true);
83 XSetWindowAttributes attr;
84 attr.override_redirect=options.fullscreen;
85 attr.event_mask=ButtonPressMask|ButtonReleaseMask|PointerMotionMask|KeyPressMask|KeyReleaseMask|StructureNotifyMask|EnterWindowMask;
87 window=XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, options.width, options.height, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect|CWEventMask, &attr);
89 XSetWMProtocols(dpy, window, &wm_delete_window, 1);
91 display.add_window(this);
92 display.check_error();
95 void Window::event(const XEvent &ev)
100 signal_button_press.emit(ev.xbutton.x, ev.xbutton.y, ev.xbutton.button, ev.xbutton.state);
103 signal_button_release.emit(ev.xbutton.x, ev.xbutton.y, ev.xbutton.button, ev.xbutton.state);
106 signal_pointer_motion.emit(ev.xmotion.x, ev.xmotion.y);
111 XLookupString(const_cast<XKeyEvent *>(&ev.xkey), buf, sizeof(buf), 0, 0);
112 // XXX Handle the result according to locale
113 signal_key_press.emit(ev.xkey.keycode, ev.xkey.state, buf[0]);
117 signal_key_release.emit(ev.xkey.keycode, ev.xkey.state);
119 case ConfigureNotify:
120 options.width=ev.xconfigure.width;
121 options.height=ev.xconfigure.height;
122 signal_resize.emit(options.width, options.height);
125 if(ev.xclient.data.l[0]==static_cast<long>(wm_delete_window))
129 XSetInputFocus(display.get_display(), window, RevertToParent, CurrentTime);
135 } // namespace Graphics