+ 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) {