Compare commits
2 commits
d1849f639b
...
b45d12edef
| Author | SHA1 | Date | |
|---|---|---|---|
| b45d12edef | |||
| 7187efd58f |
4 changed files with 60 additions and 34 deletions
6
Cargo.lock
generated
6
Cargo.lock
generated
|
|
@ -1009,7 +1009,7 @@ dependencies = [
|
||||||
"indexmap 2.13.0",
|
"indexmap 2.13.0",
|
||||||
"jiff",
|
"jiff",
|
||||||
"keyframe",
|
"keyframe",
|
||||||
"libcosmic",
|
"libcosmic-yoda",
|
||||||
"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 = "0.1.0"
|
version = "1.3.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"
|
name = "libcosmic-yoda"
|
||||||
version = "0.1.0-yoda.2"
|
version = "0.1.0-yoda.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"apply",
|
"apply",
|
||||||
|
|
|
||||||
|
|
@ -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", path = "../libcosmic", default-features = false, features = [
|
cosmic = { package = "libcosmic-yoda", path = "../libcosmic", default-features = false, features = [
|
||||||
"tokio",
|
"tokio",
|
||||||
"wayland",
|
"wayland",
|
||||||
"multi-window",
|
"multi-window",
|
||||||
|
|
|
||||||
|
|
@ -1269,15 +1269,26 @@ 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 Some(mode) = conn_info
|
let preferred = 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());
|
||||||
else {
|
let Some(preferred) = preferred 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 {
|
||||||
|
|
|
||||||
|
|
@ -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, icon::from_name, text},
|
widget::{Icon, WindowControlsPosition, icon::from_name, text},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
|
|
@ -185,32 +185,47 @@ impl<Message: TabMessage + 'static> Tab<Message> {
|
||||||
close_button = close_button.on_press(close_message);
|
close_button = close_button.on_press(close_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
let items = vec![
|
let controls_position = cosmic::config::window_controls_position();
|
||||||
widget::rule::vertical(4).class(self.rule_theme).into(),
|
|
||||||
self.app_icon
|
let rule: cosmic::Element<'a, Message> =
|
||||||
.clone()
|
widget::rule::vertical(4).class(self.rule_theme).into();
|
||||||
.apply(widget::container)
|
|
||||||
.width(Length::Shrink)
|
let app_icon: cosmic::Element<'a, Message> = self
|
||||||
.padding([2, 4])
|
.app_icon
|
||||||
.center_y(Length::Fill)
|
.clone()
|
||||||
.into(),
|
.apply(widget::container)
|
||||||
text::body(self.title)
|
.width(Length::Shrink)
|
||||||
.font(self.font)
|
.padding([2, 4])
|
||||||
.wrapping(Wrapping::None)
|
.center_y(Length::Fill)
|
||||||
.shaping(Shaping::Advanced)
|
.into();
|
||||||
.ellipsize(Ellipsize::End(EllipsizeHeightLimit::Lines(1)))
|
|
||||||
.align_y(alignment::Vertical::Center)
|
let title: cosmic::Element<'a, Message> = text::body(self.title)
|
||||||
.height(Length::Fill)
|
.font(self.font)
|
||||||
.width(Length::Fill)
|
.wrapping(Wrapping::None)
|
||||||
.into(),
|
.shaping(Shaping::Advanced)
|
||||||
close_button
|
.ellipsize(Ellipsize::End(EllipsizeHeightLimit::Lines(1)))
|
||||||
.apply(widget::container)
|
.align_y(alignment::Vertical::Center)
|
||||||
.width(Length::Shrink)
|
.height(Length::Fill)
|
||||||
.padding([2, 4])
|
.width(Length::Fill)
|
||||||
.center_y(Length::Fill)
|
.into();
|
||||||
.align_x(alignment::Horizontal::Right)
|
|
||||||
.into(),
|
let close: cosmic::Element<'a, Message> = close_button
|
||||||
];
|
.apply(widget::container)
|
||||||
|
.width(Length::Shrink)
|
||||||
|
.padding([2, 4])
|
||||||
|
.center_y(Length::Fill)
|
||||||
|
.align_x(match controls_position {
|
||||||
|
WindowControlsPosition::Start => alignment::Horizontal::Left,
|
||||||
|
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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue