diff options
Diffstat (limited to 'applets/wncklet/showdesktop.c')
| -rw-r--r-- | applets/wncklet/showdesktop.c | 75 |
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); } |
