# HG changeset patch # User Olaf Wintermann # Date 1748974462 -7200 # Node ID 488a2caebc0cce8a0bcc245a0b99b5a6d19ef27b # Parent 0afad58e3078416bd04836b42e9c8cb5d0a9c2b7# Parent 8d2b7b9342306ef0fa20721f3028aac86f18f8e5 merge diff -r 8d2b7b934230 -r 488a2caebc0c ui/gtk/container.c --- a/ui/gtk/container.c Sat May 31 20:57:26 2025 +0200 +++ b/ui/gtk/container.c Tue Jun 03 20:14:22 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 8d2b7b934230 -r 488a2caebc0c ui/gtk/container.h --- a/ui/gtk/container.h Sat May 31 20:57:26 2025 +0200 +++ b/ui/gtk/container.h Tue Jun 03 20:14:22 2025 +0200 @@ -122,6 +122,8 @@ int spacing; int columnspacing; int rowspacing; + ui_callback onchange; + void *onchangedata; } UiGtkTabView; diff -r 8d2b7b934230 -r 488a2caebc0c ui/ui/container.h --- a/ui/ui/container.h Sat May 31 20:57:26 2025 +0200 +++ b/ui/ui/container.h Tue Jun 03 20:14:22 2025 +0200 @@ -116,6 +116,8 @@ const char *style_class; UiTabViewType tabview; + ui_callback onchange; + void *onchangedata; UiSubContainerType subcontainer;