api: Add modeline to Output::setup

This commit is contained in:
Ottatop 2024-06-04 18:37:45 -05:00
parent f16767240e
commit 6c21f49177
2 changed files with 40 additions and 10 deletions

View file

@ -163,6 +163,7 @@ end
---@class OutputSetup ---@class OutputSetup
---@field filter (fun(output: OutputHandle): boolean)? -- A filter for wildcard matches that should return true if this setup should apply to the passed in output. ---@field filter (fun(output: OutputHandle): boolean)? -- A filter for wildcard matches that should return true if this setup should apply to the passed in output.
---@field mode Mode? -- Makes this setup apply the given mode to outputs. ---@field mode Mode? -- Makes this setup apply the given mode to outputs.
---@field modeline (string|Modeline)? -- Makes this setup apply the given modeline to outputs. This takes precedence over `mode`.
---@field scale number? -- Makes this setup apply the given scale to outputs. ---@field scale number? -- Makes this setup apply the given scale to outputs.
---@field tags string[]? -- Makes this setup add tags with the given name to outputs. ---@field tags string[]? -- Makes this setup add tags with the given name to outputs.
---@field transform Transform? -- Makes this setup applt the given transform to outputs. ---@field transform Transform? -- Makes this setup applt the given transform to outputs.
@ -289,7 +290,9 @@ function output.setup(setups)
goto continue goto continue
end end
if setup.mode then if setup.modeline then
op:set_modeline(setup.modeline)
elseif setup.mode then
op:set_mode( op:set_mode(
setup.mode.pixel_width, setup.mode.pixel_width,
setup.mode.pixel_height, setup.mode.pixel_height,

View file

@ -443,10 +443,15 @@ impl std::fmt::Debug for OutputMatcher {
} }
} }
enum OutputMode {
Mode(Mode),
Modeline(Modeline),
}
/// An output setup for use in [`Output::setup`]. /// An output setup for use in [`Output::setup`].
pub struct OutputSetup { pub struct OutputSetup {
output: OutputMatcher, output: OutputMatcher,
mode: Option<Mode>, mode: Option<OutputMode>,
scale: Option<f32>, scale: Option<f32>,
tag_names: Option<Vec<String>>, tag_names: Option<Vec<String>>,
transform: Option<Transform>, transform: Option<Transform>,
@ -478,9 +483,24 @@ impl OutputSetup {
} }
/// Makes this setup apply the given [`Mode`] to its outputs. /// Makes this setup apply the given [`Mode`] to its outputs.
///
/// This will overwrite [`OutputSetup::with_modeline`] if called after it.
pub fn with_mode(self, mode: Mode) -> Self { pub fn with_mode(self, mode: Mode) -> Self {
Self { Self {
mode: Some(mode), mode: Some(OutputMode::Mode(mode)),
..self
}
}
/// Makes this setup apply the given [`Modeline`] to its outputs.
///
/// You can parse a modeline string into a modeline. See [`OutputHandle::set_modeline`] for
/// specifics.
///
/// This will overwrite [`OutputSetup::with_mode`] if called after it.
pub fn with_modeline(self, modeline: Modeline) -> Self {
Self {
mode: Some(OutputMode::Modeline(modeline)),
..self ..self
} }
} }
@ -511,11 +531,18 @@ impl OutputSetup {
fn apply(&self, output: &OutputHandle, tag: &Tag) { fn apply(&self, output: &OutputHandle, tag: &Tag) {
if let Some(mode) = &self.mode { if let Some(mode) = &self.mode {
output.set_mode( match mode {
mode.pixel_width, OutputMode::Mode(mode) => {
mode.pixel_height, output.set_mode(
Some(mode.refresh_rate_millihertz), mode.pixel_width,
); mode.pixel_height,
Some(mode.refresh_rate_millihertz),
);
}
OutputMode::Modeline(modeline) => {
output.set_modeline(*modeline);
}
}
} }
if let Some(scale) = self.scale { if let Some(scale) = self.scale {
output.set_scale(scale); output.set_scale(scale);
@ -530,7 +557,7 @@ impl OutputSetup {
} }
/// A location for an output. /// A location for an output.
#[derive(Clone, Debug)] #[derive(Clone, Debug, PartialEq, Eq)]
pub enum OutputLoc { pub enum OutputLoc {
/// A specific point in the global space of the form (x, y). /// A specific point in the global space of the form (x, y).
Point(i32, i32), Point(i32, i32),
@ -1294,7 +1321,7 @@ impl OutputHandle {
} }
/// A possible output pixel dimension and refresh rate configuration. /// A possible output pixel dimension and refresh rate configuration.
#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Default)]
pub struct Mode { pub struct Mode {
/// The width of the output, in pixels. /// The width of the output, in pixels.
pub pixel_width: u32, pub pixel_width: u32,