From: Olaf Wintermann Date: Sun, 14 Jun 2026 15:36:17 +0000 (+0200) Subject: switch to Rust 2024 X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2Fmain;p=note.git switch to Rust 2024 --- diff --git a/application/Cargo.toml b/application/Cargo.toml index ff1c6f5..ed6f7a6 100644 --- a/application/Cargo.toml +++ b/application/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "note" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] ui-rs = { path = "../ui-rs" } diff --git a/application/src/note.rs b/application/src/note.rs index 9dc7743..5aea4cc 100644 --- a/application/src/note.rs +++ b/application/src/note.rs @@ -98,16 +98,20 @@ impl Note { n.init_from_model(model); n.load_content(d); } - + // make sure we receive an event, when this note is attached or detached d.ctx.on_attachment_status_change_action("attachment_status_changed"); }) } + /// Handles any attachment status change, which includes if this note is + /// directly attached or detached, but also if any parent attachment status changes #[action] pub fn attachment_status_changed(&mut self, _event: &ActionEvent) -> Option<()>{ let doc = self.doc.get_doc()?; if doc.ctx.is_attached_to_obj() { + + if let NoteId::Id(note_id) = self.id { self.lock = self.backend.backend.lockmgr.lock_note(note_id); if self.lock.is_none() { diff --git a/ui-rs-derive/Cargo.toml b/ui-rs-derive/Cargo.toml index 65ad522..35383d5 100644 --- a/ui-rs-derive/Cargo.toml +++ b/ui-rs-derive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ui-rs-derive" version = "0.1.0" -edition = "2021" +edition = "2024" [lib] proc-macro = true diff --git a/ui-rs/Cargo.toml b/ui-rs/Cargo.toml index 4014cbc..4f04a28 100644 --- a/ui-rs/Cargo.toml +++ b/ui-rs/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ui-rs" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] ui-rs-derive = { path = "../ui-rs-derive" } diff --git a/ui-rs/src/ui/application.rs b/ui-rs/src/ui/application.rs index 88df641..0ba86f2 100644 --- a/ui-rs/src/ui/application.rs +++ b/ui-rs/src/ui/application.rs @@ -62,7 +62,7 @@ impl UiActions for NoAppData { fn init_actions(&mut self, _ctx: &UiContext) {} } -extern "C" { +unsafe extern "C" { fn ui_main(); fn ui_onstartup(callback: UiCallback, userdata: *mut c_void); diff --git a/ui-rs/src/ui/button.rs b/ui-rs/src/ui/button.rs index f13a9b2..48e7d3d 100644 --- a/ui-rs/src/ui/button.rs +++ b/ui-rs/src/ui/button.rs @@ -821,7 +821,7 @@ impl LinkButton { } } -extern "C" { +unsafe extern "C" { fn ui_button_create(obj: *const UiObject, args: *const UiButtonArgs) -> *mut c_void; fn ui_togglebutton_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void; fn ui_checkbox_create(obj: *const UiObject, args: *const UiToggleArgs) -> *mut c_void; diff --git a/ui-rs/src/ui/container.rs b/ui-rs/src/ui/container.rs index a3c7d01..261db10 100644 --- a/ui-rs/src/ui/container.rs +++ b/ui-rs/src/ui/container.rs @@ -1137,7 +1137,7 @@ impl<'a, T> TabViewBuilder<'a, T> { /* -------------------------------- C functions -------------------------------- */ -extern "C" { +unsafe extern "C" { fn ui_container_begin_close(obj: *mut UiObject); fn ui_container_finish(obj: *mut UiObject) -> c_int; diff --git a/ui-rs/src/ui/event.rs b/ui-rs/src/ui/event.rs index 2610d95..3fb2104 100644 --- a/ui-rs/src/ui/event.rs +++ b/ui-rs/src/ui/event.rs @@ -380,7 +380,7 @@ impl SubListEvent { } -extern "C" { +unsafe extern "C" { fn ui_event_get_obj(event: *const UiEvent) -> *mut ffi::UiObject; fn ui_event_get_windowdata(event: *const UiEvent) -> *const c_void; fn ui_event_get_document(event: *const UiEvent) -> *const c_void; diff --git a/ui-rs/src/ui/icon.rs b/ui-rs/src/ui/icon.rs index d4d4cca..008763b 100644 --- a/ui-rs/src/ui/icon.rs +++ b/ui-rs/src/ui/icon.rs @@ -55,6 +55,6 @@ impl UiIconSet { } } -extern "C" { +unsafe extern "C" { fn ui_icon_name(id: i32) -> *const c_char ; } \ No newline at end of file diff --git a/ui-rs/src/ui/label.rs b/ui-rs/src/ui/label.rs index 8dfe3fe..501ba0c 100644 --- a/ui-rs/src/ui/label.rs +++ b/ui-rs/src/ui/label.rs @@ -252,7 +252,7 @@ impl<'a, T> LabelBuilder<'a, T> { } } -extern "C" { +unsafe extern "C" { fn ui_label_create(obj: *const ffi::UiObject, args: *const UiLabelArgs) -> *mut c_void; fn ui_llabel_create(obj: *const ffi::UiObject, args: *const UiLabelArgs) -> *mut c_void; fn ui_rlabel_create(obj: *const ffi::UiObject, args: *const UiLabelArgs) -> *mut c_void; diff --git a/ui-rs/src/ui/list.rs b/ui-rs/src/ui/list.rs index 5236170..0a732d6 100644 --- a/ui-rs/src/ui/list.rs +++ b/ui-rs/src/ui/list.rs @@ -988,7 +988,7 @@ type SLGetValueFunc = extern "C" fn( userdata: *mut c_void); -extern "C" { +unsafe extern "C" { fn malloc(size: usize) -> *mut c_void; fn ui_listview_create(obj: *const UiObject, args: *const UiListArgs) -> *mut c_void; diff --git a/ui-rs/src/ui/menu.rs b/ui-rs/src/ui/menu.rs index b5b2c4c..bf060ec 100644 --- a/ui-rs/src/ui/menu.rs +++ b/ui-rs/src/ui/menu.rs @@ -230,7 +230,7 @@ impl Drop for MenuToggleItemBuilder { } } -extern "C" { +unsafe extern "C" { fn ui_menu_create(label: *const c_char); fn ui_menuitem_create(args: *const UiMenuItemArgs); fn ui_menu_toggleitem_create(args: *const UiMenuToggleItemArgs); diff --git a/ui-rs/src/ui/text.rs b/ui-rs/src/ui/text.rs index 378f113..3064de0 100644 --- a/ui-rs/src/ui/text.rs +++ b/ui-rs/src/ui/text.rs @@ -615,7 +615,7 @@ impl<'a, T> TextFieldBuilder<'a, T> { /* -------------------------------- C functions -------------------------------- */ -extern "C" { +unsafe extern "C" { fn ui_textarea_create(obj: *const UiObject, args: *const UiTextAreaArgs) -> *mut c_void; fn ui_textfield_create(obj: *const UiObject, args: *const UiTextFieldArgs) -> *mut c_void; fn ui_frameless_textfield_create(obj: *const UiObject, args: *const UiTextFieldArgs) -> *mut c_void; diff --git a/ui-rs/src/ui/toolbar.rs b/ui-rs/src/ui/toolbar.rs index e204ad0..f5d0618 100644 --- a/ui-rs/src/ui/toolbar.rs +++ b/ui-rs/src/ui/toolbar.rs @@ -317,7 +317,7 @@ impl ToolbarMenuItemBuilder { } -extern "C" { +unsafe extern "C" { fn ui_toolbar_item_create(name: *const c_char, args: *const UiToolbarItemArgs); fn ui_toolbar_toggleitem_create(name: *const c_char, args: *const UiToolbarToggleItemArgs); fn ui_toolbar_menu_create(name: *const c_char, args: *const UiToolbarMenuArgs); diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs index fb1b544..298c084 100644 --- a/ui-rs/src/ui/toolkit.rs +++ b/ui-rs/src/ui/toolkit.rs @@ -156,18 +156,20 @@ impl UiContext { where F: FnMut(&mut T, &mut event::ActionEvent) + 'static { // if this is a document context, use the document pointer as target // otherwise it is a UiObject context, in that case we use the window_data as target - let doc_ptr = ui_context_document(self.ptr) as *mut T; - let target_ptr = if !doc_ptr.is_null() { - let doc_storage: *mut *mut T = doc_ptr.cast(); - *doc_storage - } else { - let obj_ptr = ui_context_obj(self.ptr); - assert!(!obj_ptr.is_null()); - let obj_wdata_ptr = ui_object_get_windowdata(obj_ptr); - assert!(!obj_wdata_ptr.is_null()); - obj_wdata_ptr as *mut T - }; - self.add_action_for_target(target_ptr, name, f); + unsafe { + let doc_ptr = ui_context_document(self.ptr) as *mut T; + let target_ptr = if !doc_ptr.is_null() { + let doc_storage: *mut *mut T = doc_ptr.cast(); + *doc_storage + } else { + let obj_ptr = ui_context_obj(self.ptr); + assert!(!obj_ptr.is_null()); + let obj_wdata_ptr = ui_object_get_windowdata(obj_ptr); + assert!(!obj_wdata_ptr.is_null()); + obj_wdata_ptr as *mut T + }; + self.add_action_for_target(target_ptr, name, f); + } } pub unsafe fn add_action_for_target(&self, target_ptr: *mut T, name: &str, f: F) @@ -175,7 +177,9 @@ impl UiContext { let wrapper = Box::new(ActionEventWrapper { callback: Box::new(f), target: target_ptr }); let ptr = self.reg_box(wrapper); let cstr = CString::new(name).unwrap(); - ui_add_action(self.ptr, cstr.as_ptr(), Some(action_event_wrapper::), ptr as *mut c_void); + unsafe { + ui_add_action(self.ptr, cstr.as_ptr(), Some(action_event_wrapper::), ptr as *mut c_void); + } } pub fn add_action_untyped(&self, name: &str, f: F) @@ -296,8 +300,10 @@ impl UiDoc { } pub unsafe fn get_data_ptr(&self) -> *mut T { - let ptr: *mut *mut T = self.ptr.cast(); - *ptr + unsafe { + let ptr: *mut *mut T = self.ptr.cast(); + *ptr + } } pub fn add_action(&mut self, name: &str, f: F) @@ -1223,9 +1229,11 @@ extern "C" fn list_destroy(_ctx: *mut ffi::UiContext, _list: *mut ffi::UiList } pub unsafe fn ui_list_get<'a, T>(list: *const ffi::UiList, index: usize) -> Option<&'a T> { - let data = ui_list_get_data(list); - let ls = &*(data as *mut Vec); - ls.get(index) + unsafe { + let data = ui_list_get_data(list); + let ls = &*(data as *mut Vec); + ls.get(index) + } } @@ -1308,7 +1316,7 @@ pub fn app_set_configdir(path: &str) { /* -------------------------------- C functions -------------------------------- */ -extern "C" { +unsafe extern "C" { fn ui_init(appname: *const c_char, argc: c_int, argv: *const *const c_char); pub fn ui_global_context() -> *mut ffi::UiContext; fn ui_getappdir() -> *mut c_char; @@ -1358,7 +1366,7 @@ type UiListNextFunc = extern "C" fn(*mut ffi::UiList) -> *mut c_void; type UiListGetFunc = extern "C" fn(*const ffi::UiList, c_int) -> *mut c_void; type UiListCountFunc = extern "C" fn(*const ffi::UiList) -> c_int; -extern "C" { +unsafe extern "C" { pub fn ui_app_ref(); pub fn ui_app_unref(); diff --git a/ui-rs/src/ui/widget.rs b/ui-rs/src/ui/widget.rs index 07bdc76..bf0f7e8 100644 --- a/ui-rs/src/ui/widget.rs +++ b/ui-rs/src/ui/widget.rs @@ -59,7 +59,7 @@ pub trait Widget { /* ------------------------------ C functions ----------------------------- */ -extern "C" { +unsafe extern "C" { fn ui_widget_set_size(widget: *mut c_void, width: c_int, height: c_int); fn ui_widget_redraw(widget: *mut c_void); fn ui_widget_set_enabled(widget: *mut c_void, enable: c_int); diff --git a/ui-rs/src/ui/window.rs b/ui-rs/src/ui/window.rs index b0df465..bc28e3a 100644 --- a/ui-rs/src/ui/window.rs +++ b/ui-rs/src/ui/window.rs @@ -494,7 +494,7 @@ where F: FnMut(&mut event::Event) + 'static { /* ---------------------------------- C functions ---------------------------------- */ -extern "C" { +unsafe extern "C" { fn ui_window(title: *const c_char) -> *mut UiObject; fn ui_sidebar_window(title: *const c_char) -> *mut UiObject; fn ui_splitview_window(title: *const c_char, sidebar: c_int) -> *mut UiObject;