/**************************************************************************** * 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 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); } }