aboutsummaryrefslogtreecommitdiff
path: root/src/niri.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-01-18 11:15:48 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-01-18 12:44:05 +0400
commitfa9b3ed10616e7039e2b0e2c4b797f396b74995f (patch)
treefde49a773c66201db730b507765c5fdb0a5d1eac /src/niri.rs
parentcc62a403c0144e8002de2f5a25fd50f203c661ee (diff)
downloadniri-fa9b3ed10616e7039e2b0e2c4b797f396b74995f.tar.gz
niri-fa9b3ed10616e7039e2b0e2c4b797f396b74995f.tar.bz2
niri-fa9b3ed10616e7039e2b0e2c4b797f396b74995f.zip
Add a config parse error notification
We can't rely on a notification daemon being available, especially during initial niri setup. So, render our own.
Diffstat (limited to 'src/niri.rs')
-rw-r--r--src/niri.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/niri.rs b/src/niri.rs
index e0762ae7..8109f2eb 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -90,6 +90,9 @@ use smithay::wayland::virtual_keyboard::VirtualKeyboardManagerState;
use crate::animation;
use crate::backend::tty::{SurfaceDmabufFeedback, TtyFrame, TtyRenderer, TtyRendererError};
use crate::backend::{Backend, RenderResult, Tty, Winit};
+use crate::config_error_notification::{
+ ConfigErrorNotification, ConfigErrorNotificationRenderElement,
+};
use crate::cursor::{CursorManager, CursorTextureCache, RenderCursor, XCursor};
#[cfg(feature = "dbus")]
use crate::dbus::gnome_shell_screenshot::{NiriToScreenshot, ScreenshotToNiri};
@@ -185,6 +188,7 @@ pub struct Niri {
pub lock_state: LockState,
pub screenshot_ui: ScreenshotUi,
+ pub config_error_notification: ConfigErrorNotification,
#[cfg(feature = "dbus")]
pub dbus: Option<crate::dbus::DBusServers>,
@@ -540,10 +544,14 @@ impl State {
Ok(config) => config,
Err(err) => {
warn!("{:?}", err.context("error loading config"));
+ self.niri.config_error_notification.show();
+ self.niri.queue_redraw_all();
return;
}
};
+ self.niri.config_error_notification.hide();
+
self.niri.layout.update_config(&config);
animation::ANIMATION_SLOWDOWN.store(config.debug.animation_slowdown, Ordering::Relaxed);
@@ -850,6 +858,7 @@ impl Niri {
});
let screenshot_ui = ScreenshotUi::new();
+ let config_error_notification = ConfigErrorNotification::new();
let socket_source = ListeningSocketSource::new_auto().unwrap();
let socket_name = socket_source.socket_name().to_os_string();
@@ -954,6 +963,7 @@ impl Niri {
lock_state: LockState::Unlocked,
screenshot_ui,
+ config_error_notification,
#[cfg(feature = "dbus")]
dbus: None,
@@ -1788,6 +1798,11 @@ impl Niri {
elements = self.pointer_element(renderer, output);
}
+ // The config error notification too.
+ if let Some(element) = self.config_error_notification.render(renderer, output) {
+ elements.push(element.into());
+ }
+
// If the session is locked, draw the lock surface.
if self.is_locked() {
let state = self.output_state.get(output).unwrap();
@@ -1915,6 +1930,11 @@ impl Niri {
.unwrap()
.are_animations_ongoing();
+ self.config_error_notification
+ .advance_animations(target_presentation_time);
+ state.unfinished_animations_remain |=
+ self.config_error_notification.are_animations_ongoing();
+
// Also keep redrawing if the current cursor is animated.
state.unfinished_animations_remain |= self
.cursor_manager
@@ -2828,6 +2848,7 @@ pub enum OutputRenderElements<R: NiriRenderer> {
NamedPointer(PrimaryGpuTextureRenderElement),
SolidColor(SolidColorRenderElement),
ScreenshotUi(ScreenshotUiRenderElement),
+ ConfigErrorNotification(ConfigErrorNotificationRenderElement<R>),
}
impl<R: NiriRenderer> Element for OutputRenderElements<R> {
@@ -2838,6 +2859,7 @@ impl<R: NiriRenderer> Element for OutputRenderElements<R> {
Self::NamedPointer(elem) => elem.id(),
Self::SolidColor(elem) => elem.id(),
Self::ScreenshotUi(elem) => elem.id(),
+ Self::ConfigErrorNotification(elem) => elem.id(),
}
}
@@ -2848,6 +2870,7 @@ impl<R: NiriRenderer> Element for OutputRenderElements<R> {
Self::NamedPointer(elem) => elem.current_commit(),
Self::SolidColor(elem) => elem.current_commit(),
Self::ScreenshotUi(elem) => elem.current_commit(),
+ Self::ConfigErrorNotification(elem) => elem.current_commit(),
}
}
@@ -2858,6 +2881,7 @@ impl<R: NiriRenderer> Element for OutputRenderElements<R> {
Self::NamedPointer(elem) => elem.geometry(scale),
Self::SolidColor(elem) => elem.geometry(scale),
Self::ScreenshotUi(elem) => elem.geometry(scale),
+ Self::ConfigErrorNotification(elem) => elem.geometry(scale),
}
}
@@ -2868,6 +2892,7 @@ impl<R: NiriRenderer> Element for OutputRenderElements<R> {
Self::NamedPointer(elem) => elem.transform(),
Self::SolidColor(elem) => elem.transform(),
Self::ScreenshotUi(elem) => elem.transform(),
+ Self::ConfigErrorNotification(elem) => elem.transform(),
}
}
@@ -2878,6 +2903,7 @@ impl<R: NiriRenderer> Element for OutputRenderElements<R> {
Self::NamedPointer(elem) => elem.src(),
Self::SolidColor(elem) => elem.src(),
Self::ScreenshotUi(elem) => elem.src(),
+ Self::ConfigErrorNotification(elem) => elem.src(),
}
}
@@ -2892,6 +2918,7 @@ impl<R: NiriRenderer> Element for OutputRenderElements<R> {
Self::NamedPointer(elem) => elem.damage_since(scale, commit),
Self::SolidColor(elem) => elem.damage_since(scale, commit),
Self::ScreenshotUi(elem) => elem.damage_since(scale, commit),
+ Self::ConfigErrorNotification(elem) => elem.damage_since(scale, commit),
}
}
@@ -2902,6 +2929,7 @@ impl<R: NiriRenderer> Element for OutputRenderElements<R> {
Self::NamedPointer(elem) => elem.opaque_regions(scale),
Self::SolidColor(elem) => elem.opaque_regions(scale),
Self::ScreenshotUi(elem) => elem.opaque_regions(scale),
+ Self::ConfigErrorNotification(elem) => elem.opaque_regions(scale),
}
}
@@ -2912,6 +2940,7 @@ impl<R: NiriRenderer> Element for OutputRenderElements<R> {
Self::NamedPointer(elem) => elem.alpha(),
Self::SolidColor(elem) => elem.alpha(),
Self::ScreenshotUi(elem) => elem.alpha(),
+ Self::ConfigErrorNotification(elem) => elem.alpha(),
}
}
@@ -2922,6 +2951,7 @@ impl<R: NiriRenderer> Element for OutputRenderElements<R> {
Self::NamedPointer(elem) => elem.kind(),
Self::SolidColor(elem) => elem.kind(),
Self::ScreenshotUi(elem) => elem.kind(),
+ Self::ConfigErrorNotification(elem) => elem.kind(),
}
}
}
@@ -2946,6 +2976,7 @@ impl RenderElement<GlesRenderer> for OutputRenderElements<GlesRenderer> {
Self::ScreenshotUi(elem) => {
RenderElement::<GlesRenderer>::draw(&elem, frame, src, dst, damage)
}
+ Self::ConfigErrorNotification(elem) => elem.draw(frame, src, dst, damage),
}
}
@@ -2956,6 +2987,7 @@ impl RenderElement<GlesRenderer> for OutputRenderElements<GlesRenderer> {
Self::NamedPointer(elem) => elem.underlying_storage(renderer),
Self::SolidColor(elem) => elem.underlying_storage(renderer),
Self::ScreenshotUi(elem) => elem.underlying_storage(renderer),
+ Self::ConfigErrorNotification(elem) => elem.underlying_storage(renderer),
}
}
}
@@ -2982,6 +3014,7 @@ impl<'render, 'alloc> RenderElement<TtyRenderer<'render, 'alloc>>
Self::ScreenshotUi(elem) => {
RenderElement::<TtyRenderer<'render, 'alloc>>::draw(&elem, frame, src, dst, damage)
}
+ Self::ConfigErrorNotification(elem) => elem.draw(frame, src, dst, damage),
}
}
@@ -2995,6 +3028,7 @@ impl<'render, 'alloc> RenderElement<TtyRenderer<'render, 'alloc>>
Self::NamedPointer(elem) => elem.underlying_storage(renderer),
Self::SolidColor(elem) => elem.underlying_storage(renderer),
Self::ScreenshotUi(elem) => elem.underlying_storage(renderer),
+ Self::ConfigErrorNotification(elem) => elem.underlying_storage(renderer),
}
}
}
@@ -3028,3 +3062,9 @@ impl<R: NiriRenderer> From<ScreenshotUiRenderElement> for OutputRenderElements<R
Self::ScreenshotUi(x)
}
}
+
+impl<R: NiriRenderer> From<ConfigErrorNotificationRenderElement<R>> for OutputRenderElements<R> {
+ fn from(x: ConfigErrorNotificationRenderElement<R>) -> Self {
+ Self::ConfigErrorNotification(x)
+ }
+}