# HG changeset patch # User Olaf Wintermann # Date 1748974410 -7200 # Node ID 0afad58e3078416bd04836b42e9c8cb5d0a9c2b7 # Parent 9f3ff50da3028d01b8057682aa86a259105866d9 add tabview onchange callback (GTK) diff -r 9f3ff50da302 -r 0afad58e3078 ui/gtk/container.c --- a/ui/gtk/container.c Fri May 30 17:55:57 2025 +0200 +++ b/ui/gtk/container.c Tue Jun 03 20:13:30 2025 +0200 @@ -689,6 +689,52 @@ return g_object_get_data(G_OBJECT(tabview), "ui_tabview"); } +static void tabview_switch_page( + GtkNotebook *self, + GtkWidget *page, + guint page_num, + gpointer userdata) +{ + UiGtkTabView *tabview = userdata; + if(!tabview->onchange) { + return; + } + + UiEvent event; + event.obj = tabview->obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.set = ui_get_setop(); + event.eventdata = NULL; + event.intval = page_num; + + tabview->onchange(&event, tabview->onchange); +} + +#if GTK_CHECK_VERSION(3, 10, 0) + +static void tabview_stack_changed( + GObject *object, + GParamSpec *pspec, + UiGtkTabView *tabview) +{ + if(!tabview->onchange) { + return; + } + + UiEvent event; + event.obj = tabview->obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.set = ui_get_setop(); + event.eventdata = NULL; + event.intval = 0; + + tabview->onchange(&event, tabview->onchange); +} + +#endif + typedef int64_t(*ui_tabview_get_func)(UiInteger*); typedef void (*ui_tabview_set_func)(UiInteger*, int64_t); @@ -715,6 +761,7 @@ GtkWidget *sidebar = gtk_stack_sidebar_new(); BOX_ADD(widget, sidebar); GtkWidget *stack = gtk_stack_new(); + g_signal_connect(stack, "notify::visible-child", G_CALLBACK(tabview_stack_changed), data); gtk_stack_set_transition_type (GTK_STACK(stack), GTK_STACK_TRANSITION_TYPE_SLIDE_UP_DOWN); gtk_stack_sidebar_set_stack(GTK_STACK_SIDEBAR(sidebar), GTK_STACK(stack)); BOX_ADD_EXPAND(widget, stack); @@ -734,6 +781,11 @@ case UI_TABVIEW_INVISIBLE: /* fall through */ case UI_TABVIEW_NAVIGATION_TOP2: { widget = gtk_notebook_new(); + g_signal_connect( + widget, + "clicked", + G_CALLBACK(tabview_switch_page), + data); data_widget = widget; data->select_tab = ui_notebook_tab_select; data->remove_tab = ui_notebook_tab_remove; diff -r 9f3ff50da302 -r 0afad58e3078 ui/gtk/container.h --- a/ui/gtk/container.h Fri May 30 17:55:57 2025 +0200 +++ b/ui/gtk/container.h Tue Jun 03 20:13:30 2025 +0200 @@ -122,6 +122,8 @@ int spacing; int columnspacing; int rowspacing; + ui_callback onchange; + void *onchangedata; } UiGtkTabView; diff -r 9f3ff50da302 -r 0afad58e3078 ui/ui/container.h --- a/ui/ui/container.h Fri May 30 17:55:57 2025 +0200 +++ b/ui/ui/container.h Tue Jun 03 20:13:30 2025 +0200 @@ -116,6 +116,8 @@ const char *style_class; UiTabViewType tabview; + ui_callback onchange; + void *onchangedata; UiSubContainerType subcontainer;