void screen_reflow(Buf* buf);
void screen_update(Buf* buf, unsigned crsr, unsigned* csrx, unsigned* csry);
+unsigned screen_getoff(Buf* buf, unsigned pos, unsigned row, unsigned col);
void screen_setsize(Buf* buf, unsigned nrows, unsigned ncols);
void screen_getsize(unsigned* nrows, unsigned* ncols);
void screen_clear(void);
screen_reflow(buf);
}
+unsigned screen_getoff(Buf* buf, unsigned pos, unsigned row, unsigned col) {
+ Row* scrrow = screen_getrow(row);
+ if (!scrrow) return pos;
+ pos = scrrow->off;
+ if (col > scrrow->len) {
+ pos = (scrrow->off + scrrow->rlen - 1);
+ } else {
+ for (unsigned x = 0; x < col;) {
+ Rune r = buf_get(buf,pos++);
+ if (r == '\n')
+ break;
+ else if (r == '\t')
+ x += (TabWidth - (x % TabWidth));
+ else
+ x += 1;
+ }
+ }
+ if (pos >= buf_end(buf)-1)
+ return buf_end(buf)-2;
+ return pos;
+}
+
void screen_getsize(unsigned* nrows, unsigned* ncols) {
*nrows = NumRows, *ncols = NumCols;
}
if (len > 0) {
Rune r;
size_t len = 0;
- if (buf[0] == '\r')
- buf[0] = '\n';
+ if (buf[0] == '\r') buf[0] = '\n';
for(int i = 0; i < 8 && !utf8decode(&r, &len, buf[i]); i++);
if (Buffer.insert_mode)
buf_ins(&Buffer, CursorPos++, r);
static void handle_mousebtn(XEvent* e) {
switch (e->xbutton.button) {
case Button1: /* Left Button */
+ CursorPos = screen_getoff(&Buffer, CursorPos,
+ e->xbutton.y / (X.font->ascent + X.font->descent),
+ e->xbutton.x / X.font->max_advance_width);
break;
case Button2: /* Middle Button */
break;