aboutsummaryrefslogtreecommitdiff
path: root/include/mglpp/window/Window.hpp
blob: 009c9a5d27f7ab22e56ceb53db144a04b1bccb68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#ifndef MGLPP_WINDOW_HPP
#define MGLPP_WINDOW_HPP

#include "../graphics/PrimitiveType.hpp"
#include "../graphics/Color.hpp"
#include "../system/vec.hpp"
#include "Keyboard.hpp"
#include "Mouse.hpp"
#include <stddef.h>
#include <string>
#include <functional>

extern "C" {
#include <mgl/window/window.h>
}

namespace mgl {
    typedef mgl_window_handle WindowHandle;

    class Event;
    class Drawable;
    class Shader;
    struct Vertex;

    struct View {
        vec2i position;
        vec2i size;
    };

    /*
        Return true to continue. |get_clipboard| returns false if this returns false.
        Note: |size| is the size of the current data, not the total data (if the callback only contains a part of the data).
    */
    using ClipboardCallback = std::function<bool(const unsigned char *data, size_t size, mgl_clipboard_type clipboard_type)>;

    class Window {
    public:
        /* Has to match mgl_window_create_params */
        struct CreateParams {
            mgl::vec2i position = {0, 0};
            mgl::vec2i size = {1280, 720};
            mgl::vec2i min_size; /* (0, 0) = no limit */
            mgl::vec2i max_size; /* (0, 0) = no limit */
            WindowHandle parent_window = 0; /* 0 = root window */
            bool hidden = false;
            bool override_redirect = false;
            bool support_alpha = false; /* support alpha for the window. If this is set to true then you need to call window.set_texture_blend_func before rendering textures and call window.set_render_blend_func afterwards to ensure correct alpha blending */
            bool hide_decorations = false; /* this is a hint, it may be ignored by the window manager */
            Color background_color = {0, 0, 0, 0};
            const char *class_name = nullptr;
            mgl_window_type window_type = MGL_WINDOW_TYPE_NORMAL;
            WindowHandle transient_for_window = 0; /* 0 = none */
            mgl_render_api render_api = MGL_RENDER_API_GLX;
        };

        Window();
        Window(const Window&) = delete;
        Window& operator=(const Window&) = delete;
        ~Window();

        bool create(const char *title, CreateParams create_params);
        // Initialize this window from an existing window
        bool create(WindowHandle existing_window);

        bool poll_event(Event &event);

        void clear(Color color = Color(0, 0, 0, 255));
        void draw(Drawable &drawable, Shader *shader = nullptr);
        void draw(const Vertex *vertices, size_t vertex_count, PrimitiveType primitive_type, mgl::vec2f position = {0, 0}, Shader *shader = nullptr);
        void display();

        void set_visible(bool visible);
        bool is_open() const;
        bool has_focus() const;
        void close();
        void set_title(const char *title);
        // 0 = no fps limit, or limit fps to vsync if vsync is enabled
        void set_framerate_limit(unsigned int fps);
        void set_vsync_enabled(bool enabled);
        bool is_vsync_enabled() const;
        void set_fullscreen(bool fullscreen);
        bool is_fullscreen() const;
        // Enabling low latency may slightly increase cpu usage
        void set_low_latency(bool low_latency);
        bool is_low_latency_enabled() const;
        void set_key_repeat_enabled(bool enabled);
        void set_cursor_visible(bool visible);
        vec2i get_size() const;
        /* Note that window size in get_size doesn't update immediately as the change size request can be ignored by the window manager. A Resized event will be received if the resize occurred */
        void set_size(mgl::vec2i size);
        void set_position(mgl::vec2i position);
        /* if |minimum| is (0, 0) then there is no minimum limit, if |maximum| is (0, 0) then there is no maximum limit */
        void set_size_limits(mgl::vec2i minimum, mgl::vec2i maximum);
        vec2i get_mouse_position() const;
        
        /*
            This should be called every frame to retain the view.
            Make sure to set the view back to the previous view after rendering items
            by saving the previous view with |get_view| and then call
            |set_view| with that saved view.
        */
        void set_view(const View &new_view);
        View get_view();

        bool is_key_pressed(Keyboard::Key key) const;
        bool is_mouse_button_pressed(Mouse::Button button) const;

        void set_clipboard(const std::string &str);
        bool get_clipboard(ClipboardCallback callback);
        std::string get_clipboard_string();

        void set_texture_blend_func();
        void set_render_blend_func();

        WindowHandle get_system_handle() const;

        mgl_window* internal_window();
    private:
        mgl_window window;
    };
}

#endif /* MGLPP_WINDOW_HPP */