panel: Fix sizing on output reconfiguration
This commit is contained in:
		
							
								
								
									
										32
									
								
								src/panel.rs
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								src/panel.rs
									
									
									
									
									
								
							@ -256,7 +256,7 @@ impl State {
 | 
				
			|||||||
                if output == req_output && height == req_height {(
 | 
					                if output == req_output && height == req_height {(
 | 
				
			||||||
                    State::SizeRequested{output: req_output, height: req_height},
 | 
					                    State::SizeRequested{output: req_output, height: req_height},
 | 
				
			||||||
                    Vec::new(),
 | 
					                    Vec::new(),
 | 
				
			||||||
                )} else if output == req_output {
 | 
					                )} else if output == req_output {(
 | 
				
			||||||
                    // I'm not sure about that.
 | 
					                    // I'm not sure about that.
 | 
				
			||||||
                    // This could cause a busy loop,
 | 
					                    // This could cause a busy loop,
 | 
				
			||||||
                    // when two requests are being processed at the same time:
 | 
					                    // when two requests are being processed at the same time:
 | 
				
			||||||
@ -266,16 +266,12 @@ impl State {
 | 
				
			|||||||
                    // causing the compositor to change size to B.
 | 
					                    // causing the compositor to change size to B.
 | 
				
			||||||
                    // So better cut this short here, despite artifacts.
 | 
					                    // So better cut this short here, despite artifacts.
 | 
				
			||||||
                    
 | 
					                    
 | 
				
			||||||
                    // Out of simplicty, just ignore the new request.
 | 
					                    // Doing nothing means that Squeekboard will occasionally use the stale size (see test),
 | 
				
			||||||
                    // If that causes problems, the request in flight could be stored
 | 
					                    // so instead always listen to the higher layer and request a new size.
 | 
				
			||||||
                    // for the purpose of handling it better somehow.
 | 
					                    // If this causes problems, maybe count requests/configures, or track what was allocated in response to what request.
 | 
				
			||||||
                    
 | 
					                    State::SizeRequested{output, height},
 | 
				
			||||||
                    //BUGGY
 | 
					                    vec![Update::Resize { height }],
 | 
				
			||||||
                    (
 | 
					                )} else {(
 | 
				
			||||||
                        State::SizeRequested{output: req_output, height: req_height},
 | 
					 | 
				
			||||||
                        Vec::new(),
 | 
					 | 
				
			||||||
                     )
 | 
					 | 
				
			||||||
                } else {(
 | 
					 | 
				
			||||||
                    // This looks weird, but should be safe.
 | 
					                    // This looks weird, but should be safe.
 | 
				
			||||||
                    // The stack seems to handle
 | 
					                    // The stack seems to handle
 | 
				
			||||||
                    // configure events on a dead surface.
 | 
					                    // configure events on a dead surface.
 | 
				
			||||||
@ -343,14 +339,22 @@ mod tests {
 | 
				
			|||||||
            output,
 | 
					            output,
 | 
				
			||||||
            height: PixelSize { pixels: 50, scale_factor: 1 },
 | 
					            height: PixelSize { pixels: 50, scale_factor: 1 },
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        // what's the expected outcome here? Should the failed request be kept?
 | 
					 | 
				
			||||||
        assert_eq!(
 | 
					        assert_eq!(
 | 
				
			||||||
            cmds,
 | 
					            cmds,
 | 
				
			||||||
            vec![Update::RequestWidget { output, height: 50 }],
 | 
					            vec![Update::Resize { height: 50 }],
 | 
				
			||||||
            "{:?}",
 | 
					            "{:?}",
 | 
				
			||||||
            state,
 | 
					            state,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        // This is too many layers of indirection, but as long as layer shell is tied to gtk widgets, there's not much to be done.
 | 
					        // This is too many layers of indirection, but as long as layer shell is tied to gtk widgets, there's not much to be done.
 | 
				
			||||||
 | 
					        // The main issue is that as the outputs change, we acknowledge the wrong (maintained) size:
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        [346947.774] wl_output@31.geometry(0, 0, 65, 130, 0, "<Unknown>", "<Unknown>", 3)
 | 
				
			||||||
 | 
					[346948.117] wl_output@17.geometry(0, 0, 65, 130, 0, "<Unknown>", "<Unknown>", 3)
 | 
				
			||||||
 | 
					[346948.198] zwlr_layer_surface_v1@41.configure(1709, 720, 210)
 | 
				
			||||||
 | 
					[346948.268]  -> zwlr_layer_surface_v1@41.ack_configure(1709)
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        // TODO: check if layer_shell allows not acknowledging a configure event, and which part of squeekboard is responsible for that
 | 
				
			||||||
 | 
					        // (there are no messages in between, so it's not PanelMgr; panel.c almost-unconditionally calls to Rust too; could it be layer-shell.c?).
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // event we want
 | 
					        // event we want
 | 
				
			||||||
        let good_state = state.clone().configure(Size { width: 50, height: 50 });
 | 
					        let good_state = state.clone().configure(Size { width: 50, height: 50 });
 | 
				
			||||||
@ -363,7 +367,7 @@ mod tests {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // or event we do not want
 | 
					        // or stale event we do not want
 | 
				
			||||||
        let state = state.configure(Size { width: 50, height: 100 });
 | 
					        let state = state.configure(Size { width: 50, height: 100 });
 | 
				
			||||||
        // followed by the good one
 | 
					        // followed by the good one
 | 
				
			||||||
        let state = state.configure(Size { width: 50, height: 50 });
 | 
					        let state = state.configure(Size { width: 50, height: 50 });
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user