[Ardour-Dev] How to use "small" dialogs

Johannes Mueller github at johannes-mueller.org
Sat Aug 19 07:43:39 PDT 2017


a couple of weeks ago Paul commented a commit of mine like this:

Paul Davis wrote:
> One small comment on this. Not saying it should be reverted or anything
> like that, but  ... in all new code, we should avoid this construction:
>       Dialog d;
>       ....
>       int response = d.run();
>       ...
> this use of modal dialogs creates potential for many problems. newer GTK
> versions have more or less removed it. the replacement is more complex -
> you need a response handler method/function - but the design is much more
> robust across platforms and contexts.
>    foo () { Dialog* d = new Dialog; d->signal_response().connect (bind
> (handler, d)); /* set up d */ d->show (); }
>    handler (int response, Dialog* d) { /* handle response */;
> delete_when_idle (d); }

How about small "Are you sure" dialogs? Like overwrite_file_dialog() in 
gtk2_ardour/utils.h which uses Dialog::run().

It seems to me cumbersome to use a response handler function, when I just need 
a simple yes/no dialog.

Let's say we have:

void Foo::bar()
	// 50 lines of code establishing context

	Dialog d; // simple yes/no dialog
	int response = d.run();

	// handle response (using the established context)

Using the response handler function concept I would need to transfer the 
context into the handler function. Moreover I need to take extra care to free 
any resources that belong to the context, as I can no longer rely on stack 

I'm not talking of complex dialogs that might already do something while they 
are running and that are the center of the action and can/need to have the 
context on their own. They are better of with the response handler function.




More information about the Ardour-Dev mailing list