From e55606b9cf41aa9bfa9ddb999f210250854fadde Mon Sep 17 00:00:00 2001 From: Leo dev Date: Wed, 20 Nov 2024 14:47:59 +0100 Subject: [PATCH] removed wrapper --- src/app.c | 20 +++++++++++++++++--- src/app.rs | 27 +++++++++++++-------------- src/lib.rs | 4 +++- src/main.rs | 2 +- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/app.c b/src/app.c index 8677ed4..21ed5b9 100644 --- a/src/app.c +++ b/src/app.c @@ -4,7 +4,8 @@ #include #include -typedef struct { +typedef struct +{ uint32_t* state; void* element; } EventArgs; @@ -13,7 +14,8 @@ extern void render(void* element, uint32_t state); extern void event(void* element, uint32_t* state); extern void init_event(void* element, uint32_t* state); -void sleep_ms(long milliseconds) { +void sleep_ms(long milliseconds) +{ struct timespec ts; ts.tv_sec = milliseconds / 1000; ts.tv_nsec = (milliseconds % 1000) * 1000000; @@ -31,13 +33,25 @@ void *event_checker(void *args) return NULL; } +void *command_checker(void *args) +{ + EventArgs* event_args = (EventArgs*)args; + init_event(event_args->element, event_args->state); + while (1) { + if (event_args->state == 0) { return NULL; } + event(event_args->element, event_args->state); + } + return NULL; +} + boolean_t c_run(void* element) { pthread_t thread; uint32_t state = 3; EventArgs event_args = { .element = element, .state = &state }; - if (pthread_create(&thread, NULL, event_checker, &event_args) != 0) { + if (pthread_create(&thread, NULL, event_checker, &event_args) != 0) + { perror("Failed to create thread"); } diff --git a/src/app.rs b/src/app.rs index 276f60e..e71a09b 100644 --- a/src/app.rs +++ b/src/app.rs @@ -6,23 +6,16 @@ use crate::{ }; use std::ffi::c_void; -struct ElementWrapper<'a>(&'a mut Element); - -impl<'a> ElementWrapper<'a> { - pub unsafe fn from_raw(ptr: *mut c_void) -> &'a mut Element { - assert!(!ptr.is_null(), "Pointer to ElementWrapper is null"); - let wrapper = ptr as *mut ElementWrapper; - (*wrapper).0 - } -} - extern "C" { fn c_run(element: *mut c_void) -> bool; } #[no_mangle] pub extern "C" fn render(ptr: *mut c_void, state: u32) { - let element = unsafe { ElementWrapper::from_raw(ptr) }; + let element = unsafe { + assert!(!ptr.is_null(), "Pointer is null"); + &mut *(ptr as *mut Element) + }; let (width, height) = get_term_size(); let mut frame: Vec = create_frame(width, height); render_to_frame(State::from_u32(state), width, &mut frame, element); @@ -34,7 +27,10 @@ pub extern "C" fn render(ptr: *mut c_void, state: u32) { #[no_mangle] pub extern "C" fn event(ptr: *mut c_void, state: *mut u32) { let event = crossterm::event::read().unwrap(); - let element = unsafe { ElementWrapper::from_raw(ptr) }; + let element = unsafe { + assert!(!ptr.is_null(), "Pointer is null"); + &mut *(ptr as *mut Element) + }; if let crossterm::event::Event::Resize(width, height) = event { element.update_data(width as usize, height as usize); } @@ -44,7 +40,10 @@ pub extern "C" fn event(ptr: *mut c_void, state: *mut u32) { #[no_mangle] pub extern "C" fn init_event(ptr: *mut c_void, state: *mut u32) { let event = crossterm::event::Event::FocusGained; - let element = unsafe { ElementWrapper::from_raw(ptr) }; + let element = unsafe { + assert!(!ptr.is_null(), "Pointer is null"); + &mut *(ptr as *mut Element) + }; let (width, height) = get_term_size(); element.update_data(width, height); element.event(event, &StateChanger(state)); @@ -55,7 +54,7 @@ pub fn run(element: &mut Element) -> bool { enable_raw_mode().unwrap(); clear(); unsafe { - let c = c_run(&mut ElementWrapper(element) as *mut ElementWrapper as *mut c_void); + let c = c_run(element as *mut Element as *mut c_void); show_cursor(); disable_raw_mode().unwrap(); clear(); diff --git a/src/lib.rs b/src/lib.rs index 96c8f02..e293f0d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -33,12 +33,14 @@ pub mod macros; pub mod ui; pub mod utils; +pub use app::run; + /// The `prelude` module provides commonly used imports and macros to simplify the development /// of UI elements. It re-exports commonly used traits, structs, and utility functions to make /// the UI framework easier to use. pub mod prelude { pub use crate::ui::Color::*; - pub use crate::{app::run, css, rsx, rsx_elem, ui::*, Handler}; + pub use crate::{self as osui, css, rsx, rsx_elem, ui::*, Handler}; pub use crate::{Element, State, StateChanger, Value}; // useful for Element making pub use crate::{run_handler, Children, Component, ElementCore}; diff --git a/src/main.rs b/src/main.rs index a2f1d5d..3820e0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use osui::prelude::*; fn main() { - while run(&mut app()) {} + while osui::run(&mut app()) {} } fn app() -> Element {