wayland: Implement maximized state
diff --git a/src/wl_platform.h b/src/wl_platform.h
index c538936..d75c025 100644
--- a/src/wl_platform.h
+++ b/src/wl_platform.h
@@ -83,6 +83,7 @@
 {
     int                         width, height;
     GLFWbool                    visible;
+    GLFWbool                    maximized;
     struct wl_surface*          surface;
     struct wl_egl_window*       native;
     struct wl_shell_surface*    shell_surface;
diff --git a/src/wl_window.c b/src/wl_window.c
index c254f41..0858630 100644
--- a/src/wl_window.c
+++ b/src/wl_window.c
@@ -222,6 +222,10 @@
             0,
             window->monitor->wl.output);
     }
+    else if (window->wl.maximized)
+    {
+        wl_shell_surface_set_maximized(window->wl.shell_surface, NULL);
+    }
     else
     {
         wl_shell_surface_set_toplevel(window->wl.shell_surface);
@@ -516,14 +520,27 @@
 
 void _glfwPlatformRestoreWindow(_GLFWwindow* window)
 {
-    // TODO
-    fprintf(stderr, "_glfwPlatformRestoreWindow not implemented yet\n");
+    // TODO: also do the same for iconified.
+    if (window->monitor || window->wl.maximized)
+    {
+        if (window->wl.shell_surface)
+            wl_shell_surface_set_toplevel(window->wl.shell_surface);
+
+        window->wl.maximized = GLFW_FALSE;
+    }
 }
 
 void _glfwPlatformMaximizeWindow(_GLFWwindow* window)
 {
-    // TODO
-    fprintf(stderr, "_glfwPlatformMaximizeWindow not implemented yet\n");
+    if (!window->monitor && !window->wl.maximized)
+    {
+        if (window->wl.shell_surface)
+        {
+            // Let the compositor select the best output.
+            wl_shell_surface_set_maximized(window->wl.shell_surface, NULL);
+        }
+        window->wl.maximized = GLFW_TRUE;
+    }
 }
 
 void _glfwPlatformShowWindow(_GLFWwindow* window)
@@ -592,8 +609,7 @@
 
 int _glfwPlatformWindowMaximized(_GLFWwindow* window)
 {
-    // TODO
-    return GLFW_FALSE;
+    return window->wl.maximized;
 }
 
 void _glfwPlatformPollEvents(void)