xcompcap-helper.hpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #pragma once
  2. #include <string>
  3. #include <list>
  4. #define blog(level, msg, ...) blog(level, "xcompcap: " msg, ##__VA_ARGS__)
  5. class PLock {
  6. pthread_mutex_t *m;
  7. bool islock;
  8. public:
  9. PLock(const PLock &) = delete;
  10. PLock &operator=(const PLock &) = delete;
  11. PLock(pthread_mutex_t *mtx, bool trylock = false);
  12. ~PLock();
  13. bool isLocked();
  14. void unlock();
  15. void lock();
  16. };
  17. class XErrorLock {
  18. bool islock;
  19. bool goterr;
  20. XErrorHandler prevhandler;
  21. public:
  22. XErrorLock(const XErrorLock &) = delete;
  23. XErrorLock &operator=(const XErrorLock &) = delete;
  24. XErrorLock();
  25. ~XErrorLock();
  26. bool isLocked();
  27. void unlock();
  28. void lock();
  29. bool gotError();
  30. std::string getErrorText();
  31. void resetError();
  32. };
  33. class XDisplayLock {
  34. bool islock;
  35. public:
  36. XDisplayLock(const XDisplayLock &) = delete;
  37. XDisplayLock &operator=(const XDisplayLock &) = delete;
  38. XDisplayLock();
  39. ~XDisplayLock();
  40. bool isLocked();
  41. void unlock();
  42. void lock();
  43. };
  44. class ObsGsContextHolder {
  45. public:
  46. ObsGsContextHolder(const ObsGsContextHolder &) = delete;
  47. ObsGsContextHolder &operator=(const ObsGsContextHolder &) = delete;
  48. ObsGsContextHolder();
  49. ~ObsGsContextHolder();
  50. };
  51. namespace XCompcap {
  52. Display *disp();
  53. void cleanupDisplay();
  54. std::string getWindowCommand(Window win);
  55. int getRootWindowScreen(Window root);
  56. std::string getWindowAtom(Window win, const char *atom);
  57. int getWindowPid(Window win);
  58. bool ewmhIsSupported();
  59. std::list<Window> getTopLevelWindows();
  60. std::list<Window> getAllWindows();
  61. inline std::string getWindowName(Window win)
  62. {
  63. return getWindowAtom(win, "_NET_WM_NAME");
  64. }
  65. inline std::string getWindowClass(Window win)
  66. {
  67. return getWindowAtom(win, "WM_CLASS");
  68. }
  69. void processEvents();
  70. bool windowWasReconfigured(Window win);
  71. }