+void Rect::setWidth(unsigned int __w) {
+ _x2 = __w + _x1 - 1;
+}
+
+
+void Rect::setHeight(unsigned int __h) {
+ _y2 = __h + _y1 - 1;
+}
+
+
+void Rect::setSize(unsigned int __w, unsigned int __h) {
+ _x2 = __w + _x1 - 1;
+ _y2 = __h + _y1 - 1;
+}
+
+
+void Rect::setRect(int __x, int __y, unsigned int __w, unsigned int __h) {
+ *this = Rect(__x, __y, __w, __h);
+}
+
+
+void Rect::setCoords(int __l, int __t, int __r, int __b) {
+ _x1 = __l;
+ _y1 = __t;
+ _x2 = __r;
+ _y2 = __b;
+}
+
+
+Rect Rect::operator|(const Rect &a) const {
+ Rect b;
+
+ b._x1 = std::min(_x1, a._x1);
+ b._y1 = std::min(_y1, a._y1);
+ b._x2 = std::max(_x2, a._x2);
+ b._y2 = std::max(_y2, a._y2);
+
+ return b;
+}
+
+
+Rect Rect::operator&(const Rect &a) const {
+ Rect b;
+
+ b._x1 = std::max(_x1, a._x1);
+ b._y1 = std::max(_y1, a._y1);
+ b._x2 = std::min(_x2, a._x2);
+ b._y2 = std::min(_y2, a._y2);
+
+ return b;
+}
+
+
+bool Rect::intersects(const Rect &a) const {
+ return std::max(_x1, a._x1) <= std::min(_x2, a._x2) &&
+ std::max(_y1, a._y1) <= std::min(_y2, a._y2);
+}
+
+
+string expandTilde(const string& s) {
+ if (s[0] != '~') return s;
+
+ const char* const home = getenv("HOME");
+ if (home == NULL) return s;
+
+ return string(home + s.substr(s.find('/')));
+}
+
+
+void bexec(const string& command, const string& displaystring) {