blob: f2df156cc13dab26c29f5b16eeccb9b605b1c1f3 [file] [log] [blame]
Pierre Ossmancbd1b2c2009-03-20 16:05:04 +00001/* 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
19// Management class for the RFB virtual screens
20
21#ifndef __RFB_SCREENSET_INCLUDED__
22#define __RFB_SCREENSET_INCLUDED__
23
Pierre Ossman04e62db2009-03-23 16:57:07 +000024#include <stdio.h>
25
Pierre Ossmancbd1b2c2009-03-20 16:05:04 +000026#include <rfb/Rect.h>
27#include <list>
28#include <set>
29
30namespace rfb {
31
32 // rfb::Screen
33 //
34 // Represents a single RFB virtual screen, which includes
35 // coordinates, an id and flags.
36
37 struct Screen {
38 Screen(void) : id(0), flags(0) {};
39 Screen(rdr::U32 id_, int x_, int y_, int w_, int h_, rdr::U32 flags_) :
40 id(id_), dimensions(x_, y_, x_+w_, y_+h_), flags(flags_) {};
Pierre Ossman04e62db2009-03-23 16:57:07 +000041
42 inline bool operator==(const Screen& r) const {
43 if (id != r.id)
44 return false;
45 if (!dimensions.equals(r.dimensions))
46 return false;
47 if (flags != r.flags)
48 return false;
49 return true;
50 }
51
Pierre Ossmancbd1b2c2009-03-20 16:05:04 +000052 rdr::U32 id;
53 Rect dimensions;
54 rdr::U32 flags;
55 };
56
57 // rfb::ScreenSet
58 //
59 // Represents a complete screen configuration, excluding framebuffer
60 // dimensions.
61
62 struct ScreenSet {
63 ScreenSet(void) {};
Pierre Ossman34e62f32009-03-20 21:46:12 +000064
65 typedef std::list<Screen>::iterator iterator;
66 typedef std::list<Screen>::const_iterator const_iterator;
67
68 inline iterator begin(void) { return screens.begin(); };
69 inline const_iterator begin(void) const { return screens.begin(); };
70 inline iterator end(void) { return screens.end(); };
71 inline const_iterator end(void) const { return screens.end(); };
72
73 inline int num_screens(void) const { return screens.size(); };
74
Pierre Ossmancbd1b2c2009-03-20 16:05:04 +000075 inline void add_screen(const Screen screen) { screens.push_back(screen); };
Pierre Ossman34e62f32009-03-20 21:46:12 +000076 inline void remove_screen(rdr::U32 id) {
Adam Tkac684ca1d2010-11-22 14:53:23 +000077 std::list<Screen>::iterator iter, nextiter;
78 for (iter = screens.begin();iter != screens.end();iter = nextiter) {
79 nextiter = ++iter;
Pierre Ossman34e62f32009-03-20 21:46:12 +000080 if (iter->id == id)
81 screens.erase(iter);
82 }
83 }
84
Pierre Ossmancbd1b2c2009-03-20 16:05:04 +000085 inline bool validate(int fb_width, int fb_height) const {
86 std::list<Screen>::const_iterator iter;
87 std::set<rdr::U32> seen_ids;
88 Rect fb_rect;
89
90 if (screens.empty())
91 return false;
Pierre Ossman34e62f32009-03-20 21:46:12 +000092 if (num_screens() > 255)
93 return false;
Pierre Ossmancbd1b2c2009-03-20 16:05:04 +000094
95 fb_rect.setXYWH(0, 0, fb_width, fb_height);
96
97 for (iter = screens.begin();iter != screens.end();++iter) {
98 if (iter->dimensions.is_empty())
99 return false;
100 if (!iter->dimensions.enclosed_by(fb_rect))
101 return false;
102 if (seen_ids.find(iter->id) != seen_ids.end())
103 return false;
104 seen_ids.insert(iter->id);
105 }
106
107 return true;
108 };
Pierre Ossman34e62f32009-03-20 21:46:12 +0000109
Pierre Ossman04e62db2009-03-23 16:57:07 +0000110 inline void debug_print(void) const {
111 std::list<Screen>::const_iterator iter;
112 fprintf(stderr, "%d screens\n", num_screens());
113 for (iter = screens.begin();iter != screens.end();++iter) {
114 fprintf(stderr, " %10d (0x%08x): %dx%d+%d+%d (flags 0x%08x)\n",
115 (int)iter->id, (unsigned)iter->id,
116 iter->dimensions.width(), iter->dimensions.height(),
117 iter->dimensions.tl.x, iter->dimensions.tl.y,
118 (unsigned)iter->flags);
119 }
120 };
121
122 // FIXME: List order shouldn't matter
123 inline bool operator==(const ScreenSet& r) const { return screens == r.screens; }
124 inline bool operator!=(const ScreenSet& r) const { return screens != r.screens; }
125
Pierre Ossmancbd1b2c2009-03-20 16:05:04 +0000126 std::list<Screen> screens;
127 };
128
129};
130
131#endif
132