fix BadMatch error when embedding on some windows
When embedded, st fails with BadMatch error if the embedder's window has non-default colormap/depth/visual. This commit fixes that by creating st's window inside root and then reparent it into embedder. The reference window for dc.gc is also changed to match root's visuals. A similar commit had been made for dmenu[1]. See this issue[2] on github for context. [1]: https://git.suckless.org/dmenu/commit/0fe460dbd469a1d5b6a7140d0e1801935e4a923b.html [2]: https://github.com/phillbush/xfiles/issues/47
This commit is contained in:
		
				
					committed by
					
						 Hiltjo Posthuma
						Hiltjo Posthuma
					
				
			
			
				
	
			
			
			
						parent
						
							5dbcca4926
						
					
				
				
					commit
					a0274bc20e
				
			
							
								
								
									
										11
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								x.c
									
									
									
									
									
								
							| @@ -1131,7 +1131,7 @@ xinit(int cols, int rows) | |||||||
| { | { | ||||||
| 	XGCValues gcvalues; | 	XGCValues gcvalues; | ||||||
| 	Cursor cursor; | 	Cursor cursor; | ||||||
| 	Window parent; | 	Window parent, root; | ||||||
| 	pid_t thispid = getpid(); | 	pid_t thispid = getpid(); | ||||||
| 	XColor xmousefg, xmousebg; | 	XColor xmousefg, xmousebg; | ||||||
|  |  | ||||||
| @@ -1168,16 +1168,19 @@ xinit(int cols, int rows) | |||||||
| 		| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; | 		| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; | ||||||
| 	xw.attrs.colormap = xw.cmap; | 	xw.attrs.colormap = xw.cmap; | ||||||
|  |  | ||||||
|  | 	root = XRootWindow(xw.dpy, xw.scr); | ||||||
| 	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) | 	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) | ||||||
| 		parent = XRootWindow(xw.dpy, xw.scr); | 		parent = root; | ||||||
| 	xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, | 	xw.win = XCreateWindow(xw.dpy, root, xw.l, xw.t, | ||||||
| 			win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, | 			win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, | ||||||
| 			xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity | 			xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity | ||||||
| 			| CWEventMask | CWColormap, &xw.attrs); | 			| CWEventMask | CWColormap, &xw.attrs); | ||||||
|  | 	if (parent != root) | ||||||
|  | 		XReparentWindow(xw.dpy, xw.win, parent, xw.l, xw.t); | ||||||
|  |  | ||||||
| 	memset(&gcvalues, 0, sizeof(gcvalues)); | 	memset(&gcvalues, 0, sizeof(gcvalues)); | ||||||
| 	gcvalues.graphics_exposures = False; | 	gcvalues.graphics_exposures = False; | ||||||
| 	dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, | 	dc.gc = XCreateGC(xw.dpy, xw.win, GCGraphicsExposures, | ||||||
| 			&gcvalues); | 			&gcvalues); | ||||||
| 	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, | 	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, | ||||||
| 			DefaultDepth(xw.dpy, xw.scr)); | 			DefaultDepth(xw.dpy, xw.scr)); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user