From: Olaf Wintermann Date: Thu, 7 May 2026 19:27:21 +0000 (+0200) Subject: fill event_type in for event callbacks X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=b90c306c48bfc9f38a62debb6746ee64fdbab2e3;p=note.git fill event_type in for event callbacks --- diff --git a/ui-rs/src/ui/event.rs b/ui-rs/src/ui/event.rs index 765fc5f..0a1ff3c 100644 --- a/ui-rs/src/ui/event.rs +++ b/ui-rs/src/ui/event.rs @@ -28,9 +28,9 @@ #![allow(dead_code)] -use std::ffi::c_void; -use crate::ui::{event, ffi, UiDouble, UiInteger, UiString, UiText}; -use crate::ui::ffi::{UiEvent, UiRange}; +use std::ffi::{c_char, c_void, CStr, CString}; +use crate::ui::{event, ffi, UiDouble, UiInteger, UiString, UiText, UiRange}; +use crate::ui::ffi::{UiEvent}; pub struct Event<'a, T> { pub data: &'a mut T, @@ -61,6 +61,68 @@ pub enum EventType<'a> { FileList } +enum EventTypeData { + Null, + Pointer, + String(*const c_char), + IntegerValue(UiInteger), + StringValue(UiString), + TextValue(UiText), + DoubleValue(UiDouble), + RangeValue(UiRange), + ListSelection, + ListElement, + Dnd, + SubList, + FileList +} + +fn get_event_data(e: *const ffi::UiEvent) -> EventTypeData { + let event_type = unsafe { ui_event_get_eventdatatype(e) }; + let ptr = unsafe { ui_event_get_eventdata(e) }; + match event_type { + 3 => { + let i: *mut ffi::UiInteger = ptr.cast(); + EventTypeData::IntegerValue( UiInteger { ptr: i } ) + } + 4 => { + let s: *mut ffi::UiString = ptr.cast(); + EventTypeData::StringValue( UiString { ptr: s } ) + } + 5 => { + let t: *mut ffi::UiText = ptr.cast(); + EventTypeData::TextValue( UiText { ptr: t } ) + } + 6 => { + let d: *mut ffi::UiDouble = ptr.cast(); + EventTypeData::DoubleValue( UiDouble { ptr: d } ) + } + 7 => { + let d: *mut ffi::UiRange = ptr.cast(); + EventTypeData::RangeValue( UiRange { ptr: d } ) + } + _ => EventTypeData::Null + } +} + +fn get_event_type<'a>(data: &'a mut EventTypeData) -> EventType<'a> { + match data { + EventTypeData::Null => EventType::Null, + EventTypeData::Pointer => EventType::Pointer, + EventTypeData::String(s) => EventType::String(unsafe { CStr::from_ptr(*s).to_string_lossy().into_owned() }), + EventTypeData::IntegerValue(i) => EventType::IntegerValue( i ), + EventTypeData::StringValue(s) => EventType::StringValue (s), + EventTypeData::TextValue(t) => EventType::TextValue( t ), + EventTypeData::DoubleValue(d) => EventType::DoubleValue( d ), + EventTypeData::RangeValue(r) => EventType::RangeValue( r ), + EventTypeData::ListSelection => EventType::ListSelection, + EventTypeData::ListElement => EventType::ListElement, + EventTypeData::Dnd => EventType::Dnd, + EventTypeData::SubList => EventType::SubList, + EventTypeData::FileList => EventType::FileList, + } +} + pub struct EventWrapper { pub callback: Box)> } @@ -83,9 +145,12 @@ pub extern "C" fn event_wrapper(e: *const ffi::UiEvent, data: *mut c_void) { let ev_int = ui_event_get_int(e); let ev_set = ui_event_get_set(e) != 0; + let mut event_data = get_event_data(e); + let event_type = get_event_type(&mut event_data); + let mut event = Event { data: wdata, - event_type: EventType::Null, + event_type: event_type, intval: ev_int, set: ev_set }; @@ -107,8 +172,11 @@ pub extern "C" fn action_event_wrapper(e: *const ffi::UiEvent, data: *mut c_v let ev_int = ui_event_get_int(e); let ev_set = ui_event_get_set(e) != 0; + let mut event_data = get_event_data(e); + let event_type = get_event_type(&mut event_data); + let event = ActionEvent { - event_type: EventType::Null, + event_type: event_type, intval: ev_int, set: ev_set }; @@ -120,7 +188,7 @@ pub extern "C" fn action_event_wrapper(e: *const ffi::UiEvent, data: *mut c_v extern "C" { fn ui_event_get_windowdata(event: *const UiEvent) -> *const c_void; fn ui_event_get_document(event: *const UiEvent) -> *const c_void; - fn ui_event_get_eventdata(event: *const UiEvent) -> *const c_void; + fn ui_event_get_eventdata(event: *const UiEvent) -> *mut c_void; fn ui_event_get_eventdatatype(event: *const UiEvent) -> i32; fn ui_event_get_int(event: *const UiEvent) -> i32; fn ui_event_get_set(event: *const UiEvent) -> i32; diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs index 4744baf..d80c76f 100644 --- a/ui-rs/src/ui/toolkit.rs +++ b/ui-rs/src/ui/toolkit.rs @@ -208,6 +208,10 @@ pub struct UiDouble { pub ptr: *mut ffi::UiDouble } +pub struct UiRange { + pub ptr: *mut ffi::UiRange +} + pub struct UiList { pub ptr: *mut ffi::UiList, ctx: *mut ffi::UiContext,