#pragma once #include #include #define blog(level, msg, ...) blog(level, "xcompcap: " msg, ##__VA_ARGS__) class PLock { pthread_mutex_t *m; bool islock; public: PLock(const PLock &) = delete; PLock &operator=(const PLock &) = delete; PLock(pthread_mutex_t *mtx, bool trylock = false); ~PLock(); bool isLocked(); void unlock(); void lock(); }; class XErrorLock { bool islock; bool goterr; XErrorHandler prevhandler; public: XErrorLock(const XErrorLock &) = delete; XErrorLock &operator=(const XErrorLock &) = delete; XErrorLock(); ~XErrorLock(); bool isLocked(); void unlock(); void lock(); bool gotError(); std::string getErrorText(); void resetError(); }; class XDisplayLock { bool islock; public: XDisplayLock(const XDisplayLock &) = delete; XDisplayLock &operator=(const XDisplayLock &) = delete; XDisplayLock(); ~XDisplayLock(); bool isLocked(); void unlock(); void lock(); }; class ObsGsContextHolder { public: ObsGsContextHolder(const ObsGsContextHolder &) = delete; ObsGsContextHolder &operator=(const ObsGsContextHolder &) = delete; ObsGsContextHolder(); ~ObsGsContextHolder(); }; namespace XCompcap { Display *disp(); void cleanupDisplay(); std::string getWindowCommand(Window win); int getRootWindowScreen(Window root); std::string getWindowAtom(Window win, const char *atom); int getWindowPid(Window win); bool ewmhIsSupported(); std::list getTopLevelWindows(); std::list getAllWindows(); inline std::string getWindowName(Window win) { return getWindowAtom(win, "_NET_WM_NAME"); } inline std::string getWindowClass(Window win) { return getWindowAtom(win, "WM_CLASS"); } void processEvents(); bool windowWasReconfigured(Window win); }