]> git.tdb.fi Git - libs/gui.git/blob - source/window.cpp
f867faf6e58e3a775c08248f943eb17c1159b71e
[libs/gui.git] / source / window.cpp
1 /* $Id$
2
3 This file is part of libmspgbase
4 Copyright © 2007 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #include <vector>
9 #include <X11/Xatom.h>
10 #include <X11/Xutil.h>
11 #include <msp/core/except.h>
12 #include "display.h"
13 #include "window.h"
14
15 using namespace std;
16
17 namespace Msp {
18 namespace Graphics {
19
20 WindowOptions::WindowOptions():
21         width(640),
22         height(480),
23         fullscreen(false),
24         resizable(false)
25 { }
26
27
28 Window::Window(Display &dpy, unsigned w, unsigned h, bool fs):
29         display(dpy)
30 {
31         options.width=w;
32         options.height=h;
33         options.fullscreen=fs;
34
35         init();
36 }
37
38 Window::Window(Display &dpy, const WindowOptions &opts):
39         display(dpy),
40         options(opts)
41 {
42         init();
43 }
44
45 Window::~Window()
46 {
47         if(window)
48                 XDestroyWindow(display.get_display(), window);
49
50         display.remove_window(this);
51 }
52
53 void Window::set_title(const string &title)
54 {
55         vector<unsigned char> buf(title.begin(), title.end());
56         XTextProperty prop;
57         prop.value=&buf[0];
58         prop.encoding=XA_STRING;
59         prop.format=8;
60         prop.nitems=title.size();
61         XSetWMName(display.get_display(), window, &prop);
62         display.check_error();
63 }
64
65 void Window::show()
66 {
67         XMapRaised(display.get_display(), window);
68         display.check_error();
69 }
70
71 void Window::hide()
72 {
73         XUnmapWindow(display.get_display(), window);
74         display.check_error();
75 }
76
77 void Window::init()
78 {
79         ::Display *dpy=display.get_display();
80
81         wm_delete_window=XInternAtom(dpy, "WM_DELETE_WINDOW", true);
82
83         XSetWindowAttributes attr;
84         attr.override_redirect=options.fullscreen;
85         attr.event_mask=ButtonPressMask|ButtonReleaseMask|PointerMotionMask|KeyPressMask|KeyReleaseMask|StructureNotifyMask|EnterWindowMask;
86
87         window=XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, options.width, options.height, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect|CWEventMask, &attr);
88
89         XSetWMProtocols(dpy, window, &wm_delete_window, 1);
90
91         display.add_window(this);
92         display.check_error();
93 }
94
95 void Window::event(const XEvent &ev)
96 {
97         switch(ev.type)
98         {
99         case ButtonPress:
100                 signal_button_press.emit(ev.xbutton.x, ev.xbutton.y, ev.xbutton.button, ev.xbutton.state);
101                 break;
102         case ButtonRelease:
103                 signal_button_release.emit(ev.xbutton.x, ev.xbutton.y, ev.xbutton.button, ev.xbutton.state);
104                 break;
105         case MotionNotify:
106                 signal_pointer_motion.emit(ev.xmotion.x, ev.xmotion.y);
107                 break;
108         case KeyPress:
109                 {
110                         char buf[16];
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]);
114                 }
115                 break;
116         case KeyRelease:
117                 signal_key_release.emit(ev.xkey.keycode, ev.xkey.state);
118                 break;
119         case ConfigureNotify:
120                 options.width=ev.xconfigure.width;
121                 options.height=ev.xconfigure.height;
122                 signal_resize.emit(options.width, options.height);
123                 break;
124         case ClientMessage:
125                 if(ev.xclient.data.l[0]==static_cast<long>(wm_delete_window))
126                         signal_close.emit();
127                 break;
128         case EnterNotify:
129                 XSetInputFocus(display.get_display(), window, RevertToParent, CurrentTime);
130                 break;
131         default:;
132         }
133 }
134
135 } // namespace Graphics
136 } // namespace Msp