X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gtk%2Fxboard.c;fp=gtk%2Fxboard.c;h=5ad75b117034e8e7637a001441abc90a12a71d1a;hb=9fb523a3a383401087a5ce5f1f59dada036e3c62;hp=96889c85ce241b6791d605b23c94295fb36445dd;hpb=14b8ba6e96505b24eb49b28c10444c027e43f5b5;p=xboard.git diff --git a/gtk/xboard.c b/gtk/xboard.c index 96889c8..5ad75b1 100644 --- a/gtk/xboard.c +++ b/gtk/xboard.c @@ -1759,18 +1759,19 @@ static guint delayedDragTag = 0; void DragProc () { - static int busy; - if(busy) { // prevent recursive calling, but postpone interrupting call rather than lose it - if(!delayedDragTag) delayedDragTag = g_timeout_add( 200, (GSourceFunc) DragProc, NULL); - return; - } - busy = 1; + static int busy; + if(busy++) return; // prevent recursive calling, but remember we missed an event in 'busy' + + if(delayedDragTag) g_source_remove(delayedDragTag); // no more timer interrupts from same event! + delayedDragTag = 0; + + do { GetActualPlacement(shellWidget, &wpNew); if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved wpNew.width == wpMain.width && wpNew.height == wpMain.height) { // not sized - busy = 0; return; // false alarm + busy = 0; break; // false alarm } - ReSize(&wpNew); + ReSize(&wpNew); // this can be interrupted by other events if(appData.useStickyWindows) { if(shellUp[EngOutDlg]) CoDrag(shells[EngOutDlg], &wpEngineOutput); if(shellUp[HistoryDlg]) CoDrag(shells[HistoryDlg], &wpMoveHistory); @@ -1780,9 +1781,8 @@ DragProc () } wpMain = wpNew; DrawPosition(True, NULL); - if(delayedDragTag) g_source_remove(delayedDragTag); - delayedDragTag = 0; // now drag executed, make sure next DelayedDrag will not cancel timer event (which could now be used by other) - busy = 0; + if(busy > 2) busy = 2; // if multiple events were backlogged, only do one more + } while(--busy); } void