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);