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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 16 * USA. 17 */ 18 19 // Management class for the RFB virtual screens 20 21 package com.tigervnc.rfb; 22 23 import java.util.*; 24 25 public class ScreenSet { 26 27 // Represents a complete screen configuration, excluding framebuffer 28 // dimensions. 29 ScreenSet()30 public ScreenSet() { 31 screens = new ArrayList<Screen>(); 32 } 33 begin()34 public final ListIterator<Screen> begin() { return screens.listIterator(0); } end()35 public final ListIterator<Screen> end() { 36 return screens.listIterator(screens.size()); 37 } num_screens()38 public final int num_screens() { return screens.size(); } 39 add_screen(Screen screen)40 public final void add_screen(Screen screen) { screens.add(screen); } remove_screen(int id)41 public final void remove_screen(int id) { 42 ListIterator iter, nextiter; 43 for (iter = begin(); iter != end(); iter = nextiter) { 44 nextiter = iter; nextiter.next(); 45 if (((Screen)iter.next()).id == id) 46 iter.remove(); 47 } 48 } 49 validate(int fb_width, int fb_height)50 public final boolean validate(int fb_width, int fb_height) { 51 List<Integer> seen_ids = new ArrayList<Integer>(); 52 Rect fb_rect = new Rect(); 53 54 if (screens.isEmpty()) 55 return false; 56 if (num_screens() > 255) 57 return false; 58 59 fb_rect.setXYWH(0, 0, fb_width, fb_height); 60 61 for (Iterator<Screen> iter = screens.iterator(); iter.hasNext(); ) { 62 Screen refScreen = (Screen)iter.next(); 63 if (refScreen.dimensions.is_empty()) 64 return false; 65 if (!refScreen.dimensions.enclosed_by(fb_rect)) 66 return false; 67 if (seen_ids.lastIndexOf(refScreen.id) != -1) 68 return false; 69 seen_ids.add(refScreen.id); 70 } 71 72 return true; 73 } 74 debug_print()75 public final void debug_print() { 76 vlog.debug(num_screens()+" screen(s)"); 77 for (Iterator<Screen> iter = screens.iterator(); iter.hasNext(); ) { 78 Screen refScreen = (Screen)iter.next(); 79 vlog.debug(" "+refScreen.id+" (0x"+refScreen.id+"): "+ 80 refScreen.dimensions.width()+"x"+refScreen.dimensions.height()+ 81 "+"+refScreen.dimensions.tl.x+"+"+refScreen.dimensions.tl.y+ 82 " (flags 0x"+refScreen.flags+")"); 83 } 84 } 85 86 public ArrayList<Screen> screens; 87 88 static LogWriter vlog = new LogWriter("ScreenSet"); 89 90 } 91 92