aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/container.h7
-rw-r--r--sway/commands/workspace.c10
-rw-r--r--sway/container.c4
-rw-r--r--sway/ipc-json.c3
-rw-r--r--sway/layout.c1
5 files changed, 19 insertions, 6 deletions
diff --git a/include/sway/container.h b/include/sway/container.h
index 215c0b07..67b747a0 100644
--- a/include/sway/container.h
+++ b/include/sway/container.h
@@ -2,6 +2,7 @@
#define _SWAY_CONTAINER_H
#include <sys/types.h>
#include <wlc/wlc.h>
+#include <stdint.h>
#include "list.h"
@@ -58,6 +59,12 @@ struct sway_container {
*/
wlc_handle handle;
+ /**
+ * A unique ID to identify this container. Primarily used in the
+ * get_tree JSON output.
+ */
+ size_t id;
+
enum swayc_types type;
enum swayc_layouts layout;
enum swayc_layouts prev_layout;
diff --git a/sway/commands/workspace.c b/sway/commands/workspace.c
index 5d4d3d65..35224f8a 100644
--- a/sway/commands/workspace.c
+++ b/sway/commands/workspace.c
@@ -5,21 +5,23 @@
#include "sway/workspace.h"
#include "list.h"
#include "log.h"
+#include "stringop.h"
struct cmd_results *cmd_workspace(int argc, char **argv) {
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "workspace", EXPECTED_AT_LEAST, 1))) {
return error;
}
- if (argc == 1 || (argc == 2 && strcasecmp(argv[0], "number") == 0) ) {
+ if (argc == 1 || (argc >= 2 && strcasecmp(argv[0], "number") == 0) ) {
if (config->reading || !config->active) {
return cmd_results_new(CMD_DEFER, "workspace", NULL);
}
- // Handle workspace next/prev
swayc_t *ws = NULL;
- if (argc == 2) {
+ if (argc >= 2) {
if (!(ws = workspace_by_number(argv[1]))) {
- ws = workspace_create(argv[1]);
+ char *name = join_args(argv + 1, argc - 1);
+ ws = workspace_create(name);
+ free(name);
}
} else if (strcasecmp(argv[0], "next") == 0) {
ws = workspace_next();
diff --git a/sway/container.c b/sway/container.c
index 561dcba6..73b627ec 100644
--- a/sway/container.c
+++ b/sway/container.c
@@ -18,8 +18,12 @@
#define ASSERT_NONNULL(PTR) \
sway_assert (PTR, #PTR "must be non-null")
+
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));
+ c->id = next_id++;
c->handle = -1;
c->gaps = -1;
c->layout = L_NONE;
diff --git a/sway/ipc-json.c b/sway/ipc-json.c
index 1ca7f9ce..e08b3c60 100644
--- a/sway/ipc-json.c
+++ b/sway/ipc-json.c
@@ -161,7 +161,6 @@ static void ipc_json_describe_view(swayc_t *c, json_object *object) {
ipc_json_layout_description(c->parent->prev_layout) : "none";
wlc_handle parent = wlc_view_get_parent(c->handle);
- json_object_object_add(object, "id", json_object_new_int(c->handle));
json_object_object_add(object, "type", json_object_new_string((c->is_floating) ? "floating_con" : "con"));
json_object_object_add(object, "scratchpad_state",
@@ -211,7 +210,7 @@ json_object *ipc_json_describe_container(swayc_t *c) {
json_object *object = json_object_new_object();
- json_object_object_add(object, "id", json_object_new_int((uintptr_t)&c));
+ json_object_object_add(object, "id", json_object_new_int((int)c->id));
json_object_object_add(object, "name", (c->name) ? json_object_new_string(c->name) : NULL);
json_object_object_add(object, "rect", ipc_json_create_rect(c));
json_object_object_add(object, "visible", json_object_new_boolean(c->visible));
diff --git a/sway/layout.c b/sway/layout.c
index 7802c412..6012af66 100644
--- a/sway/layout.c
+++ b/sway/layout.c
@@ -22,6 +22,7 @@ int min_sane_h = 60;
int min_sane_w = 100;
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");