aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurélien Aptel <aurelien.aptel@gmail.com>2011-10-20 23:20:59 +0200
committerAurélien Aptel <aurelien.aptel@gmail.com>2011-10-20 23:20:59 +0200
commit44c83397afcd941f0e7820831aaee36088149530 (patch)
treecc38fb000fc9c5b3fcbb3f74d8a11eaf98fbe91e
parent7c350025b23ef88d42d49ba52be8a5ea44a9928a (diff)
downloadst-patched-44c83397afcd941f0e7820831aaee36088149530.tar.bz2
st-patched-44c83397afcd941f0e7820831aaee36088149530.tar.xz
st-patched-44c83397afcd941f0e7820831aaee36088149530.zip
add dirty flag for lines
-rw-r--r--st.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/st.c b/st.c
index 72e57c8..ad6db0d 100644
--- a/st.c
+++ b/st.c
@@ -111,6 +111,7 @@ typedef struct {
111 int col; /* nb col */ 111 int col; /* nb col */
112 Line* line; /* screen */ 112 Line* line; /* screen */
113 Line* alt; /* alternate screen */ 113 Line* alt; /* alternate screen */
114 char* dirty; /* dirtyness of lines */
114 TCursor c; /* cursor */ 115 TCursor c; /* cursor */
115 int top; /* top scroll limit */ 116 int top; /* top scroll limit */
116 int bot; /* bottom scroll limit */ 117 int bot; /* bottom scroll limit */
@@ -203,6 +204,7 @@ static void tsetattr(int*, int);
203static void tsetchar(char*); 204static void tsetchar(char*);
204static void tsetscroll(int, int); 205static void tsetscroll(int, int);
205static void tswapscreen(void); 206static void tswapscreen(void);
207static void tfulldirt(void);
206 208
207static void ttynew(void); 209static void ttynew(void);
208static void ttyread(void); 210static void ttyread(void);
@@ -749,6 +751,14 @@ ttyresize(int x, int y) {
749} 751}
750 752
751void 753void
754tfulldirt(void)
755{
756 int i;
757 for(i = 0; i < term.row; i++)
758 term.dirty[i] = 1;
759}
760
761void
752tcursor(int mode) { 762tcursor(int mode) {
753 static TCursor c; 763 static TCursor c;
754 764
@@ -777,9 +787,12 @@ tnew(int col, int row) {
777 term.row = row, term.col = col; 787 term.row = row, term.col = col;
778 term.line = malloc(term.row * sizeof(Line)); 788 term.line = malloc(term.row * sizeof(Line));
779 term.alt = malloc(term.row * sizeof(Line)); 789 term.alt = malloc(term.row * sizeof(Line));
790 term.dirty = malloc(term.row * sizeof(*term.dirty));
791
780 for(row = 0; row < term.row; row++) { 792 for(row = 0; row < term.row; row++) {
781 term.line[row] = malloc(term.col * sizeof(Glyph)); 793 term.line[row] = malloc(term.col * sizeof(Glyph));
782 term.alt [row] = malloc(term.col * sizeof(Glyph)); 794 term.alt [row] = malloc(term.col * sizeof(Glyph));
795 term.dirty[row] = 0;
783 } 796 }
784 /* setup screen */ 797 /* setup screen */
785 treset(); 798 treset();
@@ -791,6 +804,7 @@ tswapscreen(void) {
791 term.line = term.alt; 804 term.line = term.alt;
792 term.alt = tmp; 805 term.alt = tmp;
793 term.mode ^= MODE_ALTSCREEN; 806 term.mode ^= MODE_ALTSCREEN;
807 tfulldirt();
794} 808}
795 809
796void 810void
@@ -806,6 +820,9 @@ tscrolldown(int orig, int n) {
806 temp = term.line[i]; 820 temp = term.line[i];
807 term.line[i] = term.line[i-n]; 821 term.line[i] = term.line[i-n];
808 term.line[i-n] = temp; 822 term.line[i-n] = temp;
823
824 term.dirty[i] = 1;
825 term.dirty[i-n] = 1;
809 } 826 }
810 827
811 selscroll(orig, n); 828 selscroll(orig, n);
@@ -823,6 +840,9 @@ tscrollup(int orig, int n) {
823 temp = term.line[i]; 840 temp = term.line[i];
824 term.line[i] = term.line[i+n]; 841 term.line[i] = term.line[i+n];
825 term.line[i+n] = temp; 842 term.line[i+n] = temp;
843
844 term.dirty[i] = 1;
845 term.dirty[i+n] = 1;
826 } 846 }
827 847
828 selscroll(orig, -n); 848 selscroll(orig, -n);
@@ -896,6 +916,7 @@ tmoveto(int x, int y) {
896 916
897void 917void
898tsetchar(char *c) { 918tsetchar(char *c) {
919 term.dirty[term.c.y] = 1;
899 term.line[term.c.y][term.c.x] = term.c.attr; 920 term.line[term.c.y][term.c.x] = term.c.attr;
900 memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ); 921 memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ);
901 term.line[term.c.y][term.c.x].state |= GLYPH_SET; 922 term.line[term.c.y][term.c.x].state |= GLYPH_SET;
@@ -915,9 +936,11 @@ tclearregion(int x1, int y1, int x2, int y2) {
915 LIMIT(y1, 0, term.row-1); 936 LIMIT(y1, 0, term.row-1);
916 LIMIT(y2, 0, term.row-1); 937 LIMIT(y2, 0, term.row-1);
917 938
918 for(y = y1; y <= y2; y++) 939 for(y = y1; y <= y2; y++) {
940 term.dirty[y] = 1;
919 for(x = x1; x <= x2; x++) 941 for(x = x1; x <= x2; x++)
920 term.line[y][x].state = 0; 942 term.line[y][x].state = 0;
943 }
921} 944}
922 945
923void 946void
@@ -925,6 +948,8 @@ tdeletechar(int n) {
925 int src = term.c.x + n; 948 int src = term.c.x + n;
926 int dst = term.c.x; 949 int dst = term.c.x;
927 int size = term.col - src; 950 int size = term.col - src;
951
952 term.dirty[term.c.y] = 1;
928 953
929 if(src >= term.col) { 954 if(src >= term.col) {
930 tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); 955 tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
@@ -940,6 +965,8 @@ tinsertblank(int n) {
940 int dst = src + n; 965 int dst = src + n;
941 int size = term.col - dst; 966 int size = term.col - dst;
942 967
968 term.dirty[term.c.y] = 1;
969
943 if(dst >= term.col) { 970 if(dst >= term.col) {
944 tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); 971 tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
945 return; 972 return;
@@ -1411,7 +1438,8 @@ tputc(char *c) {
1411 } 1438 }
1412 } 1439 }
1413 } else { 1440 } else {
1414 if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey)) sel.bx = -1; 1441 if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
1442 sel.bx = -1;
1415 switch(ascii) { 1443 switch(ascii) {
1416 case '\t': 1444 case '\t':
1417 tputtab(); 1445 tputtab();
@@ -1479,9 +1507,11 @@ tresize(int col, int row) {
1479 /* resize to new height */ 1507 /* resize to new height */
1480 term.line = realloc(term.line, row * sizeof(Line)); 1508 term.line = realloc(term.line, row * sizeof(Line));
1481 term.alt = realloc(term.alt, row * sizeof(Line)); 1509 term.alt = realloc(term.alt, row * sizeof(Line));
1510 term.dirty = realloc(term.dirty, row * sizeof(*term.dirty));
1482 1511
1483 /* resize each row to new width, zero-pad if needed */ 1512 /* resize each row to new width, zero-pad if needed */
1484 for(i = 0; i < minrow; i++) { 1513 for(i = 0; i < minrow; i++) {
1514 term.dirty[i] = 1;
1485 term.line[i] = realloc(term.line[i], col * sizeof(Glyph)); 1515 term.line[i] = realloc(term.line[i], col * sizeof(Glyph));
1486 term.alt[i] = realloc(term.alt[i], col * sizeof(Glyph)); 1516 term.alt[i] = realloc(term.alt[i], col * sizeof(Glyph));
1487 for(x = mincol; x < col; x++) { 1517 for(x = mincol; x < col; x++) {
@@ -1492,6 +1522,7 @@ tresize(int col, int row) {
1492 1522
1493 /* allocate any new rows */ 1523 /* allocate any new rows */
1494 for(/* i == minrow */; i < row; i++) { 1524 for(/* i == minrow */; i < row; i++) {
1525 term.dirty[i] = 1;
1495 term.line[i] = calloc(col, sizeof(Glyph)); 1526 term.line[i] = calloc(col, sizeof(Glyph));
1496 term.alt [i] = calloc(col, sizeof(Glyph)); 1527 term.alt [i] = calloc(col, sizeof(Glyph));
1497 } 1528 }
@@ -1502,6 +1533,7 @@ tresize(int col, int row) {
1502 tmoveto(term.c.x, term.c.y); 1533 tmoveto(term.c.x, term.c.y);
1503 /* reset scrolling region */ 1534 /* reset scrolling region */
1504 tsetscroll(0, row-1); 1535 tsetscroll(0, row-1);
1536
1505 return (slide > 0); 1537 return (slide > 0);
1506} 1538}
1507 1539
@@ -1792,8 +1824,11 @@ drawregion(int x1, int y1, int x2, int y2) {
1792 if(!(xw.state & WIN_VISIBLE)) 1824 if(!(xw.state & WIN_VISIBLE))
1793 return; 1825 return;
1794 1826
1795 xclear(x1, y1, x2-1, y2-1);
1796 for(y = y1; y < y2; y++) { 1827 for(y = y1; y < y2; y++) {
1828 if(!term.dirty[y])
1829 continue;
1830 xclear(0, y, term.col, y);
1831 term.dirty[y] = 0;
1797 base = term.line[y][0]; 1832 base = term.line[y][0];
1798 ic = ib = ox = 0; 1833 ic = ib = ox = 0;
1799 for(x = x1; x < x2; x++) { 1834 for(x = x1; x < x2; x++) {
@@ -1801,7 +1836,7 @@ drawregion(int x1, int y1, int x2, int y2) {
1801 if(sel.bx != -1 && *(new.c) && selected(x, y)) 1836 if(sel.bx != -1 && *(new.c) && selected(x, y))
1802 new.mode ^= ATTR_REVERSE; 1837 new.mode ^= ATTR_REVERSE;
1803 if(ib > 0 && (!(new.state & GLYPH_SET) || ATTRCMP(base, new) || 1838 if(ib > 0 && (!(new.state & GLYPH_SET) || ATTRCMP(base, new) ||
1804 ib >= DRAW_BUF_SIZ-UTF_SIZ)) { 1839 ib >= DRAW_BUF_SIZ-UTF_SIZ)) {
1805 xdraws(buf, base, ox, y, ic, ib); 1840 xdraws(buf, base, ox, y, ic, ib);
1806 ic = ib = 0; 1841 ic = ib = 0;
1807 } 1842 }