This commit is contained in:
Johan Malm 2026-04-08 16:04:14 +02:00 committed by GitHub
commit 393fe2fd7d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 123 additions and 1 deletions

View file

@ -424,6 +424,11 @@ Actions are used in menus and keyboard/mouse bindings.
Toggle the screen magnifier on or off at the last magnification level
used.
*<action name="ToggleShowDesktop" />*
Hide all windows in the current workspace so that the desktop is visible. On
calling the action again the hidden windows are un-minimized, as long as no
windows were un-minimized in the meantime.
*<action name="ZoomIn">*++
*<action name="ZoomOut">*
Increase or decrease the magnification level for the screen magnifier.

9
include/show-desktop.h Normal file
View file

@ -0,0 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_SHOW_DESKTOP_H
#define LABWC_SHOW_DESKTOP_H
void show_desktop_toggle(void);
void show_desktop_reset(void);
void show_desktop_finish(void);
#endif /* LABWC_SHOW_DESKTOP_H */

View file

@ -487,6 +487,7 @@ void view_resize_relative(struct view *view,
void view_move_relative(struct view *view, int x, int y);
void view_move(struct view *view, int x, int y);
void view_moved(struct view *view);
void view_minimize_no_show_desktop_reset(struct view *view, bool minimized);
void view_minimize(struct view *view, bool minimized);
bool view_compute_centered_position(struct view *view,
const struct wlr_box *ref, int w, int h, int *x, int *y);

View file

@ -27,6 +27,7 @@
#include "output.h"
#include "output-virtual.h"
#include "regions.h"
#include "show-desktop.h"
#include "ssd.h"
#include "theme.h"
#include "translate.h"
@ -132,6 +133,7 @@ struct action_arg_list {
X(TOGGLE_MAGNIFY, "ToggleMagnify") \
X(ZOOM_IN, "ZoomIn") \
X(ZOOM_OUT, "ZoomOut") \
X(TOGGLE_SHOW_DESKTOP, "ToggleShowDesktop") \
X(WARP_CURSOR, "WarpCursor") \
X(HIDE_CURSOR, "HideCursor")
@ -1560,6 +1562,9 @@ run_action(struct view *view, struct action *action,
case ACTION_TYPE_ZOOM_OUT:
magnifier_set_scale(MAGNIFY_DECREASE);
break;
case ACTION_TYPE_TOGGLE_SHOW_DESKTOP:
show_desktop_toggle();
break;
case ACTION_TYPE_WARP_CURSOR: {
const char *to = action_get_str(action, "to", "output");
const char *x = action_get_str(action, "x", "center");

View file

@ -22,6 +22,7 @@ labwc_sources = files(
'seat.c',
'server.c',
'session-lock.c',
'show-desktop.c',
'snap-constraints.c',
'snap.c',
'tearing.c',

View file

@ -68,6 +68,7 @@
#include "resize-indicator.h"
#include "scaled-buffer/scaled-buffer.h"
#include "session-lock.h"
#include "show-desktop.h"
#include "ssd.h"
#include "theme.h"
#include "view.h"
@ -786,6 +787,8 @@ server_finish(void)
wl_display_destroy_clients(server.wl_display);
show_desktop_finish();
seat_finish();
output_finish();
xdg_shell_finish();

90
src/show-desktop.c Normal file
View file

@ -0,0 +1,90 @@
// SPDX-License-Identifier: GPL-2.0-only
#include "show-desktop.h"
#include <wlr/types/wlr_seat.h>
#include "common/array.h"
#include "config/types.h"
#include "labwc.h"
#include "view.h"
static struct wl_array views;
static bool is_showing_desktop;
static void
stash_unminimized_windows_on_current_workspace(void)
{
struct view *view;
for_each_view(view, &server.views, LAB_VIEW_CRITERIA_CURRENT_WORKSPACE) {
if (view->minimized) {
continue;
}
array_add(&views, view);
}
}
static void
show(void)
{
/*
* Build array before acting on it because actions like minimize change
* server.views
*/
stash_unminimized_windows_on_current_workspace();
struct view **view;
wl_array_for_each(view, &views) {
view_minimize_no_show_desktop_reset(*view, true);
}
is_showing_desktop = true;
}
static void
restore(void)
{
struct view **view;
wl_array_for_each_reverse(view, &views) {
if (!*view) {
continue;
}
view_minimize_no_show_desktop_reset(*view, false);
}
show_desktop_reset();
}
static void
init(void)
{
static bool has_been_initialized;
if (has_been_initialized) {
return;
}
has_been_initialized = true;
wl_array_init(&views);
}
void
show_desktop_toggle(void)
{
init();
if (is_showing_desktop) {
restore();
} else {
show();
}
}
void
show_desktop_reset(void)
{
init();
wl_array_release(&views);
wl_array_init(&views);
is_showing_desktop = false;
}
void
show_desktop_finish(void)
{
init();
wl_array_release(&views);
}

View file

@ -26,6 +26,7 @@
#include "regions.h"
#include "resize-indicator.h"
#include "session-lock.h"
#include "show-desktop.h"
#include "snap-constraints.h"
#include "snap.h"
#include "ssd.h"
@ -782,7 +783,7 @@ minimize_sub_views(struct view *view, bool minimized, bool *need_refocus)
* versa.
*/
void
view_minimize(struct view *view, bool minimized)
view_minimize_no_show_desktop_reset(struct view *view, bool minimized)
{
assert(view);
bool need_refocus = false;
@ -814,6 +815,13 @@ view_minimize(struct view *view, bool minimized)
}
}
void
view_minimize(struct view *view, bool minimized)
{
view_minimize_no_show_desktop_reset(view, minimized);
show_desktop_reset();
}
bool
view_compute_centered_position(struct view *view, const struct wlr_box *ref,
int w, int h, int *x, int *y)