--- /dev/null
+#include <stdc.h>
+#include <utf.h>
+#include <x11.h>
+#include <edit.h>
+#include <draw.h>
+#include "config.h"
+
+void draw_rect(XConf* x, int color, int posx, int posy, int width, int height) {
+ x11_draw_rect(x, Palette[color], posx, posy, width, height);
+}
+
+void draw_statbox(XConf* x, int status) {
+ draw_rect(x, VerBdr, ScrollWidth, 0, 1, x->height/4);
+ switch (status) {
+ case NORMAL: draw_rect(x, TagsBg, 0, 0, ScrollWidth, x->height/4); break;
+ case MODIFIED: draw_rect(x, Purple, 0, 0, ScrollWidth, x->height/4); break;
+ case OUTDATED: draw_rect(x, Orange, 0, 0, ScrollWidth, x->height/4); break;
+ case ERRORED: draw_rect(x, Red, 0, 0, ScrollWidth, x->height/4); break;
+ }
+}
+
+int draw_hrule(XConf* x, drawcsr* csr) {
+ draw_rect(x, HorBdr, 0, csr->y + 1, x->width, 1);
+ csr->y += 2;
+ return (csr->y - 2);
+}
+
+void draw_view(XConf* x, View* view, XftFont* font, size_t nrows, drawcsr* csr, int bg, int fg, int sel, bool csrsync) {
+ int nspecs = 0;
+ XftGlyphSpec* specs = NULL;
+ size_t fheight = font->height;
+ bool csr_drawn = false;
+ /* draw the view to the window */
+ view_resize(view, (csr->w - csr->x), nrows);
+ view_update(view);
+ draw_rect(x, bg, csr->x, csr->y, csr->w, ((nrows + 1) * fheight) + 9);
+ for (size_t i = 0; i < nrows; i++) {
+ Row* row = view_getrow(view, i + view->index);
+ size_t posx = (csr->x + 2), y = (csr->y + 2 + (i * fheight));
+ for (size_t i = 0; i < row->len; i++) {
+ int rune = row->cols[i].rune;
+ if (rune == '\r' || rune == '\n' || rune == '\t')
+ rune = ' ';
+ if (buf_insel(&(view->buffer), row->cols[i].off))
+ draw_rect(x, sel, posx, y, row->cols[i].width, fheight);
+ if (row->cols[i].off == view->buffer.selection.end) {
+ csr_drawn = draw_csr(x, view, fheight, posx, y, csr_drawn);
+ if (csrsync) {
+ XWarpPointer(x->display, x->self, x->self, 0, 0, x->width, x->height, posx-4, y + fheight/2);
+ csrsync = false;
+ }
+ }
+ specs = realloc(specs, sizeof(XftGlyphSpec) * ++nspecs);
+ specs[nspecs-1].glyph = XftCharIndex(x->display, font, rune);
+ specs[nspecs-1].x = posx;
+ specs[nspecs-1].y = y + font->ascent;
+ posx += row->cols[i].width;
+ }
+ }
+ x11_draw_glyphs(x, Palette[fg], font, specs, nspecs);
+ csr->y += (nrows * fheight) + 3;
+ free(specs);
+}
+
+bool draw_csr(XConf* x, View* view, size_t fheight, int posx, int posy, bool csrdrawn) {
+ if (!csrdrawn && !view_selsize(view)) {
+ draw_rect(x, EditCsr, posx-1, posy, 3, 3);
+ draw_rect(x, EditCsr, posx, posy, 1, fheight);
+ draw_rect(x, EditCsr, posx-1, posy+fheight-3, 3, 3);
+ csrdrawn = true;
+ }
+ return csrdrawn;
+}
+
+void draw_scroll(XConf* x, drawcsr* csr, View* view, int divider) {
+ size_t bend = buf_end(&(view->buffer));
+ if (bend == 0) bend = 1;
+ if (!view->rows || !view->nrows) return;
+ size_t vbeg = view->rows[0]->off;
+ size_t vend = view->rows[view->nrows-1]->off + view->rows[view->nrows-1]->len;
+ double scroll_vis = (double)(vend - vbeg) / (double)bend;
+ double scroll_off = ((double)vbeg / (double)bend);
+ size_t thumbreg = (csr->h - divider) + 4;
+ size_t thumboff = (size_t)((thumbreg * scroll_off) + divider);
+ size_t thumbsz = (size_t)(thumbreg * scroll_vis);
+ if (thumbsz < 5) thumbsz = 5;
+ draw_rect(x, VerBdr, ScrollWidth, divider + 2, 1, thumbreg);
+ draw_rect(x, ScrollBg, 0, divider + 2, ScrollWidth, thumbreg);
+ draw_rect(x, ScrollFg, 0, thumboff + 2, ScrollWidth, thumbsz);
+}
#include <edit.h>
#include <win.h>
#include <x11.h>
+#include <draw.h>
#include <ctype.h>
#include <unistd.h>
#include <locale.h>
return extents.xOff;
}
-static void draw_rect(int color, int x, int y, int width, int height) {
- x11_draw_rect(&X, Palette[color], x, y, width, height);
-}
-
-static void draw_statbox(void) {
- draw_rect(VerBdr, ScrollWidth, 0, 1, X.height/4);
- switch (win_view(EDIT)->buffer.status) {
- case NORMAL: draw_rect(TagsBg, 0, 0, ScrollWidth, X.height/4); break;
- case MODIFIED: draw_rect(Purple, 0, 0, ScrollWidth, X.height/4); break;
- case OUTDATED: draw_rect(Orange, 0, 0, ScrollWidth, X.height/4); break;
- case ERRORED: draw_rect(Red, 0, 0, ScrollWidth, X.height/4); break;
- }
-}
-
-static bool draw_csr(View* view, size_t fheight, int x, int y, bool csrdrawn) {
- if (!csrdrawn && !view_selsize(view)) {
- int csrclr = (view == &Regions[TAGS] ? TagsCsr : EditCsr);
- draw_rect(csrclr, x-1, y, 3, 3);
- draw_rect(csrclr, x, y, 1, fheight);
- draw_rect(csrclr, x-1, y+fheight-3, 3, 3);
- csrdrawn = true;
- }
- if (SyncMouse && view == &Regions[EDIT]) {
- XWarpPointer(X.display, X.self, X.self, 0, 0, X.width, X.height, x-4, y + fheight/2);
- SyncMouse = false;
- }
- return csrdrawn;
-}
-
-static void draw_view(View* view, XftFont* font, size_t nrows, drawcsr* csr, int bg, int fg, int sel) {
- int nspecs = 0;
- XftGlyphSpec* specs = NULL;
- size_t fheight = font->height;
- bool csr_drawn = false;
- /* draw the view to the window */
- view_resize(view, (csr->w - csr->x), nrows);
- view_update(view);
- draw_rect(bg, csr->x, csr->y, csr->w, ((nrows + 1) * fheight) + 9);
- for (size_t i = 0; i < nrows; i++) {
- Row* row = view_getrow(view, i + view->index);
- size_t x = (csr->x + 2), y = (csr->y + 2 + (i * fheight));
- for (size_t i = 0; i < row->len; i++) {
- int rune = row->cols[i].rune;
- if (rune == '\r' || rune == '\n' || rune == '\t')
- rune = ' ';
- if (buf_insel(&(view->buffer), row->cols[i].off))
- draw_rect(sel, x, y, row->cols[i].width, fheight);
- if (row->cols[i].off == view->buffer.selection.end)
- csr_drawn = draw_csr(view, fheight, x, y, csr_drawn);
- specs = realloc(specs, sizeof(XftGlyphSpec) * ++nspecs);
- specs[nspecs-1].glyph = XftCharIndex(X.display, font, rune);
- specs[nspecs-1].x = x;
- specs[nspecs-1].y = y + font->ascent;
- x += row->cols[i].width;
- }
- }
- x11_draw_glyphs(&X, Palette[fg], font, specs, nspecs);
- csr->y += (nrows * fheight) + 3;
- free(specs);
-}
-
-static void draw_hrule(drawcsr* csr) {
- draw_rect(HorBdr, 0, csr->y + 1, X.width, 1);
- Divider = csr->y;
- csr->y += 2;
-}
-
-static void draw_scroll(drawcsr* csr) {
- View* view = win_view(EDIT);
- size_t bend = buf_end(win_buf(EDIT));
- if (bend == 0) bend = 1;
- if (!view->rows || !view->nrows) return;
- size_t vbeg = view->rows[0]->off;
- size_t vend = view->rows[view->nrows-1]->off + view->rows[view->nrows-1]->len;
- double scroll_vis = (double)(vend - vbeg) / (double)bend;
- double scroll_off = ((double)vbeg / (double)bend);
- size_t thumbreg = (csr->h - Divider) + 4;
- size_t thumboff = (size_t)((thumbreg * scroll_off) + Divider);
- size_t thumbsz = (size_t)(thumbreg * scroll_vis);
- if (thumbsz < 5) thumbsz = 5;
- draw_rect(VerBdr, ScrollWidth, Divider + 2, 1, thumbreg);
- draw_rect(ScrollBg, 0, Divider + 2, ScrollWidth, thumbreg);
- draw_rect(ScrollFg, 0, thumboff + 2, ScrollWidth, thumbsz);
-}
-
static void xkeypress(XConf* x, XEvent* e) {
(void)x;
Now = e->xkey.time;
/* draw the regions to the window */
drawcsr csr = { .w = X.width, .h = X.height };
csr.x += ScrollWidth + 1;
- draw_statbox();
- draw_view(&Regions[TAGS], X.tagfont, tagrows, &csr, TagsBg, TagsFg, TagsSel);
- draw_hrule(&csr);
- draw_view(&Regions[EDIT], X.font, editrows, &csr, EditBg, EditFg, EditSel);
- draw_scroll(&csr);
+ draw_statbox(&X, win_view(EDIT)->buffer.status);
+ draw_view(&X, &Regions[TAGS], X.tagfont, tagrows, &csr, TagsBg, TagsFg, TagsSel, false);
+ Divider = draw_hrule(&X, &csr);
+ draw_view(&X, &Regions[EDIT], X.font, editrows, &csr, EditBg, EditFg, EditSel, SyncMouse);
+ draw_scroll(&X, &csr, win_view(EDIT), Divider);
XCopyArea(X.display, X.pixmap, X.self, X.gc, 0, 0, X.width, X.height, 0, 0);
+ SyncMouse = false;
}
} while ((nqueued = XEventsQueued(X.display, QueuedAfterFlush)) > 0);
}