diff options
| -rw-r--r-- | applets/wncklet/org.mate.panel.Wncklet.mate-panel-applet.desktop.in.in | 2 | ||||
| -rw-r--r-- | applets/wncklet/showdesktop.c | 54 | ||||
| -rw-r--r-- | applets/wncklet/wayland-backend.c | 31 | ||||
| -rw-r--r-- | applets/wncklet/wayland-backend.h | 1 | 
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);  | 
