#define ESC_ARG_SIZ 16
#define DRAW_BUF_SIZ 1024
#define UTF_SIZ 4
+#define XK_NO_MOD UINT_MAX
+#define XK_ANY_MOD 0
#define SERRNO strerror(errno)
#define MIN(a, b) ((a) < (b) ? (a) : (b))
Colormap cmap;
Window win;
Pixmap buf;
+ Atom xembed;
XIM xim;
XIC xic;
int scr;
static char *opt_title = NULL;
static char *opt_embed = NULL;
static char *opt_class = NULL;
-static Atom xembedatom;
int
utf8decode(char *s, long *u) {
&(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff},
&(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000});
- xembedatom = XInternAtom(xw.dpy, "_XEMBED", False);
+ xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
XStoreName(xw.dpy, xw.win, opt_title ? opt_title : "st");
XMapWindow(xw.dpy, xw.win);
char*
kmap(KeySym k, unsigned int state) {
int i;
- for(i = 0; i < LEN(key); i++)
- if(key[i].k == k && (key[i].mask == 0 || key[i].mask & state))
+ state &= ~Mod2Mask;
+ for(i = 0; i < LEN(key); i++) {
+ unsigned int mask = key[i].mask;
+ if(key[i].k == k && ((state & mask) == mask || (mask == XK_NO_MOD && !state)))
return (char*)key[i].s;
+ }
return NULL;
}
void
cmessage(XEvent *e) {
- if (e->xclient.message_type == xembedatom && e->xclient.format == 32) {
+ /* 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);