added support for OpenGL extensions, vendor, version
[libgliar] / src / gliar.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <dlfcn.h>
6 #include <pwd.h>
7 #include <GL/gl.h>
8 #include "cfg.h"
9
10 static int done_init;
11 static const GLubyte* (*gl_get_string)(GLenum);
12 static struct cfgopt *cfglist;
13
14 static int init(void)
15 {
16         if(done_init) {
17                 return 0;
18         }
19
20         if(!(cfglist = gliar_load_cfg("gliar.conf"))) {
21                 struct passwd *pw;
22                 char *homedir, *path;
23
24                 if((pw = getpwuid(getuid()))) {
25                         homedir = pw->pw_dir;
26                 } else {
27                         homedir = getenv("HOME");
28                 }
29
30                 if(homedir) {
31                         path = alloca(strlen(homedir) + strlen(".gliar.conf") + 2);
32                         sprintf(path, "%s/.gliar.conf", homedir);
33
34                         cfglist = gliar_load_cfg(path);
35                 }
36         }
37
38         gl_get_string = dlsym(RTLD_NEXT, "glGetString");
39
40         done_init = 1;
41         return 0;
42 }
43
44 const GLubyte *glGetString(GLenum name)
45 {
46         const char *key, *value;
47
48         init();
49
50         switch(name) {
51         case GL_VENDOR:
52                 key = "vendor";
53                 break;
54
55         case GL_VERSION:
56                 key = "version";
57                 break;
58
59         case GL_EXTENSIONS:
60                 key = "extensions";
61                 break;
62
63         default:
64                 key = 0;
65         }
66
67         if(key && (value = gliar_find_opt(cfglist, key))) {
68                 return value;
69         }
70
71         return gl_get_string(name);
72 }