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 4:
term.c.attr.mode |= ATTR_UNDERLINE;
break;
- case 5:
+ case 5: /* slow blink */
+ case 6: /* rapid blink */
term.c.attr.mode |= ATTR_BLINK;
break;
case 7:
term.c.attr.mode &= ~ATTR_UNDERLINE;
break;
case 25:
+ case 26:
term.c.attr.mode &= ~ATTR_BLINK;
break;
case 27:
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: {
case 'X': /* ECH -- Erase <n> char */
DEFAULT(csiescseq.arg[0], 1);
tclearregion(term.c.x, term.c.y, term.c.x + csiescseq.arg[0],
- term.c.y, 0);
+ term.c.y, 1);
break;
case 'P': /* DCH -- Delete <n> char */
DEFAULT(csiescseq.arg[0], 1);
/* free unneeded rows */
i = 0;
if(slide > 0) {
- /* slide screen to keep cursor where we expect it -
+ /*
+ * slide screen to keep cursor where we expect it -
* tscrollup would work here, but we can optimize to
- * memmove because we're freeing the earlier lines */
+ * memmove because we're freeing the earlier lines
+ */
for(/* i = 0 */; i < slide; i++) {
free(term.line[i]);
free(term.alt[i]);
}
void
-xunloadfonts(void)
-{
+xunloadfonts(void) {
int i, ip;
/*
}
void
-xzoom(const Arg *arg)
-{
+xzoom(const Arg *arg) {
xunloadfonts();
xloadfonts(usedfont, usedfontsize + arg->i);
cresize(0, 0);
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);
}
}
void
cmessage(XEvent *e) {
- /* See xembed specs
- http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html */
+ /*
+ * 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;
}
void
-cresize(int width, int height)
-{
+cresize(int width, int height) {
int col, row;
if(width != 0)