diff --git a/api/rust/examples/default_config/main.rs b/api/rust/examples/default_config/main.rs
index 4d9f697..98c803f 100644
--- a/api/rust/examples/default_config/main.rs
+++ b/api/rust/examples/default_config/main.rs
@@ -60,6 +60,13 @@ async fn config() {
     //------------------------
     // Keybinds              |
     //------------------------
+    #[cfg(feature = "snowcap")]
+    input::keybind(mod_key, "u")
+        .on_press(|| {
+            pinnacle_api::experimental::mouse_area::MouseAreaTester::new().show()
+        })
+        .group("Testing")
+        .description("MouseAreaTester");
 
     // `mod_key + s` shows the bindings overlay
     #[cfg(feature = "snowcap")]
diff --git a/api/rust/src/experimental.rs b/api/rust/src/experimental.rs
index 2282200..70d89d4 100644
--- a/api/rust/src/experimental.rs
+++ b/api/rust/src/experimental.rs
@@ -87,3 +87,86 @@ pub mod input_grab {
         });
     }
 }
+
+#[cfg(feature = "snowcap")]
+pub mod mouse_area {
+    use snowcap_api::{layer::{ExclusiveZone, KeyboardInteractivity, ZLayer}, widget::{container::Container, mouse_area::MouseArea, text::Text, Alignment, Length, Program}};
+
+    /// Test MouseArea
+    pub struct MouseAreaTester;
+
+    #[derive(Debug, Clone)]
+    pub enum Event {
+        Press,
+        Release,
+        DoubleClick,
+        RightPress,
+        RightRelease,
+        MiddlePress,
+        MiddleRelease,
+        Scroll(snowcap_api::widget::mouse_area::ScrollDelta),
+        Enter,
+        Move(snowcap_api::widget::mouse_area::Point),
+        Exit,
+    }
+
+    impl Program for MouseAreaTester {
+        type Message = Event;
+
+        fn view(&self) -> snowcap_api::widget::WidgetDef<Self::Message> {
+            println!("view called");
+            let widget =
+                MouseArea::new(Container::new(Text::new(""))
+                    .width(Length::Fixed(220.0))
+                    .height(Length::Fixed(120.0))
+                    .vertical_alignment(Alignment::Center)
+                    .horizontal_alignment(Alignment::Center)
+                    .style(snowcap_api::widget::container::Style {
+                        text_color: None,
+                        background_color: Some([0.15, 0.03, 0.1, 0.65].into()),
+                        border: None,
+                    })
+                )
+                .interaction(snowcap_api::widget::mouse_area::Interaction::Grab)
+                .on_press(Event::Press)
+                .on_release(Event::Release)
+                .on_double_click(Event::DoubleClick)
+                .on_right_press(Event::RightPress)
+                .on_right_release(Event::RightRelease)
+                .on_middle_press(Event::MiddlePress)
+                .on_middle_release(Event::MiddleRelease)
+                .on_scroll(|evt| Event::Scroll(evt))
+                .on_enter(Event::Enter)
+                .on_move(|evt| Event::Move(evt))
+                .on_exit(Event::Exit);
+
+            widget.into()
+        }
+
+        fn update(&mut self, msg: Self::Message) {
+            println!("UPDATE {msg:#?}");
+        }
+    }
+
+    impl MouseAreaTester {
+        /// Create a MouseAreaTester
+        pub fn new() -> Self {
+            Self
+        }
+
+        /// Shows this MouseAreaTester
+        pub fn show(self) {
+            snowcap_api::layer::new_widget(
+                self,
+                None,
+                KeyboardInteractivity::Exclusive,
+                ExclusiveZone::Respect,
+                ZLayer::Overlay
+            )
+            .unwrap()
+            .on_key_press(|hndl, _key, _mods| {
+                hndl.close();
+            });
+        }
+    }
+}
diff --git a/snowcap/api/rust/src/layer.rs b/snowcap/api/rust/src/layer.rs
index 0eb1014..cf0a8cd 100644
--- a/snowcap/api/rust/src/layer.rs
+++ b/snowcap/api/rust/src/layer.rs
@@ -170,6 +170,7 @@ where
     tokio::spawn(async move {
         loop {
             let mut rebuild_ui = false;
+            let curr_id = format!("{:?}", callbacks.keys());
             tokio::select! {
                 Some(Ok(response)) = event_stream.next() => {
                     for widget_event in response.widget_events {
@@ -198,6 +199,7 @@ where
                         };
 
                         let Some(msg) = msg else {
+                            println!("dropped event {id:?}\navail id: {curr_id:?}");
                             continue;
                         };
 
diff --git a/snowcap/src/surface.rs b/snowcap/src/surface.rs
index 4697d34..d828a4a 100644
--- a/snowcap/src/surface.rs
+++ b/snowcap/src/surface.rs
@@ -345,6 +345,7 @@ impl SnowcapSurface {
 
         // If there are messages, we'll need to recreate the UI with the new state.
         if ui_stale {
+            //tracing::info!("STALE UI");
             request_frame = true;
 
             self.widgets
