tweak focus to support XEMBED client message and remove focus on EnterNotify. (thx Adrian)
This commit is contained in:
		
							parent
							
								
									d5f3d120ea
								
							
						
					
					
						commit
						8d2d8848e8
					
				
							
								
								
									
										26
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								st.c
									
									
									
									
									
								
							| @ -37,6 +37,10 @@ | |||||||
| 	"st-" VERSION ", (c) 2010-2011 st engineers\n" \ | 	"st-" VERSION ", (c) 2010-2011 st engineers\n" \ | ||||||
| 	"usage: st [-t title] [-c class] [-w windowid] [-v] [-e command...]\n" | 	"usage: st [-t title] [-c class] [-w windowid] [-v] [-e command...]\n" | ||||||
| 
 | 
 | ||||||
|  | /* XEMBED messages */ | ||||||
|  | #define XEMBED_FOCUS_IN  4 | ||||||
|  | #define XEMBED_FOCUS_OUT 5 | ||||||
|  | 
 | ||||||
| /* Arbitrary sizes */ | /* Arbitrary sizes */ | ||||||
| #define ESC_TITLE_SIZ 256 | #define ESC_TITLE_SIZ 256 | ||||||
| #define ESC_BUF_SIZ   256 | #define ESC_BUF_SIZ   256 | ||||||
| @ -217,6 +221,7 @@ static void visibility(XEvent *); | |||||||
| static void unmap(XEvent *); | static void unmap(XEvent *); | ||||||
| static char* kmap(KeySym, unsigned int state); | static char* kmap(KeySym, unsigned int state); | ||||||
| static void kpress(XEvent *); | static void kpress(XEvent *); | ||||||
|  | static void cmessage(XEvent *); | ||||||
| static void resize(XEvent *); | static void resize(XEvent *); | ||||||
| static void focus(XEvent *); | static void focus(XEvent *); | ||||||
| static void brelease(XEvent *); | static void brelease(XEvent *); | ||||||
| @ -237,12 +242,11 @@ static int isfullutf8(char *, int); | |||||||
| 
 | 
 | ||||||
| static void (*handler[LASTEvent])(XEvent *) = { | static void (*handler[LASTEvent])(XEvent *) = { | ||||||
| 	[KeyPress] = kpress, | 	[KeyPress] = kpress, | ||||||
|  | 	[ClientMessage] = cmessage, | ||||||
| 	[ConfigureNotify] = resize, | 	[ConfigureNotify] = resize, | ||||||
| 	[VisibilityNotify] = visibility, | 	[VisibilityNotify] = visibility, | ||||||
| 	[UnmapNotify] = unmap, | 	[UnmapNotify] = unmap, | ||||||
| 	[Expose] = expose, | 	[Expose] = expose, | ||||||
| 	[EnterNotify] = focus, |  | ||||||
| 	[LeaveNotify] = focus, |  | ||||||
| 	[FocusIn] = focus, | 	[FocusIn] = focus, | ||||||
| 	[FocusOut] = focus, | 	[FocusOut] = focus, | ||||||
| 	[MotionNotify] = bmotion, | 	[MotionNotify] = bmotion, | ||||||
| @ -264,6 +268,7 @@ static char **opt_cmd  = NULL; | |||||||
| static char *opt_title = NULL; | static char *opt_title = NULL; | ||||||
| static char *opt_embed = NULL; | static char *opt_embed = NULL; | ||||||
| static char *opt_class = NULL; | static char *opt_class = NULL; | ||||||
|  | static Atom xembedatom; | ||||||
| 
 | 
 | ||||||
| int | int | ||||||
| utf8decode(char *s, long *u) { | utf8decode(char *s, long *u) { | ||||||
| @ -1666,6 +1671,8 @@ xinit(void) { | |||||||
| 		&(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff}, | 		&(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff}, | ||||||
| 		&(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000}); | 		&(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000}); | ||||||
| 
 | 
 | ||||||
|  | 	xembedatom = XInternAtom(xw.dpy, "_XEMBED", False); | ||||||
|  | 
 | ||||||
| 	XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st"); | 	XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st"); | ||||||
| 	XMapWindow(xw.dpy, xw.win); | 	XMapWindow(xw.dpy, xw.win); | ||||||
| 	xhints(); | 	xhints(); | ||||||
| @ -1822,7 +1829,7 @@ xseturgency(int add) { | |||||||
| 
 | 
 | ||||||
| void | void | ||||||
| focus(XEvent *ev) { | focus(XEvent *ev) { | ||||||
| 	if(ev->type == FocusIn || ev->type == EnterNotify) { | 	if(ev->type == FocusIn) { | ||||||
| 		xw.state |= WIN_FOCUSED; | 		xw.state |= WIN_FOCUSED; | ||||||
| 		xseturgency(0); | 		xseturgency(0); | ||||||
| 	} else | 	} else | ||||||
| @ -1889,6 +1896,19 @@ kpress(XEvent *ev) { | |||||||
| 		} | 		} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | cmessage(XEvent *e) { | ||||||
|  | 	if (e->xclient.message_type == xembedatom && e->xclient.format == 32) { | ||||||
|  | 		if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) { | ||||||
|  | 			xw.state |= WIN_FOCUSED; | ||||||
|  | 			xseturgency(0); | ||||||
|  | 		} else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { | ||||||
|  | 			xw.state &= ~WIN_FOCUSED; | ||||||
|  | 		} | ||||||
|  | 		draw(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| resize(XEvent *e) { | resize(XEvent *e) { | ||||||
| 	int col, row; | 	int col, row; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user