--- a/ui/gtk/button.c Sun Aug 24 15:24:16 2025 +0200 +++ b/ui/gtk/button.c Sat Oct 04 14:52:59 2025 +0200 @@ -382,13 +382,98 @@ } #endif + +#if GTK_MAJOR_VERSION >= 3 + +static void switch_changed( + GObject *gobject, + GParamSpec *pspec, + UiVarEventData *event) +{ + GtkSwitch *sw = GTK_SWITCH (gobject); + gboolean active = gtk_switch_get_active (sw); + + UiEvent e; + e.obj = event->obj; + e.document = e.obj->ctx->document; + e.window = e.obj->window; + e.eventdata = NULL; + e.eventdatatype = 0; + e.set = ui_get_setop(); + + if(event->callback) { + event->callback(&e, event->userdata); + } + if(event->var) { + UiInteger *i = event->var->value; + ui_notify_evt(i->observers, &e); + } +} + UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { -#ifdef UI_GTK3 - return NULL; // TODO + UiObject* current = uic_current_obj(obj); + GtkWidget *widget = gtk_switch_new(); + ui_set_name_and_style(widget, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, widget, args->groups); + + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER); + if(var) { + UiInteger *value = var->value; + value->obj = widget; + value->get = ui_switch_get; + value->set = ui_switch_set; + + if(value->value) { + gtk_switch_set_active(GTK_SWITCH(widget), TRUE); + } + + + } + + UiVarEventData *event = malloc(sizeof(UiVarEventData)); + event->obj = obj; + event->callback = args->onchange; + event->userdata = args->onchangedata; + event->var = var; + event->observers = NULL; + + g_signal_connect( + widget, + "notify::active", + G_CALLBACK(switch_changed), + event); + + g_signal_connect( + widget, + "destroy", + G_CALLBACK(ui_destroy_vardata), + event); + + UI_APPLY_LAYOUT2(current, args); + current->container->add(current->container, widget); + + return widget; +} + +int64_t ui_switch_get(UiInteger *value) { + GtkSwitch *sw = GTK_SWITCH((GtkWidget*)value->obj); + value->value = gtk_switch_get_active(sw); + return value->value; +} + +void ui_switch_set(UiInteger *value, int64_t i) { + GtkSwitch *sw = GTK_SWITCH((GtkWidget*)value->obj); + value->value = i; + gtk_switch_set_active(sw, i); +} + #else + +UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { return ui_checkbox_create(obj, args); +} + #endif -} #if GTK_MAJOR_VERSION >= 4 #define RADIOBUTTON_NEW(group, label) gtk_check_button_new_with_label(label) @@ -760,6 +845,12 @@ data); } gtk_button_set_label(GTK_BUTTON(button), args->label); +#if GTK_CHECK_VERSION(4, 0, 0) + gtk_button_set_can_shrink(GTK_BUTTON(button), TRUE); +#elif GTK_MAJOR_VERSION == 3 + GtkWidget *child = gtk_bin_get_child(GTK_BIN(button)); + gtk_label_set_ellipsize(GTK_LABEL(child), PANGO_ELLIPSIZE_END); +#endif g_object_set_data(G_OBJECT(button), "ui_linkbutton", data); g_signal_connect( button, @@ -806,6 +897,11 @@ if(s->value.free) { s->value.free(s->value.ptr); } +#if GTK_MAJOR_VERSION == 3 + UiLinkButton *data = s->obj; + GtkWidget *child = gtk_bin_get_child(GTK_BIN(data->widget)); + gtk_label_set_ellipsize(GTK_LABEL(child), PANGO_ELLIPSIZE_END); +#endif }