fix BadMatch error when embedding on some windows
When embedded into another window, dmenu will fail with the BadMatch error if that window have not the same colormap/depth/visual as the root window. That happens because dmenu inherits the colormap/depth/visual from its parent, but draws on a pixmap created based on the root window using a GC created for the root window (see drw.c). A BadMatch will occur when copying the content of the pixmap into dmenu's window. A solution is to create dmenu's window inside root and then reparent it if embeded. See this mail[1] on ports@openbsd.org mailing list for context. [1]: https://marc.info/?l=openbsd-ports&m=168072150814664&w=2
This commit is contained in:
		
				
					committed by
					
						 Hiltjo Posthuma
						Hiltjo Posthuma
					
				
			
			
				
	
			
			
			
						parent
						
							dfbbf7f6e1
						
					
				
				
					commit
					0fe460dbd4
				
			
							
								
								
									
										3
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								dmenu.c
									
									
									
									
									
								
							| @ -685,7 +685,7 @@ setup(void) | ||||
| 	swa.override_redirect = True; | ||||
| 	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; | ||||
| 	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; | ||||
| 	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, | ||||
| 	win = XCreateWindow(dpy, root, x, y, mw, mh, 0, | ||||
| 	                    CopyFromParent, CopyFromParent, CopyFromParent, | ||||
| 	                    CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); | ||||
| 	XSetClassHint(dpy, win, &ch); | ||||
| @ -700,6 +700,7 @@ setup(void) | ||||
|  | ||||
| 	XMapRaised(dpy, win); | ||||
| 	if (embed) { | ||||
| 		XReparentWindow(dpy, win, parentwin, x, y); | ||||
| 		XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); | ||||
| 		if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { | ||||
| 			for (i = 0; i < du && dws[i] != win; ++i) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user