-int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
-
- T(("overlap : sby %d, sbx %d, smy %d, smx %d, dby %d, dbx %d, dmy %d, dmx %d",
- s->_begy, s->_begx, s->_maxy, s->_maxx,
- d->_begy, d->_begx, d->_maxy, d->_maxx));
-
- if (!s || !d)
- returnCode(ERR);
-
- sminrow = max(s->_begy, d->_begy) - s->_begy;
- smincol = max(s->_begx, d->_begx) - s->_begx;
- dminrow = max(s->_begy, d->_begy) - d->_begy;
- dmincol = max(s->_begx, d->_begx) - d->_begx;
- dmaxrow = min(s->_maxy+s->_begy, d->_maxy+d->_begy) - d->_begy;
- dmaxcol = min(s->_maxx+s->_begx, d->_maxx+d->_begx) - d->_begx;
-
- return(copywin(s, d,
- sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol,
- flag));
+ int rc = ERR;
+
+ T((T_CALLED("overlap(%p,%p,%d)"), (const void *) src, (void *) dst, flag));
+
+ if (src != 0 && dst != 0) {
+ int sx1, sy1, sx2, sy2;
+ int dx1, dy1, dx2, dy2;
+
+ _nc_lock_global(curses);
+
+ T(("src : begy %ld, begx %ld, maxy %ld, maxx %ld",
+ (long) src->_begy,
+ (long) src->_begx,
+ (long) src->_maxy,
+ (long) src->_maxx));
+ T(("dst : begy %ld, begx %ld, maxy %ld, maxx %ld",
+ (long) dst->_begy,
+ (long) dst->_begx,
+ (long) dst->_maxy,
+ (long) dst->_maxx));
+
+ sx1 = src->_begx;
+ sy1 = src->_begy;
+ sx2 = sx1 + src->_maxx;
+ sy2 = sy1 + src->_maxy;
+
+ dx1 = dst->_begx;
+ dy1 = dst->_begy;
+ dx2 = dx1 + dst->_maxx;
+ dy2 = dy1 + dst->_maxy;
+
+ if (dx2 >= sx1 && dx1 <= sx2 && dy2 >= sy1 && dy1 <= sy2) {
+ int sminrow = max(sy1, dy1) - sy1;
+ int smincol = max(sx1, dx1) - sx1;
+ int dminrow = max(sy1, dy1) - dy1;
+ int dmincol = max(sx1, dx1) - dx1;
+ int dmaxrow = min(sy2, dy2) - dy1;
+ int dmaxcol = min(sx2, dx2) - dx1;
+
+ rc = copywin(src, dst,
+ sminrow, smincol,
+ dminrow, dmincol,
+ dmaxrow, dmaxcol,
+ flag);
+ }
+ _nc_unlock_global(curses);
+ }
+ returnCode(rc);