180 lines
5.2 KiB
C
180 lines
5.2 KiB
C
/****************************************************************************
|
|
* Copyright 2018,2020 Thomas E. Dickey *
|
|
* *
|
|
* Permission is hereby granted, free of charge, to any person obtaining a *
|
|
* copy of this software and associated documentation files (the *
|
|
* "Software"), to deal in the Software without restriction, including *
|
|
* without limitation the rights to use, copy, modify, merge, publish, *
|
|
* distribute, distribute with modifications, sublicense, and/or sell *
|
|
* copies of the Software, and to permit persons to whom the Software is *
|
|
* furnished to do so, subject to the following conditions: *
|
|
* *
|
|
* The above copyright notice and this permission notice shall be included *
|
|
* in all copies or substantial portions of the Software. *
|
|
* *
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
|
|
* IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
|
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
|
|
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
|
|
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
|
|
* *
|
|
* Except as contained in this notice, the name(s) of the above copyright *
|
|
* holders shall not be used in advertising or otherwise to promote the *
|
|
* sale, use or other dealings in this Software without prior written *
|
|
* authorization. *
|
|
****************************************************************************/
|
|
/*
|
|
* $Id: dump_window.c,v 1.4 2020/02/02 23:34:34 tom Exp $
|
|
*/
|
|
#include <dump_window.h>
|
|
|
|
static FILE *dumpfp;
|
|
|
|
int
|
|
open_dump(const char *fn)
|
|
{
|
|
int result = 0;
|
|
close_dump();
|
|
if ((dumpfp = fopen(fn, "a")) != 0)
|
|
result = 1;
|
|
return result;
|
|
}
|
|
|
|
void
|
|
close_dump(void)
|
|
{
|
|
if (dumpfp != 0) {
|
|
fclose(dumpfp);
|
|
dumpfp = 0;
|
|
}
|
|
}
|
|
|
|
void
|
|
dump_window(WINDOW *w)
|
|
{
|
|
wgetch(w);
|
|
if (dumpfp != 0) {
|
|
int y, x;
|
|
int oldy, oldx;
|
|
int maxy, maxx;
|
|
int pass;
|
|
char *cvec = 0;
|
|
char *avec = 0;
|
|
char *pvec = 0;
|
|
int ccnt = 0;
|
|
int acnt = 0;
|
|
int pcnt = 0;
|
|
int endy = -1;
|
|
int endx = -1;
|
|
|
|
fprintf(dumpfp, "Window %p\n", (void *) w);
|
|
|
|
getyx(w, oldy, oldx);
|
|
getmaxyx(w, maxy, maxx);
|
|
fprintf(dumpfp, "size (%dx%d)\n", maxy, maxx);
|
|
getbegyx(w, y, x);
|
|
fprintf(dumpfp, "begin (%dx%d)\n", maxy, maxx);
|
|
getyx(w, y, x);
|
|
fprintf(dumpfp, "position (%d,%d)\n", y, x);
|
|
|
|
if (maxy > 0 && maxx > 0) {
|
|
for (pass = 0; pass < 2; ++pass) {
|
|
for (y = 0; y < maxy; ++y) {
|
|
|
|
if (cvec)
|
|
memset(cvec, 0, (size_t) maxx + 1);
|
|
if (avec)
|
|
memset(avec, 0, (size_t) maxx + 1);
|
|
if (pvec)
|
|
memset(pvec, 0, (size_t) maxx + 1);
|
|
|
|
for (x = 0; x < maxx; ++x) {
|
|
chtype data = mvwinch(w, y, x);
|
|
chtype temp;
|
|
char cc = (char) ((data & 0xff) ? (data & 0xff) : ' ');
|
|
char aa;
|
|
char pp;
|
|
|
|
temp = ((data & A_ATTRIBUTES) & (~A_COLOR));
|
|
if (temp) {
|
|
if (temp & A_ALTCHARSET) {
|
|
aa = (temp & A_BOLD) ? 'A' : 'a';
|
|
} else if (temp & A_STANDOUT) {
|
|
aa = (temp & A_BOLD) ? 'S' : 's';
|
|
} else if (temp & A_REVERSE) {
|
|
aa = (temp & A_BOLD) ? 'R' : 'r';
|
|
} else if (temp & A_UNDERLINE) {
|
|
aa = (temp & A_BOLD) ? 'U' : 'u';
|
|
} else {
|
|
aa = (temp & A_BOLD) ? 'b' : '?';
|
|
}
|
|
} else {
|
|
aa = ' ';
|
|
}
|
|
if (data & A_COLOR) {
|
|
if (PAIR_NUMBER((int) data) < 8) {
|
|
pp = (char) ('0' + PAIR_NUMBER((int) data));
|
|
} else {
|
|
pp = '*';
|
|
}
|
|
} else {
|
|
pp = ' ';
|
|
}
|
|
|
|
if (pass) {
|
|
if (cvec)
|
|
cvec[x] = cc;
|
|
if (avec)
|
|
avec[x] = aa;
|
|
if (pvec)
|
|
pvec[x] = pp;
|
|
} else {
|
|
if (cc != ' ' || aa != ' ' || pp != ' ') {
|
|
if (endx < x)
|
|
endx = x;
|
|
if (endy < y)
|
|
endy = y;
|
|
}
|
|
ccnt += (cc != ' ');
|
|
acnt += (aa != ' ');
|
|
pcnt += (pp != ' ');
|
|
}
|
|
}
|
|
if (pass) {
|
|
fprintf(dumpfp, "%3d", y + 1);
|
|
if (cvec)
|
|
fprintf(dumpfp, "\tc|%.*s|\n", maxx, cvec);
|
|
if (avec)
|
|
fprintf(dumpfp, "\ta|%.*s|\n", maxx, avec);
|
|
if (pvec)
|
|
fprintf(dumpfp, "\tp|%.*s|\n", maxx, pvec);
|
|
}
|
|
}
|
|
if (pass) {
|
|
free(cvec);
|
|
free(avec);
|
|
free(pvec);
|
|
} else {
|
|
fprintf(dumpfp, "%d cells with characters\n", ccnt);
|
|
fprintf(dumpfp, "%d cells with video-attributes\n", acnt);
|
|
fprintf(dumpfp, "%d cells with color-attributes\n", pcnt);
|
|
if (endy < 0 || endx < 0)
|
|
break;
|
|
/* reduce the dump a little, ignore really blank cells */
|
|
maxx = endx + 1;
|
|
maxy = endy + 1;
|
|
if (ccnt)
|
|
cvec = malloc((size_t) maxx + 1);
|
|
if (acnt)
|
|
avec = malloc((size_t) maxx + 1);
|
|
if (pcnt)
|
|
pvec = malloc((size_t) maxx + 1);
|
|
}
|
|
}
|
|
}
|
|
wmove(w, oldy, oldx);
|
|
}
|
|
}
|