]> uap-core.de Git - note.git/commitdiff
simplify note title change detection main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 30 May 2026 19:23:36 +0000 (21:23 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 30 May 2026 19:23:36 +0000 (21:23 +0200)
15 files changed:
application/src/note.rs
application/src/window.rs
ui-rs/src/ui/event.rs
ui-rs/src/ui/text.rs
ui/common/args.c
ui/common/args.h
ui/gtk/text.c
ui/gtk/text.h
ui/motif/button.c
ui/motif/button.h
ui/motif/menu.c
ui/motif/text.c
ui/motif/toolkit.c
ui/motif/toolkit.h
ui/ui/text.h

index b49dbbcbd5e6c9a69b2dd1195715dfcef1203b95..1c7550324cf4df3bc7cf655e0c79337c081244eb 100644 (file)
@@ -19,6 +19,7 @@ pub struct Note {
     pub kind: NoteType,
     pub created: DateTimeWithTimeZone,
 
+    extract_title: bool,
     title_start: i32,
     title_end: i32,
 
@@ -40,6 +41,7 @@ impl Note {
             content_id: 0,
             kind: NoteType::PlainTextNote,
             created: Default::default(),
+            extract_title: false,
             title_start: -1,
             title_end: -1,
 
@@ -124,24 +126,20 @@ impl Note {
         });
     }
 
+    /// Event before the text is changed: detect if the change affects the title
     #[action]
-    pub fn note_text_changed(&mut self, event: &ActionEvent) {
+    pub fn note_text_change(&mut self, event: &ActionEvent) {
         if event.set {
+            self.extract_title = false;
             return;
         }
 
-        let mut content = "".to_string();
         // check if any text in the title range has changed
         let pos = match &event.event_type {
             EventType::TextInsert(t) => {
-                content = self.text.get();
-                content.insert_str(t.pos as usize, t.text.as_str());
                 t.pos
             },
             EventType::TextDelete(t) => {
-                content = self.text.get();
-                let range = t.begin as usize..t.end as usize;
-                content.replace_range(range, "");
                 t.begin
             },
             _ => {
@@ -151,9 +149,16 @@ impl Note {
         if self.title_end != -1 && pos > self.title_end + 1 {
             //return; // this text edit can not change the title
         }
+        self.extract_title = true;
+    }
+
 
-        // TODO: we don't need the full text
-        self.update_title(content.as_str(), true);
+    #[action]
+    pub fn note_text_changed(&mut self, event: &ActionEvent) {
+        if !event.set && self.extract_title {
+            self.update_title(self.text.get().as_str(), true);
+        }
+        self.extract_title = false;
     }
 }
 
index 1927fbfd5ea0a520ca383af16c5f84247f530bd4..1aefa7a62cd5b38f09b6545808856f3b38b12450 100644 (file)
@@ -191,7 +191,8 @@ pub fn create_window(app: &App, ctx: &AppContext<MainWindow>) -> UiObject<MainWi
                         obj.textarea(|b|{
                            b.fill(true);
                             b.varname("note_text");
-                            b.action("note_text_changed");
+                            b.onchange_action("note_text_change");
+                            b.ontextchanged_action("note_text_changed");
                         });
                     });
                 });
index 053b527b4e6ce450ac10071f2f196af15df17bd3..cbdcd72f9c9d0a8502f8feb9dbd117b4e6544c1c 100644 (file)
@@ -49,6 +49,24 @@ pub struct ActionEvent<'a> {
     pub set: bool
 }
 
+#[repr(i32)]
+enum UiEventType {
+    Null = 0,
+    Pointer,
+    String,
+    IntegerValue,
+    StringValue,
+    TextValue,
+    DoubleValue,
+    RangeValue,
+    TextChanged,
+    ListSelection,
+    ListElm,
+    DND,
+    SubList,
+    FileList
+}
+
 pub enum EventType<'a> {
     Null,
     Pointer,
