1 /**
2 *	Initialization and error handling.
3 */
4 module glfw3d.Main;
5 
6 import std.experimental.logger;
7 import glfw3d.glfw3;
8 
9 __gshared Logger glfw3dLog;
10 
11 /**
12 *	Terminates glfw3d
13 */
14 alias glfw3dTerminate = glfwTerminate;
15 
16 shared static this() {
17 	glfw3dLog = sharedLog;
18 }
19 
20 /**
21 *	glfw3d throws this exception on errors
22 */
23 class glfw3dException : Exception {
24 	pure nothrow @nogc @safe this(string msg,
25 		string file = __FILE__,
26 		size_t line = __LINE__,
27 		Throwable next = null) {
28 			super(msg, file, line, next);
29 	}
30 }
31 
32 /**
33 *	Returns GLFW version
34 *	Returns: [Major, Minor, Rev]
35 */
36 int[3] glfw3dVersion() {
37 	int major, minor, rev;
38 	glfwGetVersion(&major, &minor, &rev);
39 	return [major, minor, rev];
40 }
41 
42 /**
43 *	Returns: GLFW version string
44 */
45 string glfw3dVersionString() {
46 	import std.string : fromStringz;
47 	return cast(string) glfwGetVersionString().fromStringz;
48 }
49 
50 private template Error(string e) {
51 	import std.string : fromStringz;
52 	const char[] Error = 
53 	"case GLFW_" ~ e ~ ":"
54 	~" try {glfw3dLog.log(\"GLFW error: "~ e ~"\");} catch {} break;";
55 }
56 
57 private extern(C) nothrow void glfw3dErrorCallback(int error, const(char)* desc) {
58 	switch(error) {
59 		mixin(Error!("VERSION_UNAVAILABLE"));
60 		mixin(Error!("NO_CURRENT_CONTEXT"));
61 		mixin(Error!("FORMAT_UNAVAILABLE"));
62 //		mixin(Error!("NO_WINDOW_CONTEXT"));
63 		mixin(Error!("NOT_INITIALIZED"));
64 		mixin(Error!("API_UNAVAILABLE"));
65 		mixin(Error!("PLATFORM_ERROR"));
66 		mixin(Error!("INVALID_VALUE"));
67 		mixin(Error!("OUT_OF_MEMORY"));
68 		mixin(Error!("INVALID_ENUM"));
69 		
70 		default:
71 			try {glfw3dLog.log("GLFW error: unknown");} catch {}
72 			break;
73 	}
74 }
75 
76 /**
77 *	Initializes glfw3d
78 *	Throws: glfw3dException on error
79 *	Params:
80 *		l = logger for glfw3d
81 */
82 void glfw3dInit(Logger l) {
83 	glfw3dLog = l;
84 	glfw3dInit();
85 }
86 /// ditto
87 void glfw3dInit() {
88 	if(!glfwInit()) {
89 		glfw3dTerminate();
90 		throw new glfw3dException("GLFW initialization failed");
91 	} else {
92 		glfwSetErrorCallback(&glfw3dErrorCallback);
93 	}
94 	debug glfw3dLog.log("glfw3d initialized");
95 }
96