]> git.sur5r.net Git - i3/i3/blob - include/workspace.h
Merge pull request #3200 from orestisf1993/_con_move_to_con
[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  * Returns the workspace with the given name or NULL if such a workspace does
29  * not exist.
30  *
31  */
32 Con *get_existing_workspace_by_name(const char *name);
33
34 /**
35  * Returns the workspace with the given number or NULL if such a workspace does
36  * not exist.
37  *
38  */
39 Con *get_existing_workspace_by_num(int num);
40
41 /**
42  * Returns a pointer to the workspace with the given number (starting at 0),
43  * creating the workspace if necessary (by allocating the necessary amount of
44  * memory and initializing the data structures correctly).
45  *
46  * If created is not NULL, *created will be set to whether or not the
47  * workspace has just been created.
48  *
49  */
50 Con *workspace_get(const char *num, bool *created);
51
52 /**
53  * Extracts workspace names from keybindings (e.g. “web” from “bindsym $mod+1
54  * workspace web”), so that when an output needs a workspace, i3 can start with
55  * the first configured one. Needs to be called before reorder_bindings() so
56  * that the config-file order is used, not the i3-internal order.
57  *
58  */
59 void extract_workspace_names_from_bindings(void);
60
61 /**
62  * Returns a pointer to a new workspace in the given output. The workspace
63  * is created attached to the tree hierarchy through the given content
64  * container.
65  *
66  */
67 Con *create_workspace_on_output(Output *output, Con *content);
68
69 /**
70  * Returns true if the workspace is currently visible. Especially important for
71  * multi-monitor environments, as they can have multiple currenlty active
72  * workspaces.
73  *
74  */
75 bool workspace_is_visible(Con *ws);
76
77 /**
78  * Switches to the given workspace
79  *
80  */
81 void workspace_show(Con *ws);
82
83 /**
84  * Looks up the workspace by name and switches to it.
85  *
86  */
87 void workspace_show_by_name(const char *num);
88
89 /**
90  * Returns the next workspace.
91  *
92  */
93 Con *workspace_next(void);
94
95 /**
96  * Returns the previous workspace.
97  *
98  */
99 Con *workspace_prev(void);
100
101 /**
102  * Returns the next workspace on the same output
103  *
104  */
105 Con *workspace_next_on_output(void);
106
107 /**
108  * Returns the previous workspace on the same output
109  *
110  */
111 Con *workspace_prev_on_output(void);
112
113 /**
114  * Focuses the previously focused workspace.
115  *
116  */
117 void workspace_back_and_forth(void);
118
119 /**
120  * Returns the previously focused workspace con, or NULL if unavailable.
121  *
122  */
123 Con *workspace_back_and_forth_get(void);
124
125 #if 0
126 /**
127  * Assigns the given workspace to the given screen by correctly updating its
128  * state and reconfiguring all the clients on this workspace.
129  *
130  * This is called when initializing a screen and when re-assigning it to a
131  * different screen which just got available (if you configured it to be on
132  * screen 1 and you just plugged in screen 1).
133  *
134  */
135 void workspace_assign_to(Workspace *ws, Output *screen, bool hide_it);
136
137 /**
138  * Initializes the given workspace if it is not already initialized. The given
139  * screen is to be understood as a fallback, if the workspace itself either
140  * was not assigned to a particular screen or cannot be placed there because
141  * the screen is not attached at the moment.
142  *
143  */
144 void workspace_initialize(Workspace *ws, Output *screen, bool recheck);
145
146 /**
147  * Gets the first unused workspace for the given screen, taking into account
148  * the preferred_screen setting of every workspace (workspace assignments).
149  *
150  */
151 Workspace *get_first_workspace_for_output(Output *screen);
152
153 /**
154  * Unmaps all clients (and stack windows) of the given workspace.
155  *
156  * This needs to be called separately when temporarily rendering a workspace
157  * which is not the active workspace to force reconfiguration of all clients,
158  * like in src/xinerama.c when re-assigning a workspace to another screen.
159  *
160  */
161 void workspace_unmap_clients(xcb_connection_t *conn, Workspace *u_ws);
162
163 /**
164  * Maps all clients (and stack windows) of the given workspace.
165  *
166  */
167 void workspace_map_clients(xcb_connection_t *conn, Workspace *ws);
168 #endif
169
170 /**
171  * Goes through all clients on the given workspace and updates the workspace’s
172  * urgent flag accordingly.
173  *
174  */
175 void workspace_update_urgent_flag(Con *ws);
176
177 /**
178  * 'Forces' workspace orientation by moving all cons into a new split-con with
179  * the same orientation as the workspace and then changing the workspace
180  * orientation.
181  *
182  */
183 void ws_force_orientation(Con *ws, orientation_t orientation);
184
185 /**
186  * Called when a new con (with a window, not an empty or split con) should be
187  * attached to the workspace (for example when managing a new window or when
188  * moving an existing window to the workspace level).
189  *
190  * Depending on the workspace_layout setting, this function either returns the
191  * workspace itself (default layout) or creates a new stacked/tabbed con and
192  * returns that.
193  *
194  */
195 Con *workspace_attach_to(Con *ws);
196
197 /**
198  * Creates a new container and re-parents all of children from the given
199  * workspace into it.
200  *
201  * The container inherits the layout from the workspace.
202  */
203 Con *workspace_encapsulate(Con *ws);
204
205 /**
206  * Move the given workspace to the specified output.
207  * This returns true if and only if moving the workspace was successful.
208  *
209  */
210 bool workspace_move_to_output(Con *ws, const char *output);