--- a/ui/gtk/button.c Sat Oct 04 14:54:25 2025 +0200 +++ b/ui/gtk/button.c Sun Oct 19 21:20:08 2025 +0200 @@ -60,6 +60,7 @@ UiObject *obj, const char *label, const char *icon, + const char *tooltip, ui_callback onclick, void *userdata, int event_value, @@ -67,6 +68,9 @@ { GtkWidget *button = gtk_button_new_with_label(label); ui_button_set_icon_name(button, icon); + if(tooltip) { + gtk_widget_set_tooltip_text(button, tooltip); + } if(onclick) { UiEventData *event = malloc(sizeof(UiEventData)); @@ -100,12 +104,12 @@ } UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) { - UiObject* current = uic_current_obj(obj); - GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->onclick, args->onclickdata, 0, FALSE); + GtkWidget *button = ui_create_button(obj, args->label, args->icon, args->tooltip, args->onclick, args->onclickdata, 0, FALSE); ui_set_name_and_style(button, args->name, args->style_class); ui_set_widget_groups(obj->ctx, button, args->groups); - UI_APPLY_LAYOUT2(current, args); - current->container->add(current->container, button); + UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; + UiLayout layout = UI_ARGS2LAYOUT(args); + ct->add(ct, button, &layout); return button; } @@ -181,6 +185,7 @@ GtkWidget *togglebutton, const char *label, const char *icon, + const char *tooltip, const char *varname, UiInteger *value, ui_callback onchange, @@ -191,6 +196,9 @@ gtk_button_set_label(GTK_BUTTON(togglebutton), label); } ui_button_set_icon_name(togglebutton, icon); + if(tooltip) { + gtk_widget_set_tooltip_text(togglebutton, tooltip); + } ui_bind_togglebutton( obj, @@ -220,8 +228,7 @@ void (*enable_state_func)(void*, void*), int enable_state) { - UiObject* current = uic_current_obj(obj); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, value, varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER); if (var) { UiInteger* value = (UiInteger*)var->value; value->obj = widget; @@ -291,13 +298,12 @@ } static UIWIDGET togglebutton_create(UiObject *obj, GtkWidget *widget, UiToggleArgs *args) { - UiObject* current = uic_current_obj(obj); - ui_setup_togglebutton( obj, widget, args->label, args->icon, + args->tooltip, args->varname, args->value, args->onchange, @@ -306,8 +312,9 @@ ui_set_name_and_style(widget, args->name, args->style_class); ui_set_widget_groups(obj->ctx, widget, args->groups); - UI_APPLY_LAYOUT2(current, args); - current->container->add(current->container, widget); + UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; + UiLayout layout = UI_ARGS2LAYOUT(args); + ct->add(ct, widget, &layout); return widget; } @@ -350,9 +357,7 @@ } } -UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { - UiObject* current = uic_current_obj(obj); - +UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { GtkWidget *widget = gtk_check_button_new_with_label(args->label); ui_bind_togglebutton( obj, @@ -370,8 +375,9 @@ ui_set_name_and_style(widget, args->name, args->style_class); ui_set_widget_groups(obj->ctx, widget, args->groups); - UI_APPLY_LAYOUT2(current, args); - current->container->add(current->container, widget); + UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; + UiLayout layout = UI_ARGS2LAYOUT(args); + ct->add(ct, widget, &layout); return widget; } @@ -411,12 +417,11 @@ } UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { - 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); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); if(var) { UiInteger *value = var->value; value->obj = widget; @@ -449,8 +454,9 @@ G_CALLBACK(ui_destroy_vardata), event); - UI_APPLY_LAYOUT2(current, args); - current->container->add(current->container, widget); + UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; + UiLayout layout = UI_ARGS2LAYOUT(args); + ct->add(ct, widget, &layout); return widget; } @@ -519,12 +525,10 @@ } UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs *args) { - UiObject* current = uic_current_obj(obj); - GSList *rg = NULL; UiInteger *rgroup; - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_INTEGER); + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); UiBool first = FALSE; if(var) { @@ -600,8 +604,9 @@ event); } - UI_APPLY_LAYOUT2(current, args); - current->container->add(current->container, rbutton); + UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; + UiLayout layout = UI_ARGS2LAYOUT(args); + ct->add(ct, rbutton, &layout); return rbutton; } @@ -800,7 +805,7 @@ return create_linkbutton_jsonvalue(label, uri, TRUE, visited, TRUE); } -static void linkbutton_clicked(GtkWidget *widget, UiLinkButton *data) { +static void linkbutton_callback(GtkWidget *widget, UiLinkButton *data) { if(data->onclick) { UiEvent e; e.obj = data->obj; @@ -814,8 +819,24 @@ } } +static void linkbutton_clicked(GtkWidget *widget, UiLinkButton *data) { + linkbutton_callback(widget, data); + if(data->link) { +#if GTK_CHECK_VERSION(4, 0, 0) + GtkUriLauncher *launcher = gtk_uri_launcher_new (data->link); + gtk_uri_launcher_launch (launcher, NULL, NULL, NULL, NULL); + g_object_unref (launcher); +#elif GTK_CHECK_VERSION(3, 22, 0) + GError *error = NULL; + gtk_show_uri_on_window(NULL, data->link, GDK_CURRENT_TIME, &error); +#elif + // TODO: call xdg-open +#endif + } +} + static gboolean linkbutton_activate_link(GtkLinkButton *self, UiLinkButton *data) { - linkbutton_clicked(data->widget, data); + linkbutton_callback(data->widget, data); return data->nofollow; } @@ -860,8 +881,7 @@ data->widget = button; - UiObject* current = uic_current_obj(obj); - UiVar *var = uic_widget_var(obj->ctx, current->ctx, args->value, args->varname, UI_VAR_STRING); + UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); if(var) { UiString *str = var->value; char *current_value = ui_get(str); @@ -876,8 +896,9 @@ ui_set_name_and_style(button, args->name, args->style_class); ui_set_widget_groups(obj->ctx, button, args->groups); - UI_APPLY_LAYOUT2(current, args); - current->container->add(current->container, button); + UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end; + UiLayout layout = UI_ARGS2LAYOUT(args); + ct->add(ct, button, &layout); return button; }