> Let me sum up:
> * In the beginning of each button click callback you call a
> function to make the buttons insensitive (even the clicked one?
> protection is needed here also),

I just kept a list of all the buttons that mattered, and insensitised them all 
rather indiscriminantly (even the clicked one) in a loop.  As someone else 
mentioned, you could try insensitising the whole window; I still wanted to keep 
some of the widgets active.


> * in the end of each button click event you start an idle function
> (by the way do you start the same idle function for all buttons? if
> so, how did you make sure to not start it twice?)

It shouldn't be able to start twice.  The idle function was started from the 
same function that insensitised all the buttons, and it was only those buttons' 
click handlers that called it.  So once one triggered it, they were all 
rendered insensitive until it was over.

Even so, I did keep the id of the idle function as a global, though you could 
stash it in the window object or something.  The idle callback set the ID to an 
invalid value, and then re-sensitised everything and removed itself.


> * the idle function make the buttons sensitive again after a
> delay

An idle timeout should do it, assuming Windows delivers the clicks as fast as 
the app will take them.  Otherwise make the user wait half a second, or maybe 
even a full second.

It's dodgy, but then so is the reason you're having the problem in the first 
place.  ;)  You could also try waiting until the idle callback has been called 
a couple thousand times.  The only "correct" solution I can really see, would 
be to make the idle callback check to see if there's any more mouse clicks in 
the message queue, if that's possible without a large amount of pain and 
suffering.


> * the idle function is killed when the program exits

Insensitise the buttons as soon as possible, start your processing, then when 
it's done, we start some kind of timeout to soak up all those damn mouse 
clicks.  The idea is that the idle timeout shouldn't trigger while there are 
events comming in.  At least, that was always my impression of what "idle" 
means.  ;)  Seemes to work on my system.  My swap partition is on a hard drive 
that I don't often use for anything else, so it sometimes gets to spin down, 
causing the whole system to stop for a second or two while it spins up again so 
the virtual memory system can do its thing.  It seemed to work fine there...


> Did I get you right?

Sure...  Give it a shot, and let us know how you went.  Insensitising things is 
the "proper" way to indicate they're not supposed to be used right now, and 
this way it uses the built in mechansism to eat the excessive mouse clicks.

Hopefully I haven't forgotten anything.  ;)

Fredderic

_______________________________________________
Join Excite! - http://www.excite.com
The most personalized portal on the Web!
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to