summaryrefslogtreecommitdiff
path: root/applets/wncklet/showdesktop.c
diff options
context:
space:
mode:
Diffstat (limited to 'applets/wncklet/showdesktop.c')
-rw-r--r--applets/wncklet/showdesktop.c75
1 files changed, 71 insertions, 4 deletions
diff --git a/applets/wncklet/showdesktop.c b/applets/wncklet/showdesktop.c
index 190077f1..882e55d6 100644
--- a/applets/wncklet/showdesktop.c
+++ b/applets/wncklet/showdesktop.c
@@ -35,11 +35,21 @@
#include <libwnck/libwnck.h>
#endif
+#ifndef HAVE_X11
+#include <gdk/gdkwayland.h>
+#define GDK_IS_X11_DISPLAY(object) !(G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WAYLAND_DISPLAY))
+#endif
+
#include "wncklet.h"
#include "showdesktop.h"
#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"
@@ -52,6 +62,9 @@ typedef struct {
GtkOrientation orient;
int size;
+#ifdef HAVE_X11
+ WnckHandle* wnck_handle;
+#endif
WnckScreen* wnck_screen;
guint showing_desktop: 1;
@@ -72,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)
@@ -308,6 +326,10 @@ static void applet_destroyed(GtkWidget* applet, ShowDesktopData* sdd)
sdd->icon_theme = NULL;
}
+#ifdef HAVE_X11
+ g_clear_object(&sdd->wnck_handle);
+#endif
+
g_free (sdd);
}
@@ -371,7 +393,7 @@ static void show_desktop_applet_realized(MatePanelApplet* applet, gpointer data)
#ifdef HAVE_X11
if (GDK_IS_X11_DISPLAY (gdk_display_get_default ()))
{
- sdd->wnck_screen = wnck_screen_get (gdk_x11_screen_get_screen_number (screen));
+ sdd->wnck_screen = wncklet_get_screen (sdd->wnck_handle, sdd->applet);
if (sdd->wnck_screen != NULL)
wncklet_connect_while_alive (sdd->wnck_screen,
"showing_desktop_changed",
@@ -382,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);
@@ -426,6 +455,13 @@ gboolean show_desktop_applet_fill(MatePanelApplet* applet)
sdd->size = mate_panel_applet_get_size(MATE_PANEL_APPLET(sdd->applet));
+#ifdef HAVE_X11
+ if (GDK_IS_X11_DISPLAY (gdk_display_get_default ()))
+ {
+ sdd->wnck_handle = wnck_handle_new(WNCK_CLIENT_TYPE_PAGER);
+ }
+#endif
+
g_signal_connect (sdd->applet, "realize",
G_CALLBACK (show_desktop_applet_realized),
sdd);
@@ -545,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
- { /* not using X11 */
+#ifdef HAVE_WAYLAND
+#ifndef HAVE_X11
+ if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
+#endif
+ {
+ 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;
}
@@ -588,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);
}