#endif
#define USAGE \
- "st " VERSION " (c) 2010-2012 st engineers\n" \
+ "st " VERSION " (c) 2010-2013 st engineers\n" \
"usage: st [-v] [-c class] [-f font] [-g geometry] [-o file]" \
" [-t title] [-w windowid] [-e command ...]\n"
MODE_KBDLOCK = 256,
MODE_HIDE = 512,
MODE_ECHO = 1024,
- MODE_APPCURSOR = 2048
+ MODE_APPCURSOR = 2048,
+ MODE_MOUSESGR = 4096,
};
enum escape_state {
void
mousereport(XEvent *e) {
- int x = x2col(e->xbutton.x);
- int y = y2row(e->xbutton.y);
- int button = e->xbutton.button;
- int state = e->xbutton.state;
- char buf[] = { '\033', '[', 'M', 0, 32+x+1, 32+y+1 };
+ int x = x2col(e->xbutton.x), y = y2row(e->xbutton.y),
+ button = e->xbutton.button, state = e->xbutton.state,
+ len;
+ char buf[40];
static int ob, ox, oy;
/* from urxvt */
return;
button = ob + 32;
ox = x, oy = y;
- } else if(e->xbutton.type == ButtonRelease || button == AnyButton) {
+ } else if(!IS_SET(MODE_MOUSESGR)
+ && (e->xbutton.type == ButtonRelease
+ || button == AnyButton)) {
button = 3;
} else {
button -= Button1;
}
}
- buf[3] = 32 + button + (state & ShiftMask ? 4 : 0)
+ button += (state & ShiftMask ? 4 : 0)
+ (state & Mod4Mask ? 8 : 0)
+ (state & ControlMask ? 16 : 0);
- ttywrite(buf, sizeof(buf));
+ len = 0;
+ if(IS_SET(MODE_MOUSESGR)) {
+ len = snprintf(buf, sizeof(buf), "\033[<%d;%d;%d%c",
+ button, x+1, y+1,
+ e->xbutton.type == ButtonRelease ? 'm' : 'M');
+ } else if(x < 223 && y < 223) {
+ len = snprintf(buf, sizeof(buf), "\033[M%c%c%c",
+ 32+button, 32+x+1, 32+y+1);
+ } else {
+ return;
+ }
+
+ ttywrite(buf, len);
}
void
void
selrequest(XEvent *e) {
+ fprintf(stderr, "selrequest\n");
XSelectionRequestEvent *xsre;
XSelectionEvent xev;
Atom xa_targets, string;
void
xsetsel(char *str) {
+ fprintf(stderr, "xsetsel: %s\n", str);
/* register the selection for both the clipboard and the primary */
Atom clipboard;
case 1002:
MODBIT(term.mode, set, MODE_MOUSEMOTION);
break;
+ case 1006:
+ MODBIT(term.mode, set, MODE_MOUSESGR);
+ break;
case 1049: /* = 1047 and 1048 */
case 47:
case 1047: {
void
xinit(void) {
XSetWindowAttributes attrs;
+ XGCValues gcvalues;
Cursor cursor;
Window parent;
int sw, sh, major, minor;
usedbe = True;
} else {
*/
- dc.gc = XCreateGC(xw.dpy, parent, 0, 0);
+ memset(&gcvalues, 0, sizeof(gcvalues));
+ gcvalues.graphics_exposures = False;
+ dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
+ &gcvalues);
xw.buf = XCreatePixmap(xw.dpy, xw.win, xw.w, xw.h,
DefaultDepth(xw.dpy, xw.scr));
XSetForeground(xw.dpy, dc.gc, 0);
XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, xw.w,
xw.h, 0, 0);
XSetForeground(xw.dpy, dc.gc, 0);
- XSync(xw.dpy, False);
}
}