This repository has been archived by the owner on Apr 18, 2023. It is now read-only.
/
workspace.h
188 lines (163 loc) · 4.91 KB
/
workspace.h
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/*
* vim:ts=4:sw=4:expandtab
*
* i3 - an improved dynamic tiling window manager
* © 2009 Michael Stapelberg and contributors (see also: LICENSE)
*
* workspace.c: Modifying workspaces, accessing them, moving containers to
* workspaces.
*
*/
#pragma once
#include <config.h>
#include "data.h"
#include "tree.h"
#include "randr.h"
/* We use NET_WM_DESKTOP_NONE for cases where we cannot determine the EWMH
* desktop index for a window. We cannot use a negative value like -1 since we
* need to use uint32_t as we actually need the full range of it. This is
* technically dangerous, but it's safe to assume that we will never have more
* than 4294967279 workspaces open at a time. */
#define NET_WM_DESKTOP_NONE 0xFFFFFFF0
#define NET_WM_DESKTOP_ALL 0xFFFFFFFF
/**
* Stores a copy of the name of the last used workspace for the workspace
* back-and-forth switching.
*
*/
extern char *previous_workspace_name;
/**
* Returns the workspace with the given name or NULL if such a workspace does
* not exist.
*
*/
Con *get_existing_workspace_by_name(const char *name);
/**
* Returns the workspace with the given number or NULL if such a workspace does
* not exist.
*
*/
Con *get_existing_workspace_by_num(int num);
/**
* Returns the first output that is assigned to a workspace specified by the
* given name or number. Returns NULL if no such output exists.
*
* If an assignment matches by number but there is an assignment later that
* matches by name, the second one is preferred.
* The order of the 'ws_assignments' queue is respected: if multiple
* assignments match the criteria, the first one is returned.
* 'name' is ignored when NULL, 'parsed_num' is ignored when it is -1.
*
*/
Con *get_assigned_output(const char *name, long parsed_num);
/**
* Returns true if the first output assigned to a workspace with the given
* workspace assignment is the same as the given output.
*
*/
bool output_triggers_assignment(Output *output, struct Workspace_Assignment *assignment);
/**
* Returns a pointer to the workspace with the given number (starting at 0),
* creating the workspace if necessary (by allocating the necessary amount of
* memory and initializing the data structures correctly).
*
*/
Con *workspace_get(const char *num);
/**
* Extracts workspace names from keybindings (e.g. “web” from “bindsym $mod+1
* workspace web”), so that when an output needs a workspace, i3 can start with
* the first configured one. Needs to be called before reorder_bindings() so
* that the config-file order is used, not the i3-internal order.
*
*/
void extract_workspace_names_from_bindings(void);
/**
* Returns a pointer to a new workspace in the given output. The workspace
* is created attached to the tree hierarchy through the given content
* container.
*
*/
Con *create_workspace_on_output(Output *output, Con *content);
/**
* Returns true if the workspace is currently visible. Especially important for
* multi-monitor environments, as they can have multiple currenlty active
* workspaces.
*
*/
bool workspace_is_visible(Con *ws);
/**
* Switches to the given workspace
*
*/
void workspace_show(Con *ws);
/**
* Looks up the workspace by name and switches to it.
*
*/
void workspace_show_by_name(const char *num);
/**
* Returns the next workspace.
*
*/
Con *workspace_next(void);
/**
* Returns the previous workspace.
*
*/
Con *workspace_prev(void);
/**
* Returns the next workspace on the same output
*
*/
Con *workspace_next_on_output(void);
/**
* Returns the previous workspace on the same output
*
*/
Con *workspace_prev_on_output(void);
/**
* Focuses the previously focused workspace.
*
*/
void workspace_back_and_forth(void);
/**
* Returns the previously focused workspace con, or NULL if unavailable.
*
*/
Con *workspace_back_and_forth_get(void);
/**
* Goes through all clients on the given workspace and updates the workspace’s
* urgent flag accordingly.
*
*/
void workspace_update_urgent_flag(Con *ws);
/**
* 'Forces' workspace orientation by moving all cons into a new split-con with
* the same orientation as the workspace and then changing the workspace
* orientation.
*
*/
void ws_force_orientation(Con *ws, orientation_t orientation);
/**
* Called when a new con (with a window, not an empty or split con) should be
* attached to the workspace (for example when managing a new window or when
* moving an existing window to the workspace level).
*
* Depending on the workspace_layout setting, this function either returns the
* workspace itself (default layout) or creates a new stacked/tabbed con and
* returns that.
*
*/
Con *workspace_attach_to(Con *ws);
/**
* Creates a new container and re-parents all of children from the given
* workspace into it.
*
* The container inherits the layout from the workspace.
*/
Con *workspace_encapsulate(Con *ws);
/**
* Move the given workspace to the specified output.
*
*/
void workspace_move_to_output(Con *ws, Output *output);