diff --git a/include/wlr/types/wlr_foreign_toplevel_management_v1.h b/include/wlr/types/wlr_foreign_toplevel_management_v1.h index 75ae0e64..6b234eb9 100644 --- a/include/wlr/types/wlr_foreign_toplevel_management_v1.h +++ b/include/wlr/types/wlr_foreign_toplevel_management_v1.h @@ -28,9 +28,10 @@ struct wlr_foreign_toplevel_manager_v1 { }; enum wlr_foreign_toplevel_handle_v1_state { - WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_MAXIMIZED = 1, - WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_MINIMIZED = 2, - WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_ACTIVATED = 4, + WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_MAXIMIZED = (1 << 0), + WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_MINIMIZED = (1 << 1), + WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_ACTIVATED = (1 << 2), + WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_FULLSCREEN = (1 << 3), }; struct wlr_foreign_toplevel_handle_v1_output { @@ -59,6 +60,8 @@ struct wlr_foreign_toplevel_handle_v1 { struct wl_signal request_minimize; //wlr_foreign_toplevel_handle_v1_activated_event struct wl_signal request_activate; + //wlr_foreign_toplevel_handle_v1_fullscreen_event + struct wl_signal request_fullscreen; struct wl_signal request_close; //wlr_foreign_toplevel_handle_v1_set_rectangle_event @@ -84,6 +87,12 @@ struct wlr_foreign_toplevel_handle_v1_activated_event { struct wlr_seat *seat; }; +struct wlr_foreign_toplevel_handle_v1_fullscreen_event { + struct wlr_foreign_toplevel_handle_v1 *toplevel; + bool fullscreen; + struct wlr_output *output; +}; + struct wlr_foreign_toplevel_handle_v1_set_rectangle_event { struct wlr_foreign_toplevel_handle_v1 *toplevel; struct wlr_surface *surface; @@ -116,5 +125,7 @@ void wlr_foreign_toplevel_handle_v1_set_minimized( struct wlr_foreign_toplevel_handle_v1 *toplevel, bool minimized); void wlr_foreign_toplevel_handle_v1_set_activated( struct wlr_foreign_toplevel_handle_v1 *toplevel, bool activated); +void wlr_foreign_toplevel_handle_v1_set_fullscreen( + struct wlr_foreign_toplevel_handle_v1* toplevel, bool fullscreen); #endif diff --git a/protocol/wlr-foreign-toplevel-management-unstable-v1.xml b/protocol/wlr-foreign-toplevel-management-unstable-v1.xml index 234d9535..a97738f8 100644 --- a/protocol/wlr-foreign-toplevel-management-unstable-v1.xml +++ b/protocol/wlr-foreign-toplevel-management-unstable-v1.xml @@ -25,7 +25,7 @@ THIS SOFTWARE. - + The purpose of this protocol is to enable the creation of taskbars and docks by providing them with a list of opened applications and @@ -68,7 +68,7 @@ - + A zwlr_foreign_toplevel_handle_v1 object represents an opened toplevel window. Each app may have multiple opened toplevels. @@ -150,9 +150,10 @@ as the states with the same names defined in xdg-toplevel - - - + + + + @@ -231,5 +232,28 @@ destruction of the object. + + + + + + Requests that the toplevel be fullscreened on the given output. If the + fullscreen state and/or the outputs the toplevel is visible on actually + change, this will be indicated by the state and output_enter/leave + events. + + The output parameter is only a hint to the compositor. Also, if output + is NULL, the compositor should decide which output the toplevel will be + fullscreened on, if at all. + + + + + + + Requests that the toplevel be unfullscreened. If the fullscreen state + actually changes, this will be indicated by the state event. + + diff --git a/types/wlr_foreign_toplevel_management_v1.c b/types/wlr_foreign_toplevel_management_v1.c index caecfd1a..6aed5eeb 100644 --- a/types/wlr_foreign_toplevel_management_v1.c +++ b/types/wlr_foreign_toplevel_management_v1.c @@ -9,7 +9,7 @@ #include "util/signal.h" #include "wlr-foreign-toplevel-management-unstable-v1-protocol.h" -#define FOREIGN_TOPLEVEL_MANAGEMENT_V1_VERSION 1 +#define FOREIGN_TOPLEVEL_MANAGEMENT_V1_VERSION 2 static const struct zwlr_foreign_toplevel_handle_v1_interface toplevel_handle_impl; @@ -70,6 +70,36 @@ static void foreign_toplevel_handle_unset_minimized(struct wl_client *client, toplevel_send_minimized_event(resource, false); } +static void toplevel_send_fullscreen_event(struct wl_resource *resource, + bool state, struct wl_resource *output_resource) { + struct wlr_foreign_toplevel_handle_v1 *toplevel = + toplevel_handle_from_resource(resource); + if (!toplevel) { + return; + } + + struct wlr_output *output = NULL; + if (output_resource) { + output = wlr_output_from_resource(output_resource); + } + struct wlr_foreign_toplevel_handle_v1_fullscreen_event event = { + .toplevel = toplevel, + .fullscreen = state, + .output = output, + }; + wlr_signal_emit_safe(&toplevel->events.request_fullscreen, &event); +} + +static void foreign_toplevel_handle_set_fullscreen(struct wl_client *client, + struct wl_resource *resource, struct wl_resource *output) { + toplevel_send_fullscreen_event(resource, true, output); +} + +static void foreign_toplevel_handle_unset_fullscreen(struct wl_client *client, + struct wl_resource *resource) { + toplevel_send_fullscreen_event(resource, false, NULL); +} + static void foreign_toplevel_handle_activate(struct wl_client *client, struct wl_resource *resource, struct wl_resource *seat) { struct wlr_foreign_toplevel_handle_v1 *toplevel = @@ -136,7 +166,9 @@ static const struct zwlr_foreign_toplevel_handle_v1_interface toplevel_handle_im .activate = foreign_toplevel_handle_activate, .close = foreign_toplevel_handle_close, .set_rectangle = foreign_toplevel_handle_set_rectangle, - .destroy = foreign_toplevel_handle_destroy + .destroy = foreign_toplevel_handle_destroy, + .set_fullscreen = foreign_toplevel_handle_set_fullscreen, + .unset_fullscreen = foreign_toplevel_handle_unset_fullscreen, }; static void toplevel_idle_send_done(void *data) { @@ -299,6 +331,13 @@ static bool fill_array_from_toplevel_state(struct wl_array *array, } *index = ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_ACTIVATED; } + if (state & WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_FULLSCREEN) { + uint32_t *index = wl_array_add(array, sizeof(uint32_t)); + if (index == NULL) { + return false; + } + *index = ZWLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_FULLSCREEN; + } return true; } @@ -356,6 +395,16 @@ void wlr_foreign_toplevel_handle_v1_set_activated( toplevel_send_state(toplevel); } +void wlr_foreign_toplevel_handle_v1_set_fullscreen( + struct wlr_foreign_toplevel_handle_v1 * toplevel, bool fullscreen) { + if (fullscreen) { + toplevel->state |= WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_FULLSCREEN; + } else { + toplevel->state &= ~WLR_FOREIGN_TOPLEVEL_HANDLE_V1_STATE_FULLSCREEN; + } + toplevel_send_state(toplevel); +} + void wlr_foreign_toplevel_handle_v1_destroy( struct wlr_foreign_toplevel_handle_v1 *toplevel) { if (!toplevel) { @@ -430,6 +479,7 @@ wlr_foreign_toplevel_handle_v1_create( wl_signal_init(&toplevel->events.request_maximize); wl_signal_init(&toplevel->events.request_minimize); wl_signal_init(&toplevel->events.request_activate); + wl_signal_init(&toplevel->events.request_fullscreen); wl_signal_init(&toplevel->events.request_close); wl_signal_init(&toplevel->events.set_rectangle); wl_signal_init(&toplevel->events.destroy);