On the code level this means that the application should wait within the _save_work() subroutine for a 'button-press' event and, when it was passed to either the "Ok"-button or the "Cancel"-button, the program should execute the necessary actions and leave the loop. If any other event will occur the application should stay in that loop to force the user to press one of the buttons.
Somehow "looping and waiting" makes me uneasy, because you are already in an event loop that is responsible for looping and waiting.
So another approach would be to have the code register a callback for the "Ok" and one for the "Cancel" button, disable most of the widgets, and then return.
Then the event handlers for the "Ok" and "Cancel" buttons are responsible for calling the callbacks that the code we first talked about registered.