]> git.mdlowis.com Git - projs/tide.git/commitdiff
move drawing functions to a dedicated file so it can be used from other utilities
authorMichael D. Lowis <mike@mdlowis.com>
Sat, 5 Jan 2019 04:24:46 +0000 (23:24 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Sat, 5 Jan 2019 04:24:46 +0000 (23:24 -0500)
Makefile
config.mk
inc/draw.h [new file with mode: 0644]
inc/win.h
src/lib/draw.c [new file with mode: 0644]
src/tide.c

index 324fab15e20eb8606dea4d7af9320615226e91ed..9839e0bcab6d2a4c397fd8d5b50d804279d1e3f2 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,7 @@ LIBEDIT_OBJS = \
        src/lib/utf8.o \
        src/lib/job.o \
        src/lib/view.o \
+       src/lib/draw.o \
        src/lib/x11.o \
        src/lib/x11_gc.o \
        src/lib/x11_sel.o
index cb8c7f5248133e23ee496a2f6fbae900c07ca932..4b9626da2e7b8cd2b6a81e2215f419bf9571bf13 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -7,7 +7,7 @@ MAKEFLAGS += -j
 PREFIX = $(HOME)
 
 # OSX X11 Flags
-INCS += -I/usr/X11/include           \
+INCS += -I/usr/X11/include \
                -I/usr/X11/include/freetype2 \
                -I.
 LIBS += -L/usr/X11/lib
diff --git a/inc/draw.h b/inc/draw.h
new file mode 100644 (file)
index 0000000..adbf1ff
--- /dev/null
@@ -0,0 +1,11 @@
+typedef struct {
+    int x, y;
+    int h, w;
+} drawcsr;
+
+void draw_rect(XConf* x, int color, int posx, int posy, int width, int height);
+void draw_statbox(XConf* x, int status);
+int draw_hrule(XConf* x, drawcsr* csr);
+void draw_view(XConf* x, View* view, XftFont* font, size_t nrows, drawcsr* csr, int bg, int fg, int sel, bool csrsync);
+bool draw_csr(XConf* x, View* view, size_t fheight, int posx, int posy, bool csrdrawn);
+void draw_scroll(XConf* x, drawcsr* csr, View* view, int divider);
index 0aed412f5b04990beb367aa0d62eed2e0d6ecbcb..e37567fd799939fa71cb6f0d9aa406b1637dcfe5 100644 (file)
--- a/inc/win.h
+++ b/inc/win.h
@@ -120,11 +120,6 @@ typedef struct {
     char* arg;
 } KeyBinding;
 
-typedef struct {
-    int x, y;
-    int h, w;
-} drawcsr;
-
 void win_init(KeyBinding* bindings);
 void win_title(char* path);
 void win_font(char* font);
diff --git a/src/lib/draw.c b/src/lib/draw.c
new file mode 100644 (file)
index 0000000..fb1f9cb
--- /dev/null
@@ -0,0 +1,90 @@
+#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);
+}
index c1db3a03be502705a48c59205c25ea169dc6867e..e5e1bf13566446f338fa7eedd4bd3ef77faafc86 100644 (file)
@@ -5,6 +5,7 @@
 #include <edit.h>
 #include <win.h>
 #include <x11.h>
+#include <draw.h>
 #include <ctype.h>
 #include <unistd.h>
 #include <locale.h>
@@ -182,91 +183,6 @@ size_t glyph_width(View* view, int c) {
         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;
@@ -346,12 +262,13 @@ static void xupdate(Job* job) {
             /* 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);
 }