]> uap-core.de Git - note.git/commitdiff
fill event_type in for event callbacks
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 7 May 2026 19:27:21 +0000 (21:27 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Thu, 7 May 2026 19:27:21 +0000 (21:27 +0200)
ui-rs/src/ui/event.rs
ui-rs/src/ui/toolkit.rs

index 765fc5f071211b35b710170f699c13f9bedfcb39..0a1ff3c2d05615d904b5a33b03800ea747df3eae 100644 (file)
@@ -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<T> {
     pub callback: Box<dyn FnMut(&mut Event<T>)>
 }
@@ -83,9 +145,12 @@ pub extern "C" fn event_wrapper<T>(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<T>(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<T>(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;
index 4744baf5fc57fda40a9cbff0871205e24861807c..d80c76f184ec91ffeb78ea5fc1cb584002fd119f 100644 (file)
@@ -208,6 +208,10 @@ pub struct UiDouble {
     pub ptr: *mut ffi::UiDouble
 }
 
+pub struct UiRange {
+    pub ptr: *mut ffi::UiRange
+}
+
 pub struct UiList<T> {
     pub ptr: *mut ffi::UiList,
     ctx: *mut ffi::UiContext,