mirror of
https://github.com/swaywm/sway.git
synced 2024-12-28 16:06:37 +01:00
Add outputs to the tree
This commit is contained in:
parent
733993a651
commit
db4fb1c85c
8 changed files with 229 additions and 4 deletions
130
include/sway/container.h
Normal file
130
include/sway/container.h
Normal 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
9
include/sway/layout.h
Normal 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
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
45
sway/tree/container.c
Normal 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
35
sway/tree/layout.c
Normal 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);
|
||||
}
|
||||
*/
|
||||
}
|
Loading…
Reference in a new issue