Add outputs to the tree

This commit is contained in:
Drew DeVault 2017-11-19 17:04:28 -05:00
parent 733993a651
commit db4fb1c85c
8 changed files with 229 additions and 4 deletions

130
include/sway/container.h Normal file
View file

@ -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

9
include/sway/layout.h Normal file
View file

@ -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

View file

@ -5,9 +5,11 @@
#include <wlr/types/wlr_output.h>
struct sway_server;
struct sway_container;
struct sway_output {
struct wlr_output *wlr_output;
struct sway_container *swayc;
struct sway_server *server;
struct timespec last_frame;
struct wl_listener frame;

View file

@ -14,6 +14,9 @@ add_executable(sway
desktop/output.c
desktop/xdg_shell_v6.c
tree/layout.c
tree/container.c
base64.c
main.c
server.c

View file

@ -5,6 +5,7 @@
#include <wlr/types/wlr_output.h>
#include <wlr/render.h>
#include "log.h"
#include "sway/container.h"
#include "sway/output.h"
#include "sway/server.h"
@ -34,11 +35,10 @@ void output_add_notify(struct wl_listener *listener, void *data) {
struct sway_output *output = calloc(1, sizeof(struct sway_output));
output->wlr_output = wlr_output;
output->server = server;
output->swayc = new_output(output);
output->frame.notify = output_frame_notify;
wl_signal_add(&wlr_output->events.frame, &output->frame);
// TODO: Add to tree
}
void output_remove_notify(struct wl_listener *listener, void *data) {

View file

@ -16,10 +16,11 @@
#include <sys/prctl.h>
#endif
#include "sway/server.h"
#include "sway/layout.h"
#include "ipc-client.h"
#include "log.h"
#include "readline.h"
#include "stringop.h"
#include "log.h"
#include "util.h"
static bool terminate_request = false;
@ -436,7 +437,7 @@ int main(int argc, char **argv) {
return 1;
}
//init_layout();
init_layout();
//ipc_init();
//if (validate) {

45
sway/tree/container.c Normal file
View file

@ -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;
}

35
sway/tree/layout.c Normal file
View file

@ -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);
}
*/
}