mirror of
https://github.com/swaywm/sway.git
synced 2024-12-29 08:26:45 +01:00
Add workspace to outputs
This commit is contained in:
parent
68036018c8
commit
aeda2e077f
7 changed files with 104 additions and 5 deletions
|
@ -126,5 +126,6 @@ struct sway_container {
|
||||||
};
|
};
|
||||||
|
|
||||||
swayc_t *new_output(struct sway_output *sway_output);
|
swayc_t *new_output(struct sway_output *sway_output);
|
||||||
|
swayc_t *new_workspace(swayc_t *output, const char *name);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -5,5 +5,7 @@ struct sway_container;
|
||||||
|
|
||||||
void init_layout(void);
|
void init_layout(void);
|
||||||
void add_child(struct sway_container *parent, struct sway_container *child);
|
void add_child(struct sway_container *parent, struct sway_container *child);
|
||||||
|
enum swayc_layouts default_layout(struct sway_container *output);
|
||||||
|
void sort_workspaces(struct sway_container *output);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
6
include/sway/workspace.h
Normal file
6
include/sway/workspace.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef _SWAY_WORKSPACE_H
|
||||||
|
#define _SWAY_WORKSPACE_H
|
||||||
|
|
||||||
|
char *workspace_next_name(const char *output_name);
|
||||||
|
|
||||||
|
#endif
|
|
@ -14,8 +14,9 @@ add_executable(sway
|
||||||
desktop/output.c
|
desktop/output.c
|
||||||
desktop/xdg_shell_v6.c
|
desktop/xdg_shell_v6.c
|
||||||
|
|
||||||
tree/layout.c
|
|
||||||
tree/container.c
|
tree/container.c
|
||||||
|
tree/layout.c
|
||||||
|
tree/workspace.c
|
||||||
|
|
||||||
base64.c
|
base64.c
|
||||||
main.c
|
main.c
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include "sway/container.h"
|
#include "sway/container.h"
|
||||||
#include "sway/layout.h"
|
#include "sway/layout.h"
|
||||||
#include "sway/output.h"
|
#include "sway/output.h"
|
||||||
|
#include "sway/workspace.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
static swayc_t *new_swayc(enum swayc_types type) {
|
static swayc_t *new_swayc(enum swayc_types type) {
|
||||||
// next id starts at 1 because 0 is assigned to root_container in layout.c
|
// next id starts at 1 because 0 is assigned to root_container in layout.c
|
||||||
|
@ -27,8 +29,8 @@ static swayc_t *new_swayc(enum swayc_types type) {
|
||||||
|
|
||||||
swayc_t *new_output(struct sway_output *sway_output) {
|
swayc_t *new_output(struct sway_output *sway_output) {
|
||||||
struct wlr_box size;
|
struct wlr_box size;
|
||||||
wlr_output_effective_resolution(sway_output->wlr_output,
|
wlr_output_effective_resolution(
|
||||||
&size.width, &size.height);
|
sway_output->wlr_output, &size.width, &size.height);
|
||||||
const char *name = sway_output->wlr_output->name;
|
const char *name = sway_output->wlr_output->name;
|
||||||
|
|
||||||
swayc_t *output = new_swayc(C_OUTPUT);
|
swayc_t *output = new_swayc(C_OUTPUT);
|
||||||
|
@ -39,7 +41,31 @@ swayc_t *new_output(struct sway_output *sway_output) {
|
||||||
|
|
||||||
add_child(&root_container, output);
|
add_child(&root_container, output);
|
||||||
|
|
||||||
// TODO: Create workspace
|
// Create workspace
|
||||||
|
char *ws_name = workspace_next_name(output->name);
|
||||||
|
sway_log(L_DEBUG, "Creating default workspace %s", ws_name);
|
||||||
|
new_workspace(output, ws_name);
|
||||||
|
free(ws_name);
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
swayc_t *new_workspace(swayc_t *output, const char *name) {
|
||||||
|
if (!sway_assert(output, "new_workspace called with null output")) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
sway_log(L_DEBUG, "Added workspace %s for output %s", name, output->name);
|
||||||
|
swayc_t *workspace = new_swayc(C_WORKSPACE);
|
||||||
|
|
||||||
|
workspace->x = output->x;
|
||||||
|
workspace->y = output->y;
|
||||||
|
workspace->width = output->width;
|
||||||
|
workspace->height = output->height;
|
||||||
|
workspace->name = !name ? NULL : strdup(name);
|
||||||
|
workspace->prev_layout = L_NONE;
|
||||||
|
workspace->layout = default_layout(output);
|
||||||
|
workspace->workspace_layout = default_layout(output);
|
||||||
|
|
||||||
|
add_child(output, workspace);
|
||||||
|
sort_workspaces(output);
|
||||||
|
return workspace;
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#define _POSIX_C_SOURCE 200809L
|
#define _POSIX_C_SOURCE 200809L
|
||||||
|
#include <ctype.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <wlr/types/wlr_output_layout.h>
|
#include <wlr/types/wlr_output_layout.h>
|
||||||
#include "sway/container.h"
|
#include "sway/container.h"
|
||||||
|
@ -33,3 +35,38 @@ void add_child(swayc_t *parent, swayc_t *child) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum swayc_layouts default_layout(swayc_t *output) {
|
||||||
|
/* TODO WLR
|
||||||
|
if (config->default_layout != L_NONE) {
|
||||||
|
//return config->default_layout;
|
||||||
|
} else if (config->default_orientation != L_NONE) {
|
||||||
|
return config->default_orientation;
|
||||||
|
} else */if (output->width >= output->height) {
|
||||||
|
return L_HORIZ;
|
||||||
|
} else {
|
||||||
|
return L_VERT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sort_workspace_cmp_qsort(const void *_a, const void *_b) {
|
||||||
|
swayc_t *a = *(void **)_a;
|
||||||
|
swayc_t *b = *(void **)_b;
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
|
if (isdigit(a->name[0]) && isdigit(b->name[0])) {
|
||||||
|
int a_num = strtol(a->name, NULL, 10);
|
||||||
|
int b_num = strtol(b->name, NULL, 10);
|
||||||
|
retval = (a_num < b_num) ? -1 : (a_num > b_num);
|
||||||
|
} else if (isdigit(a->name[0])) {
|
||||||
|
retval = -1;
|
||||||
|
} else if (isdigit(b->name[0])) {
|
||||||
|
retval = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sort_workspaces(swayc_t *output) {
|
||||||
|
list_stable_sort(output->children, sort_workspace_cmp_qsort);
|
||||||
|
}
|
||||||
|
|
26
sway/tree/workspace.c
Normal file
26
sway/tree/workspace.c
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#define _XOPEN_SOURCE 500
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "sway/container.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
void next_name_map(swayc_t *ws, void *data) {
|
||||||
|
int *count = data;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *workspace_next_name(const char *output_name) {
|
||||||
|
sway_log(L_DEBUG, "Workspace: Generating new workspace name for output %s",
|
||||||
|
output_name);
|
||||||
|
int count = 0;
|
||||||
|
next_name_map(&root_container, &count);
|
||||||
|
++count;
|
||||||
|
int len = snprintf(NULL, 0, "%d", count);
|
||||||
|
char *name = malloc(len + 1);
|
||||||
|
if (!sway_assert(name, "Failed to allocate workspace name")) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
snprintf(name, len + 1, "%d", count);
|
||||||
|
return name;
|
||||||
|
}
|
Loading…
Reference in a new issue