Alias ffi::shell_surface to shell::Surface and move rust impl

Change-Id: Ic6e613210002f05ec9eb29cbd5b96803f99a83f5
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/croscomp/+/3277709
Tested-by: Kristian Kristensen <hoegsberg@chromium.org>
Reviewed-by: Lucas Berthou <berlu@chromium.org>
Commit-Queue: Kristian Kristensen <hoegsberg@chromium.org>
diff --git a/src/ffi.rs b/src/ffi.rs
index 26698f9..fa46e78 100644
--- a/src/ffi.rs
+++ b/src/ffi.rs
@@ -513,36 +513,6 @@
     }
 }
 
-impl shell_surface {
-    pub fn get<'a>(surface: &mut weston_surface) -> Option<&'a mut shell_surface> {
-        unsafe { get_shell_surface(surface).as_mut() }
-    }
-
-    pub fn r#move(&mut self, pointer: &mut weston_pointer, client_initiated: bool) {
-        unsafe {
-            shell_surface_move(self, pointer as *mut _, client_initiated);
-        }
-    }
-
-    pub fn resize(&mut self, pointer: &mut weston_pointer, edges: u32) {
-        unsafe {
-            shell_surface_resize(self, pointer as *mut _, edges);
-        }
-    }
-
-    pub fn set_size(&mut self, width: i32, height: i32) {
-        unsafe { shell_surface_set_size(self, width, height) }
-    }
-
-    pub fn set_resizing(&mut self, edges: wl_shell_surface_resize) {
-        unsafe { shell_surface_set_resizing(self, edges.0) }
-    }
-
-    pub fn get_geometry(&mut self) -> weston_geometry {
-        unsafe { shell_surface_get_geometry(self) }
-    }
-}
-
 impl wl_shell_surface_resize {
     pub fn has(&self, bit: wl_shell_surface_resize) -> bool {
         *self & bit == bit
diff --git a/src/shell.rs b/src/shell.rs
index 89fc92e..b0c3494 100644
--- a/src/shell.rs
+++ b/src/shell.rs
@@ -232,3 +232,59 @@
         debug!("-------------------- drop Shell")
     }
 }
+
+pub type Surface = ffi::shell_surface;
+
+impl Surface {
+    pub fn new(
+        shell: &mut Shell,
+        surface: *mut ffi::weston_surface,
+        view: *mut ffi::weston_view,
+    ) -> *mut Self {
+        unsafe { ffi::shell_surface_create(&mut shell.native as *mut _, surface, view) }
+    }
+
+    pub fn get<'a>(surface: &mut ffi::weston_surface) -> Option<&'a mut Surface> {
+        unsafe { ffi::get_shell_surface(surface).as_mut() }
+    }
+
+    pub fn r#move(&mut self, pointer: &mut ffi::weston_pointer, client_initiated: bool) {
+        unsafe {
+            ffi::shell_surface_move(self, pointer as *mut _, client_initiated);
+        }
+    }
+
+    pub fn resize(&mut self, pointer: &mut ffi::weston_pointer, edges: u32) {
+        unsafe {
+            ffi::shell_surface_resize(self, pointer as *mut _, edges);
+        }
+    }
+
+    pub fn set_size(&mut self, width: i32, height: i32) {
+        unsafe { ffi::shell_surface_set_size(self, width, height) }
+    }
+
+    pub fn set_resizing(&mut self, edges: ffi::wl_shell_surface_resize) {
+        unsafe { ffi::shell_surface_set_resizing(self, edges.0) }
+    }
+
+    pub fn get_geometry(&mut self) -> ffi::weston_geometry {
+        unsafe { ffi::shell_surface_get_geometry(self) }
+    }
+
+    pub fn set_maximized(&mut self, enable: bool) -> ffi::weston_size {
+        unsafe { ffi::shell_surface_set_maximized(self, enable) }
+    }
+
+    pub fn set_fullscreen(
+        &mut self,
+        enable: bool,
+        output: *mut ffi::weston_output,
+    ) -> ffi::weston_size {
+        unsafe { ffi::shell_surface_set_fullscreen(self, enable, output) }
+    }
+
+    pub fn set_minimized(&mut self) {
+        unsafe { ffi::shell_surface_set_minimized(self) }
+    }
+}
diff --git a/src/xdg_shell.rs b/src/xdg_shell.rs
index 83794c8..9ec03e2 100644
--- a/src/xdg_shell.rs
+++ b/src/xdg_shell.rs
@@ -4,10 +4,12 @@
 
 use crate::ffi;
 use crate::protocol;
+use crate::shell;
 use log::debug;
 use std::any::Any;
 use std::cell::RefCell;
 use std::rc::Rc;
+use std::ops::DerefMut;
 
 use crate::server::Resource;
 use protocol::xdg_popup::{self, XdgPopup};
@@ -149,7 +151,7 @@
 struct Toplevel {
     shell: Rc<RefCell<crate::Shell>>,
     surface: *mut ffi::weston_surface,
-    shsurf: *mut ffi::shell_surface,
+    shsurf: *mut shell::Surface,
     surface_resource: Resource<XdgSurface>,
     resource: Resource<XdgToplevel>,
     title: String,
@@ -174,8 +176,8 @@
         let shsurf = unsafe {
             let view = ffi::weston_view_create(surface.surface);
 
-            ffi::shell_surface_create(
-                &mut (surface.shell.borrow_mut()).native as *mut _,
+            shell::Surface::new(
+                surface.shell.borrow_mut().deref_mut(),
                 surface.surface,
                 view,
             )
@@ -292,12 +294,12 @@
         }
         SetMaximized => unsafe {
             toplevel.pending_state.maximized = true;
-            toplevel.pending_size = ffi::shell_surface_set_maximized(shsurf, true);
+            toplevel.pending_size = shsurf.set_maximized(true);
             toplevel.schedule_configure(Rc::clone(&rc));
         },
         UnsetMaximized => unsafe {
             toplevel.pending_state.maximized = false;
-            toplevel.pending_size = ffi::shell_surface_set_maximized(shsurf, false);
+            toplevel.pending_size = shsurf.set_maximized(false);
             toplevel.schedule_configure(Rc::clone(&rc));
         },
         SetFullscreen { output } => unsafe {
@@ -305,17 +307,17 @@
                 Some(output) => output.as_ref().user_data::<ffi::weston_output>(),
                 None => 0 as *mut _,
             };
-            toplevel.pending_size = ffi::shell_surface_set_fullscreen(shsurf, true, output);
+            toplevel.pending_size = shsurf.set_fullscreen(true, output);
             toplevel.pending_state.fullscreen = true;
             toplevel.schedule_configure(Rc::clone(&rc));
         },
         UnsetFullscreen => unsafe {
-            toplevel.pending_size = ffi::shell_surface_set_fullscreen(shsurf, false, 0 as *mut _);
+            toplevel.pending_size = shsurf.set_fullscreen(false, 0 as *mut _);
             toplevel.pending_state.fullscreen = true;
             toplevel.schedule_configure(Rc::clone(&rc));
         },
         SetMinimized => unsafe {
-            ffi::shell_surface_set_minimized(shsurf);
+            shsurf.set_minimized();
         },
     }
 }