]> git.sur5r.net Git - i3/i3/blob - include/workspace.h
db544ce8eea6d154120b5a13118dc033a0c533b4
[i3/i3] / include / workspace.h
1 /*
2  * vim:ts=4:sw=4:expandtab
3  *
4  * i3 - an improved dynamic tiling window manager
5  * © 2009 Michael Stapelberg and contributors (see also: LICENSE)
6  *
7  * workspace.c: Modifying workspaces, accessing them, moving containers to
8  *              workspaces.
9  *
10  */
11 #pragma once
12
13 #include <config.h>
14
15 #include "data.h"
16 #include "tree.h"
17 #include "randr.h"
18
19 /* We use NET_WM_DESKTOP_NONE for cases where we cannot determine the EWMH
20  * desktop index for a window. We cannot use a negative value like -1 since we
21  * need to use uint32_t as we actually need the full range of it. This is
22  * technically dangerous, but it's safe to assume that we will never have more
23  * than 4294967279 workspaces open at a time. */
24 #define NET_WM_DESKTOP_NONE 0xFFFFFFF0
25 #define NET_WM_DESKTOP_ALL 0xFFFFFFFF
26
27 /**
28  * Stores a copy of the name of the last used workspace for the workspace
29  * back-and-forth switching.
30  *
31  */
32 extern char *previous_workspace_name;
33
34 /**
35  * Returns the workspace with the given name or NULL if such a workspace does
36  * not exist.
37  *
38  */
39 Con *get_existing_workspace_by_name(const char *name);
40
41 /**
42  * Returns the workspace with the given number or NULL if such a workspace does
43  * not exist.
44  *
45  */
46 Con *get_existing_workspace_by_num(int num);
47
48 /**
49  * Returns true if the first output assigned to a workspace with the given
50  * workspace assignment is the same as the given output.
51  *
52  */
53 bool output_triggers_assignment(Output *output, struct Workspace_Assignment *assignment);
54
55 /**
56  * Returns a pointer to the workspace with the given number (starting at 0),
57  * creating the workspace if necessary (by allocating the necessary amount of
58  * memory and initializing the data structures correctly).
59  *
60  * If created is not NULL, *created will be set to whether or not the
61  * workspace has just been created.
62  *
63  */
64 Con *workspace_get(const char *num, bool *created);
65
66 /**
67  * Extracts workspace names from keybindings (e.g. “web” from “bindsym $mod+1
68  * workspace web”), so that when an output needs a workspace, i3 can start with
69  * the first configured one. Needs to be called before reorder_bindings() so
70  * that the config-file order is used, not the i3-internal order.
71  *
72  */
73 void extract_workspace_names_from_bindings(void);
74
75 /**
76  * Returns a pointer to a new workspace in the given output. The workspace
77  * is created attached to the tree hierarchy through the given content
78  * container.
79  *
80  */
81 Con *create_workspace_on_output(Output *output, Con *content);
82
83 /**
84  * Returns true if the workspace is currently visible. Especially important for
85  * multi-monitor environments, as they can have multiple currenlty active
86  * workspaces.
87  *
88  */
89 bool workspace_is_visible(Con *ws);
90
91 /**
92  * Switches to the given workspace
93  *
94  */
95 void workspace_show(Con *ws);
96
97 /**
98  * Looks up the workspace by name and switches to it.
99  *
100  */
101 void workspace_show_by_name(const char *num);
102
103 /**
104  * Returns the next workspace.
105  *
106  */
107 Con *workspace_next(void);
108
109 /**
110  * Returns the previous workspace.
111  *
112  */
113 Con *workspace_prev(void);
114
115 /**
116  * Returns the next workspace on the same output
117  *
118  */
119 Con *workspace_next_on_output(void);
120
121 /**
122  * Returns the previous workspace on the same output
123  *
124  */
125 Con *workspace_prev_on_output(void);
126
127 /**
128  * Focuses the previously focused workspace.
129  *
130  */
131 void workspace_back_and_forth(void);
132
133 /**
134  * Returns the previously focused workspace con, or NULL if unavailable.
135  *
136  */
137 Con *workspace_back_and_forth_get(void);
138
139 #if 0
140 /**
141  * Assigns the given workspace to the given screen by correctly updating its
142  * state and reconfiguring all the clients on this workspace.
143  *
144  * This is called when initializing a screen and when re-assigning it to a
145  * different screen which just got available (if you configured it to be on
146  * screen 1 and you just plugged in screen 1).
147  *
148  */
149 void workspace_assign_to(Workspace *ws, Output *screen, bool hide_it);
150
151 /**
152  * Initializes the given workspace if it is not already initialized. The given
153  * screen is to be understood as a fallback, if the workspace itself either
154  * was not assigned to a particular screen or cannot be placed there because
155  * the screen is not attached at the moment.
156  *
157  */
158 void workspace_initialize(Workspace *ws, Output *screen, bool recheck);
159
160 /**
161  * Gets the first unused workspace for the given screen, taking into account
162  * the preferred_screen setting of every workspace (workspace assignments).
163  *
164  */
165 Workspace *get_first_workspace_for_output(Output *screen);
166
167 /**
168  * Unmaps all clients (and stack windows) of the given workspace.
169  *
170  * This needs to be called separately when temporarily rendering a workspace
171  * which is not the active workspace to force reconfiguration of all clients,
172  * like in src/xinerama.c when re-assigning a workspace to another screen.
173  *
174  */
175 void workspace_unmap_clients(xcb_connection_t *conn, Workspace *u_ws);
176
177 /**
178  * Maps all clients (and stack windows) of the given workspace.
179  *
180  */
181 void workspace_map_clients(xcb_connection_t *conn, Workspace *ws);
182 #endif
183
184 /**
185  * Goes through all clients on the given workspace and updates the workspace’s
186  * urgent flag accordingly.
187  *
188  */
189 void workspace_update_urgent_flag(Con *ws);
190
191 /**
192  * 'Forces' workspace orientation by moving all cons into a new split-con with
193  * the same orientation as the workspace and then changing the workspace
194  * orientation.
195  *
196  */
197 void ws_force_orientation(Con *ws, orientation_t orientation);
198
199 /**
200  * Called when a new con (with a window, not an empty or split con) should be
201  * attached to the workspace (for example when managing a new window or when
202  * moving an existing window to the workspace level).
203  *
204  * Depending on the workspace_layout setting, this function either returns the
205  * workspace itself (default layout) or creates a new stacked/tabbed con and
206  * returns that.
207  *
208  */
209 Con *workspace_attach_to(Con *ws);
210
211 /**
212  * Creates a new container and re-parents all of children from the given
213  * workspace into it.
214  *
215  * The container inherits the layout from the workspace.
216  */
217 Con *workspace_encapsulate(Con *ws);
218
219 /**
220  * Move the given workspace to the specified output.
221  * This returns true if and only if moving the workspace was successful.
222  *
223  */
224 bool workspace_move_to_output(Con *ws, Output *output);