return shader;
}
-int create_gl_resources(Compositor *compositor, CompositedScreen *screen)
+unsigned link_program(unsigned *shaders, unsigned nshaders)
{
+ unsigned program;
+ unsigned i;
int status;
char info_log[1024];
GLsizei length;
+ program = glCreateProgram();
+ for(i=0; i<nshaders; ++i)
+ glAttachShader(program, shaders[i]);
+ glBindAttribLocation(program, 0, "vertex");
+ glLinkProgram(program);
+
+ glGetProgramiv(program, GL_LINK_STATUS, &status);
+ glGetProgramInfoLog(program, sizeof(info_log), &length, info_log);
+ if(!status)
+ {
+ fprintf(stderr, "Program link failed:\n%s\n", info_log);
+ glDeleteProgram(program);
+ return 0;
+ }
+ else if(length)
+ printf("Program info log:\n%s\n", info_log);
+
+ return program;
+}
+
+int create_gl_resources(Compositor *compositor, CompositedScreen *screen)
+{
use_gl(compositor, screen);
screen->shaders[0] = compile_shader(GL_VERTEX_SHADER, vshader);
if(!screen->shaders[0] || !screen->shaders[1])
return 0;
- screen->program = glCreateProgram();
- glAttachShader(screen->program, screen->shaders[0]);
- glAttachShader(screen->program, screen->shaders[1]);
- glBindAttribLocation(screen->program, 0, "vertex");
- glLinkProgram(screen->program);
+ screen->program = link_program(screen->shaders, 2);
+ if(!screen->program)
+ return 0;
screen->geometry_loc = glGetUniformLocation(screen->program, "geometry");
- glGetProgramiv(screen->program, GL_LINK_STATUS, &status);
- glGetProgramInfoLog(screen->program, sizeof(info_log), &length, info_log);
- if(!status)
- {
- fprintf(stderr, "Program link failed:\n%s\n", info_log);
- glDeleteProgram(screen->program);
- return 0;
- }
- else if(length)
- printf("Program info log:\n%s\n", info_log);
-
glGenBuffers(1, &screen->vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, screen->vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
void process_destroy_window_event(Compositor *compositor, XDestroyWindowEvent *event)
{
- CompositedScreen *screen = find_screen_by_root(compositor, event->event);
+ CompositedScreen *screen;
+ CompositedWindow *window;
+
+ screen = find_screen_by_root(compositor, event->event);
if(!screen)
return;
- CompositedWindow *window = find_window(screen, event->window);
+ window = find_window(screen, event->window);
if(window)
remove_window(compositor, screen, window, 1);
}
void process_map_event(Compositor *compositor, XMapEvent *event)
{
- CompositedScreen *screen = find_screen_by_root(compositor, event->event);
+ CompositedScreen *screen;
+ CompositedWindow *window;
+
+ screen = find_screen_by_root(compositor, event->event);
if(!screen)
return;
- CompositedWindow *window = find_window(screen, event->window);
+ window = find_window(screen, event->window);
if(!window)
return;
void process_unmap_event(Compositor *compositor, XUnmapEvent *event)
{
- CompositedScreen *screen = find_screen_by_root(compositor, event->event);
+ CompositedScreen *screen;
+ CompositedWindow *window;
+
+ screen = find_screen_by_root(compositor, event->event);
if(!screen)
return;
- CompositedWindow *window = find_window(screen, event->window);
+ window = find_window(screen, event->window);
if(window)
window->map_state = IsUnviewable;
void process_reparent_event(Compositor *compositor, XReparentEvent *event)
{
- CompositedScreen *screen = find_screen_by_root(compositor, event->event);
+ CompositedScreen *screen;
+ CompositedWindow *window;
+
+ screen = find_screen_by_root(compositor, event->event);
if(!screen)
return;
- CompositedWindow *window;
if(event->parent==screen->root)
window = add_window(compositor, screen, event->window);
else
void process_configure_event(Compositor *compositor, XConfigureEvent *event)
{
- CompositedScreen *screen = find_screen_by_root(compositor, event->event);
+ CompositedScreen *screen;
+ CompositedWindow *window;
+
+ screen = find_screen_by_root(compositor, event->event);
if(!screen)
return;
- CompositedWindow *window = find_window(screen, event->window);
+ window = find_window(screen, event->window);
if(!window)
return;
void process_damage_event(Compositor *compositor, XDamageNotifyEvent *event)
{
- CompositedScreen *screen = find_screen_by_window(compositor, event->drawable);
+ CompositedScreen *screen;
+ CompositedWindow *window;
+
+ screen = find_screen_by_window(compositor, event->drawable);
if(!screen)
return;
- CompositedWindow *window = find_window(screen, event->drawable);
+ window = find_window(screen, event->drawable);
if(window->map_state==IsViewable)
mark_dirty(compositor, screen);
}