parent
							
								
									733993a651
								
							
						
					
					
						commit
						db4fb1c85c
					
				| @ -0,0 +1,130 @@ | ||||
| #ifndef _SWAY_CONTAINER_H | ||||
| #define _SWAY_CONTAINER_H | ||||
| #include <stdint.h> | ||||
| #include <sys/types.h> | ||||
| #include <wlr/types/wlr_box.h> | ||||
| #include "list.h" | ||||
| 
 | ||||
| typedef struct sway_container swayc_t; | ||||
| 
 | ||||
| extern swayc_t root_container; | ||||
| 
 | ||||
| struct sway_view; | ||||
| 
 | ||||
| /**
 | ||||
|  * Different kinds of containers. | ||||
|  * | ||||
|  * This enum is in order. A container will never be inside of a container below | ||||
|  * it on this list. | ||||
|  */ | ||||
| enum swayc_types { | ||||
| 	C_ROOT,      /**< The root container. Only one of these ever exists. */ | ||||
| 	C_OUTPUT,    /**< An output (aka monitor, head, etc). */ | ||||
| 	C_WORKSPACE, /**< A workspace. */ | ||||
| 	C_CONTAINER, /**< A manually created container. */ | ||||
| 	C_VIEW,      /**< A view (aka window). */ | ||||
| 
 | ||||
| 	C_TYPES, | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * Different ways to arrange a container. | ||||
|  */ | ||||
| enum swayc_layouts { | ||||
| 	L_NONE,     /**< Used for containers that have no layout (views, root) */ | ||||
| 	L_HORIZ, | ||||
| 	L_VERT, | ||||
| 	L_STACKED, | ||||
| 	L_TABBED, | ||||
| 	L_FLOATING, /**< A psuedo-container, removed from the tree, to hold floating windows */ | ||||
| 
 | ||||
| 	/* Awesome/Monad style auto layouts */ | ||||
| 	L_AUTO_LEFT, | ||||
| 	L_AUTO_RIGHT, | ||||
| 	L_AUTO_TOP, | ||||
| 	L_AUTO_BOTTOM, | ||||
| 
 | ||||
| 	L_AUTO_FIRST = L_AUTO_LEFT, | ||||
| 	L_AUTO_LAST = L_AUTO_BOTTOM, | ||||
| 
 | ||||
| 	// Keep last
 | ||||
| 	L_LAYOUTS, | ||||
| }; | ||||
| 
 | ||||
| enum swayc_border_types { | ||||
| 	B_NONE,   /**< No border */ | ||||
| 	B_PIXEL,  /**< 1px border */ | ||||
| 	B_NORMAL, /**< Normal border with title bar */ | ||||
| }; | ||||
| 
 | ||||
| struct sway_output; | ||||
| struct sway_view; | ||||
| struct wlr_output_layout; | ||||
| 
 | ||||
| /**
 | ||||
|  * Stores information about a container. | ||||
|  * | ||||
|  * The tree is made of these. Views are containers that cannot have children. | ||||
|  */ | ||||
| struct sway_container { | ||||
| 	union { | ||||
| 		// TODO: Encapsulate state for other node types as well like C_CONTAINER
 | ||||
| 		struct wlr_output_layout *output_layout; // C_ROOT
 | ||||
| 		struct sway_output *sway_output;         // C_OUTPUT
 | ||||
| 		struct sway_view *sway_view;             // C_VIEW
 | ||||
| 	}; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * A unique ID to identify this container. Primarily used in the | ||||
| 	 * get_tree JSON output. | ||||
| 	 */ | ||||
| 	size_t id; | ||||
| 
 | ||||
| 	char *name; | ||||
| 
 | ||||
| 	enum swayc_types type; | ||||
| 	enum swayc_layouts layout; | ||||
| 	enum swayc_layouts prev_layout; | ||||
| 	enum swayc_layouts workspace_layout; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * The coordinates that this view appear at, relative to the output they | ||||
| 	 * are located on (output containers have absolute coordinates). | ||||
| 	 */ | ||||
| 	double x, y; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Width and height of this container, without borders or gaps. | ||||
| 	 */ | ||||
| 	double width, height; | ||||
| 
 | ||||
| 	list_t *children; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * The parent of this container. NULL for the root container. | ||||
| 	 */ | ||||
| 	struct sway_container *parent; | ||||
| 	/**
 | ||||
| 	 * Which of this container's children has focus. | ||||
| 	 */ | ||||
| 	struct sway_container *focused; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Number of master views in auto layouts. | ||||
| 	 */ | ||||
| 	size_t nb_master; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Number of slave groups (e.g. columns) in auto layouts. | ||||
| 	 */ | ||||
| 	size_t nb_slave_groups; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * Marks applied to the container, list_t of char*. | ||||
| 	 */ | ||||
| 	list_t *marks; | ||||
| }; | ||||
| 
 | ||||
| swayc_t *new_output(struct sway_output *sway_output); | ||||
| 
 | ||||
| #endif | ||||
| @ -0,0 +1,9 @@ | ||||
| #ifndef _SWAY_LAYOUT_H | ||||
| #define _SWAY_LAYOUT_H | ||||
| 
 | ||||
| struct sway_container; | ||||
| 
 | ||||
| void init_layout(void); | ||||
| void add_child(struct sway_container *parent, struct sway_container *child); | ||||
| 
 | ||||
| #endif | ||||
| @ -0,0 +1,45 @@ | ||||
| #define _POSIX_C_SOURCE 200809L | ||||
| #include <stdint.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "sway/container.h" | ||||
| #include "sway/layout.h" | ||||
| #include "sway/output.h" | ||||
| 
 | ||||
| static swayc_t *new_swayc(enum swayc_types type) { | ||||
| 	// next id starts at 1 because 0 is assigned to root_container in layout.c
 | ||||
| 	static size_t next_id = 1; | ||||
| 	swayc_t *c = calloc(1, sizeof(swayc_t)); | ||||
| 	if (!c) { | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	c->id = next_id++; | ||||
| 	c->layout = L_NONE; | ||||
| 	c->workspace_layout = L_NONE; | ||||
| 	c->type = type; | ||||
| 	c->nb_master = 1; | ||||
| 	c->nb_slave_groups = 1; | ||||
| 	if (type != C_VIEW) { | ||||
| 		c->children = create_list(); | ||||
| 	} | ||||
| 	return c; | ||||
| } | ||||
| 
 | ||||
| swayc_t *new_output(struct sway_output *sway_output) { | ||||
| 	struct wlr_box size; | ||||
| 	wlr_output_effective_resolution(sway_output->wlr_output, | ||||
| 			&size.width, &size.height); | ||||
| 	const char *name = sway_output->wlr_output->name; | ||||
| 
 | ||||
| 	swayc_t *output = new_swayc(C_OUTPUT); | ||||
| 	output->sway_output = sway_output; | ||||
| 	output->name = name ? strdup(name) : NULL; | ||||
| 	output->width = size.width; | ||||
| 	output->height = size.width; | ||||
| 
 | ||||
| 	add_child(&root_container, output); | ||||
| 
 | ||||
| 	// TODO: Create workspace
 | ||||
| 
 | ||||
| 	return output; | ||||
| } | ||||
| @ -0,0 +1,35 @@ | ||||
| #define _POSIX_C_SOURCE 200809L | ||||
| #include <stdbool.h> | ||||
| #include <string.h> | ||||
| #include <wlr/types/wlr_output_layout.h> | ||||
| #include "sway/container.h" | ||||
| #include "list.h" | ||||
| #include "log.h" | ||||
| 
 | ||||
| swayc_t root_container; | ||||
| 
 | ||||
| void init_layout(void) { | ||||
| 	root_container.id = 0; // normally assigned in new_swayc()
 | ||||
| 	root_container.type = C_ROOT; | ||||
| 	root_container.layout = L_NONE; | ||||
| 	root_container.name = strdup("root"); | ||||
| 	root_container.children = create_list(); | ||||
| 	root_container.output_layout = wlr_output_layout_create(); | ||||
| } | ||||
| 
 | ||||
| void add_child(swayc_t *parent, swayc_t *child) { | ||||
| 	sway_log(L_DEBUG, "Adding %p (%d, %fx%f) to %p (%d, %fx%f)", | ||||
| 			child, child->type, child->width, child->height, | ||||
| 			parent, parent->type, parent->width, parent->height); | ||||
| 	list_add(parent->children, child); | ||||
| 	child->parent = parent; | ||||
| 	// set focus for this container
 | ||||
| 	if (!parent->focused) { | ||||
| 		parent->focused = child; | ||||
| 	} | ||||
| 	/* TODO WLR
 | ||||
| 	if (parent->type == C_WORKSPACE && child->type == C_VIEW && (parent->workspace_layout == L_TABBED || parent->workspace_layout == L_STACKED)) { | ||||
| 		child = new_container(child, parent->workspace_layout); | ||||
| 	} | ||||
| 	*/ | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue