X-Git-Url: https://git.xinqibao.xyz/st.git/blobdiff_plain/ab7037cb33b4be4d16e3197d907066ed5b8ab16b..3a50a4fd931ed58454b680c9fc5c1bc2278e67f3:/st.c

diff --git a/st.c b/st.c
index c9d0fb8..5d5ac30 100644
--- a/st.c
+++ b/st.c
@@ -107,6 +107,8 @@ typedef struct {
 	Colormap cmap;
 	Window win;
 	Pixmap buf;
+	XIM xim;
+	XIC xic;
 	int scr;
 	int w;	/* window width	 */
 	int h;	/* window height */
@@ -114,7 +116,7 @@ typedef struct {
 	int bufh; /* pixmap height */
 	int ch; /* char height */
 	int cw; /* char width  */
-	int hasfocus;
+	int focus;
 	int vis; /* is visible */
 } XWindow; 
 
@@ -241,8 +243,9 @@ static inline int selected(int x, int y) {
 }
 
 static void getbuttoninfo(XEvent *e, int *b, int *x, int *y) {
-	if(b) *b = e->xbutton.state,
-		*b=*b==4096?5:*b==2048?4:*b==1024?3:*b==512?2:*b==256?1:-1;
+	if(b) 
+		*b = e->xbutton.button;
+
 	*x = e->xbutton.x/xw.cw;
 	*y = e->xbutton.y/xw.ch;
 	sel.b.x = sel.by < sel.ey ? sel.bx : sel.ex;
@@ -1043,7 +1046,7 @@ tputc(char c) {
 			tnewline();
 			break;
 		case '\a':
-			if(!xw.hasfocus)
+			if(!xw.focus)
 				xseturgency(1);
 			break;
 		case '\033':
@@ -1228,6 +1231,13 @@ xinit(void) {
 			| CWColormap,
 			&attrs);
 	xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr));
+
+
+	/* input methods */
+	xw.xim = XOpenIM(xw.dis, NULL, NULL, NULL);
+	xw.xic = XCreateIC(xw.xim, XNInputStyle, XIMPreeditNothing 
+					   | XIMStatusNothing, XNClientWindow, xw.win, 
+					   XNFocusWindow, xw.win, NULL);
 	/* gc */
 	dc.gc = XCreateGC(xw.dis, xw.win, 0, NULL);
 	
@@ -1286,7 +1296,7 @@ xdrawcursor(void) {
 		xclear(oldx, oldy, oldx, oldy);
 	
 	/* draw the new one */
-	if(!(term.c.state & CURSOR_HIDE) && xw.hasfocus) {
+	if(!(term.c.state & CURSOR_HIDE) && xw.focus) {
 		xdraws(&g.c, g, term.c.x, term.c.y, 1);
 		oldx = term.c.x, oldy = term.c.y;
 	}
@@ -1388,7 +1398,7 @@ xseturgency(int add) {
 
 void
 focus(XEvent *ev) {
-	if((xw.hasfocus = ev->type == FocusIn))
+	if((xw.focus = ev->type == FocusIn))
 		xseturgency(0);
 	draw(SCREEN_UPDATE);
 }
@@ -1411,10 +1421,11 @@ kpress(XEvent *ev) {
 	int len;
 	int meta;
 	int shift;
+	Status status;
 
 	meta = e->state & Mod1Mask;
 	shift = e->state & ShiftMask;
-	len = XLookupString(e, buf, sizeof(buf), &ksym, NULL);
+	len = XmbLookupString(xw.xic, e, buf, sizeof(buf), &ksym, &status);
 
 	if((customkey = kmap(ksym)))
 		ttywrite(customkey, strlen(customkey));
@@ -1484,6 +1495,8 @@ run(void) {
 		}
 		while(XPending(xw.dis)) {
 			XNextEvent(xw.dis, &ev);
+			if (XFilterEvent(&ev, xw.win))
+				continue;
 			if(handler[ev.type])
 				(handler[ev.type])(&ev);
 		}