make fully max'd windows properly snap
Dana Jansens danakj@orodu.net
2 files changed,
18 insertions(+),
14 deletions(-)
M
src/Window.cc
→
src/Window.cc
@@ -2891,17 +2891,17 @@ dtop = std::abs(wtop - srect.top()),
dbottom = std::abs(wbottom - srect.bottom()); // snap left? - if (dleft < snap_distance && dleft < dright) + if (dleft < snap_distance && dleft <= dright) dx = srect.left(); // snap right? - else if (dright < snap_distance && dright < dleft) + else if (dright < snap_distance) dx = srect.right() - frame.rect.width() + 1; // snap top? - if (dtop < snap_distance && dtop < dbottom) + if (dtop < snap_distance && dtop <= dbottom) dy = srect.top(); // snap bottom? - else if (dbottom < snap_distance && dbottom < dtop) + else if (dbottom < snap_distance) dy = srect.bottom() - frame.rect.height() + 1; srect = screen->getRect(); // now get the full screen@@ -2912,17 +2912,17 @@ dtop = std::abs(wtop - srect.top()),
dbottom = std::abs(wbottom - srect.bottom()); // snap left? - if (dleft < snap_distance && dleft < dright) + if (dleft < snap_distance && dleft <= dright) dx = srect.left(); // snap right? - else if (dright < snap_distance && dright < dleft) + else if (dright < snap_distance) dx = srect.right() - frame.rect.width() + 1; // snap top? - if (dtop < snap_distance && dtop < dbottom) + if (dtop < snap_distance && dtop <= dbottom) dy = srect.top(); // snap bottom? - else if (dbottom < snap_distance && dbottom < dtop) + else if (dbottom < snap_distance) dy = srect.bottom() - frame.rect.height() + 1; }
M
src/XAtom.cc
→
src/XAtom.cc
@@ -357,12 +357,14 @@ unsigned char *c_val; // value alloc'd with c malloc
Atom ret_type; int ret_size; unsigned long ret_bytes; + int result; const unsigned long maxread = nelements; // try get the first element - XGetWindowProperty(_display, win, atom, 0l, 1l, False, AnyPropertyType, - &ret_type, &ret_size, &nelements, &ret_bytes, &c_val); - if (ret_type == None || nelements < 1) - // the property does not exist on the window or is empty + result = XGetWindowProperty(_display, win, atom, 0l, 1l, False, + AnyPropertyType, &ret_type, &ret_size, + &nelements, &ret_bytes, &c_val); + if (result != Success || ret_type == None || nelements < 1) + // an error occured, the property does not exist on the window, or is empty return false; if (ret_type != type || ret_size != size) { // wrong data in property@@ -384,8 +386,10 @@ // value. The last + 1 is the first long that we retrieved above.
int remain = (ret_bytes - 1)/sizeof(long) + 1 + 1; if (remain > size/8 * (signed)maxread) // dont get more than the max remain = size/8 * (signed)maxread; - XGetWindowProperty(_display, win, atom, 0l, remain, False, type, &ret_type, - &ret_size, &nelements, &ret_bytes, &c_val); + result = XGetWindowProperty(_display, win, atom, 0l, remain, False, type, + &ret_type, &ret_size, &nelements, &ret_bytes, + &c_val); + assert(result == Success); assert(ret_bytes == 0); *value = new unsigned char[nelements * size/8 + 1]; memcpy(*value, c_val, nelements * size/8 + 1);