@@ -3,7 +3,6 @@ use crate::pithos::anims::spring::Spring;
33use crate :: pithos:: commands:: RenderMode ;
44use crate :: pithos:: config:: DaemonConfig ;
55use crate :: pithos:: misc:: get_viewport_dimensions;
6- use crate :: wayland:: render_base:: OutputRenderStateVariety :: Wallpaper ;
76
87use std:: collections:: HashMap ;
98use std:: fs:: File ;
@@ -86,17 +85,16 @@ impl RenderThreadState {
8685
8786 pub fn is_animating ( & self ) -> bool {
8887 for ( _, output_state) in & self . outputs {
89- if let Some ( render_state) = & output_state. render_state {
90- match render_state {
91- Wallpaper ( wallpaper_render_state) => {
88+ match & output_state. render_state {
89+ OutputRenderStateVariety :: Wallpaper ( wallpaper_render_state) => {
9290 if wallpaper_render_state. width . scroll_state . is_some ( ) {
9391 return true ;
9492 }
9593 if wallpaper_render_state. height . scroll_state . is_some ( ) {
9694 return true ;
9795 }
98- } //Lockscreen => (),
99- }
96+ } //OutputRenderStateVariety:: Lockscreen => (),
97+ OutputRenderStateVariety :: None => { }
10098 }
10199 }
102100 false
@@ -143,13 +141,26 @@ impl RenderThreadState {
143141 }
144142}
145143
146- #[ derive( Default ) ]
147144pub struct OutputState {
148145 pub name : String ,
149146 pub width : i32 ,
150147 pub height : i32 ,
151148 pub done : bool ,
152- pub render_state : Option < OutputRenderStateVariety > ,
149+ pub transform : wl_output:: Transform ,
150+ pub render_state : OutputRenderStateVariety ,
151+ }
152+
153+ impl Default for OutputState {
154+ fn default ( ) -> Self {
155+ Self {
156+ name : String :: default ( ) ,
157+ width : 0 ,
158+ height : 0 ,
159+ done : false ,
160+ transform : wl_output:: Transform :: Normal ,
161+ render_state : OutputRenderStateVariety :: None ,
162+ }
163+ }
153164}
154165
155166impl OutputState {
@@ -160,26 +171,27 @@ impl OutputState {
160171 prior_state : & mut OutputState ,
161172 render_state : & mut RenderThreadState ,
162173 ) {
163- if let Some ( kind ) = & mut prior_state. render_state {
164- let new_state = match kind {
165- Wallpaper ( wp_state ) => Wallpaper ( WallpaperRenderState :: from_prior (
174+ match & mut prior_state. render_state {
175+ OutputRenderStateVariety :: Wallpaper ( wp_state ) => {
176+ let new_state = OutputRenderStateVariety :: Wallpaper ( WallpaperRenderState :: from_prior (
166177 conn, render_state, wp_state, new_output, self ,
167- ) ) ,
168- } ;
169- self . render_state = Some ( new_state) ;
178+ ) ) ;
179+ self . render_state = new_state;
180+ }
181+ OutputRenderStateVariety :: None => { }
170182 }
171183 }
172184
173185 pub fn yeet ( & mut self , conn : & mut Connection < RenderThreadState > ) {
174- if let Some ( kind) = & self . render_state {
175- match kind {
176- Wallpaper ( wp_state) => wp_state. yeet ( conn) ,
177- } ;
186+ match & self . render_state {
187+ OutputRenderStateVariety :: Wallpaper ( wp_state) => wp_state. yeet ( conn) ,
188+ OutputRenderStateVariety :: None => { }
178189 }
179190 }
180191}
181192
182193pub enum OutputRenderStateVariety {
194+ None ,
183195 Wallpaper ( WallpaperRenderState ) ,
184196 //Lockscreen,
185197}
@@ -634,16 +646,15 @@ fn frame_callback(ctx: EventCtx<RenderThreadState, WlCallback>) {
634646 // where we update that in the draw loop -> dispatch stuff
635647 // rly goofy ngl........
636648 for ( _, os) in & mut ctx. state . outputs {
637- if let Some ( render_state) = & mut os. render_state {
638- match render_state {
639- OutputRenderStateVariety :: Wallpaper ( wallpaper_render_state) => {
640- if wallpaper_render_state. width . scroll_state . is_some ( )
641- || wallpaper_render_state. height . scroll_state . is_some ( )
642- {
643- wallpaper_render_state. do_scroll_tick ( ctx. conn ) ;
644- }
645- } //OutputRenderStateVariety::Lockscreen => (),
646- }
649+ match & mut os. render_state {
650+ OutputRenderStateVariety :: Wallpaper ( wallpaper_render_state) => {
651+ if wallpaper_render_state. width . scroll_state . is_some ( )
652+ || wallpaper_render_state. height . scroll_state . is_some ( )
653+ {
654+ wallpaper_render_state. do_scroll_tick ( ctx. conn ) ;
655+ }
656+ } //OutputRenderStateVariety::Lockscreen => (),
657+ OutputRenderStateVariety :: None => { }
647658 }
648659 }
649660}
@@ -727,7 +738,8 @@ pub fn initialize_wallpaper_outputs(
727738 width,
728739 height,
729740 done,
730- render_state : None ,
741+ transform : wl_output:: Transform :: Normal ,
742+ render_state : OutputRenderStateVariety :: None ,
731743 } ;
732744
733745 let wallpaper_state = WallpaperRenderState :: new (
@@ -743,7 +755,7 @@ pub fn initialize_wallpaper_outputs(
743755
744756 // Find the actual output state and update it
745757 if let Some ( ( _, output_state) ) = state. outputs . iter_mut ( ) . find ( |( _, os) | os. name == output_name) {
746- output_state. render_state = Some ( OutputRenderStateVariety :: Wallpaper ( wallpaper_state) ) ;
758+ output_state. render_state = OutputRenderStateVariety :: Wallpaper ( wallpaper_state) ;
747759 }
748760 }
749761}
@@ -839,6 +851,29 @@ fn wl_output_cb(ctx: EventCtx<RenderThreadState, WlOutput>) {
839851 output_state. width = mode. width ;
840852 output_state. height = mode. height ;
841853 }
854+ wl_output:: Event :: Geometry ( geometry) => {
855+ let prev_transform = output_state. transform ;
856+ let new_transform = geometry. transform ;
857+
858+ // Check if transform changed from/to a 90° or 270° rotation
859+ let prev_is_rotated = matches ! ( prev_transform,
860+ wl_output:: Transform :: _90 | wl_output:: Transform :: _270 |
861+ wl_output:: Transform :: Flipped90 | wl_output:: Transform :: Flipped270 ) ;
862+ let new_is_rotated = matches ! ( new_transform,
863+ wl_output:: Transform :: _90 | wl_output:: Transform :: _270 |
864+ wl_output:: Transform :: Flipped90 | wl_output:: Transform :: Flipped270 ) ;
865+
866+ // Update the transform
867+ output_state. transform = new_transform;
868+
869+ // If rotation state changed, swap width/height and flag for reseat
870+ if prev_is_rotated != new_is_rotated {
871+ let old_width = output_state. width ;
872+ output_state. width = output_state. height ;
873+ output_state. height = old_width;
874+ ctx. state . reseat_needed = true ;
875+ }
876+ }
842877 // wl_output::Event::Scale(scale) => output.scale = Some(scale), // maybe track this for lockscreen element scaling?
843878 wl_output:: Event :: Done => {
844879 output_state. done = true ;
0 commit comments