fix(graphics): better handle failures to set graphics mode
This commit is contained in:
parent
9a3daa80a5
commit
360762536e
1 changed files with 75 additions and 28 deletions
|
|
@ -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,
|
||||||
}),
|
}),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue