Improve output of multiple screen resolution
[apps/agl-service-windowmanager-2017.git] / src / util.hpp
index 5ebee23..2f17845 100644 (file)
@@ -24,7 +24,8 @@
 #include <sys/poll.h>
 
 #ifndef DO_NOT_USE_AFB
-extern "C" {
+extern "C"
+{
 #include <afb/afb-binding.h>
 };
 #endif
@@ -34,7 +35,7 @@ extern "C" {
 
 #ifdef __GNUC__
 #define ATTR_FORMAT(stringindex, firsttocheck) \
-   __attribute__((format(printf, stringindex, firsttocheck)))
+    __attribute__((format(printf, stringindex, firsttocheck)))
 #define ATTR_NORETURN __attribute__((noreturn))
 #else
 #define ATTR_FORMAT(stringindex, firsttocheck)
@@ -44,18 +45,20 @@ extern "C" {
 #ifdef AFB_BINDING_VERSION
 #define lognotice(...) AFB_NOTICE(__VA_ARGS__)
 #define logerror(...) AFB_ERROR(__VA_ARGS__)
-#define fatal(...)            \
-   do {                       \
-      AFB_ERROR(__VA_ARGS__); \
-      abort();                \
-   } while (0)
+#define fatal(...)              \
+    do                          \
+    {                           \
+        AFB_ERROR(__VA_ARGS__); \
+        abort();                \
+    } while (0)
 #else
 #define lognotice(...)
 #define logerror(...)
-#define fatal(...)            \
-   do {                       \
-      abort();                \
-   } while (0)
+#define fatal(...) \
+    do             \
+    {              \
+        abort();   \
+    } while (0)
 #endif
 
 #ifdef DEBUG_OUTPUT
@@ -77,33 +80,87 @@ extern "C" {
 #define STN(N) \
     ScopeTrace __attribute__((unused)) CONCAT(named_trace_scope_, __LINE__)(#N)
 
-struct ScopeTrace {
-   thread_local static int indent;
-   char const *f{};
-   explicit ScopeTrace(char const *func);
-   ~ScopeTrace();
+struct ScopeTrace
+{
+    thread_local static int indent;
+    char const *f{};
+    explicit ScopeTrace(char const *func);
+    ~ScopeTrace();
 };
 #endif
 
-//      _                   _                 _                       __     _
-//  ___| |_ _ __ _   _  ___| |_   _   _ _ __ (_) __ _ _   _  ___     / _| __| |
-// / __| __| '__| | | |/ __| __| | | | | '_ \| |/ _` | | | |/ _ \   | |_ / _` |
-// \__ \ |_| |  | |_| | (__| |_  | |_| | | | | | (_| | |_| |  __/   |  _| (_| |
-// |___/\__|_|   \__,_|\___|\__|  \__,_|_| |_|_|\__, |\__,_|\___|___|_|  \__,_|
-//                                                 |_|         |_____|
-struct unique_fd {
-   int fd{-1};
-   unique_fd() = default;
-   explicit unique_fd(int f) : fd{f} {}
-   operator int() const { return fd; }
-   ~unique_fd();
-   unique_fd(unique_fd const &) = delete;
-   unique_fd &operator=(unique_fd const &) = delete;
-   unique_fd(unique_fd &&o) : fd(o.fd) { o.fd = -1; }
-   unique_fd &operator=(unique_fd &&o) {
-      std::swap(this->fd, o.fd);
-      return *this;
-   }
+/**
+ * @struct unique_fd
+ */
+struct unique_fd
+{
+    int fd{-1};
+    unique_fd() = default;
+    explicit unique_fd(int f) : fd{f} {}
+    operator int() const { return fd; }
+    ~unique_fd();
+    unique_fd(unique_fd const &) = delete;
+    unique_fd &operator=(unique_fd const &) = delete;
+    unique_fd(unique_fd &&o) : fd(o.fd) { o.fd = -1; }
+    unique_fd &operator=(unique_fd &&o)
+    {
+        std::swap(this->fd, o.fd);
+        return *this;
+    }
+};
+
+class rectangle
+{
+  public:
+    explicit rectangle(long wd, long ht) : _right(wd - 1), _bottom(ht - 1) {};
+
+    void set_left(long l) {
+        _left = l;
+    }
+    long left() const { return _left; };
+
+    void set_right(long r) {
+        _right = r;
+    }
+    long right() const { return _right; };
+
+    void set_top(long t) {
+        _top = t;
+    }
+    long top() const { return _top; };
+
+    void set_bottom(long b) {
+        _bottom = b;
+    }
+    long bottom() const { return _bottom; }
+
+    long width() const {
+        if (is_valid())
+            return 0;
+        else
+            return _right - _left + 1;
+    }
+
+    long height() const {
+        if (is_valid())
+            return 0;
+        else
+            return _bottom - _top + 1;
+    }
+
+    void set_aspect(double ratio);
+    void fit(unsigned long to_width, unsigned long to_height);
+    void center(unsigned long outer_w, unsigned long outer_h);
+
+  private:
+    bool is_valid() const {
+        return (_top > _bottom || _left > _right);
+    }
+
+    long _left = 0;
+    long _top = 0;
+    long _right;
+    long _bottom;
 };
 
-#endif  // !WM_UTIL_HPP
+#endif // !WM_UTIL_HPP