* @GDK_TOPLEVEL_STATE_BOTTOM_RESIZABLE: whether the bottom edge is resizable
* @GDK_TOPLEVEL_STATE_LEFT_TILED: whether the left edge is tiled
* @GDK_TOPLEVEL_STATE_LEFT_RESIZABLE: whether the left edge is resizable
+ * @GDK_TOPLEVEL_STATE_SUSPENDED: the surface is not visible to the user
*
* Specifies the state of a toplevel surface.
*
GDK_TOPLEVEL_STATE_BOTTOM_TILED = 1 << 12,
GDK_TOPLEVEL_STATE_BOTTOM_RESIZABLE = 1 << 13,
GDK_TOPLEVEL_STATE_LEFT_TILED = 1 << 14,
- GDK_TOPLEVEL_STATE_LEFT_RESIZABLE = 1 << 15
+ GDK_TOPLEVEL_STATE_LEFT_RESIZABLE = 1 << 15,
+ GDK_TOPLEVEL_STATE_SUSPENDED = 1 << 16
} GdkToplevelState;
/**
-(void)windowDidMiniaturize:(NSNotification *)aNotification
{
- gdk_synthesize_surface_state (GDK_SURFACE (gdk_surface), 0, GDK_TOPLEVEL_STATE_MINIMIZED);
+ gdk_synthesize_surface_state (GDK_SURFACE (gdk_surface),
+ 0,
+ GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED);
}
-(void)windowDidDeminiaturize:(NSNotification *)aNotification
else if (GDK_IS_MACOS_POPUP_SURFACE (gdk_surface))
_gdk_macos_popup_surface_attach_to_parent (GDK_MACOS_POPUP_SURFACE (gdk_surface));
- gdk_synthesize_surface_state (GDK_SURFACE (gdk_surface), GDK_TOPLEVEL_STATE_MINIMIZED, 0);
+ gdk_synthesize_surface_state (GDK_SURFACE (gdk_surface),
+ GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED,
+ 0);
}
-(void)windowDidBecomeKey:(NSNotification *)aNotification
pending_state |= (GDK_TOPLEVEL_STATE_TILED |
GDK_TOPLEVEL_STATE_LEFT_TILED);
break;
+ case XDG_TOPLEVEL_STATE_SUSPENDED:
+ pending_state |= GDK_TOPLEVEL_STATE_SUSPENDED;
+ break;
default:
/* Unknown state */
break;
unset_bits = 0;
if (IsIconic (msg->hwnd))
- set_bits |= GDK_TOPLEVEL_STATE_MINIMIZED;
+ set_bits |= (GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED);
else
- unset_bits |= GDK_TOPLEVEL_STATE_MINIMIZED;
+ unset_bits |= (GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED);
if (IsZoomed (msg->hwnd))
set_bits |= GDK_TOPLEVEL_STATE_MAXIMIZED;
if (old_state & GDK_TOPLEVEL_STATE_MINIMIZED)
{
if (!toplevel->have_hidden)
- unset |= GDK_TOPLEVEL_STATE_MINIMIZED;
+ {
+ unset |= (GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED);
+ }
}
else
{
if (toplevel->have_hidden)
- set |= GDK_TOPLEVEL_STATE_MINIMIZED;
+ {
+ set |= (GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED);
+ }
}
/* Update edge constraints and tiling */
* the minimized bit off.
*/
if (GDK_SURFACE_IS_MAPPED (surface))
- gdk_synthesize_surface_state (surface,
- 0,
- GDK_TOPLEVEL_STATE_MINIMIZED);
+ {
+ gdk_synthesize_surface_state (surface,
+ 0,
+ GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED);
+ }
}
if (surface_impl->toplevel &&
{
/* Unset minimized if it was set */
if (surface->state & GDK_TOPLEVEL_STATE_MINIMIZED)
- gdk_synthesize_surface_state (surface,
- GDK_TOPLEVEL_STATE_MINIMIZED,
- 0);
+ {
+ gdk_synthesize_surface_state (surface,
+ GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED,
+ 0);
+ }
if (toplevel)
gdk_surface_thaw_updates (surface);
else
{
/* Flip our client side flag, the real work happens on map. */
- gdk_synthesize_surface_state (surface, 0, GDK_TOPLEVEL_STATE_MINIMIZED);
+ gdk_synthesize_surface_state (surface,
+ 0,
+ GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED);
gdk_wmspec_change_state (TRUE, surface,
"_NET_WM_STATE_HIDDEN",
NULL);
else
{
/* Flip our client side flag, the real work happens on map. */
- gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_MINIMIZED, 0);
+ gdk_synthesize_surface_state (surface,
+ GDK_TOPLEVEL_STATE_MINIMIZED |
+ GDK_TOPLEVEL_STATE_SUSPENDED,
+ 0);
gdk_wmspec_change_state (FALSE, surface,
"_NET_WM_STATE_HIDDEN",
NULL);
guint client_decorated : 1; /* Decorations drawn client-side */
guint use_client_shadow : 1; /* Decorations use client-side shadows */
guint maximized : 1;
+ guint suspended : 1;
guint fullscreen : 1;
guint tiled : 1;
/* Readonly properties */
PROP_IS_ACTIVE,
+ PROP_SUSPENDED,
/* Writeonly properties */
PROP_STARTUP_ID,
FALSE,
GTK_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_EXPLICIT_NOTIFY);
+ /**
+ * GtkWindow:suspended: (attributes org.gtk.Property.get=gtk_window_is_suspended)
+ *
+ * Whether the window is suspended.
+ *
+ * See [method@Gtk.Window.is_suspended] for details about what suspended means.
+ */
+ window_props[PROP_SUSPENDED] =
+ g_param_spec_boolean ("suspended", NULL, NULL,
+ FALSE,
+ GTK_PARAM_READABLE|G_PARAM_EXPLICIT_NOTIFY);
+
/**
* GtkWindow:application: (attributes org.gtk.Property.get=gtk_window_get_application org.gtk.Property.set=gtk_window_set_application)
*
return priv->fullscreen;
}
+/**
+ * gtk_window_is_suspended: (attributes org.gtk.Property.get=suspended)
+ * @window: a `GtkWindow`
+ *
+ * Retrieves the current suspended state of @window.
+ *
+ * A window being suspended means it's currently not visible to the user, for
+ * example by being on a inactive workspace, minimized, obstructed.
+ *
+ * Returns: whether the window is suspended.
+ */
+gboolean
+gtk_window_is_suspended (GtkWindow *window)
+{
+ GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+
+ g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
+
+ return priv->suspended;
+}
+
void
_gtk_window_toggle_maximized (GtkWindow *window)
{
case PROP_FULLSCREENED:
g_value_set_boolean (value, gtk_window_is_fullscreen (window));
break;
+ case PROP_SUSPENDED:
+ g_value_set_boolean (value, gtk_window_is_suspended (window));
+ break;
case PROP_FOCUS_WIDGET:
g_value_set_object (value, gtk_window_get_focus (window));
break;
g_object_notify_by_pspec (G_OBJECT (widget), window_props[PROP_MAXIMIZED]);
}
+ if (changed_mask & GDK_TOPLEVEL_STATE_SUSPENDED)
+ {
+ priv->suspended = (new_surface_state & GDK_TOPLEVEL_STATE_SUSPENDED) ? TRUE : FALSE;
+
+ g_object_notify_by_pspec (G_OBJECT (widget), window_props[PROP_SUSPENDED]);
+ }
+
update_edge_constraints (window, new_surface_state);
if (changed_mask & (GDK_TOPLEVEL_STATE_FULLSCREEN |
GDK_AVAILABLE_IN_ALL
gboolean gtk_window_is_fullscreen (GtkWindow *window);
+GDK_AVAILABLE_IN_4_12
+gboolean gtk_window_is_suspended (GtkWindow *window);
+
GDK_AVAILABLE_IN_ALL
void gtk_window_destroy (GtkWindow *window);
fribidi_req = '>= 1.0.6'
cairo_req = '>= 1.14.0'
gdk_pixbuf_req = '>= 2.30.0'
-wayland_proto_req = '>= 1.31'
+wayland_proto_req = '>= 1.32'
wayland_req = '>= 1.21.0'
graphene_req = '>= 1.10.0'
epoxy_req = '>= 1.4'
['teststack'],
['testrevealer'],
['testrevealer2'],
+ ['testsuspended'],
['testwindowsize'],
['testpopover'],
['listmodel'],
msg = g_strconcat ((const char *)g_object_get_data (G_OBJECT (label), "title"), ": ",
(new_state & GDK_TOPLEVEL_STATE_MINIMIZED) ?
"minimized" : "not minimized", ", ",
+ (new_state & GDK_TOPLEVEL_STATE_SUSPENDED) ?
+ "suspended" : "not suspended", ", ",
(new_state & GDK_TOPLEVEL_STATE_STICKY) ?
"sticky" : "not sticky", ", ",
(new_state & GDK_TOPLEVEL_STATE_MAXIMIZED) ?
--- /dev/null
+#include <gtk/gtk.h>
+
+static void
+quit_cb (GtkWidget *widget,
+ gpointer data)
+{
+ gboolean *done = data;
+
+ *done = TRUE;
+
+ g_main_context_wakeup (NULL);
+}
+
+static void
+report_suspended_state (GtkWindow *window)
+{
+ g_print ("Window is %s\n",
+ gtk_window_is_suspended (window) ? "suspended" : "active");
+}
+
+static void
+suspended_changed_cb (GtkWindow *window)
+{
+ report_suspended_state (window);
+}
+
+int main (int argc, char *argv[])
+{
+ GtkWidget *window;
+ gboolean done = FALSE;
+
+ gtk_init ();
+
+ window = gtk_window_new ();
+ gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
+ g_signal_connect (window, "destroy", G_CALLBACK (quit_cb), &done);
+ g_signal_connect (window, "notify::suspended",
+ G_CALLBACK (suspended_changed_cb), &done);
+ gtk_window_present (GTK_WINDOW (window));
+ report_suspended_state (GTK_WINDOW (window));
+
+ while (!done)
+ g_main_context_iteration (NULL, TRUE);
+
+ return EXIT_SUCCESS;
+}