shell: Add zoom UI

This commit is contained in:
Victoria Brekenfeld 2025-02-13 21:09:13 +01:00 committed by Victoria Brekenfeld
parent 55e4dd7c0f
commit f72d2b91f3
10 changed files with 1247 additions and 261 deletions

View file

@ -21,6 +21,7 @@ use crate::{
};
pub enum Stage<'a> {
ZoomUI,
SessionLock(Option<&'a LockSurface>),
LayerPopup {
layer: LayerSurface,
@ -69,6 +70,10 @@ fn render_input_order_internal<R: 'static>(
element_filter: ElementFilter,
mut callback: impl FnMut(Stage) -> ControlFlow<Result<R, OutputNoMode>, ()>,
) -> ControlFlow<Result<R, OutputNoMode>, ()> {
if shell.zoom_state.is_some() {
callback(Stage::ZoomUI)?;
}
// Session Lock
if let Some(session_lock) = &shell.session_lock {
return callback(Stage::SessionLock(session_lock.surfaces.get(output)));

View file

@ -4,6 +4,7 @@ use crate::{
shell::{
element::{CosmicMapped, CosmicStack, CosmicWindow},
layout::tiling::ResizeForkTarget,
zoom::ZoomFocusTarget,
CosmicSurface, SeatExt,
},
utils::prelude::*,
@ -41,6 +42,7 @@ pub enum PointerFocusTarget {
StackUI(CosmicStack),
WindowUI(CosmicWindow),
ResizeFork(ResizeForkTarget),
ZoomUI(ZoomFocusTarget),
}
#[derive(Debug, Clone, PartialEq)]
@ -188,6 +190,7 @@ impl IsAlive for PointerFocusTarget {
PointerFocusTarget::StackUI(e) => e.alive(),
PointerFocusTarget::WindowUI(e) => e.alive(),
PointerFocusTarget::ResizeFork(f) => f.alive(),
PointerFocusTarget::ZoomUI(_) => true,
}
}
}
@ -233,6 +236,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::StackUI(u) => PointerTarget::enter(u, seat, data, event),
PointerFocusTarget::WindowUI(u) => PointerTarget::enter(u, seat, data, event),
PointerFocusTarget::ResizeFork(f) => PointerTarget::enter(f, seat, data, event),
PointerFocusTarget::ZoomUI(e) => PointerTarget::enter(e, seat, data, event),
}
}
fn motion(&self, seat: &Seat<State>, data: &mut State, event: &PointerMotionEvent) {
@ -262,6 +266,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::StackUI(u) => PointerTarget::motion(u, seat, data, event),
PointerFocusTarget::WindowUI(u) => PointerTarget::motion(u, seat, data, event),
PointerFocusTarget::ResizeFork(f) => PointerTarget::motion(f, seat, data, event),
PointerFocusTarget::ZoomUI(e) => PointerTarget::motion(e, seat, data, event),
}
}
fn relative_motion(&self, seat: &Seat<State>, data: &mut State, event: &RelativeMotionEvent) {
@ -274,6 +279,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(f) => {
PointerTarget::relative_motion(f, seat, data, event)
}
PointerFocusTarget::ZoomUI(e) => PointerTarget::relative_motion(e, seat, data, event),
}
}
fn button(&self, seat: &Seat<State>, data: &mut State, event: &ButtonEvent) {
@ -284,6 +290,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::StackUI(u) => PointerTarget::button(u, seat, data, event),
PointerFocusTarget::WindowUI(u) => PointerTarget::button(u, seat, data, event),
PointerFocusTarget::ResizeFork(f) => PointerTarget::button(f, seat, data, event),
PointerFocusTarget::ZoomUI(e) => PointerTarget::button(e, seat, data, event),
}
}
fn axis(&self, seat: &Seat<State>, data: &mut State, frame: AxisFrame) {
@ -294,6 +301,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::StackUI(u) => PointerTarget::axis(u, seat, data, frame),
PointerFocusTarget::WindowUI(u) => PointerTarget::axis(u, seat, data, frame),
PointerFocusTarget::ResizeFork(f) => PointerTarget::axis(f, seat, data, frame),
PointerFocusTarget::ZoomUI(e) => PointerTarget::axis(e, seat, data, frame),
}
}
fn frame(&self, seat: &Seat<State>, data: &mut State) {
@ -304,6 +312,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::StackUI(u) => PointerTarget::frame(u, seat, data),
PointerFocusTarget::WindowUI(u) => PointerTarget::frame(u, seat, data),
PointerFocusTarget::ResizeFork(f) => PointerTarget::frame(f, seat, data),
PointerFocusTarget::ZoomUI(e) => PointerTarget::frame(e, seat, data),
}
}
fn leave(&self, seat: &Seat<State>, data: &mut State, serial: Serial, time: u32) {
@ -322,6 +331,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::StackUI(u) => PointerTarget::leave(u, seat, data, serial, time),
PointerFocusTarget::WindowUI(u) => PointerTarget::leave(u, seat, data, serial, time),
PointerFocusTarget::ResizeFork(f) => PointerTarget::leave(f, seat, data, serial, time),
PointerFocusTarget::ZoomUI(e) => PointerTarget::leave(e, seat, data, serial, time),
}
}
fn gesture_swipe_begin(
@ -343,6 +353,9 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(f) => {
PointerTarget::gesture_swipe_begin(f, seat, data, event)
}
PointerFocusTarget::ZoomUI(e) => {
PointerTarget::gesture_swipe_begin(e, seat, data, event)
}
}
}
fn gesture_swipe_update(
@ -364,6 +377,9 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(f) => {
PointerTarget::gesture_swipe_update(f, seat, data, event)
}
PointerFocusTarget::ZoomUI(e) => {
PointerTarget::gesture_swipe_update(e, seat, data, event)
}
}
}
fn gesture_swipe_end(
@ -385,6 +401,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(f) => {
PointerTarget::gesture_swipe_end(f, seat, data, event)
}
PointerFocusTarget::ZoomUI(e) => PointerTarget::gesture_swipe_end(e, seat, data, event),
}
}
fn gesture_pinch_begin(
@ -406,6 +423,9 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(f) => {
PointerTarget::gesture_pinch_begin(f, seat, data, event)
}
PointerFocusTarget::ZoomUI(e) => {
PointerTarget::gesture_pinch_begin(e, seat, data, event)
}
}
}
fn gesture_pinch_update(
@ -427,6 +447,9 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(f) => {
PointerTarget::gesture_pinch_update(f, seat, data, event)
}
PointerFocusTarget::ZoomUI(e) => {
PointerTarget::gesture_pinch_update(e, seat, data, event)
}
}
}
fn gesture_pinch_end(
@ -448,6 +471,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(f) => {
PointerTarget::gesture_pinch_end(f, seat, data, event)
}
PointerFocusTarget::ZoomUI(e) => PointerTarget::gesture_pinch_end(e, seat, data, event),
}
}
fn gesture_hold_begin(
@ -469,6 +493,9 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(f) => {
PointerTarget::gesture_hold_begin(f, seat, data, event)
}
PointerFocusTarget::ZoomUI(e) => {
PointerTarget::gesture_hold_begin(e, seat, data, event)
}
}
}
fn gesture_hold_end(&self, seat: &Seat<State>, data: &mut State, event: &GestureHoldEndEvent) {
@ -483,6 +510,7 @@ impl PointerTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(f) => {
PointerTarget::gesture_hold_end(f, seat, data, event)
}
PointerFocusTarget::ZoomUI(e) => PointerTarget::gesture_hold_end(e, seat, data, event),
}
}
}
@ -498,6 +526,7 @@ impl TouchTarget<State> for PointerFocusTarget {
}
PointerFocusTarget::StackUI(stack) => TouchTarget::down(stack, seat, data, event, seq),
PointerFocusTarget::ResizeFork(fork) => TouchTarget::down(fork, seat, data, event, seq),
PointerFocusTarget::ZoomUI(elem) => TouchTarget::down(elem, seat, data, event, seq),
}
}
@ -509,6 +538,7 @@ impl TouchTarget<State> for PointerFocusTarget {
PointerFocusTarget::WindowUI(window) => TouchTarget::up(window, seat, data, event, seq),
PointerFocusTarget::StackUI(stack) => TouchTarget::up(stack, seat, data, event, seq),
PointerFocusTarget::ResizeFork(fork) => TouchTarget::up(fork, seat, data, event, seq),
PointerFocusTarget::ZoomUI(elem) => TouchTarget::up(elem, seat, data, event, seq),
}
}
@ -526,6 +556,7 @@ impl TouchTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(fork) => {
TouchTarget::motion(fork, seat, data, event, seq)
}
PointerFocusTarget::ZoomUI(elem) => TouchTarget::motion(elem, seat, data, event, seq),
}
}
@ -537,6 +568,7 @@ impl TouchTarget<State> for PointerFocusTarget {
PointerFocusTarget::WindowUI(window) => TouchTarget::frame(window, seat, data, seq),
PointerFocusTarget::StackUI(stack) => TouchTarget::frame(stack, seat, data, seq),
PointerFocusTarget::ResizeFork(fork) => TouchTarget::frame(fork, seat, data, seq),
PointerFocusTarget::ZoomUI(elem) => TouchTarget::frame(elem, seat, data, seq),
}
}
@ -548,6 +580,7 @@ impl TouchTarget<State> for PointerFocusTarget {
PointerFocusTarget::WindowUI(window) => TouchTarget::cancel(window, seat, data, seq),
PointerFocusTarget::StackUI(stack) => TouchTarget::cancel(stack, seat, data, seq),
PointerFocusTarget::ResizeFork(fork) => TouchTarget::cancel(fork, seat, data, seq),
PointerFocusTarget::ZoomUI(elem) => TouchTarget::cancel(elem, seat, data, seq),
}
}
@ -563,6 +596,7 @@ impl TouchTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(fork) => {
TouchTarget::shape(fork, seat, data, event, seq)
}
PointerFocusTarget::ZoomUI(elem) => TouchTarget::shape(elem, seat, data, event, seq),
}
}
@ -586,6 +620,9 @@ impl TouchTarget<State> for PointerFocusTarget {
PointerFocusTarget::ResizeFork(fork) => {
TouchTarget::orientation(fork, seat, data, event, seq)
}
PointerFocusTarget::ZoomUI(elem) => {
TouchTarget::orientation(elem, seat, data, event, seq)
}
}
}
}
@ -734,7 +771,8 @@ impl WaylandFocus for PointerFocusTarget {
PointerFocusTarget::WlSurface { surface, .. } => Cow::Borrowed(surface),
PointerFocusTarget::ResizeFork(_)
| PointerFocusTarget::StackUI(_)
| PointerFocusTarget::WindowUI(_) => {
| PointerFocusTarget::WindowUI(_)
| PointerFocusTarget::ZoomUI(_) => {
return None;
}
})
@ -751,7 +789,7 @@ impl WaylandFocus for PointerFocusTarget {
.wl_surface()
.map(|s| s.id().same_client_as(object_id))
.unwrap_or(false),
PointerFocusTarget::ResizeFork(_) => false,
PointerFocusTarget::ResizeFork(_) | PointerFocusTarget::ZoomUI(_) => false,
}
}
}