X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_overlay.c;h=a206248a1e74ee3afc18d14508d43bbee49d53d4;hp=26314de5e5fba0d604cfbf5c7b7b1bb2c14c03a9;hb=ef2d99350e0d3e4606171b5b1466ab92ec440205;hpb=396a05943b7da5039dd15d79c4385c7d2a75d6d4 diff --git a/ncurses/base/lib_overlay.c b/ncurses/base/lib_overlay.c index 26314de5..a206248a 100644 --- a/ncurses/base/lib_overlay.c +++ b/ncurses/base/lib_overlay.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. * + * Copyright (c) 1998-2009,2013 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -40,7 +40,7 @@ #include -MODULE_ID("$Id: lib_overlay.c,v 1.25 2008/04/12 17:21:59 tom Exp $") +MODULE_ID("$Id: lib_overlay.c,v 1.31 2013/04/06 23:47:13 tom Exp $") static int overlap(const WINDOW *const src, WINDOW *const dst, int const flag) @@ -52,11 +52,10 @@ overlap(const WINDOW *const src, WINDOW *const dst, int const flag) int dminrow, dmincol; int dmaxrow, dmaxcol; - T((T_CALLED("overlap(%p,%p,%d)"), src, dst, flag)); + T((T_CALLED("overlap(%p,%p,%d)"), (const void *) src, (void *) dst, flag)); if (src != 0 && dst != 0) { - _nc_lock_window(src); - _nc_lock_window(dst); + _nc_lock_global(curses); T(("src : begy %ld, begx %ld, maxy %ld, maxx %ld", (long) src->_begy, @@ -93,8 +92,7 @@ overlap(const WINDOW *const src, WINDOW *const dst, int const flag) dmaxrow, dmaxcol, flag); } - _nc_unlock_window(dst); - _nc_unlock_window(src); + _nc_unlock_global(curses); } returnCode(rc); } @@ -112,7 +110,7 @@ overlap(const WINDOW *const src, WINDOW *const dst, int const flag) NCURSES_EXPORT(int) overlay(const WINDOW *win1, WINDOW *win2) { - T((T_CALLED("overlay(%p,%p)"), win1, win2)); + T((T_CALLED("overlay(%p,%p)"), (const void *) win1, (void *) win2)); returnCode(overlap(win1, win2, TRUE)); } @@ -129,7 +127,7 @@ overlay(const WINDOW *win1, WINDOW *win2) NCURSES_EXPORT(int) overwrite(const WINDOW *win1, WINDOW *win2) { - T((T_CALLED("overwrite(%p,%p)"), win1, win2)); + T((T_CALLED("overwrite(%p,%p)"), (const void *) win1, (void *) win2)); returnCode(overlap(win1, win2, FALSE)); } @@ -147,12 +145,17 @@ copywin(const WINDOW *src, WINDOW *dst, attr_t mask; T((T_CALLED("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)"), - src, dst, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, over)); - - if (src && dst) { - - _nc_lock_window(src); - _nc_lock_window(dst); + (const void *) src, + (void *) dst, + sminrow, smincol, + dminrow, dmincol, + dmaxrow, dmaxcol, over)); + + if (src != 0 + && dst != 0 + && dmaxrow >= dminrow + && dmaxcol >= dmincol) { + _nc_lock_global(curses); bk = AttrOf(dst->_nc_bkgd); mask = ~(attr_t) ((bk & A_COLOR) ? A_COLOR : 0); @@ -160,6 +163,7 @@ copywin(const WINDOW *src, WINDOW *dst, /* make sure rectangle exists in source */ if ((sminrow + dmaxrow - dminrow) <= (src->_maxy + 1) && (smincol + dmaxcol - dmincol) <= (src->_maxx + 1)) { + bool copied = FALSE; T(("rectangle exists in source")); @@ -172,10 +176,18 @@ copywin(const WINDOW *src, WINDOW *dst, dy <= dmaxrow; sy++, dy++) { + if (dy < 0 || sy < 0) + continue; + touched = FALSE; for (dx = dmincol, sx = smincol; dx <= dmaxcol; sx++, dx++) { + + if (dx < 0 || sx < 0) + continue; + copied = TRUE; + if (over) { if ((CharOf(src->_line[sy].text[sx]) != L(' ')) && (!CharEq(dst->_line[dy].text[dx], @@ -201,11 +213,11 @@ copywin(const WINDOW *src, WINDOW *dst, } } T(("finished copywin")); - rc = OK; + if (copied) + rc = OK; } } - _nc_unlock_window(dst); - _nc_unlock_window(src); + _nc_unlock_global(curses); } returnCode(rc); }