gimp but for windows: a wayland compositor
git clone https://github.com/m-col/wimp
Files | Refs | Readme

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));
 }