#ifndef WM_UTIL_HPP #define WM_UTIL_HPP #include #include #include #ifdef __GNUC__ #define ATTR_FORMAT(stringindex, firsttocheck) \ __attribute__((format(printf, stringindex, firsttocheck))) #else #define ATTR_FORMAT(stringindex, firsttocheck) #endif void lognotice(char const *fmt, ...) ATTR_FORMAT(1, 2); void logerror(char const *fmt, ...) ATTR_FORMAT(1, 2); void fatal(char const *fmt, ...) ATTR_FORMAT(1, 2); #ifdef DEBUG_OUTPUT void logdebug(char const *fmt, ...) ATTR_FORMAT(1, 2); #else static inline void logdebug(char const *fmt, ...) ATTR_FORMAT(1, 2); static inline void logdebug(char const *fmt, ...) {} #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 Poller { std::vector> handlers; std::vector pfds; Poller() = default; void add_fd(int fd, std::function handler); int check_events(); }; #endif // !WM_UTIL_HPP