diff options
| -rw-r--r-- | TODO | 1 | ||||
| -rw-r--r-- | st.c | 32 | 
2 files changed, 28 insertions, 5 deletions
| @@ -11,6 +11,7 @@ code & interface  * clean selection code  * clean and complete terminfo entry  * fix shift up/down (shift selection in emacs) +* fast drawing  * ...  misc @@ -37,6 +37,10 @@  	"st-" VERSION ", (c) 2010-2011 st engineers\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 */  #define ESC_TITLE_SIZ 256  #define ESC_BUF_SIZ   256 @@ -122,6 +126,7 @@ typedef struct {  	Colormap cmap;  	Window win;  	Pixmap buf; +	Atom xembed;  	XIM xim;  	XIC xic;  	int scr; @@ -219,6 +224,7 @@ static void visibility(XEvent *);  static void unmap(XEvent *);  static char* kmap(KeySym, unsigned int state);  static void kpress(XEvent *); +static void cmessage(XEvent *);  static void resize(XEvent *);  static void focus(XEvent *);  static void brelease(XEvent *); @@ -239,12 +245,11 @@ static int isfullutf8(char *, int);  static void (*handler[LASTEvent])(XEvent *) = {  	[KeyPress] = kpress, +	[ClientMessage] = cmessage,  	[ConfigureNotify] = resize,  	[VisibilityNotify] = visibility,  	[UnmapNotify] = unmap,  	[Expose] = expose, -	[EnterNotify] = focus, -	[LeaveNotify] = focus,  	[FocusIn] = focus,  	[FocusOut] = focus,  	[MotionNotify] = bmotion, @@ -1629,8 +1634,8 @@ xinit(void) {  	xloadcols();  	/* window - default size */ -	xw.bufh = 24 * xw.ch; -	xw.bufw = 80 * xw.cw; +	xw.bufh = term.row * xw.ch; +	xw.bufw = term.col * xw.cw;  	xw.h = xw.bufh + 2*BORDER;  	xw.w = xw.bufw + 2*BORDER; @@ -1668,6 +1673,8 @@ xinit(void) {  		&(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff},  		&(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000}); +	xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); +  	XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st");  	XMapWindow(xw.dpy, xw.win);  	xhints(); @@ -1824,7 +1831,7 @@ xseturgency(int add) {  void  focus(XEvent *ev) { -	if(ev->type == FocusIn || ev->type == EnterNotify) { +	if(ev->type == FocusIn) {  		xw.state |= WIN_FOCUSED;  		xseturgency(0);  	} else @@ -1895,6 +1902,21 @@ kpress(XEvent *ev) {  }  void +cmessage(XEvent *e) { +	/* See xembed specs +	   http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html */ +	if (e->xclient.message_type == xw.xembed && 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  resize(XEvent *e) {  	int col, row; |