SHOW:
|
|
- or go back to the newest paste.
1 | #include <stdlib.h> | |
2 | - | #include <SFML/Graphics.hpp> |
2 | + | |
3 | - | #include <SFML/OpenGL.hpp> |
3 | + | #include <SFML/Window.hpp> |
4 | #include <X11/Xlib.h> | |
5 | #include <GL/gl.h> | |
6 | ||
7 | bool running = true; | |
8 | ||
9 | class RenderTask | |
10 | { | |
11 | - | RenderTask(sf::RenderWindow& window):window(window) {} |
11 | + | |
12 | RenderTask(sf::Window& window):window(window) {} | |
13 | virtual ~RenderTask() {} | |
14 | ||
15 | void run() | |
16 | { | |
17 | window.setActive(); | |
18 | window.setVerticalSyncEnabled(true); | |
19 | ||
20 | sf::Clock clock; | |
21 | while (running) { | |
22 | ||
23 | std::cout << clock.getElapsedTime().asMilliseconds() << std::endl; | |
24 | clock.restart(); | |
25 | ||
26 | glClear(GL_COLOR_BUFFER_BIT); | |
27 | window.display(); | |
28 | } | |
29 | } | |
30 | ||
31 | - | sf::RenderWindow& window; |
31 | + | |
32 | sf::Window& window; | |
33 | }; | |
34 | - | int main(int argc, char **argv) |
34 | + | |
35 | - | { |
35 | + | int main() |
36 | { | |
37 | XInitThreads(); | |
38 | - | sf::RenderWindow window(sf::VideoMode(1024, 768), "Test", sf::Style::Close, sf::ContextSettings(32)); |
38 | + | |
39 | - | window.setActive(false); |
39 | + | Display* display = XOpenDisplay(NULL); |
40 | if (!display) { | |
41 | - | RenderTask renderTask(window); |
41 | + | return EXIT_FAILURE; |
42 | } | |
43 | ||
44 | Window window = XCreateSimpleWindow(display, DefaultRootWindow(display), | |
45 | 0, 0, 1024, 768, | |
46 | 0, 0, 0); | |
47 | - | sf::Event event; |
47 | + | XStoreName(display, window, "X11 Test"); |
48 | - | while (window.pollEvent(event)) { |
48 | + | |
49 | - | if (event.type == sf::Event::Closed) |
49 | + | XMapWindow(display, window); |
50 | - | running = false; |
50 | + | XFlush(display); |
51 | ||
52 | Atom wmDeleteWindow = XInternAtom(display, "WM_DELETE_WINDOW", True); | |
53 | - | sf::sleep(sf::milliseconds(10)); |
53 | + | XSetWMProtocols(display, window, &wmDeleteWindow, 1); |
54 | ||
55 | sf::Window sfmlWindow(window); | |
56 | sfmlWindow.setActive(false); | |
57 | - | window.close(); |
57 | + | |
58 | RenderTask renderTask(sfmlWindow); | |
59 | - | return 0; |
59 | + | |
60 | renderThread.launch(); | |
61 | ||
62 | while (running) { | |
63 | ||
64 | while (running && XPending(display)) { | |
65 | XEvent event; | |
66 | XNextEvent(display, &event); | |
67 | switch (event.type) { | |
68 | case ClientMessage: | |
69 | if ((Atom)event.xclient.data.l[0] == wmDeleteWindow) { | |
70 | running = false; | |
71 | } | |
72 | break; | |
73 | } | |
74 | } | |
75 | ||
76 | } | |
77 | ||
78 | ||
79 | renderThread.wait(); | |
80 | sfmlWindow.close(); | |
81 | XCloseDisplay(display); | |
82 | ||
83 | return EXIT_SUCCESS; | |
84 | } |