summaryrefslogtreecommitdiff
path: root/src/state
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-08-10 19:06:46 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-08-10 19:06:46 +0200
commit63cfcbe7a7745b276de58ec92e0141b958c44feb (patch)
tree990e33a83756e27187033579ee2f85d5c79169d5 /src/state
parentb747ca8af52129876b577a4f20f7105a05c6b002 (diff)
use unsafe blocks instead of mutexes
Diffstat (limited to 'src/state')
-rw-r--r--src/state/bar.rs8
-rw-r--r--src/state/editor/bar.rs3
-rw-r--r--src/state/editor/mod.rs24
-rw-r--r--src/state/log.rs4
-rw-r--r--src/state/mod.rs18
-rw-r--r--src/state/view/bar.rs3
-rw-r--r--src/state/view/mod.rs37
7 files changed, 35 insertions, 62 deletions
diff --git a/src/state/bar.rs b/src/state/bar.rs
index 2f8e6aa..ea69dfe 100644
--- a/src/state/bar.rs
+++ b/src/state/bar.rs
@@ -1,5 +1,5 @@
macro_rules! BarState {
- ($name:ident, $type:ty, $cfg:expr, $cfg_mut:expr) => {
+ ($name:ident, $type:ty, $cfg:expr) => {
use crate::lua::evalsto::EvalTo;
use crate::widgets::statusbar::StatusBar;
use mlua::{Lua, UserData};
@@ -36,19 +36,19 @@ macro_rules! BarState {
fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) {
fields.add_field_function_get("left", |_, _| Ok($cfg.left.clone()));
fields.add_field_function_set("left", |_, _, style: EvalTo<String, $type>| {
- $cfg_mut.left = style;
+ $cfg.left = style;
Ok(())
});
fields.add_field_function_get("middle", |_, _| Ok($cfg.middle.clone()));
fields.add_field_function_set("middle", |_, _, style: EvalTo<String, $type>| {
- $cfg_mut.middle = style;
+ $cfg.middle = style;
Ok(())
});
fields.add_field_function_get("right", |_, _| Ok($cfg.right.clone()));
fields.add_field_function_set("right", |_, _, style: EvalTo<String, $type>| {
- $cfg_mut.right = style;
+ $cfg.right = style;
Ok(())
});
}
diff --git a/src/state/editor/bar.rs b/src/state/editor/bar.rs
index 752d021..f6163af 100644
--- a/src/state/editor/bar.rs
+++ b/src/state/editor/bar.rs
@@ -3,6 +3,5 @@ use crate::state::{bar::BarState, GlobalState};
BarState!(
EditorBarState,
(),
- GlobalState::instance().editor.bar,
- GlobalState::instance_mut().editor.bar
+ GlobalState::get().editor.bar
);
diff --git a/src/state/editor/mod.rs b/src/state/editor/mod.rs
index 3639226..3e9d9e0 100644
--- a/src/state/editor/mod.rs
+++ b/src/state/editor/mod.rs
@@ -19,13 +19,7 @@ pub struct EditorState {
macro_rules! cfg {
() => {
- GlobalState::instance().editor
- };
-}
-
-macro_rules! cfg_mut {
- () => {
- GlobalState::instance_mut().editor
+ GlobalState::get().editor
};
}
@@ -51,12 +45,11 @@ impl UserData for EditorState {
fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) {
fields.add_field_function_get("visible", |_, _| Ok(cfg!().visible));
fields.add_field_function_set("visible", |_, _, visible: bool| {
- let mut state = GlobalState::instance_mut();
- state.editor.visible = visible;
+ cfg!().visible = visible;
- if let Window::Editor = state.active_window {
+ if let Window::Editor = GlobalState::get().active_window {
if !visible {
- state.set_focus(Window::View);
+ GlobalState::get().set_focus(Window::View);
}
}
@@ -65,17 +58,16 @@ impl UserData for EditorState {
fields.add_field_function_get("content", |_, _| Ok(cfg!().buffer.as_string()));
fields.add_field_function_set("content", |_, _, content: String| {
- cfg_mut!().buffer.set_lines_from_string(content);
+ cfg!().buffer.set_lines_from_string(content);
Ok(())
});
fields.add_field_function_get("cursor_shape", |_, _| Ok(cfg!().cursor_shape));
fields.add_field_function_set("cursor_shape", |_, _, shape: CursorShape| {
- cfg_mut!().cursor_shape = shape;
+ cfg!().cursor_shape = shape;
Ok(())
});
-
fields.add_field_function_get("lines", |lua, _| {
let table = lua.create_table()?;
@@ -86,7 +78,7 @@ impl UserData for EditorState {
Ok(table)
});
fields.add_field_function_set("lines", |_, _, content: String| {
- cfg_mut!().buffer.set_lines_from_string(content);
+ cfg!().buffer.set_lines_from_string(content);
Ok(())
});
@@ -100,7 +92,7 @@ impl UserData for EditorState {
});
methods.add_function("move_cursor", |_, m: CursorMove| {
- cfg_mut!().buffer.move_cursor(m);
+ cfg!().buffer.move_cursor(m);
Ok(())
})
}
diff --git a/src/state/log.rs b/src/state/log.rs
index f9b4665..6c0c924 100644
--- a/src/state/log.rs
+++ b/src/state/log.rs
@@ -14,7 +14,7 @@ impl LogState {
macro_rules! cfg {
() => {
- GlobalState::instance().log
+ GlobalState::get().log
};
}
@@ -22,7 +22,7 @@ impl UserData for LogState {
fn add_fields<'lua, F: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut F) {
fields.add_field_function_get("visible", |_, _| Ok(cfg!().visible));
fields.add_field_function_set("visible", |_, _, visible: bool| {
- let mut state = GlobalState::instance_mut();
+ let state = GlobalState::get();
state.log.visible = visible;
if let Window::Log = state.active_window {
diff --git a/src/state/mod.rs b/src/state/mod.rs
index 138b597..1b1430d 100644
--- a/src/state/mod.rs
+++ b/src/state/mod.rs
@@ -1,4 +1,4 @@
-use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
+use std::ptr::addr_of_mut;
use mlua::{UserData, UserDataFields};
@@ -19,7 +19,6 @@ pub struct GlobalState {
pub exit: bool,
}
-static GLOBAL_STATE: RwLock<GlobalState> = RwLock::new(GlobalState::new());
const DUMMY_STATE: GlobalState = GlobalState::new();
impl GlobalState {
@@ -33,12 +32,9 @@ impl GlobalState {
}
}
- pub fn instance() -> RwLockReadGuard<'static, Self> {
- GLOBAL_STATE.read().unwrap()
- }
-
- pub fn instance_mut() -> RwLockWriteGuard<'static, Self> {
- GLOBAL_STATE.write().unwrap()
+ pub fn get() -> &'static mut Self {
+ static mut GLOBAL_STATE: GlobalState = GlobalState::new();
+ unsafe { &mut *addr_of_mut!(GLOBAL_STATE) }
}
pub fn set_focus(&mut self, win: window::Window) {
@@ -58,17 +54,17 @@ impl UserData for GlobalState {
fields.add_field_function_get("editor", |_, _| Ok(DUMMY_STATE.editor));
fields.add_field_function_get("log", |_, _| Ok(DUMMY_STATE.log));
fields.add_field_function_get("active_window", |_, _| {
- Ok(GlobalState::instance().active_window)
+ Ok(GlobalState::get().active_window)
});
fields.add_field_function_set("active_window", |_, _, win: window::Window| {
- GlobalState::instance_mut().set_focus(win);
+ GlobalState::get().set_focus(win);
Ok(())
});
}
fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_function("quit", |_, _: ()| {
- GlobalState::instance_mut().exit = true;
+ GlobalState::get().exit = true;
Ok(())
})
}
diff --git a/src/state/view/bar.rs b/src/state/view/bar.rs
index 57898f5..f935de7 100644
--- a/src/state/view/bar.rs
+++ b/src/state/view/bar.rs
@@ -5,6 +5,5 @@ use super::mode::Mode;
BarState!(
SheetViewBarState,
Mode,
- GlobalState::instance().view.bar,
- GlobalState::instance_mut().view.bar
+ GlobalState::get().view.bar
);
diff --git a/src/state/view/mod.rs b/src/state/view/mod.rs
index 961c4ca..41937a1 100644
--- a/src/state/view/mod.rs
+++ b/src/state/view/mod.rs
@@ -1,5 +1,3 @@
-use std::sync::{Arc, RwLock};
-
use mlua::{IntoLua, UserData, Value};
use self::{bar::SheetViewBarState, mode::Mode};
@@ -37,24 +35,19 @@ impl SheetViewState {
}
}
- pub fn set_active_sheet(&mut self, sheet: Option<SheetId>) {
- if let Some(id) = sheet {
- if let Some(lock) = Register::get(id) {
- let sheet = lock.read().unwrap();
+ pub fn set_active_sheet(&mut self, active: Option<SheetId>) {
+ if let Some(id) = active {
+ if let Some(sheet) = Register::get(id) {
self.cursor.set_x_max(sheet.width() - 1);
self.cursor.set_y_max(sheet.height() - 1);
}
}
- self.active_sheet = sheet
+ self.active_sheet = active
}
- pub fn active_sheet(&self) -> Option<Arc<RwLock<Sheet>>> {
- if let Some(id) = self.active_sheet {
- Register::get(id)
- } else {
- None
- }
+ pub fn active_sheet(&self) -> Option<&'static mut Sheet> {
+ Register::get(self.active_sheet?)
}
pub fn cancel_mode(&mut self) {
@@ -121,13 +114,7 @@ impl SheetViewState {
macro_rules! cfg {
() => {
- GlobalState::instance().view
- };
-}
-
-macro_rules! cfg_mut {
- () => {
- GlobalState::instance_mut().view
+ GlobalState::get().view
};
}
@@ -143,9 +130,9 @@ impl UserData for SheetViewState {
fields.add_field_function_set("active", |_, _, sheet: Option<SheetLuaRef>| {
if let Some(r) = sheet {
- cfg_mut!().active_sheet = Some(r.id())
+ cfg!().active_sheet = Some(r.id())
} else {
- cfg_mut!().active_sheet = None
+ cfg!().active_sheet = None
}
Ok(())
@@ -160,7 +147,7 @@ impl UserData for SheetViewState {
fields.add_field_function_get("mode", |_, _| Ok(cfg!().mode));
fields.add_field_function_set("mode", |_, _, mode: Mode| {
- let this = &mut cfg_mut!();
+ let this = &mut cfg!();
match mode {
Mode::Visual => match this.mode {
Mode::Visual => {}
@@ -177,12 +164,12 @@ impl UserData for SheetViewState {
fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_function("move_cursor", |_, m: CursorMove| {
- cfg_mut!().cursor.move_checked(m);
+ cfg!().cursor.move_checked(m);
Ok(())
});
methods.add_function("cancel_mode", |_, _: ()| {
- cfg_mut!().cancel_mode();
+ cfg!().cancel_mode();
Ok(())
})
}