Compare commits

..

No commits in common. "b45d12edef7d4b37c12f1c0cdee2845482d448d1" and "d1849f639bf33968abd35592c6ada8dc96b97c09" have entirely different histories.

4 changed files with 34 additions and 60 deletions

6
Cargo.lock generated
View file

@ -1009,7 +1009,7 @@ dependencies = [
"indexmap 2.13.0", "indexmap 2.13.0",
"jiff", "jiff",
"keyframe", "keyframe",
"libcosmic-yoda", "libcosmic",
"libdisplay-info", "libdisplay-info",
"libsystemd", "libsystemd",
"log-panics", "log-panics",
@ -1115,7 +1115,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-randr-shell" name = "cosmic-randr-shell"
version = "1.3.0" version = "0.1.0"
dependencies = [ dependencies = [
"kdl", "kdl",
"slotmap", "slotmap",
@ -3139,7 +3139,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[package]] [[package]]
name = "libcosmic-yoda" name = "libcosmic"
version = "0.1.0-yoda.2" version = "0.1.0-yoda.2"
dependencies = [ dependencies = [
"apply", "apply",

View file

@ -43,7 +43,7 @@ iced_tiny_skia = { path = "../libcosmic/iced/tiny_skia" }
iced_graphics = { path = "../libcosmic/iced/graphics", features = ["geometry"] } iced_graphics = { path = "../libcosmic/iced/graphics", features = ["geometry"] }
indexmap = "2.13" indexmap = "2.13"
keyframe = "1.1.1" keyframe = "1.1.1"
cosmic = { package = "libcosmic-yoda", path = "../libcosmic", default-features = false, features = [ cosmic = { package = "libcosmic", path = "../libcosmic", default-features = false, features = [
"tokio", "tokio",
"wayland", "wayland",
"multi-window", "multi-window",

View file

@ -1269,26 +1269,15 @@ fn populate_modes(
) -> Result<()> { ) -> Result<()> {
let conn_info = drm.get_connector(conn, false)?; let conn_info = drm.get_connector(conn, false)?;
let max_bpc = drm_helpers::get_max_bpc(drm, conn)?.map(|(_val, range)| range.end.min(16)); let max_bpc = drm_helpers::get_max_bpc(drm, conn)?.map(|(_val, range)| range.end.min(16));
let preferred = conn_info let Some(mode) = conn_info
.modes() .modes()
.iter() .iter()
.find(|mode| mode.mode_type().contains(ModeTypeFlags::PREFERRED)) .find(|mode| mode.mode_type().contains(ModeTypeFlags::PREFERRED))
.copied() .copied()
.or(conn_info.modes().first().copied()); .or(conn_info.modes().first().copied())
let Some(preferred) = preferred else { else {
anyhow::bail!("No mode found"); anyhow::bail!("No mode found");
}; };
// Prefer the highest refresh rate at the native resolution so that
// high-refresh panels (120 Hz, 144 Hz, …) are used out-of-the-box
// without a pre-existing outputs.ron config.
let preferred_size = preferred.size();
let mode = conn_info
.modes()
.iter()
.filter(|m| m.size() == preferred_size)
.max_by_key(|m| drm_helpers::calculate_refresh_rate(**m))
.copied()
.unwrap_or(preferred);
let refresh_rate = drm_helpers::calculate_refresh_rate(mode); let refresh_rate = drm_helpers::calculate_refresh_rate(mode);
let output_mode = OutputMode { let output_mode = OutputMode {

View file

@ -13,7 +13,7 @@ use cosmic::{
widget::{self, container::draw_background, rule::FillMode, scrollable::AbsoluteOffset}, widget::{self, container::draw_background, rule::FillMode, scrollable::AbsoluteOffset},
}, },
theme, theme,
widget::{Icon, WindowControlsPosition, icon::from_name, text}, widget::{Icon, icon::from_name, text},
}; };
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -185,21 +185,16 @@ impl<Message: TabMessage + 'static> Tab<Message> {
close_button = close_button.on_press(close_message); close_button = close_button.on_press(close_message);
} }
let controls_position = cosmic::config::window_controls_position(); let items = vec![
widget::rule::vertical(4).class(self.rule_theme).into(),
let rule: cosmic::Element<'a, Message> = self.app_icon
widget::rule::vertical(4).class(self.rule_theme).into();
let app_icon: cosmic::Element<'a, Message> = self
.app_icon
.clone() .clone()
.apply(widget::container) .apply(widget::container)
.width(Length::Shrink) .width(Length::Shrink)
.padding([2, 4]) .padding([2, 4])
.center_y(Length::Fill) .center_y(Length::Fill)
.into(); .into(),
text::body(self.title)
let title: cosmic::Element<'a, Message> = text::body(self.title)
.font(self.font) .font(self.font)
.wrapping(Wrapping::None) .wrapping(Wrapping::None)
.shaping(Shaping::Advanced) .shaping(Shaping::Advanced)
@ -207,25 +202,15 @@ impl<Message: TabMessage + 'static> Tab<Message> {
.align_y(alignment::Vertical::Center) .align_y(alignment::Vertical::Center)
.height(Length::Fill) .height(Length::Fill)
.width(Length::Fill) .width(Length::Fill)
.into(); .into(),
close_button
let close: cosmic::Element<'a, Message> = close_button
.apply(widget::container) .apply(widget::container)
.width(Length::Shrink) .width(Length::Shrink)
.padding([2, 4]) .padding([2, 4])
.center_y(Length::Fill) .center_y(Length::Fill)
.align_x(match controls_position { .align_x(alignment::Horizontal::Right)
WindowControlsPosition::Start => alignment::Horizontal::Left, .into(),
WindowControlsPosition::End => alignment::Horizontal::Right, ];
})
.into();
// With macOS-style controls the close button leads the tab contents,
// mirroring the window buttons in the header bar.
let items = match controls_position {
WindowControlsPosition::Start => vec![rule, close, app_icon, title],
WindowControlsPosition::End => vec![rule, app_icon, title, close],
};
TabInternal { TabInternal {
id: self.id, id: self.id,