Fix potential crash during manual window placement.

Test case:
Run
 while true; do xterm -e false; done
and move pointer.

Noted by Daniel Manjarres.

SVN revision: 59977
This commit is contained in:
Kim Woelders 2011-06-05 20:56:46 +00:00
parent b9538622d8
commit f6346e6019
2 changed files with 12 additions and 3 deletions

View File

@ -65,6 +65,7 @@ static void EwinHandleEventsToplevel(Win win, XEvent * ev, void *prm);
static void EwinHandleEventsContainer(Win win, XEvent * ev, void *prm);
static void EwinHandleEventsClient(Win win, XEvent * ev, void *prm);
static void EwinUnmap1(EWin * ewin);
static void EwinUnmap2(EWin * ewin);
Window
@ -385,6 +386,8 @@ EwinDestroy(EWin * ewin)
if (!ewin)
return;
EwinUnmap1(ewin);
if (ewin->state.state == EWIN_STATE_MAPPED)
EwinUnmap2(ewin);

View File

@ -213,6 +213,7 @@ _MoveResizeMoveEnd(EWin * ewin)
Mode.mode = MODE_NONE;
Mode.move.swap = 0;
Mode.place.doing_manual = 0;
Mode_mr.ewin = NULL;
if (Mode_mr.grab_server)
{
@ -490,6 +491,7 @@ _MoveResizeResizeEnd(EWin * ewin)
ESync(ESYNC_MOVRES);
done:
Mode_mr.ewin = NULL;
if (Mode_mr.grab_server)
{
EUngrabServer();
@ -929,6 +931,8 @@ MoveResizeEnd(EWin * ewin)
static void
_MoveResizeEventHandler(Win win __UNUSED__, XEvent * ev, void *prm __UNUSED__)
{
EWin *ewin;
#if 0
Eprintf("%s: type=%2d win=%#lx\n", __func__, ev->type, ev->xany.window);
#endif
@ -944,9 +948,11 @@ _MoveResizeEventHandler(Win win __UNUSED__, XEvent * ev, void *prm __UNUSED__)
break;
#endif
case ButtonRelease:
MoveResizeEnd(NULL);
if (Mode_mr.ewin)
BorderCheckState(Mode_mr.ewin, ev);
ewin = Mode_mr.ewin;
if (!ewin)
break;
MoveResizeEnd(ewin);
BorderCheckState(ewin, ev);
break;
case MotionNotify:
_MoveResizeHandleMotion();