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