This would make complete sense to me, because WITHIN MAIN(), function on_btn_read_clicked() is called with MAIN()'s private WIDGETS structure in the function call.
I just don’t get how a (private) variable (structure) scope can simply jump out of main() as it does in my original code snippet.
The app_widgets pointer isn’t really attached to the function in the way you think. The button-click event calls a function with a pointer to a GtkButton and a pointer to something. It doesn’t care what that something is, you can pass in any pointer you like when you setup the callback. The function actually takes a void* type which, for C, means pointer to no specific thing.
This also means that you could pass in a pointer to one kind of thing when the function is expecting another kind of thing, and that can cause all sorts of bugs. That’s a freedom which C allows you, and the risk it carries.