summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlukefromdc <[email protected]>2025-09-20 22:31:09 -0400
committerLuke from DC <[email protected]>2025-09-28 16:33:41 +0000
commit96613f26127df84440d2d7adf2be570725f483b3 (patch)
tree49aeb6faf3402d30112cfa02fa5c868349a33833
parentcf2f458dd8b70450c3fdffb10d4a45c8c369b3e9 (diff)
downloadmate-panel-master.tar.bz2
mate-panel-master.tar.xz
Show desktop: support wayland useHEADmaster
-rw-r--r--applets/wncklet/org.mate.panel.Wncklet.mate-panel-applet.desktop.in.in2
-rw-r--r--applets/wncklet/showdesktop.c54
-rw-r--r--applets/wncklet/wayland-backend.c31
-rw-r--r--applets/wncklet/wayland-backend.h1
4 files changed, 84 insertions, 4 deletions
diff --git a/applets/wncklet/org.mate.panel.Wncklet.mate-panel-applet.desktop.in.in b/applets/wncklet/org.mate.panel.Wncklet.mate-panel-applet.desktop.in.in
index 99e7815c..ec53ade3 100644
--- a/applets/wncklet/org.mate.panel.Wncklet.mate-panel-applet.desktop.in.in
+++ b/applets/wncklet/org.mate.panel.Wncklet.mate-panel-applet.desktop.in.in
@@ -50,7 +50,7 @@ Description=Hide application windows and show the desktop
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
Icon=user-desktop
MateComponentId=OAFIID:MATE_ShowDesktopApplet;
-Platforms=X11;
+Platforms=X11;Wayland;
X-MATE-Bugzilla-Bugzilla=MATE
X-MATE-Bugzilla-Product=mate-panel
X-MATE-Bugzilla-Component=Show Desktop Button
diff --git a/applets/wncklet/showdesktop.c b/applets/wncklet/showdesktop.c
index 60142953..882e55d6 100644
--- a/applets/wncklet/showdesktop.c
+++ b/applets/wncklet/showdesktop.c
@@ -45,6 +45,11 @@
#include <string.h>
+#ifdef HAVE_WAYLAND
+#include "wayland-protocol/wlr-foreign-toplevel-management-unstable-v1-client.h"
+#include "wayland-backend.h"
+#include <gdk/gdkwayland.h>
+#endif
#define TIMEOUT_ACTIVATE_SECONDS 1
#define SHOW_DESKTOP_ICON "user-desktop"
@@ -80,6 +85,11 @@ static void theme_changed_callback(GtkIconTheme* icon_theme, ShowDesktopData* sd
static void button_toggled_callback(GtkWidget* button, ShowDesktopData* sdd);
static void show_desktop_changed_callback(WnckScreen* screen, ShowDesktopData* sdd);
+#ifdef HAVE_WAYLAND
+GtkWidget* tasklist;
+gboolean desktop_showing;
+#endif
+
/* this is when the panel orientation changes */
static void applet_change_orient(MatePanelApplet* applet, MatePanelAppletOrient orient, ShowDesktopData* sdd)
@@ -394,7 +404,14 @@ static void show_desktop_applet_realized(MatePanelApplet* applet, gpointer data)
g_warning ("Could not get WnckScreen!");
}
#endif /* HAVE_X11 */
-
+#ifdef HAVE_WAYLAND
+if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
+{
+ /*/initialize wayland show desktop applet*/
+ tasklist = wayland_tasklist_new();
+ desktop_showing = FALSE;
+}
+#endif
show_desktop_changed_callback (sdd->wnck_screen, sdd);
sdd->icon_theme = gtk_icon_theme_get_for_screen (screen);
@@ -564,9 +581,39 @@ static void button_toggled_callback(GtkWidget* button, ShowDesktopData* sdd)
gdk_atom_intern("_NET_SHOWING_DESKTOP",
FALSE));
}
- else
+#ifdef HAVE_WAYLAND
+ else if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
+#endif
+#endif
+#ifdef HAVE_WAYLAND
+#ifndef HAVE_X11
+ if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
#endif
- { /* not using X11 */
+ {
+ static GtkWidget* outer_box;
+ GList *children1, *children2;
+ if (desktop_showing == FALSE)
+ desktop_showing = TRUE;
+
+ else
+ desktop_showing = FALSE;
+
+ can_show_desktop = TRUE;
+ children1 = gtk_container_get_children (GTK_CONTAINER (tasklist));
+ outer_box = g_list_first(children1)->data;
+ children2 = gtk_container_get_children (GTK_CONTAINER (outer_box));
+ while (children2 != NULL)
+ {
+ button = GTK_WIDGET (children2->data);
+ toggle_show_desktop (button, desktop_showing);
+ children2 = children2->next;
+ }
+ }
+#endif
+
+else
+
+ { /* not using X11 or wayland */
can_show_desktop = FALSE;
}
@@ -607,6 +654,7 @@ static void button_toggled_callback(GtkWidget* button, ShowDesktopData* sdd)
wnck_screen_toggle_showing_desktop(sdd->wnck_screen, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
#endif /* HAVE_X11 */
+
update_button_display (sdd);
}
diff --git a/applets/wncklet/wayland-backend.c b/applets/wncklet/wayland-backend.c
index f10b2d65..b80f78a7 100644
--- a/applets/wncklet/wayland-backend.c
+++ b/applets/wncklet/wayland-backend.c
@@ -79,6 +79,8 @@ static ToplevelTask *toplevel_task_new (TasklistManager *tasklist, struct zwlr_f
guint buttons, tasklist_width;
+gboolean window_hidden;
+
static void
wl_registry_handle_global (void *_data,
struct wl_registry *registry,
@@ -494,6 +496,34 @@ toplevel_task_disconnected_from_widget (ToplevelTask *task)
g_free (task);
}
+/*We have to use the "activate" signal here
+ *as only signals valid for GtkButton work,
+ *"clicked" is taken, and we need to separate
+ *showing the desktop from mouse clicks on window buttons
+ */
+void
+toggle_show_desktop(GtkWidget *button, gboolean desktop_showing)
+{
+ window_hidden = desktop_showing;
+ g_signal_emit_by_name (button, "activate");
+}
+
+static void
+toggle_window(GtkButton *button, ToplevelTask *task)
+{
+ if (task->toplevel)
+ {
+ if (window_hidden)
+ {
+ zwlr_foreign_toplevel_handle_v1_set_minimized (task->toplevel);
+ }
+ else
+ {
+ zwlr_foreign_toplevel_handle_v1_unset_minimized (task->toplevel);
+ }
+ }
+}
+
static void
toplevel_task_handle_clicked (GtkButton *button, ToplevelTask *task)
{
@@ -551,6 +581,7 @@ toplevel_task_new (TasklistManager *tasklist, struct zwlr_foreign_toplevel_handl
orient = gtk_orientable_get_orientation (GTK_ORIENTABLE (tasklist->outer_box));
task->button = gtk_button_new ();
g_signal_connect (task->button, "clicked", G_CALLBACK (toplevel_task_handle_clicked), task);
+ g_signal_connect (task->button, "activate", G_CALLBACK (toggle_window), task);
task->icon = gtk_image_new_from_icon_name ("unknown", icon_size);
diff --git a/applets/wncklet/wayland-backend.h b/applets/wncklet/wayland-backend.h
index e2402236..0bff2b5f 100644
--- a/applets/wncklet/wayland-backend.h
+++ b/applets/wncklet/wayland-backend.h
@@ -35,6 +35,7 @@
extern "C" {
#endif
+void toggle_show_desktop(GtkWidget *button, gboolean desktop_showing);
GtkWidget* wayland_tasklist_new (void);
void wayland_tasklist_set_orientation (GtkWidget* tasklist_widget, GtkOrientation orient);