mirror of
https://github.com/swaywm/sway.git
synced 2026-04-25 06:46:24 -04:00
sway 1.5.1
This is a bugfix release which adds support for wlroots 0.12.0.
Simon Ser (2):
build: bump wlroots dependency to 0.12.0
build: bump version to 1.5.1
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEENP+VJs/vDpejQOLkD9574OiPXkgFAl+qxYUACgkQD9574OiP
Xki2BBAAusN/5OJQfNQZ5UWVDff4ZRcp5Lty8xgloLtSFm8Rn2FRhaJjP1p+dsiw
2NBmoixnds/ziRMpyR/82HxQBpHXE/Zm73lamvQ695QwyFU1EcCaicMZrHAEl5op
b+ZySCH1zEEyZU5ltN1buVerkG0QM70aFjTau6h7BAfbVPJymTmSvXssIhdGt6Mb
RdHtxoDn++D4UmHDkt7+YznHnOskyw8SKHcbW2oVpf65a0NKyDhUnFV2mLCX89+u
zDC+3IDw+FV+Bu8bZHOxfgs1lkbnxD1DGCKf3v/n8BOvOxykygbS3ZMN2g907jmN
TDXpIOevL3b5OqDs3kMQayIPxCVpt9Iqqlkg6K99b2d4SgmjzNuHMFOp81u+nIre
U/RwO20U94fYWA2yut1MrtlMm0b12OTNoQYxQJZCzrIJuStmJ6rqonoJEFdfj7g6
wR3SdVkGEaBGzDjZTZVFibgt67TiSQc0RMaGEK5zi1wFnmKLR/O4cZvI1fOXUr5V
aVEuhlTeHjcUJTPKmFYiKxcz71260pyvy2VRIYcs3cke+086p5ZLMIgVZ7uEDm7x
40CH5i40Lb0J/acruMgEzZF6U0AmJyJmy37NF914v8Zc4uzjX8LX9J4GIZ93bcZd
PUvD/KfNOJi8eS7SMimjSbwo1yT7nTkCwXOXpqGNRdlhCM2XFFY=
=e4ID
-----END PGP SIGNATURE-----
Merge tag '1.5.1' into color-profiles
sway 1.5.1
This is a bugfix release which adds support for wlroots 0.12.0.
Simon Ser (2):
build: bump wlroots dependency to 0.12.0
build: bump version to 1.5.1
This commit is contained in:
commit
8a7f4d5333
10 changed files with 84 additions and 56 deletions
43
config.in
43
config.in
|
|
@ -37,8 +37,7 @@ output * bg @datadir@/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill
|
||||||
#
|
#
|
||||||
# exec swayidle -w \
|
# exec swayidle -w \
|
||||||
# timeout 300 'swaylock -f -c 000000' \
|
# timeout 300 'swaylock -f -c 000000' \
|
||||||
# timeout 600 'swaymsg "output * dpms off"' \
|
# timeout 600 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' \
|
||||||
# resume 'swaymsg "output * dpms on"' \
|
|
||||||
# before-sleep 'swaylock -f -c 000000'
|
# before-sleep 'swaylock -f -c 000000'
|
||||||
#
|
#
|
||||||
# This will lock your screen after 300 seconds of inactivity, then turn off
|
# This will lock your screen after 300 seconds of inactivity, then turn off
|
||||||
|
|
@ -112,27 +111,27 @@ output * bg @datadir@/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill
|
||||||
# Workspaces:
|
# Workspaces:
|
||||||
#
|
#
|
||||||
# Switch to workspace
|
# Switch to workspace
|
||||||
bindsym $mod+1 workspace 1
|
bindsym $mod+1 workspace number 1
|
||||||
bindsym $mod+2 workspace 2
|
bindsym $mod+2 workspace number 2
|
||||||
bindsym $mod+3 workspace 3
|
bindsym $mod+3 workspace number 3
|
||||||
bindsym $mod+4 workspace 4
|
bindsym $mod+4 workspace number 4
|
||||||
bindsym $mod+5 workspace 5
|
bindsym $mod+5 workspace number 5
|
||||||
bindsym $mod+6 workspace 6
|
bindsym $mod+6 workspace number 6
|
||||||
bindsym $mod+7 workspace 7
|
bindsym $mod+7 workspace number 7
|
||||||
bindsym $mod+8 workspace 8
|
bindsym $mod+8 workspace number 8
|
||||||
bindsym $mod+9 workspace 9
|
bindsym $mod+9 workspace number 9
|
||||||
bindsym $mod+0 workspace 10
|
bindsym $mod+0 workspace number 10
|
||||||
# Move focused container to workspace
|
# Move focused container to workspace
|
||||||
bindsym $mod+Shift+1 move container to workspace 1
|
bindsym $mod+Shift+1 move container to workspace number 1
|
||||||
bindsym $mod+Shift+2 move container to workspace 2
|
bindsym $mod+Shift+2 move container to workspace number 2
|
||||||
bindsym $mod+Shift+3 move container to workspace 3
|
bindsym $mod+Shift+3 move container to workspace number 3
|
||||||
bindsym $mod+Shift+4 move container to workspace 4
|
bindsym $mod+Shift+4 move container to workspace number 4
|
||||||
bindsym $mod+Shift+5 move container to workspace 5
|
bindsym $mod+Shift+5 move container to workspace number 5
|
||||||
bindsym $mod+Shift+6 move container to workspace 6
|
bindsym $mod+Shift+6 move container to workspace number 6
|
||||||
bindsym $mod+Shift+7 move container to workspace 7
|
bindsym $mod+Shift+7 move container to workspace number 7
|
||||||
bindsym $mod+Shift+8 move container to workspace 8
|
bindsym $mod+Shift+8 move container to workspace number 8
|
||||||
bindsym $mod+Shift+9 move container to workspace 9
|
bindsym $mod+Shift+9 move container to workspace number 9
|
||||||
bindsym $mod+Shift+0 move container to workspace 10
|
bindsym $mod+Shift+0 move container to workspace number 10
|
||||||
# Note: workspaces can have any name you want, not just numbers.
|
# Note: workspaces can have any name you want, not just numbers.
|
||||||
# We just use 1-10 as the default.
|
# We just use 1-10 as the default.
|
||||||
#
|
#
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,10 @@ if [ "$ACTION" = "check" ] ; then
|
||||||
exit
|
exit
|
||||||
elif [ "$SUBJECT" = "area" ] ; then
|
elif [ "$SUBJECT" = "area" ] ; then
|
||||||
GEOM=$(slurp -d)
|
GEOM=$(slurp -d)
|
||||||
|
# Check if user exited slurp without selecting the area
|
||||||
|
if [ -z "$GEOM" ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
WHAT="Area"
|
WHAT="Area"
|
||||||
elif [ "$SUBJECT" = "active" ] ; then
|
elif [ "$SUBJECT" = "active" ] ; then
|
||||||
FOCUSED=$(swaymsg -t get_tree | jq -r 'recurse(.nodes[]?, .floating_nodes[]?) | select(.focused)')
|
FOCUSED=$(swaymsg -t get_tree | jq -r 'recurse(.nodes[]?, .floating_nodes[]?) | select(.focused)')
|
||||||
|
|
@ -126,6 +130,10 @@ elif [ "$SUBJECT" = "output" ] ; then
|
||||||
WHAT="$OUTPUT"
|
WHAT="$OUTPUT"
|
||||||
elif [ "$SUBJECT" = "window" ] ; then
|
elif [ "$SUBJECT" = "window" ] ; then
|
||||||
GEOM=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | slurp)
|
GEOM=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | slurp)
|
||||||
|
# Check if user exited slurp without selecting the area
|
||||||
|
if [ -z "$GEOM" ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
WHAT="Window"
|
WHAT="Window"
|
||||||
else
|
else
|
||||||
die "Unknown subject to take a screen shot from" "$SUBJECT"
|
die "Unknown subject to take a screen shot from" "$SUBJECT"
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ struct sway_output {
|
||||||
// last applied mode when the output is DPMS'ed
|
// last applied mode when the output is DPMS'ed
|
||||||
struct wlr_output_mode *current_mode;
|
struct wlr_output_mode *current_mode;
|
||||||
|
|
||||||
bool enabled, configured;
|
bool enabling, enabled;
|
||||||
list_t *workspaces;
|
list_t *workspaces;
|
||||||
|
|
||||||
struct sway_output_state current;
|
struct sway_output_state current;
|
||||||
|
|
@ -99,7 +99,7 @@ struct sway_output *all_output_by_name_or_id(const char *name_or_id);
|
||||||
|
|
||||||
void output_sort_workspaces(struct sway_output *output);
|
void output_sort_workspaces(struct sway_output *output);
|
||||||
|
|
||||||
void output_configure(struct sway_output *output);
|
void output_enable(struct sway_output *output);
|
||||||
|
|
||||||
void output_disable(struct sway_output *output);
|
void output_disable(struct sway_output *output);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
project(
|
project(
|
||||||
'sway',
|
'sway',
|
||||||
'c',
|
'c',
|
||||||
version: 'v1.5-rc2', #release_version
|
version: '1.5.1', #release_version
|
||||||
license: 'MIT',
|
license: 'MIT',
|
||||||
meson_version: '>=0.53.0',
|
meson_version: '>=0.53.0',
|
||||||
default_options: [
|
default_options: [
|
||||||
|
|
@ -60,7 +60,7 @@ math = cc.find_library('m')
|
||||||
rt = cc.find_library('rt')
|
rt = cc.find_library('rt')
|
||||||
|
|
||||||
# Try first to find wlroots as a subproject, then as a system dependency
|
# Try first to find wlroots as a subproject, then as a system dependency
|
||||||
wlroots_version = ['>=0.10.0', '<0.11.0']
|
wlroots_version = ['>=0.12.0', '<0.13.0']
|
||||||
wlroots_proj = subproject(
|
wlroots_proj = subproject(
|
||||||
'wlroots',
|
'wlroots',
|
||||||
default_options: ['examples=false'],
|
default_options: ['examples=false'],
|
||||||
|
|
|
||||||
|
|
@ -401,17 +401,8 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
|
||||||
|
|
||||||
struct wlr_output *wlr_output = output->wlr_output;
|
struct wlr_output *wlr_output = output->wlr_output;
|
||||||
|
|
||||||
bool was_enabled = output->enabled;
|
// Flag to prevent the output mode event handler from calling us
|
||||||
if (oc && !oc->enabled) {
|
output->enabling = (!oc || oc->enabled);
|
||||||
// Output is configured to be disabled
|
|
||||||
sway_log(SWAY_DEBUG, "Disabling output %s", oc->name);
|
|
||||||
if (output->enabled) {
|
|
||||||
output_disable(output);
|
|
||||||
wlr_output_layout_remove(root->output_layout, wlr_output);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
output->enabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
queue_output_config(oc, output);
|
queue_output_config(oc, output);
|
||||||
|
|
||||||
|
|
@ -425,11 +416,18 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
|
||||||
// Leave the output disabled for now and try again when the output gets
|
// Leave the output disabled for now and try again when the output gets
|
||||||
// the mode we asked for.
|
// the mode we asked for.
|
||||||
sway_log(SWAY_ERROR, "Failed to commit output %s", wlr_output->name);
|
sway_log(SWAY_ERROR, "Failed to commit output %s", wlr_output->name);
|
||||||
output->enabled = was_enabled;
|
output->enabling = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
output->enabling = false;
|
||||||
|
|
||||||
if (oc && !oc->enabled) {
|
if (oc && !oc->enabled) {
|
||||||
|
sway_log(SWAY_DEBUG, "Disabling output %s", oc->name);
|
||||||
|
if (output->enabled) {
|
||||||
|
output_disable(output);
|
||||||
|
wlr_output_layout_remove(root->output_layout, wlr_output);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -472,8 +470,8 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
|
||||||
output->width = output_box->width;
|
output->width = output_box->width;
|
||||||
output->height = output_box->height;
|
output->height = output_box->height;
|
||||||
|
|
||||||
if (!output->configured) {
|
if (!output->enabled) {
|
||||||
output_configure(output);
|
output_enable(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oc && oc->max_render_time >= 0) {
|
if (oc && oc->max_render_time >= 0) {
|
||||||
|
|
|
||||||
|
|
@ -844,7 +844,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
|
||||||
|
|
||||||
static void handle_mode(struct wl_listener *listener, void *data) {
|
static void handle_mode(struct wl_listener *listener, void *data) {
|
||||||
struct sway_output *output = wl_container_of(listener, output, mode);
|
struct sway_output *output = wl_container_of(listener, output, mode);
|
||||||
if (!output->configured && !output->enabled) {
|
if (!output->enabled && !output->enabling) {
|
||||||
struct output_config *oc = find_output_config(output);
|
struct output_config *oc = find_output_config(output);
|
||||||
if (output->wlr_output->current_mode != NULL &&
|
if (output->wlr_output->current_mode != NULL &&
|
||||||
(!oc || oc->enabled)) {
|
(!oc || oc->enabled)) {
|
||||||
|
|
@ -857,7 +857,7 @@ static void handle_mode(struct wl_listener *listener, void *data) {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!output->enabled || !output->configured) {
|
if (!output->enabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
arrange_layers(output);
|
arrange_layers(output);
|
||||||
|
|
@ -869,7 +869,7 @@ static void handle_mode(struct wl_listener *listener, void *data) {
|
||||||
|
|
||||||
static void handle_transform(struct wl_listener *listener, void *data) {
|
static void handle_transform(struct wl_listener *listener, void *data) {
|
||||||
struct sway_output *output = wl_container_of(listener, output, transform);
|
struct sway_output *output = wl_container_of(listener, output, transform);
|
||||||
if (!output->enabled || !output->configured) {
|
if (!output->enabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
arrange_layers(output);
|
arrange_layers(output);
|
||||||
|
|
@ -886,7 +886,7 @@ static void update_textures(struct sway_container *con, void *data) {
|
||||||
|
|
||||||
static void handle_scale(struct wl_listener *listener, void *data) {
|
static void handle_scale(struct wl_listener *listener, void *data) {
|
||||||
struct sway_output *output = wl_container_of(listener, output, scale);
|
struct sway_output *output = wl_container_of(listener, output, scale);
|
||||||
if (!output->enabled || !output->configured) {
|
if (!output->enabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
arrange_layers(output);
|
arrange_layers(output);
|
||||||
|
|
|
||||||
|
|
@ -360,6 +360,11 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data)
|
||||||
transaction_commit_dirty();
|
transaction_commit_dirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_request_maximize(struct wl_listener *listener, void *data) {
|
||||||
|
struct wlr_xdg_surface *surface = data;
|
||||||
|
wlr_xdg_surface_schedule_configure(surface);
|
||||||
|
}
|
||||||
|
|
||||||
static void handle_request_move(struct wl_listener *listener, void *data) {
|
static void handle_request_move(struct wl_listener *listener, void *data) {
|
||||||
struct sway_xdg_shell_view *xdg_shell_view =
|
struct sway_xdg_shell_view *xdg_shell_view =
|
||||||
wl_container_of(listener, xdg_shell_view, request_move);
|
wl_container_of(listener, xdg_shell_view, request_move);
|
||||||
|
|
@ -402,6 +407,7 @@ static void handle_unmap(struct wl_listener *listener, void *data) {
|
||||||
wl_list_remove(&xdg_shell_view->commit.link);
|
wl_list_remove(&xdg_shell_view->commit.link);
|
||||||
wl_list_remove(&xdg_shell_view->new_popup.link);
|
wl_list_remove(&xdg_shell_view->new_popup.link);
|
||||||
wl_list_remove(&xdg_shell_view->request_fullscreen.link);
|
wl_list_remove(&xdg_shell_view->request_fullscreen.link);
|
||||||
|
wl_list_remove(&xdg_shell_view->request_maximize.link);
|
||||||
wl_list_remove(&xdg_shell_view->request_move.link);
|
wl_list_remove(&xdg_shell_view->request_move.link);
|
||||||
wl_list_remove(&xdg_shell_view->request_resize.link);
|
wl_list_remove(&xdg_shell_view->request_resize.link);
|
||||||
wl_list_remove(&xdg_shell_view->set_title.link);
|
wl_list_remove(&xdg_shell_view->set_title.link);
|
||||||
|
|
@ -450,6 +456,10 @@ static void handle_map(struct wl_listener *listener, void *data) {
|
||||||
wl_signal_add(&xdg_surface->toplevel->events.request_fullscreen,
|
wl_signal_add(&xdg_surface->toplevel->events.request_fullscreen,
|
||||||
&xdg_shell_view->request_fullscreen);
|
&xdg_shell_view->request_fullscreen);
|
||||||
|
|
||||||
|
xdg_shell_view->request_maximize.notify = handle_request_maximize;
|
||||||
|
wl_signal_add(&xdg_surface->toplevel->events.request_maximize,
|
||||||
|
&xdg_shell_view->request_maximize);
|
||||||
|
|
||||||
xdg_shell_view->request_move.notify = handle_request_move;
|
xdg_shell_view->request_move.notify = handle_request_move;
|
||||||
wl_signal_add(&xdg_surface->toplevel->events.request_move,
|
wl_signal_add(&xdg_surface->toplevel->events.request_move,
|
||||||
&xdg_shell_view->request_move);
|
&xdg_shell_view->request_move);
|
||||||
|
|
|
||||||
|
|
@ -99,8 +99,8 @@ struct sway_node *node_at_coords(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
struct sway_output *output = wlr_output->data;
|
struct sway_output *output = wlr_output->data;
|
||||||
if (!output || !output->configured) {
|
if (!output || !output->enabled) {
|
||||||
// output is being destroyed or is being configured
|
// output is being destroyed or is being enabled
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
double ox = lx, oy = ly;
|
double ox = lx, oy = ly;
|
||||||
|
|
@ -1244,6 +1244,10 @@ static void warp_to_constraint_cursor_hint(struct sway_cursor *cursor) {
|
||||||
double ly = sy + con->content_y - view->geometry.y;
|
double ly = sy + con->content_y - view->geometry.y;
|
||||||
|
|
||||||
wlr_cursor_warp(cursor->cursor, NULL, lx, ly);
|
wlr_cursor_warp(cursor->cursor, NULL, lx, ly);
|
||||||
|
|
||||||
|
// Warp the pointer as well, so that on the next pointer rebase we don't
|
||||||
|
// send an unexpected synthetic motion event to clients.
|
||||||
|
wlr_seat_pointer_warp(constraint->seat, sx, sy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -110,12 +110,12 @@ struct sway_output *output_create(struct wlr_output *wlr_output) {
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
void output_configure(struct sway_output *output) {
|
void output_enable(struct sway_output *output) {
|
||||||
if (!sway_assert(!output->configured, "output is already configured")) {
|
if (!sway_assert(!output->enabled, "output is already enabled")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
struct wlr_output *wlr_output = output->wlr_output;
|
struct wlr_output *wlr_output = output->wlr_output;
|
||||||
output->configured = true;
|
output->enabled = true;
|
||||||
list_add(root->outputs, output);
|
list_add(root->outputs, output);
|
||||||
|
|
||||||
restore_workspaces(output);
|
restore_workspaces(output);
|
||||||
|
|
@ -251,6 +251,11 @@ void output_disable(struct sway_output *output) {
|
||||||
if (!sway_assert(output->enabled, "Expected an enabled output")) {
|
if (!sway_assert(output->enabled, "Expected an enabled output")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int index = list_find(root->outputs, output);
|
||||||
|
if (!sway_assert(index >= 0, "Output not found in root node")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
sway_log(SWAY_DEBUG, "Disabling output '%s'", output->wlr_output->name);
|
sway_log(SWAY_DEBUG, "Disabling output '%s'", output->wlr_output->name);
|
||||||
wl_signal_emit(&output->events.destroy, output);
|
wl_signal_emit(&output->events.destroy, output);
|
||||||
|
|
||||||
|
|
@ -258,11 +263,9 @@ void output_disable(struct sway_output *output) {
|
||||||
|
|
||||||
root_for_each_container(untrack_output, output);
|
root_for_each_container(untrack_output, output);
|
||||||
|
|
||||||
int index = list_find(root->outputs, output);
|
|
||||||
list_del(root->outputs, index);
|
list_del(root->outputs, index);
|
||||||
|
|
||||||
output->enabled = false;
|
output->enabled = false;
|
||||||
output->configured = false;
|
|
||||||
output->current_mode = NULL;
|
output->current_mode = NULL;
|
||||||
|
|
||||||
arrange_root();
|
arrange_root();
|
||||||
|
|
|
||||||
|
|
@ -44,12 +44,18 @@ _swaymsg_ [options...] [message]
|
||||||
The message is a sway command (the same commands you can bind to keybindings
|
The message is a sway command (the same commands you can bind to keybindings
|
||||||
in your sway config file). It will be executed immediately.
|
in your sway config file). It will be executed immediately.
|
||||||
|
|
||||||
See **sway**(5) for a list of commands.
|
See *sway*(5) for a list of commands.
|
||||||
|
|
||||||
Tip: If you are proving a command that contains a leading hyphen (_-_),
|
Tips:
|
||||||
insert two hyphens (_--_) before the command to signal to swaymsg not to
|
- Command expansion is performed twice: once by swaymsg, and again by sway.
|
||||||
parse anything beyond that point as an option. For example, use
|
If you have quoted multi-word strings in your command, enclose the entire
|
||||||
_swaymsg -- mark --add test_ instead of _swaymsg mark --add test_
|
command in single-quotes. For example, use
|
||||||
|
_swaymsg 'output "Foobar Display" enable'_ instead of
|
||||||
|
_swaymsg output "Foobar Display" enable_.
|
||||||
|
- If you are proving a command that contains a leading hyphen (_-_), insert
|
||||||
|
two hyphens (_--_) before the command to signal to swaymsg not to parse
|
||||||
|
anything beyond that point as an option. For example, use
|
||||||
|
_swaymsg -- mark --add test_ instead of _swaymsg mark --add test_.
|
||||||
|
|
||||||
*get\_workspaces*
|
*get\_workspaces*
|
||||||
Gets a JSON-encoded list of workspaces and their status.
|
Gets a JSON-encoded list of workspaces and their status.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue