xglcomp
diff src/main.cc @ 3:e831d38e6faa
textures
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 22 Jan 2016 07:46:47 +0200 |
parents | 876efea9424c |
children | 86e57e56a454 |
line diff
1.1 --- a/src/main.cc Fri Jan 22 06:31:03 2016 +0200 1.2 +++ b/src/main.cc Fri Jan 22 07:46:47 2016 +0200 1.3 @@ -15,6 +15,7 @@ 1.4 static void manage_window(Window xwin); 1.5 static void unmanage_window(Window xwin); 1.6 static void redraw(); 1.7 +static void draw_window(CompWindow *cwin); 1.8 static void reshape(int x, int y); 1.9 1.10 Display *dpy; 1.11 @@ -72,6 +73,7 @@ 1.12 XEvent ev; 1.13 XNextEvent(dpy, &ev); 1.14 1.15 + CompWindow *cwin; 1.16 switch(ev.type) { 1.17 case CreateNotify: 1.18 manage_window(ev.xcreatewindow.window); 1.19 @@ -85,8 +87,15 @@ 1.20 break; 1.21 1.22 case MapNotify: 1.23 + if((cwin = find_window_xid(ev.xmap.window))) { 1.24 + cwin->mapped = true; 1.25 + } 1.26 break; 1.27 + 1.28 case UnmapNotify: 1.29 + if((cwin = find_window_xid(ev.xunmap.window))) { 1.30 + cwin->mapped = false; 1.31 + } 1.32 break; 1.33 1.34 case ReparentNotify: 1.35 @@ -101,10 +110,7 @@ 1.36 break; 1.37 1.38 case Expose: 1.39 - if(ev.xexpose.window == root_win) { 1.40 - log_debug("expose\n"); 1.41 - // TODO 1.42 - } 1.43 + // TODO? 1.44 break; 1.45 1.46 default: 1.47 @@ -157,6 +163,7 @@ 1.48 //log_debug("manage_window %u\n", xwin); 1.49 CompWindow *cwin = new CompWindow(xwin); 1.50 XGetWindowAttributes(dpy, xwin, &cwin->attr); 1.51 + cwin->mapped = cwin->attr.map_state != IsUnmapped; 1.52 add_window(cwin); 1.53 } 1.54 1.55 @@ -164,16 +171,22 @@ 1.56 { 1.57 //log_debug("unmanage_window %u\n", xwin); 1.58 CompWindow *cwin = find_window_xid(xwin); 1.59 - if(cwin) { 1.60 - remove_window(cwin); 1.61 - delete cwin; 1.62 + if(!cwin) return; 1.63 + 1.64 + if(cwin->xpixmap) { 1.65 + XFreePixmap(dpy, cwin->xpixmap); 1.66 } 1.67 + 1.68 + remove_window(cwin); 1.69 + delete cwin; 1.70 } 1.71 1.72 static void redraw() 1.73 { 1.74 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 1.75 1.76 + glPushAttrib(GL_ENABLE_BIT); 1.77 + glEnable(GL_TEXTURE_2D); 1.78 glEnable(GL_BLEND); 1.79 glBlendFunc(GL_ONE, GL_ONE); 1.80 1.81 @@ -181,20 +194,48 @@ 1.82 for(int i=0; i<num_win; i++) { 1.83 CompWindow *cwin = get_window(i); 1.84 1.85 - glBegin(GL_QUADS); 1.86 - glColor3f(0.4, 0.1, 0.05); 1.87 - glVertex2f(cwin->attr.x, cwin->attr.y); 1.88 - glVertex2f(cwin->attr.x + cwin->attr.width, cwin->attr.y); 1.89 - glVertex2f(cwin->attr.x + cwin->attr.width, cwin->attr.y + cwin->attr.height); 1.90 - glVertex2f(cwin->attr.x, cwin->attr.y + cwin->attr.height); 1.91 - glEnd(); 1.92 + if(!cwin->mapped) continue; 1.93 + 1.94 + if(cwin->attr.x + cwin->attr.width <= 0 || 1.95 + cwin->attr.y + cwin->attr.height <= 0 || 1.96 + cwin->attr.x >= root_width || cwin->attr.y >= root_height) { 1.97 + continue; 1.98 + } 1.99 + 1.100 + draw_window(cwin); 1.101 } 1.102 1.103 - glDisable(GL_BLEND); 1.104 + glPopAttrib(); 1.105 1.106 glXSwapBuffers(dpy, comp_win); 1.107 } 1.108 1.109 +static void draw_window(CompWindow *cwin) 1.110 +{ 1.111 + if(!cwin->xpixmap) { 1.112 + cwin->xpixmap = XCompositeNameWindowPixmap(dpy, cwin->xwin); 1.113 + if(!cwin->xpixmap) { 1.114 + log_warning("failed to get pixmap\n"); 1.115 + return; 1.116 + } 1.117 + cwin->tex.set_image(dpy, cwin->xpixmap); 1.118 + } 1.119 + 1.120 + glBindTexture(GL_TEXTURE_2D, cwin->tex.get_id()); 1.121 + 1.122 + glBegin(GL_QUADS); 1.123 + glColor3f(0.3, 0.3, 0.3); 1.124 + glTexCoord2f(0, 0); 1.125 + glVertex2f(cwin->attr.x, cwin->attr.y); 1.126 + glTexCoord2f(1, 0); 1.127 + glVertex2f(cwin->attr.x + cwin->attr.width, cwin->attr.y); 1.128 + glTexCoord2f(1, 1); 1.129 + glVertex2f(cwin->attr.x + cwin->attr.width, cwin->attr.y + cwin->attr.height); 1.130 + glTexCoord2f(0, 1); 1.131 + glVertex2f(cwin->attr.x, cwin->attr.y + cwin->attr.height); 1.132 + glEnd(); 1.133 +} 1.134 + 1.135 static void reshape(int x, int y) 1.136 { 1.137 glViewport(0, 0, x, y);