| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -94,8 +94,10 @@ typedef struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Drawable buf; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						GlyphFontSpec *specbuf; /* font spec buffer used for rendering */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Atom xembed, wmdeletewin, netwmname, netwmpid; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XIM xim; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XIC xic; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						struct { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XIM xim; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XIC xic; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} ime; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Draw draw; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Visual *vis; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XSetWindowAttributes attrs; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1026,18 +1028,18 @@ ximopen(Display *dpy) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XIMCallback destroy = { .client_data = NULL, .callback = ximdestroy }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if ((xw.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if ((xw.ime.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetLocaleModifiers("@im=local"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if ((xw.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if ((xw.ime.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XSetLocaleModifiers("@im="); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if ((xw.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if ((xw.ime.xim = XOpenIM(xw.dpy, NULL, NULL, NULL)) == NULL) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									die("XOpenIM failed. Could not open input device.\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (XSetIMValues(xw.xim, XNDestroyCallback, &destroy, NULL) != NULL) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (XSetIMValues(xw.ime.xim, XNDestroyCallback, &destroy, NULL) != NULL) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							die("XSetIMValues failed. Could not set input method value.\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xw.xic = XCreateIC(xw.xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									XNClientWindow, xw.win, XNFocusWindow, xw.win, NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xw.xic = XCreateIC(xw.ime.xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						                   XNClientWindow, xw.win, XNFocusWindow, xw.win, NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (xw.xic == NULL) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							die("XCreateIC failed. Could not obtain input method.\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -1053,7 +1055,7 @@ ximinstantiate(Display *dpy, XPointer client, XPointer call) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					ximdestroy(XIM xim, XPointer client, XPointer call) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xw.xim = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						xw.ime.xim = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										ximinstantiate, NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1682,13 +1684,13 @@ focus(XEvent *ev) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (ev->type == FocusIn) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetICFocus(xw.xic); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XSetICFocus(xw.ime.xic); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							win.mode |= MODE_FOCUSED; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							xseturgency(0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (IS_SET(MODE_FOCUS)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								ttywrite("\033[I", 3, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XUnsetICFocus(xw.xic); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XUnsetICFocus(xw.ime.xic); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							win.mode &= ~MODE_FOCUSED; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (IS_SET(MODE_FOCUS)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								ttywrite("\033[O", 3, 0); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1752,7 +1754,7 @@ kpress(XEvent *ev) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (IS_SET(MODE_KBDLOCK)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						len = XmbLookupString(xw.xic, e, buf, sizeof buf, &ksym, &status); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* 1. shortcuts */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (ksym == bp->keysym && match(bp->mod, e->state)) { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |