return program;
}
+unsigned create_2d_texture()
+{
+ unsigned texture;
+ glGenTextures(1, &texture);
+ glBindTexture(GL_TEXTURE_2D, texture);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ return texture;
+}
+
int create_gl_resources(Compositor *compositor, CompositedScreen *screen)
{
unsigned stride;
glBindBuffer(GL_ARRAY_BUFFER, 0);
- glGenTextures(1, &screen->fb_texture);
- glBindTexture(GL_TEXTURE_2D, screen->fb_texture);
+ screen->fb_texture = create_2d_texture();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, screen->width, screen->height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);
glGenFramebuffers(1, &screen->framebuffer);
return NULL;
}
+CompositedWindow *find_window_global(Compositor *compositor, Window w, CompositedScreen **screen)
+{
+ unsigned i, j;
+
+ for(i=0; i<compositor->nscreens; ++i)
+ for(j=0; j<compositor->screens[i].nwindows; ++j)
+ if(compositor->screens[i].windows[j].window==w)
+ {
+ if(screen)
+ *screen = &compositor->screens[i];
+ return &compositor->screens[i].windows[j];
+ }
+
+ if(screen)
+ *screen = NULL;
+ return NULL;
+}
+
void create_window_pixmap(Compositor *compositor, CompositedScreen *screen, CompositedWindow *window)
{
int attribs[5];
if(window->map_state==IsViewable)
create_window_pixmap(compositor, screen, window);
- glGenTextures(1, &window->texture);
- glBindTexture(GL_TEXTURE_2D, window->texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ window->texture = create_2d_texture();
return window;
}
return NULL;
}
-CompositedScreen *find_screen_by_window(Compositor *compositor, Window w)
-{
- unsigned i, j;
-
- for(i=0; i<compositor->nscreens; ++i)
- for(j=0; j<compositor->screens[i].nwindows; ++j)
- if(compositor->screens[i].windows[j].window==w)
- return &compositor->screens[i];
-
- return NULL;
-}
-
void update_monitor_vertices(CompositedScreen *screen, CompositedMonitor *monitor)
{
unsigned t;
CompositedScreen *screen;
CompositedWindow *window;
- screen = find_screen_by_window(compositor, event->drawable);
- if(!screen)
- return;
-
- window = find_window(screen, event->drawable);
- if(window->map_state==IsViewable)
+ window = find_window_global(compositor, event->drawable, &screen);
+ if(window && window->map_state==IsViewable)
mark_dirty(compositor, screen);
}