diff --git a/sway/ipc-json.c b/sway/ipc-json.c index cd79e1c8..443b7f13 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -10,6 +10,7 @@ #include "log.h" #include "sway/config.h" #include "sway/ipc-json.h" +#include "sway/layers.h" #include "sway/tree/container.h" #include "sway/tree/view.h" #include "sway/tree/workspace.h" @@ -273,7 +274,8 @@ static json_object *ipc_json_create_node(int id, const char* type, char *name, return object; } -static void ipc_json_describe_wlr_output(struct wlr_output *wlr_output, json_object *object) { +static void ipc_json_describe_wlr_output(struct wlr_output *wlr_output, + struct sway_output *output, json_object *object) { json_object_object_add(object, "primary", json_object_new_boolean(false)); json_object_object_add(object, "make", json_object_new_string(wlr_output->make ? wlr_output->make : "Unknown")); @@ -299,7 +301,7 @@ static void ipc_json_describe_wlr_output(struct wlr_output *wlr_output, json_obj static void ipc_json_describe_output(struct sway_output *output, json_object *object) { - ipc_json_describe_wlr_output(output->wlr_output, object); + ipc_json_describe_wlr_output(output->wlr_output, output, object); } static void ipc_json_describe_enabled_output(struct sway_output *output, @@ -331,6 +333,51 @@ static void ipc_json_describe_enabled_output(struct sway_output *output, json_object_object_add(object, "adaptive_sync_status", json_object_new_string(adaptive_sync_status)); + struct json_object *layers = json_object_new_array(); + size_t len = sizeof(output->layers) / sizeof(output->layers[0]); + for (size_t i = 0; i < len; ++i) { + struct sway_layer_surface *lsurface; + wl_list_for_each(lsurface, &output->layers[i], link) { + json_object *layer = json_object_new_object(); + + json_object_object_add(layer, "namespace", + json_object_new_string(lsurface->layer_surface->namespace)); + + char *layer_name; + switch (lsurface->layer) { + case ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND: + layer_name = "background"; + break; + case ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM: + layer_name = "bottom"; + break; + case ZWLR_LAYER_SHELL_V1_LAYER_TOP: + layer_name = "top"; + break; + case ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY: + layer_name = "overlay"; + break; + } + + json_object_object_add(layer, "layer", + json_object_new_string(layer_name)); + + json_object *extent = json_object_new_object(); + json_object_object_add(extent, "width", + json_object_new_int(lsurface->extent.width)); + json_object_object_add(extent, "height", + json_object_new_int(lsurface->extent.height)); + json_object_object_add(extent, "x", + json_object_new_int(lsurface->extent.x)); + json_object_object_add(extent, "y", + json_object_new_int(lsurface->extent.y)); + json_object_object_add(layer, "extent", extent); + + json_object_array_add(layers, layer); + } + } + json_object_object_add(object, "layer_shell_surfaces", layers); + struct sway_workspace *ws = output_get_active_workspace(output); if (!sway_assert(ws, "Expected output to have a workspace")) { return; @@ -413,7 +460,7 @@ json_object *ipc_json_describe_non_desktop_output(struct sway_output_non_desktop json_object *object = json_object_new_object(); - ipc_json_describe_wlr_output(wlr_output, object); + ipc_json_describe_wlr_output(wlr_output, NULL, object); json_object_object_add(object, "non_desktop", json_object_new_boolean(true)); json_object_object_add(object, "type", json_object_new_string("output")); diff --git a/sway/sway-ipc.7.scd b/sway/sway-ipc.7.scd index f2ab30f7..6e083114 100644 --- a/sway/sway-ipc.7.scd +++ b/sway/sway-ipc.7.scd @@ -230,6 +230,11 @@ following properties: : string : The transform currently in use for the output. This can be _normal_, _90_, _180_, _270_, _flipped-90_, _flipped-180_, or _flipped-270_ +|- layer_shell_surfaces +: array +: An array of all layer-shell surfaces attached to the output. Each object + contains _namespace_, _layer_, and _extent_ object that contains _x_, _y_ + _width_, and _height_ |- current_workspace : string : The workspace currently visible on the output or _null_ for disabled outputs @@ -259,6 +264,28 @@ following properties: "scale": 1.0, "subpixel_hinting": "rgb", "transform": "normal", + "layer_shell_surfaces": [ + { + "namespace": "wallpaper", + "layer": "background", + "extent": { + "width": 2560, + "height": 1440, + "x": 0, + "y": 0 + } + }, + { + "namespace": "waybar", + "layer": "top", + "extent": { + "width": 2548, + "height": 31, + "x": 6, + "y": 6 + } + } + ], "current_workspace": "1", "modes": [ {