state: Make size independent of scaling factor
This commit is contained in:
		
							
								
								
									
										55
									
								
								src/state.rs
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								src/state.rs
									
									
									
									
									
								
							@ -385,19 +385,20 @@ Outcome:
 | 
				
			|||||||
                let ideal_height = IDEAL_TARGET_SIZE * ROW_COUNT as i32;
 | 
					                let ideal_height = IDEAL_TARGET_SIZE * ROW_COUNT as i32;
 | 
				
			||||||
                let ideal_height_px = (ideal_height * density).ceil().0 as u32;
 | 
					                let ideal_height_px = (ideal_height * density).ceil().0 as u32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let max_wide_height = Rational {
 | 
				
			||||||
 | 
					                    numerator: 172,
 | 
				
			||||||
 | 
					                    denominator: 540,
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                let ideal_panel_height = Rational {
 | 
				
			||||||
 | 
					                    numerator: ideal_height_px as i32,
 | 
				
			||||||
 | 
					                    denominator: dbg!(px_size.width),
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
                // Reduce height to match what the layout can fill.
 | 
					                // Reduce height to match what the layout can fill.
 | 
				
			||||||
                // For this, we need to guess if normal or wide will be picked up.
 | 
					                // For this, we need to guess if normal or wide will be picked.
 | 
				
			||||||
                // This must match `eek_gtk_keyboard.c::get_type`.
 | 
					                // This must match `eek_gtk_keyboard.c::get_type`.
 | 
				
			||||||
                // TODO: query layout database and choose one directly
 | 
					                // TODO: query layout database and choose one directly
 | 
				
			||||||
                let abstract_width
 | 
					 | 
				
			||||||
                    = PixelSize {
 | 
					 | 
				
			||||||
                        scale_factor: output.scale as u32,
 | 
					 | 
				
			||||||
                        pixels: px_size.width,
 | 
					 | 
				
			||||||
                    } 
 | 
					 | 
				
			||||||
                    .as_scaled_ceiling();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                let (arrangement, height_as_widths) = {
 | 
					                let (arrangement, height_as_widths) = {
 | 
				
			||||||
                    if abstract_width < 540 {(
 | 
					                    if max_wide_height < dbg!(ideal_panel_height) {(
 | 
				
			||||||
                        ArrangementKind::Base,
 | 
					                        ArrangementKind::Base,
 | 
				
			||||||
                        Rational {
 | 
					                        Rational {
 | 
				
			||||||
                            numerator: 210,
 | 
					                            numerator: 210,
 | 
				
			||||||
@ -405,16 +406,13 @@ Outcome:
 | 
				
			|||||||
                        },
 | 
					                        },
 | 
				
			||||||
                    )} else {(
 | 
					                    )} else {(
 | 
				
			||||||
                        ArrangementKind::Wide,
 | 
					                        ArrangementKind::Wide,
 | 
				
			||||||
                        Rational {
 | 
					                        max_wide_height,
 | 
				
			||||||
                            numerator: 172,
 | 
					 | 
				
			||||||
                            denominator: 540,
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    )}
 | 
					                    )}
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                let height
 | 
					                let height
 | 
				
			||||||
                    = cmp::min(
 | 
					                    = cmp::min(
 | 
				
			||||||
                        ideal_height_px,
 | 
					                        dbg!(ideal_height_px),
 | 
				
			||||||
                        (height_as_widths * px_size.width as i32).ceil() as u32,
 | 
					                        (height_as_widths * px_size.width as i32).ceil() as u32,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -755,4 +753,33 @@ pub mod test {
 | 
				
			|||||||
            )),
 | 
					            )),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    #[test]
 | 
				
			||||||
 | 
					    fn size_l5_scale1() {
 | 
				
			||||||
 | 
					        use crate::outputs::{Mode, Geometry, c, Size};
 | 
				
			||||||
 | 
					        assert_eq!(
 | 
				
			||||||
 | 
					            Application::get_preferred_height_and_arrangement(&OutputState {
 | 
				
			||||||
 | 
					                current_mode: Some(Mode {
 | 
				
			||||||
 | 
					                    width: 720,
 | 
				
			||||||
 | 
					                    height: 1440,
 | 
				
			||||||
 | 
					                }),
 | 
				
			||||||
 | 
					                geometry: Some(Geometry{
 | 
				
			||||||
 | 
					                    transform: c::Transform::Normal,
 | 
				
			||||||
 | 
					                    phys_size: Size {
 | 
				
			||||||
 | 
					                        width: Some(Millimeter(65)),
 | 
				
			||||||
 | 
					                        height: Some(Millimeter(130)),
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                }),
 | 
				
			||||||
 | 
					                scale: 1,
 | 
				
			||||||
 | 
					            }),
 | 
				
			||||||
 | 
					            Some((
 | 
				
			||||||
 | 
					                PixelSize {
 | 
				
			||||||
 | 
					                    scale_factor: 1,
 | 
				
			||||||
 | 
					                    pixels: 420,
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                ArrangementKind::Base,
 | 
				
			||||||
 | 
					            )),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										45
									
								
								src/util.rs
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								src/util.rs
									
									
									
									
									
								
							@ -4,6 +4,7 @@ use std::rc::Rc;
 | 
				
			|||||||
use crate::float_ord::FloatOrd;
 | 
					use crate::float_ord::FloatOrd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use std::borrow::Borrow;
 | 
					use std::borrow::Borrow;
 | 
				
			||||||
 | 
					use std::cmp::{Ordering, PartialOrd};
 | 
				
			||||||
use std::hash::{ Hash, Hasher };
 | 
					use std::hash::{ Hash, Hasher };
 | 
				
			||||||
use std::ops::Mul;
 | 
					use std::ops::Mul;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -242,6 +243,34 @@ impl<U, T: Mul<U, Output=T>> Mul<Rational<U>> for Rational<T> {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl PartialEq for Rational<i32> {
 | 
				
			||||||
 | 
					    fn eq(&self, other: &Self) -> bool {
 | 
				
			||||||
 | 
					        (self.denominator as i64).saturating_mul(other.numerator as i64)
 | 
				
			||||||
 | 
					            == (other.denominator as i64).saturating_mul(self.numerator as i64)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Eq for Rational<i32> {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Ord for Rational<i32> {
 | 
				
			||||||
 | 
					    fn cmp(&self, other: &Self) -> Ordering {
 | 
				
			||||||
 | 
					        // Using 64-bit values to make overflows unlikely.
 | 
				
			||||||
 | 
					        // If i32_max * u32_max can exceed i64_max,
 | 
				
			||||||
 | 
					        // then this is actually PartialOrd.
 | 
				
			||||||
 | 
					        // Saturating mul used just to avoid propagating mistakes.
 | 
				
			||||||
 | 
					        (other.denominator as i64).saturating_mul(self.numerator as i64)
 | 
				
			||||||
 | 
					            .cmp(
 | 
				
			||||||
 | 
					                &(self.denominator as i64).saturating_mul(other.numerator as i64)
 | 
				
			||||||
 | 
					             )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl PartialOrd for Rational<i32> {
 | 
				
			||||||
 | 
					    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
 | 
				
			||||||
 | 
					        Some(self.cmp(other))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Compares pointers but not internal values of Rc
 | 
					/// Compares pointers but not internal values of Rc
 | 
				
			||||||
pub struct Pointer<T>(pub Rc<T>);
 | 
					pub struct Pointer<T>(pub Rc<T>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -327,4 +356,20 @@ mod tests {
 | 
				
			|||||||
            vec![(5, 0), (6, 0), (7, 0), (5, 1), (6, 1), (7, 1), (5, 2)]
 | 
					            vec![(5, 0), (6, 0), (7, 0), (5, 1), (6, 1), (7, 1), (5, 2)]
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    #[test]
 | 
				
			||||||
 | 
					    fn check_rational_cmp() {
 | 
				
			||||||
 | 
					        assert_eq!(
 | 
				
			||||||
 | 
					            Rational { numerator: 1, denominator: 1 },
 | 
				
			||||||
 | 
					            Rational { numerator: 1, denominator: 1 },
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        assert_eq!(
 | 
				
			||||||
 | 
					            Rational { numerator: 1, denominator: 1 },
 | 
				
			||||||
 | 
					            Rational { numerator: 2, denominator: 2 },
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        assert!(
 | 
				
			||||||
 | 
					            Rational { numerator: 1, denominator: 1 }
 | 
				
			||||||
 | 
					            < Rational { numerator: 2, denominator: 1 }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user