@@ -89,27 +107,30 @@ 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 => {
+        UiEventType::String => {
+            EventTypeData::String(ptr.cast())
+        },
+        UiEventType::IntegerValue => {
             let i: *mut ffi::UiInteger = ptr.cast();
             EventTypeData::IntegerValue( UiInteger { ptr: i } )
         }
-        4 => {
+        UiEventType::StringValue => {
             let s: *mut ffi::UiString = ptr.cast();
             EventTypeData::StringValue( UiString { ptr: s } )
         }
-        5 => {
+        UiEventType::TextValue => {
             let t: *mut ffi::UiText = ptr.cast();
             EventTypeData::TextValue( UiText::from_ptr(t) )
         }
-        6 => {
+        UiEventType::DoubleValue => {
             let d: *mut ffi::UiDouble = ptr.cast();
             EventTypeData::DoubleValue( UiDouble { ptr: d } )
         }
-        7 => {
+        UiEventType::RangeValue => {
             let d: *mut ffi::UiRange = ptr.cast();
             EventTypeData::RangeValue( UiRange { ptr: d } )
         }
-        8 => {
+        UiEventType::TextChanged => {
             let d: *mut ffi::UiTextChangeEventData = ptr.cast();
             let text_change_type = unsafe { ui_text_change_event_get_type(d) };
             match text_change_type {
@@ -141,21 +162,21 @@ fn get_event_data(e: *const ffi::UiEvent) -> EventTypeData {
                 _ => EventTypeData::Null
             }
         },
-        9 => {
+        UiEventType::ListSelection => {
             EventTypeData::ListSelection( ListSelection::from_ptr(ptr.cast()) )
         }
-        10 => {
+        UiEventType::ListElm => {
             // list elm
             EventTypeData::Null
         }
-        11 => {
+        UiEventType::DND => {
             // dnd
             EventTypeData::Null
         }
-        12 => {
+        UiEventType::SubList => {
             EventTypeData::SubList(SubListEvent::from_ptr(ptr.cast()))
         }
-        13 => {
+        UiEventType::FileList => {
             // filelist
             EventTypeData::Null
         }
@@ -296,7 +317,7 @@ 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) -> *mut c_void;
-    fn ui_event_get_eventdatatype(event: *const UiEvent) -> i32;
+    fn ui_event_get_eventdatatype(event: *const UiEvent) -> UiEventType;
     fn ui_event_get_int(event: *const UiEvent) -> i32;
     fn ui_event_get_set(event: *const UiEvent) -> i32;
 
index 12eff0173873d171e65d1f12834c63d0991d3c7c..70057c41bdd872220200e4161ab9d55340fc31fa 100644 (file)
@@ -254,10 +254,29 @@ impl<'a, T> TextAreaBuilder<'a, T> {
         self
     }
 
-    pub fn action(&mut self, action: &str) -> &mut Self {
+    pub fn onchange_action(&mut self, action: &str) -> &mut Self {
+        let cstr = CString::new(action).unwrap();
+        unsafe {
+            ui_textarea_args_set_onchange_action(self.args, cstr.as_ptr());
+        }
+        self
+    }
+
+    pub fn ontextchanged<F>(&mut self, f: F) -> &mut Self
+    where F: FnMut(&mut event::Event<T>) + 'static {
+        let wrapper = Box::new(EventWrapper { callback: Box::new(f) });
+        let ptr = self.obj.ctx.reg_box(wrapper);
+        unsafe {
+            ui_textarea_args_set_ontextchanged(self.args, Some(event::event_wrapper::<T>));
+            ui_textarea_args_set_ontextchangeddata(self.args, ptr as *mut c_void);
+        }
+        self
+    }
+
+    pub fn ontextchanged_action(&mut self, action: &str) -> &mut Self {
         let cstr = CString::new(action).unwrap();
         unsafe {
-            ui_textarea_args_set_action(self.args, cstr.as_ptr());
+            ui_textarea_args_set_ontextchanged_action(self.args, cstr.as_ptr());
         }
         self
     }
@@ -648,7 +667,10 @@ extern "C" {
     fn ui_textarea_args_set_style_class(args: *mut UiTextAreaArgs, classname: *const c_char);
     fn ui_textarea_args_set_onchange(args: *mut UiTextAreaArgs, callback: UiCallback);
     fn ui_textarea_args_set_onchangedata(args: *mut UiTextAreaArgs, data: *mut c_void);
-    fn ui_textarea_args_set_action(args: *mut UiTextAreaArgs, action: *const c_char);
+    fn ui_textarea_args_set_onchange_action(args: *mut UiTextAreaArgs, action: *const c_char);
+    fn ui_textarea_args_set_ontextchanged(args: *mut UiTextAreaArgs, callback: UiCallback);
+    fn ui_textarea_args_set_ontextchangeddata(args: *mut UiTextAreaArgs, data: *mut c_void);
+    fn ui_textarea_args_set_ontextchanged_action(args: *mut UiTextAreaArgs, action: *const c_char);
     fn ui_textarea_args_set_varname(args: *mut UiTextAreaArgs, varname: *const c_char);
     fn ui_textarea_args_set_value(args: *mut UiTextAreaArgs, ivalue: *mut UiText);
     fn ui_textarea_args_set_states(args: *mut UiTextAreaArgs, states: *const c_int, numstates: c_int);
index ac6e05ca32b39d2e374b1bb8fcd3877036114bab..77b302b0409e0232c1420eadb158e351138e01da 100644 (file)
@@ -2227,8 +2227,20 @@ void ui_textarea_args_set_onchangedata(UiTextAreaArgs *args, void *onchangedata)
     args->onchangedata = onchangedata;
 }
 
-void ui_textarea_args_set_action(UiTextAreaArgs *args, const char *action) {
-    args->action = strdup(action);
+void ui_textarea_args_set_onchange_action(UiTextAreaArgs *args, const char *action) {
+    args->onchange_action = strdup(action);
+}
+
+void ui_textarea_args_set_ontextchanged(UiTextAreaArgs *args, ui_callback callback) {
+    args->ontextchanged = callback;
+}
+
+void ui_textarea_args_set_ontextchangeddata(UiTextAreaArgs *args, void *onchangedata) {
+    args->ontextchangeddata = onchangedata;
+}
+
+void ui_textarea_args_set_ontextchanged_action(UiTextAreaArgs *args, const char *action) {
+    args->ontextchanged_action = strdup(action);
 }
 
 void ui_textarea_args_set_varname(UiTextAreaArgs *args, const char *varname) {
@@ -2255,7 +2267,8 @@ void ui_textarea_args_free(UiTextAreaArgs *args) {
     free((void*)args->name);
     free((void*)args->style_class);
     free((void*)args->varname);
-    free((void*)args->action);
+    free((void*)args->onchange_action);
+    free((void*)args->ontextchanged_action);
     free((void*)args->states);
     free((void*)args->visibility_states);
     free(args);
index 2639ac9aa9a13ff9714872983dc46f8dadff72e1..5f4171fc869f93b7ad5ddfa9186dcafabb48e709 100644 (file)
@@ -520,7 +520,10 @@ UIEXPORT void ui_textarea_args_set_name(UiTextAreaArgs *args, const char *name);
 UIEXPORT void ui_textarea_args_set_style_class(UiTextAreaArgs *args, const char *classname);
 UIEXPORT void ui_textarea_args_set_onchange(UiTextAreaArgs *args, ui_callback callback);
 UIEXPORT void ui_textarea_args_set_onchangedata(UiTextAreaArgs *args, void *onchangedata);
-UIEXPORT void ui_textarea_args_set_action(UiTextAreaArgs *args, const char *action);
+UIEXPORT void ui_textarea_args_set_onchange_action(UiTextAreaArgs *args, const char *action);
+UIEXPORT void ui_textarea_args_set_ontextchanged(UiTextAreaArgs *args, ui_callback callback);
+UIEXPORT void ui_textarea_args_set_ontextchangeddata(UiTextAreaArgs *args, void *onchangedata);
+UIEXPORT void ui_textarea_args_set_ontextchanged_action(UiTextAreaArgs *args, const char *action);
 UIEXPORT void ui_textarea_args_set_varname(UiTextAreaArgs *args, const char *varname);
 UIEXPORT void ui_textarea_args_set_value(UiTextAreaArgs *args, UiText *value);
 UIEXPORT void ui_textarea_args_set_states(UiTextAreaArgs *args, int *states, int numstates);
index 55b840450ae6f28491e5a24eb805bf4b0be14458..35b14a6779099fb26aa09a90e8701056ec2e4811 100644 (file)
@@ -97,23 +97,21 @@ static void textarea_set_undomgr(GtkWidget *text_area, UiText *value) {
 static GtkTextBuffer* create_textbuffer(UiTextArea *textarea) {
     GtkTextBuffer *buf = gtk_text_buffer_new(NULL);
     if(textarea) {
-        /*
         g_signal_connect(
                 buf,
                 "changed",
                 G_CALLBACK(ui_textbuf_changed),
                 textarea);
-        */
         
         g_signal_connect(
                 buf,
                 "insert-text",
-                G_CALLBACK(ui_textbuf_changed_insert),
+                G_CALLBACK(ui_textbuf_change_insert),
                 textarea);
         g_signal_connect(
                 buf,
                 "delete-range",
-                G_CALLBACK(ui_textbuf_changed_delete),
+                G_CALLBACK(ui_textbuf_change_delete),
                 textarea); 
     } else {
         fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n");
@@ -142,7 +140,10 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) {
     uitext->last_selection_state = 0;
     uitext->onchange = args->onchange;
     uitext->onchangedata = args->onchangedata;
-    uitext->action = args->action ? strdup(args->action) : NULL;
+    uitext->onchange_action = args->onchange_action ? strdup(args->onchange_action) : NULL;
+    uitext->ontextchanged = args->ontextchanged;
+    uitext->ontextchangeddata = args->ontextchangeddata;
+    uitext->ontextchanged_action = args->ontextchanged_action ? strdup(args->ontextchanged_action) : NULL;
     
     g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext);
     g_object_set_data(G_OBJECT(text_area), "ui_textarea_widget", text_area);
@@ -226,7 +227,8 @@ void ui_textarea_destroy(GtkWidget *object, UiTextArea *textarea) {
     if(textarea->var) {
         ui_destroy_boundvar(textarea->ctx, textarea->var);
     }
-    free(textarea->action);
+    free(textarea->onchange_action);
+    free(textarea->ontextchanged_action);
     free(textarea);
 }
 
@@ -463,7 +465,30 @@ void ui_textarea_realize_event(GtkWidget *widget, gpointer data) {
 }
 
 
-void ui_textbuf_changed_insert(
+static void textbuf_change_event(UiTextArea *textarea, UiTextChangeEventData *data) {
+    if(!ui_onchange_events_is_enabled()) {
+        return;
+    }
+    
+    UiEvent e;
+    e.obj = textarea->obj;
+    e.window = e.obj->window;
+    e.document = textarea->ctx->document;
+    e.eventdata = data;
+    e.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED;
+    e.intval = 0;
+    e.set = ui_get_setop();
+    
+    if(textarea->onchange) {
+        textarea->onchange(&e, textarea->onchangedata);
+    }
+    
+    if(textarea->onchange_action) {
+        uic_action_callback(&e, textarea->onchange_action);
+    }
+}
+
+void ui_textbuf_change_insert(
         GtkTextBuffer *textbuffer,
         GtkTextIter *location,
         char *text,
@@ -476,10 +501,10 @@ void ui_textbuf_changed_insert(
     event.end = event.begin + length;
     event.text = text;
     event.length = length;
-    ui_textbuf_changed(textarea, &event);
+    textbuf_change_event(textarea, &event);
 }
 
-void ui_textbuf_changed_delete(
+void ui_textbuf_change_delete(
         GtkTextBuffer *self,
         const GtkTextIter *start,
         const GtkTextIter *end,
@@ -491,13 +516,11 @@ void ui_textbuf_changed_delete(
     event.end = gtk_text_iter_get_offset(end);
     event.text = NULL;
     event.length = 0;
-    ui_textbuf_changed(textarea, &event);
+    textbuf_change_event(textarea, &event);
 }
 
 
-// void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea)
-
-void ui_textbuf_changed(UiTextArea *textarea, UiTextChangeEventData *data) {
+void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea) {
     if(!ui_onchange_events_is_enabled()) {
         return;
     }
@@ -508,21 +531,21 @@ void ui_textbuf_changed(UiTextArea *textarea, UiTextChangeEventData *data) {
     e.obj = textarea->obj;
     e.window = e.obj->window;
     e.document = textarea->ctx->document;
-    e.eventdata = data;
-    e.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED;
+    e.eventdata = value;
+    e.eventdatatype = UI_EVENT_DATA_TEXT_VALUE;
     e.intval = 0;
     e.set = ui_get_setop();
     
-    if(textarea->onchange) {
-        textarea->onchange(&e, textarea->onchangedata);
+    if(textarea->ontextchanged) {
+        textarea->ontextchanged(&e, textarea->ontextchangeddata);
     }
     
-    if(value->observers) {
-        ui_notify_evt(value->observers, &e);
+    if(textarea->ontextchanged_action) {
+        uic_action_callback(&e, textarea->ontextchanged_action);
     }
     
-    if(textarea->action) {
-        uic_action_callback(&e, textarea->action);
+    if(value->observers) {
+        ui_notify_evt(value->observers, &e);
     }
 }
 
index 6318e05386f672549f8445450757da07766dac2b..772ab78e4f9d2694b81e1b0641a84643ca907228 100644 (file)
@@ -67,7 +67,10 @@ typedef struct UiTextArea {
     int         last_selection_state;
     ui_callback onchange;
     void        *onchangedata;
-    char        *action;
+    char        *onchange_action;
+    ui_callback ontextchanged;
+    void        *ontextchangeddata;
+    char        *ontextchanged_action;
 } UiTextArea;
 
 typedef struct UiTextField {
@@ -132,18 +135,19 @@ void ui_textarea_remove(UiText *text, int begin, int end);
 
 void ui_textarea_realize_event(GtkWidget *widget, gpointer data);
 //void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea);
-void ui_textbuf_changed_insert(
+void ui_textbuf_change_insert(
         GtkTextBuffer *textbuffer,
         GtkTextIter *location,
         char *text,
         int length,
         UiTextArea *textarea);
-void ui_textbuf_changed_delete(
+void ui_textbuf_change_delete(
         GtkTextBuffer *self,
         const GtkTextIter *start,
         const GtkTextIter *end,
         UiTextArea *textarea);
-void ui_textbuf_changed(UiTextArea *textarea, UiTextChangeEventData *data);
+
+void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea);
 
 void ui_textbuf_insert(
         GtkTextBuffer *textbuffer,
index babbf80b03090a1893194a26a763269b731ea570..8578a630ee92393ffb682f8a0d981409d5ed5c98 100644 (file)
@@ -32,6 +32,7 @@
 #include "button.h"
 #include "container.h"
 #include "../common/context.h"
+#include "../common/action.h"
 #include <cx/mempool.h>
 
 #include <cx/linked_list.h>
@@ -70,6 +71,7 @@ UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) {
         eventdata->userdata = args->onclickdata;
         eventdata->obj = obj;
         eventdata->value = 0;
+        eventdata->action = args->action ? strdup(args->action) : NULL;
         XtAddCallback(
                 button,
                 XmNactivateCallback,
@@ -78,7 +80,7 @@ UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) {
        XtAddCallback(
                 button,
                 XmNdestroyCallback,
-                (XtCallbackProc)ui_destroy_data,
+                (XtCallbackProc)ui_destroy_event_data,
                 eventdata);
     }
     
@@ -95,6 +97,10 @@ void ui_push_button_callback(Widget widget, UiEventData *event, XtPointer d) {
     e.intval = event->value;
     e.set = 0;
     event->callback(&e, event->userdata);
+    
+    if(event->action) {
+        uic_action_callback(&e, event->action);
+    }
 }
 
 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) {
@@ -122,7 +128,7 @@ UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) {
     
     ui_set_widget_groups(obj->ctx, button, args->states);
     
-    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_state);
+    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->action, args->enable_state);
     
     XmStringFree(label);
     return button;
@@ -151,7 +157,7 @@ UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) {
     
     ui_set_widget_groups(obj->ctx, button, args->states);
     
-    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_state);
+    ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->action, args->enable_state);
     
     XmStringFree(label);
     return button;
@@ -184,6 +190,10 @@ static void togglebutton_changed(Widget w, UiVarEventData *event, XmToggleButton
         event->callback(&e, event->userdata);
     }
     
+    if(event->action) {
+        uic_action_callback(&e, event->action);
+    }
+    
     if(event->var && event->var->value) {
         UiInteger *v = event->var->value;
         v->value = e.intval;
@@ -198,6 +208,7 @@ void ui_bind_togglebutton(
         UiInteger *value,
         ui_callback onchange,
         void *onchangedata,
+        const char *action,
         int enable_state)
 {
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER);
@@ -216,6 +227,7 @@ void ui_bind_togglebutton(
     event->obj = obj;
     event->callback = onchange;
     event->userdata = onchangedata;
+    event->action = action ? strdup(action) : NULL;
     event->var = var;
     event->observers = NULL;
     event->value = enable_state;
@@ -227,7 +239,7 @@ void ui_bind_togglebutton(
     XtAddCallback(
             widget,
             XmNdestroyCallback,
-            (XtCallbackProc)ui_destroy_data,
+            (XtCallbackProc)ui_destroy_var_event_data,
             event);
 }
 
@@ -294,12 +306,16 @@ static void radiobutton_changed(Widget w, UiVarEventData *event, XmToggleButtonC
         event->callback(&e, event->userdata);
     }
     
+    if(event->action) {
+        uic_action_callback(&e, event->action);
+    }
+    
     if(value) {
         ui_notify_evt(value->observers, &e);
     }
 }
 
-void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, int enable_group) {
+void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, const char *action, int enable_group) {
     UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER);
     if(var) {
         UiInteger *value = var->value;
@@ -333,6 +349,7 @@ void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const
     event->obj = obj;
     event->callback = onchange;
     event->userdata = onchangedata;
+    event->action = action ? strdup(action) : NULL;
     event->observers = NULL;
     event->var = var;
     event->value = enable_group;
@@ -404,6 +421,7 @@ UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) {
     event->obj = obj;
     event->callback = args->onchange;
     event->userdata = args->onchangedata;
+    event->action = args->action ? strdup(args->action) : NULL;
     event->observers = NULL;
     event->var = var;
     event->value = args->enable_state;
index b6dd711a47fb26c6b950a2b8e0c0a168e7c813a7..35800910b90fdaf0a35542beb28abbdb10e0c208 100644 (file)
@@ -45,12 +45,13 @@ void ui_bind_togglebutton(
         UiInteger *value,
         ui_callback onchange,
         void *onchangedata,
+        const char *action,
         int enable_state);
 
 int64_t ui_togglebutton_get(UiInteger *i);
 void ui_togglebutton_set(UiInteger *i, int64_t value);
 
-void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, int enable_group);
+void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, const char *action, int enable_group);
 
 int64_t ui_radiobutton_get(UiInteger *i);
 void ui_radiobutton_set(UiInteger *i, int64_t value);
index d3e62395a9895c7c8560249cd7cd64a9a158aa55..ae2585bffc52e3b89d22bdd786adaed31efd81cb 100644 (file)
@@ -179,7 +179,7 @@ void add_checkitem_widget(Widget p, int i, UiMenuItemI *item, UiObject *obj) {
         XmStringFree(s);
     }
     
-    ui_bind_togglebutton(obj, checkbox, it->varname, NULL, it->callback, it->userdata, 0);
+    ui_bind_togglebutton(obj, checkbox, it->varname, NULL, it->callback, it->userdata, NULL, 0);
     
     ui_set_widget_groups(obj->ctx, checkbox, it->states);
 }
index f0dd46c0379fa82103c1d205aad5211f2710e296..43c1d65c86ff0be3e860f4650872f5d135a5f03a 100644 (file)
@@ -98,6 +98,10 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) {
                 var);
     }
     
+    if(args->onchange || args->action) {
+        
+    }
+    
     return widget;
 }
 
index b0ec4a4072368e2cfd743c7550d5b557e2549932..2fd1bd299e1d27094e872c9bff2f38a76beeb837 100644 (file)
@@ -348,6 +348,16 @@ void ui_destroy_data(Widget w, XtPointer data, XtPointer d) {
     free(data);
 }
 
+void ui_destroy_event_data(Widget w, UiEventData *data, XtPointer d) {
+    free(data->action);
+    free(data);
+}
+
+void ui_destroy_var_event_data(Widget w, UiVarEventData *data, XtPointer d) {
+    free(data->action);
+    free(data);
+}
+
 void ui_set_widget_groups(UiContext *ctx, Widget widget, const int *groups) {
     if(!groups) {
         return;
index 069e31c89ee1141b97d9d8f0ca2c8b689f24ea82..880733315f49c2b58903da945ba87653d96d41f6 100644 (file)
@@ -44,6 +44,7 @@ typedef struct UiEventData {
     void        *userdata;
     int         value;
     void        *customdata;
+    char        *action;
 } UiEventData;
 
 typedef struct UiEventDataExt {
@@ -68,6 +69,7 @@ typedef struct UiVarEventData {
     UiObserver  **observers;
     ui_callback callback;
     void        *userdata;
+    char        *action;
     int         value;
 } UiVarEventData;
 
@@ -94,6 +96,10 @@ void ui_window_dark_theme(Display *dp, Window window);
 
 void ui_destroy_data(Widget w, XtPointer data, XtPointer d);
 
+void ui_destroy_event_data(Widget w, UiEventData *data, XtPointer d);
+
+void ui_destroy_var_event_data(Widget w, UiVarEventData *data, XtPointer d);
+
 void ui_set_widget_groups(UiContext *ctx, Widget widget, const int *groups) ;
 void ui_set_widget_ngroups(UiContext *ctx, Widget widget, const int *groups, size_t ngroups);
 
index 2646da9d177455ced72560795438829685350c99..793d8eed1b902bc58456a8a9754a593717853fae 100644 (file)
@@ -58,7 +58,10 @@ typedef struct UiTextAreaArgs {
     const char *varname;
     ui_callback onchange;
     void *onchangedata;
-    const char *action;
+    const char *onchange_action;
+    ui_callback ontextchanged;
+    void *ontextchangeddata;
+    const char *ontextchanged_action;
     
     const int *states;
     const int *visibility_states;