summaryrefslogtreecommitdiff
path: root/src/wlrunstable/wlr_ext_workspace_v1.hpp
blob: 8ca1ef747ba16d3c0d870227da6db24ba52aa96d (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
124
125
/*
 * This an unstable interface of wlroots. No guarantees are made regarding the
 * future consistency of this API.
 */

#ifndef WLR_TYPES_WLR_WORKSPACE_V1_H
#define WLR_TYPES_WLR_WORKSPACE_V1_H

#include <wayland-server-core.h>
#include <wlr/types/wlr_output.h>

struct wlr_ext_workspace_manager_v1 {
    struct wl_event_loop*   event_loop;
    struct wl_event_source* idle_source;

    struct wl_global*       global;
    struct wl_list          resources; // wl_resource_get_link
    struct wl_list          groups;    // wlr_ext_workspace_group_handle_v1::link

    struct wl_listener      display_destroy;

    struct {
        struct wl_signal commit; // wlr_ext_workspace_manager_v1
        struct wl_signal destroy;
    } events;

    void* data;
};

struct wlr_ext_workspace_group_handle_v1 {
    struct wl_list                       link;      // wlr_ext_workspace_manager_v1::groups
    struct wl_list                       resources; // wl_ext_resource_get_link

    struct wl_list                       workspaces; // wlr_ext_workspace_handle_v1::link
    struct wl_list                       outputs;    // wlr_ext_workspace_group_handle_v1_output::link

    struct wlr_ext_workspace_manager_v1* manager;

    struct {
        // wlr_ext_workspace_group_handle_v1_create_workspace_event
        struct wl_signal create_workspace_request;
        struct wl_signal destroy;
    } events;

    void* data;
};

struct wlr_ext_workspace_group_handle_v1_create_workspace_event {
    struct wlr_ext_workspace_group_handle_v1* workspace_group;
    const char*                               name;
};

struct wlr_ext_workspace_group_handle_v1_output {
    struct wl_list                            link; // wlr_ext_workspace_group_handle_v1::outputs
    struct wl_listener                        output_bind;
    struct wl_listener                        output_destroy;
    struct wlr_output*                        output;

    struct wlr_ext_workspace_group_handle_v1* group_handle;
};

enum wlr_ext_workspace_handle_v1_state
{
    WLR_EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE = 1 << 0,
    WLR_EXT_WORKSPACE_HANDLE_V1_STATE_URGENT = 1 << 1,
    WLR_EXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN = 1 << 2,
};

struct wlr_ext_workspace_handle_v1 {
    struct wl_list                            link; // wlr_ext_workspace_group_handle_v1::workspaces
    struct wl_list                            resources;

    struct wlr_ext_workspace_group_handle_v1* group;

    // request from the client
    uint32_t pending, current;
    bool     requestsActivate;

    // set by the compositor
    uint32_t        server_state;

    char*           name;
    struct wl_array coordinates;

    struct {
        struct wl_signal remove_request;
        struct wl_signal destroy;
    } events;

    void* data;
};

struct wlr_ext_workspace_manager_v1*      wlr_ext_workspace_manager_v1_create(struct wl_display* display);

struct wlr_ext_workspace_group_handle_v1* wlr_ext_workspace_group_handle_v1_create(struct wlr_ext_workspace_manager_v1* manager);

/**
 * Destroy the workspace group and all workspaces inside it.
 */
void wlr_ext_workspace_group_handle_v1_destroy(struct wlr_ext_workspace_group_handle_v1* group);

/**
 * Create a new workspace in the workspace group.
 * Note that the compositor must set the workspace name immediately after
 * creating it.
 */
struct wlr_ext_workspace_handle_v1* wlr_ext_workspace_handle_v1_create(struct wlr_ext_workspace_group_handle_v1* group);

void                                wlr_ext_workspace_handle_v1_destroy(struct wlr_ext_workspace_handle_v1* workspace);

void                                wlr_ext_workspace_group_handle_v1_output_enter(struct wlr_ext_workspace_group_handle_v1* group, struct wlr_output* output);

void                                wlr_ext_workspace_group_handle_v1_output_leave(struct wlr_ext_workspace_group_handle_v1* group, struct wlr_output* output);

void                                wlr_ext_workspace_handle_v1_set_name(struct wlr_ext_workspace_handle_v1* workspace, const char* name);

void                                wlr_ext_workspace_handle_v1_set_coordinates(struct wlr_ext_workspace_handle_v1* workspace, struct wl_array* coordinates);

void                                wlr_ext_workspace_handle_v1_set_active(struct wlr_ext_workspace_handle_v1* workspace, bool active);

void                                wlr_ext_workspace_handle_v1_set_urgent(struct wlr_ext_workspace_handle_v1* workspace, bool urgent);

void                                wlr_ext_workspace_handle_v1_set_hidden(struct wlr_ext_workspace_handle_v1* workspace, bool hidden);

#endif