You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ScreenSet.h 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /* Copyright 2009 Pierre Ossman for Cendio AB
  2. *
  3. * This is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation; either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This software is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this software; if not, write to the Free Software
  15. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  16. * USA.
  17. */
  18. // Management class for the RFB virtual screens
  19. #ifndef __RFB_SCREENSET_INCLUDED__
  20. #define __RFB_SCREENSET_INCLUDED__
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <stdint.h>
  24. #include <rfb/Rect.h>
  25. #include <list>
  26. #include <set>
  27. namespace rfb {
  28. // rfb::Screen
  29. //
  30. // Represents a single RFB virtual screen, which includes
  31. // coordinates, an id and flags.
  32. struct Screen {
  33. Screen(void) : id(0), flags(0) {};
  34. Screen(uint32_t id_, int x_, int y_, int w_, int h_, uint32_t flags_) :
  35. id(id_), dimensions(x_, y_, x_+w_, y_+h_), flags(flags_) {};
  36. inline bool operator==(const Screen& r) const {
  37. if (id != r.id)
  38. return false;
  39. if (!dimensions.equals(r.dimensions))
  40. return false;
  41. if (flags != r.flags)
  42. return false;
  43. return true;
  44. }
  45. uint32_t id;
  46. Rect dimensions;
  47. uint32_t flags;
  48. };
  49. // rfb::ScreenSet
  50. //
  51. // Represents a complete screen configuration, excluding framebuffer
  52. // dimensions.
  53. struct ScreenSet {
  54. ScreenSet(void) {};
  55. typedef std::list<Screen>::iterator iterator;
  56. typedef std::list<Screen>::const_iterator const_iterator;
  57. inline iterator begin(void) { return screens.begin(); };
  58. inline const_iterator begin(void) const { return screens.begin(); };
  59. inline iterator end(void) { return screens.end(); };
  60. inline const_iterator end(void) const { return screens.end(); };
  61. inline int num_screens(void) const { return screens.size(); };
  62. inline void add_screen(const Screen screen) { screens.push_back(screen); };
  63. inline void remove_screen(uint32_t id) {
  64. std::list<Screen>::iterator iter, nextiter;
  65. for (iter = screens.begin();iter != screens.end();iter = nextiter) {
  66. nextiter = iter; nextiter++;
  67. if (iter->id == id)
  68. screens.erase(iter);
  69. }
  70. }
  71. inline bool validate(int fb_width, int fb_height) const {
  72. std::list<Screen>::const_iterator iter;
  73. std::set<uint32_t> seen_ids;
  74. Rect fb_rect;
  75. if (screens.empty())
  76. return false;
  77. if (num_screens() > 255)
  78. return false;
  79. fb_rect.setXYWH(0, 0, fb_width, fb_height);
  80. for (iter = screens.begin();iter != screens.end();++iter) {
  81. if (iter->dimensions.is_empty())
  82. return false;
  83. if (!iter->dimensions.enclosed_by(fb_rect))
  84. return false;
  85. if (seen_ids.find(iter->id) != seen_ids.end())
  86. return false;
  87. seen_ids.insert(iter->id);
  88. }
  89. return true;
  90. };
  91. inline void print(char* str, size_t len) const {
  92. char buffer[128];
  93. std::list<Screen>::const_iterator iter;
  94. snprintf(buffer, sizeof(buffer), "%d screen(s)\n", num_screens());
  95. str[0] = '\0';
  96. strncat(str, buffer, len - 1 - strlen(str));
  97. for (iter = screens.begin();iter != screens.end();++iter) {
  98. snprintf(buffer, sizeof(buffer),
  99. " %10d (0x%08x): %dx%d+%d+%d (flags 0x%08x)\n",
  100. (int)iter->id, (unsigned)iter->id,
  101. iter->dimensions.width(), iter->dimensions.height(),
  102. iter->dimensions.tl.x, iter->dimensions.tl.y,
  103. (unsigned)iter->flags);
  104. strncat(str, buffer, len - 1 - strlen(str));
  105. }
  106. };
  107. inline bool operator==(const ScreenSet& r) const {
  108. std::list<Screen> a = screens;
  109. a.sort(compare_screen);
  110. std::list<Screen> b = r.screens;
  111. b.sort(compare_screen);
  112. return a == b;
  113. };
  114. inline bool operator!=(const ScreenSet& r) const { return !operator==(r); }
  115. std::list<Screen> screens;
  116. private:
  117. static inline bool compare_screen(const Screen& first, const Screen& second)
  118. {
  119. return first.id < second.id;
  120. }
  121. };
  122. };
  123. #endif