removed wrapper
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user