removed wrapper

This commit is contained in:
2024-11-20 14:47:59 +01:00
parent a593829a81
commit e55606b9cf
4 changed files with 34 additions and 19 deletions
+17 -3
View File
@@ -4,7 +4,8 @@
#include <pthread.h> #include <pthread.h>
#include <time.h> #include <time.h>
typedef struct { typedef struct
{
uint32_t* state; uint32_t* state;
void* element; void* element;
} EventArgs; } EventArgs;
@@ -13,7 +14,8 @@ extern void render(void* element, uint32_t state);
extern void event(void* element, uint32_t* state); extern void event(void* element, uint32_t* state);
extern void init_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; struct timespec ts;
ts.tv_sec = milliseconds / 1000; ts.tv_sec = milliseconds / 1000;
ts.tv_nsec = (milliseconds % 1000) * 1000000; ts.tv_nsec = (milliseconds % 1000) * 1000000;
@@ -31,13 +33,25 @@ void *event_checker(void *args)
return NULL; 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) boolean_t c_run(void* element)
{ {
pthread_t thread; pthread_t thread;
uint32_t state = 3; uint32_t state = 3;
EventArgs event_args = { .element = element, .state = &state }; 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"); perror("Failed to create thread");
} }
+13 -14
View File
@@ -6,23 +6,16 @@ use crate::{
}; };
use std::ffi::c_void; 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" { extern "C" {
fn c_run(element: *mut c_void) -> bool; fn c_run(element: *mut c_void) -> bool;
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn render(ptr: *mut c_void, state: u32) { 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 (width, height) = get_term_size();
let mut frame: Vec<String> = create_frame(width, height); let mut frame: Vec<String> = create_frame(width, height);
render_to_frame(State::from_u32(state), width, &mut frame, element); 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] #[no_mangle]
pub extern "C" fn event(ptr: *mut c_void, state: *mut u32) { pub extern "C" fn event(ptr: *mut c_void, state: *mut u32) {
let event = crossterm::event::read().unwrap(); 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 { if let crossterm::event::Event::Resize(width, height) = event {
element.update_data(width as usize, height as usize); 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] #[no_mangle]
pub extern "C" fn init_event(ptr: *mut c_void, state: *mut u32) { pub extern "C" fn init_event(ptr: *mut c_void, state: *mut u32) {
let event = crossterm::event::Event::FocusGained; 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(); let (width, height) = get_term_size();
element.update_data(width, height); element.update_data(width, height);
element.event(event, &StateChanger(state)); element.event(event, &StateChanger(state));
@@ -55,7 +54,7 @@ pub fn run(element: &mut Element) -> bool {
enable_raw_mode().unwrap(); enable_raw_mode().unwrap();
clear(); clear();
unsafe { 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(); show_cursor();
disable_raw_mode().unwrap(); disable_raw_mode().unwrap();
clear(); clear();
+3 -1
View File
@@ -33,12 +33,14 @@ pub mod macros;
pub mod ui; pub mod ui;
pub mod utils; pub mod utils;
pub use app::run;
/// The `prelude` module provides commonly used imports and macros to simplify the development /// 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 /// of UI elements. It re-exports commonly used traits, structs, and utility functions to make
/// the UI framework easier to use. /// the UI framework easier to use.
pub mod prelude { pub mod prelude {
pub use crate::ui::Color::*; 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}; pub use crate::{Element, State, StateChanger, Value};
// useful for Element making // useful for Element making
pub use crate::{run_handler, Children, Component, ElementCore}; pub use crate::{run_handler, Children, Component, ElementCore};
+1 -1
View File
@@ -1,7 +1,7 @@
use osui::prelude::*; use osui::prelude::*;
fn main() { fn main() {
while run(&mut app()) {} while osui::run(&mut app()) {}
} }
fn app() -> Element { fn app() -> Element {