fix(graphics): better handle failures to set graphics mode

This commit is contained in:
Ashley Wulber 2023-02-20 12:59:53 -05:00
parent 9a3daa80a5
commit 360762536e
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820

View file

@ -24,14 +24,14 @@ use zbus::Connection;
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
enum GraphicsMode { enum GraphicsMode {
AppliedGraphicsMode(Graphics), AppliedGraphicsMode(Graphics),
SelectedGraphicsMode(Graphics), SelectedGraphicsMode { prev: Graphics, new: Graphics },
CurrentGraphicsMode(Graphics), CurrentGraphicsMode(Graphics),
} }
impl GraphicsMode { impl GraphicsMode {
fn inner(&self) -> Graphics { fn inner(&self) -> Graphics {
match self { match self {
GraphicsMode::SelectedGraphicsMode(g) => *g, GraphicsMode::SelectedGraphicsMode { new, .. } => *new,
GraphicsMode::CurrentGraphicsMode(g) => *g, GraphicsMode::CurrentGraphicsMode(g) => *g,
GraphicsMode::AppliedGraphicsMode(g) => *g, GraphicsMode::AppliedGraphicsMode(g) => *g,
} }
@ -76,16 +76,16 @@ impl Application for Window {
fn update(&mut self, message: Message) -> iced::Command<Self::Message> { fn update(&mut self, message: Message) -> iced::Command<Self::Message> {
match message { match message {
Message::SelectGraphicsMode(new_graphics_mode) => { Message::SelectGraphicsMode(new) => {
if let Some((_, proxy)) = self.dbus.as_ref() { if let Some((_, proxy)) = self.dbus.as_ref() {
self.graphics_mode = let prev = self
Some(GraphicsMode::SelectedGraphicsMode(new_graphics_mode)); .graphics_mode
return Command::perform( .map(|m| m.inner())
set_graphics(proxy.clone(), new_graphics_mode), .unwrap_or_else(|| Graphics::Integrated);
move |success| { self.graphics_mode = Some(GraphicsMode::SelectedGraphicsMode { prev, new });
Message::AppliedGraphics(success.ok().map(|_| new_graphics_mode)) return Command::perform(set_graphics(proxy.clone(), new), move |success| {
}, Message::AppliedGraphics(success.ok().map(|_| new))
); });
} }
} }
Message::TogglePopup => { Message::TogglePopup => {
@ -146,6 +146,38 @@ impl Application for Window {
Message::AppliedGraphics(g) => { Message::AppliedGraphics(g) => {
if let Some(g) = g { if let Some(g) = g {
self.graphics_mode = Some(GraphicsMode::AppliedGraphicsMode(g)); self.graphics_mode = Some(GraphicsMode::AppliedGraphicsMode(g));
} else {
// Reset graphics
match self.graphics_mode {
Some(GraphicsMode::SelectedGraphicsMode { prev, new }) => {
// TODO send notification with error?
self.graphics_mode = Some(GraphicsMode::AppliedGraphicsMode(prev));
// Reset to prev after failing
// https://github.com/pop-os/system76-power/issues/387
if let Some((_, proxy)) = self.dbus.as_ref() {
return Command::perform(
set_graphics(proxy.clone(), prev),
move |success| {
Message::AppliedGraphics(success.ok().map(|_| new))
},
);
}
}
_ => {
return Command::perform(
get_current_graphics(self.dbus.as_ref().unwrap().1.clone()),
|cur_graphics| {
Message::CurrentGraphics(match cur_graphics {
Ok(g) => Some(g),
Err(err) => {
dbg!(err);
None
}
})
},
)
}
};
} }
} }
} }
@ -199,9 +231,10 @@ impl Application for Window {
.width(Length::Fill), .width(Length::Fill),
icon( icon(
match self.graphics_mode { match self.graphics_mode {
Some(GraphicsMode::SelectedGraphicsMode( Some(GraphicsMode::SelectedGraphicsMode {
Graphics::Integrated, new: Graphics::Integrated,
)) => "process-working-symbolic", ..
}) => "process-working-symbolic",
_ => "emblem-ok-symbolic", _ => "emblem-ok-symbolic",
}, },
12 12
@ -212,8 +245,10 @@ impl Application for Window {
Svg::SymbolicActive, Svg::SymbolicActive,
Some(GraphicsMode::AppliedGraphicsMode(Graphics::Integrated)) => Some(GraphicsMode::AppliedGraphicsMode(Graphics::Integrated)) =>
Svg::SymbolicActive, Svg::SymbolicActive,
Some(GraphicsMode::SelectedGraphicsMode(Graphics::Integrated)) => Some(GraphicsMode::SelectedGraphicsMode {
Svg::Symbolic, new: Graphics::Integrated,
..
}) => Svg::Symbolic,
_ => Svg::Default, _ => Svg::Default,
},), },),
] ]
@ -231,8 +266,10 @@ impl Application for Window {
.width(Length::Fill), .width(Length::Fill),
icon( icon(
match self.graphics_mode { match self.graphics_mode {
Some(GraphicsMode::SelectedGraphicsMode(Graphics::Nvidia)) => Some(GraphicsMode::SelectedGraphicsMode {
"process-working-symbolic", new: Graphics::Nvidia,
..
}) => "process-working-symbolic",
_ => "emblem-ok-symbolic", _ => "emblem-ok-symbolic",
}, },
12 12
@ -243,8 +280,10 @@ impl Application for Window {
Svg::SymbolicActive, Svg::SymbolicActive,
Some(GraphicsMode::AppliedGraphicsMode(Graphics::Nvidia)) => Some(GraphicsMode::AppliedGraphicsMode(Graphics::Nvidia)) =>
Svg::SymbolicActive, Svg::SymbolicActive,
Some(GraphicsMode::SelectedGraphicsMode(Graphics::Nvidia)) => Some(GraphicsMode::SelectedGraphicsMode {
Svg::Symbolic, new: Graphics::Nvidia,
..
}) => Svg::Symbolic,
_ => Svg::Default, _ => Svg::Default,
}), }),
] ]
@ -263,8 +302,10 @@ impl Application for Window {
.width(Length::Fill), .width(Length::Fill),
icon( icon(
match self.graphics_mode { match self.graphics_mode {
Some(GraphicsMode::SelectedGraphicsMode(Graphics::Hybrid)) => Some(GraphicsMode::SelectedGraphicsMode {
"process-working-symbolic", new: Graphics::Hybrid,
..
}) => "process-working-symbolic",
_ => "emblem-ok-symbolic", _ => "emblem-ok-symbolic",
}, },
12 12
@ -275,8 +316,10 @@ impl Application for Window {
Svg::SymbolicActive, Svg::SymbolicActive,
Some(GraphicsMode::AppliedGraphicsMode(Graphics::Hybrid)) => Some(GraphicsMode::AppliedGraphicsMode(Graphics::Hybrid)) =>
Svg::SymbolicActive, Svg::SymbolicActive,
Some(GraphicsMode::SelectedGraphicsMode(Graphics::Hybrid)) => Some(GraphicsMode::SelectedGraphicsMode {
Svg::Symbolic, new: Graphics::Hybrid,
..
}) => Svg::Symbolic,
_ => Svg::Default, _ => Svg::Default,
}) })
] ]
@ -295,8 +338,10 @@ impl Application for Window {
.width(Length::Fill), .width(Length::Fill),
icon( icon(
match self.graphics_mode { match self.graphics_mode {
Some(GraphicsMode::SelectedGraphicsMode(Graphics::Compute)) => Some(GraphicsMode::SelectedGraphicsMode {
"process-working-symbolic", new: Graphics::Compute,
..
}) => "process-working-symbolic",
_ => "emblem-ok-symbolic", _ => "emblem-ok-symbolic",
}, },
12 12
@ -307,8 +352,10 @@ impl Application for Window {
Svg::SymbolicActive, Svg::SymbolicActive,
Some(GraphicsMode::AppliedGraphicsMode(Graphics::Compute)) => Some(GraphicsMode::AppliedGraphicsMode(Graphics::Compute)) =>
Svg::SymbolicActive, Svg::SymbolicActive,
Some(GraphicsMode::SelectedGraphicsMode(Graphics::Compute)) => Some(GraphicsMode::SelectedGraphicsMode {
Svg::Symbolic, new: Graphics::Compute,
..
}) => Svg::Symbolic,
_ => Svg::Default, _ => Svg::Default,
}), }),
] ]