Commit 24863ef9f0533fcf3247d2ef342bce80490885a7 Parent: e69f4e02ebeebfed7833c14a938fb090ac0b0bee Author: mcol <mcol@posteo.net> Date: 2021-01-19 23:01:48 +0000 Committer: mcol <mcol@posteo.net> Committed: 2021-01-19 23:01:48 +0000 Add action and basic listener to start fullscreening implementation
src/types.h Modified
@@ -86,6 +86,7 @@ struct wl_listener destroy_listener; struct wl_listener request_move_listener; struct wl_listener request_resize_listener; + struct wl_listener request_fullscreen_listener; double x, y; }; @@ -111,6 +112,8 @@ double panned_x, panned_y; int index; double zoom; + struct wlr_xdg_surface *fullscreened; + struct wlr_box fullscreened_saved_geo; }; struct binding {
src/shell.h Modified
@@ -6,6 +6,7 @@ void unmap_view(struct view *view); void map_view(struct view *view); void focus_view(struct view *view, struct wlr_surface *surface); +void fullscreen_xdg_surface(struct server *server, struct wlr_xdg_surface *xdg_surface); void set_up_shell(struct server *server); #endif
src/shell.c Modified
@@ -1,3 +1,4 @@ +#include <wlr/types/wlr_xdg_shell.h> #include <wlr/util/edges.h> #include "types.h" @@ -42,6 +43,22 @@ } +void fullscreen_xdg_surface(struct server *server, struct wlr_xdg_surface *xdg_surface) { + + struct wlr_xdg_surface *prev_surface = server->current_desk->fullscreened; + if (prev_surface) { + wlr_xdg_toplevel_set_fullscreen(prev_surface, false); + if (prev_surface == xdg_surface) { + server->current_desk->fullscreened = NULL; + return; + } + } + + wlr_xdg_toplevel_set_fullscreen(xdg_surface, true); + server->current_desk->fullscreened = xdg_surface; +} + + void on_map(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, map_listener); if (view->server->can_steal_focus) @@ -103,6 +120,13 @@ } +void on_request_fullscreen(struct wl_listener *listener, void *data) { + struct wlr_xdg_toplevel_set_fullscreen_event *event = data; + struct view *view = wl_container_of(listener, view, request_fullscreen_listener); + fullscreen_xdg_surface(view->server, event->surface); +} + + void on_new_xdg_surface(struct wl_listener *listener, void *data) { struct server *server = wl_container_of(listener, server, new_xdg_surface_listener); struct wlr_xdg_surface *surface = data; @@ -126,6 +150,8 @@ wl_signal_add(&toplevel->events.request_move, &view->request_move_listener); view->request_resize_listener.notify = on_request_resize; wl_signal_add(&toplevel->events.request_resize, &view->request_resize_listener); + view->request_fullscreen_listener.notify = on_request_fullscreen; + wl_signal_add(&toplevel->events.request_fullscreen, &view->request_fullscreen_listener); wl_list_insert(&server->current_desk->views, &view->link); }
src/desk.c Modified
@@ -13,6 +13,7 @@ desk->wallpaper = NULL; desk->index = server->desk_count; desk->zoom = 1; + desk->fullscreened = NULL; server->desk_count++; }
src/action.c Modified
@@ -5,6 +5,7 @@ #include "action.h" #include "desk.h" +#include "shell.h" #include "types.h" @@ -193,10 +194,6 @@ void toggle_fullscreen(struct server *server, void *data) { struct wlr_surface *surface = server->seat->keyboard_state.focused_surface; - if (!surface) - return; - - struct wlr_xdg_surface *xdg_surface = wlr_xdg_surface_from_wlr_surface(surface); - if (xdg_surface) - wlr_xdg_toplevel_set_fullscreen(xdg_surface, true); + if (surface) + fullscreen_xdg_surface(server, wlr_xdg_surface_from_wlr_surface(surface)); }