95 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			95 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | #include <Kore/Log.h>
 | ||
|  | 
 | ||
|  | #include "Display.h"
 | ||
|  | 
 | ||
|  | #include <cstdio>
 | ||
|  | #include <cstdlib>
 | ||
|  | 
 | ||
|  | namespace Kore { | ||
|  | 	namespace Display { | ||
|  | 		void fatalError(const char *message) { | ||
|  | 			printf("main: %s\n", message); | ||
|  | 			exit(1); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		enum { MAXIMUM_DISPLAY_COUNT = 10 }; | ||
|  | 
 | ||
|  | 		DeviceInfo displays[MAXIMUM_DISPLAY_COUNT]; | ||
|  | 		int displayCounter = -1; | ||
|  | 		bool initialized = false; | ||
|  | 
 | ||
|  | 		void enumDisplayMonitors(DeviceInfo screens[], int &displayCounter); | ||
|  | 
 | ||
|  | 		void enumerate() { | ||
|  | 			if (initialized) { | ||
|  | 				return; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			initialized = true; | ||
|  | 			enumDisplayMonitors(displays, displayCounter); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		int count() { | ||
|  | 			return displayCounter + 1; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		int width(int index) { | ||
|  | 			return displays[index].width; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		int height(int index) { | ||
|  | 			return displays[index].height; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		int x(int index) { | ||
|  | 			return displays[index].x; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		int y(int index) { | ||
|  | 			return displays[index].y; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		bool isPrimary(int index) { | ||
|  | 			return displays[index].isPrimary; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		const DeviceInfo *primaryScreen() { | ||
|  | 			for (int index = 0; index < MAXIMUM_DISPLAY_COUNT; ++index) { | ||
|  | 				const DeviceInfo &info = displays[index]; | ||
|  | 
 | ||
|  | 				if (info.isAvailable && info.isPrimary) { | ||
|  | 					return &info; | ||
|  | 				} | ||
|  | 			} | ||
|  | 
 | ||
|  | 			if (!displays[0].isAvailable) { | ||
|  | 				log(Warning, "No display attached?"); | ||
|  | 				// TODO (DK) throw exception?
 | ||
|  | 				return nullptr; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			log(Warning, "No primary display defined, returning first display"); | ||
|  | 			return &displays[0]; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		const DeviceInfo *screenById(int id) { | ||
|  | 			for (int index = 0; index < MAXIMUM_DISPLAY_COUNT; ++index) { | ||
|  | 				const DeviceInfo &info = displays[index]; | ||
|  | 
 | ||
|  | 				if (info.number == id) { | ||
|  | 					return &info; | ||
|  | 				} | ||
|  | 			} | ||
|  | 
 | ||
|  | 			if (!displays[0].isAvailable) { | ||
|  | 				log(Warning, "No display available"); | ||
|  | 				// TODO (DK) throw exception?
 | ||
|  | 				return nullptr; | ||
|  | 			} | ||
|  | 
 | ||
|  | 			log(Warning, "No display with id \"%i\" found, returning first display", id); | ||
|  | 			return &displays[0]; | ||
|  | 		} | ||
|  | 	} | ||
|  | } |