2010-03-27 15:25:51 +01:00
|
|
|
/*
|
|
|
|
* vim:ts=4:sw=4:expandtab
|
2011-10-25 22:19:38 +02:00
|
|
|
*
|
|
|
|
* i3 - an improved dynamic tiling window manager
|
2015-04-04 02:17:56 +02:00
|
|
|
* © 2009 Michael Stapelberg and contributors (see also: LICENSE)
|
2011-10-25 22:19:38 +02:00
|
|
|
*
|
|
|
|
* tree.c: Everything that primarily modifies the layout tree data structure.
|
|
|
|
*
|
2010-03-27 15:25:51 +01:00
|
|
|
*/
|
2013-12-29 03:11:50 +01:00
|
|
|
#pragma once
|
2010-03-27 15:25:51 +01:00
|
|
|
|
|
|
|
extern Con *croot;
|
|
|
|
/* TODO: i am not sure yet how much access to the focused container should
|
|
|
|
* be permitted to source files */
|
|
|
|
extern Con *focused;
|
|
|
|
TAILQ_HEAD(all_cons_head, Con);
|
|
|
|
extern struct all_cons_head all_cons;
|
|
|
|
|
2010-07-13 11:35:05 +02:00
|
|
|
/**
|
|
|
|
* Initializes the tree by creating the root node, adding all RandR outputs
|
|
|
|
* to the tree (that means randr_init() has to be called before) and
|
|
|
|
* assigning a workspace to each RandR output.
|
|
|
|
*
|
|
|
|
*/
|
2011-06-10 18:27:20 +02:00
|
|
|
void tree_init(xcb_get_geometry_reply_t *geometry);
|
2010-07-13 11:35:05 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Opens an empty container in the current container
|
|
|
|
*
|
|
|
|
*/
|
2011-06-02 17:21:38 +02:00
|
|
|
Con *tree_open_con(Con *con, i3Window *window);
|
2010-07-13 11:35:05 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Splits (horizontally or vertically) the given container by creating a new
|
|
|
|
* container which contains the old one and the future ones.
|
|
|
|
*
|
|
|
|
*/
|
2010-03-27 15:25:51 +01:00
|
|
|
void tree_split(Con *con, orientation_t orientation);
|
2010-07-13 11:35:05 +02:00
|
|
|
|
|
|
|
/**
|
2012-05-26 23:36:25 +02:00
|
|
|
* Moves focus one level up. Returns true if focus changed.
|
2010-07-13 11:35:05 +02:00
|
|
|
*
|
|
|
|
*/
|
2012-05-26 23:36:25 +02:00
|
|
|
bool level_up(void);
|
2010-07-13 11:35:05 +02:00
|
|
|
|
|
|
|
/**
|
2012-05-26 23:36:25 +02:00
|
|
|
* Moves focus one level down. Returns true if focus changed.
|
2010-07-13 11:35:05 +02:00
|
|
|
*
|
|
|
|
*/
|
2012-05-26 23:36:25 +02:00
|
|
|
bool level_down(void);
|
2010-07-13 11:35:05 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Renders the tree, that is rendering all outputs using render_con() and
|
|
|
|
* pushing the changes to X11 using x_push_changes().
|
|
|
|
*
|
|
|
|
*/
|
2012-03-31 10:53:04 +02:00
|
|
|
void tree_render(void);
|
2010-07-13 11:35:05 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Changes focus in the given way (next/previous) and given orientation
|
|
|
|
* (horizontal/vertical).
|
|
|
|
*
|
|
|
|
*/
|
2010-03-27 15:25:51 +01:00
|
|
|
void tree_next(char way, orientation_t orientation);
|
2010-07-13 11:35:05 +02:00
|
|
|
|
|
|
|
/**
|
2011-05-11 20:22:47 +02:00
|
|
|
* Closes the given container including all children.
|
|
|
|
* Returns true if the container was killed or false if just WM_DELETE was sent
|
|
|
|
* and the window is expected to kill itself.
|
2010-07-13 11:35:05 +02:00
|
|
|
*
|
2011-09-22 00:28:01 +02:00
|
|
|
* The dont_kill_parent flag is specified when the function calls itself
|
|
|
|
* recursively while deleting a containers children.
|
|
|
|
*
|
|
|
|
* The force_set_focus flag is specified in the case of killing a floating
|
2015-12-28 02:58:35 +01:00
|
|
|
* window: tree_close_internal() will be invoked for the CT_FLOATINGCON (the parent
|
2011-09-22 00:28:01 +02:00
|
|
|
* container) and focus should be set there.
|
|
|
|
*
|
2010-07-13 11:35:05 +02:00
|
|
|
*/
|
2015-12-28 02:58:35 +01:00
|
|
|
bool tree_close_internal(Con *con, kill_window_t kill_window, bool dont_kill_parent, bool force_set_focus);
|
2010-07-13 11:35:05 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Loads tree from ~/.i3/_restart.json (used for in-place restarts).
|
|
|
|
*
|
|
|
|
*/
|
2011-06-10 18:27:20 +02:00
|
|
|
bool tree_restore(const char *path, xcb_get_geometry_reply_t *geometry);
|
2010-03-27 15:25:51 +01:00
|
|
|
|
2011-01-07 22:21:41 +01:00
|
|
|
/**
|
|
|
|
* tree_flatten() removes pairs of redundant split containers, e.g.:
|
|
|
|
* [workspace, horizontal]
|
|
|
|
* [v-split] [child3]
|
|
|
|
* [h-split]
|
|
|
|
* [child1] [child2]
|
|
|
|
* In this example, the v-split and h-split container are redundant.
|
|
|
|
* Such a situation can be created by moving containers in a direction which is
|
|
|
|
* not the orientation of their parent container. i3 needs to create a new
|
|
|
|
* split container then and if you move containers this way multiple times,
|
|
|
|
* redundant chains of split-containers can be the result.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void tree_flatten(Con *child);
|